From 4e02495ee8c6636fae2656c26f65001761bbfb43 Mon Sep 17 00:00:00 2001 From: eigenmikem Date: Thu, 9 Jan 2025 13:05:52 -0500 Subject: [PATCH 01/35] test: lashing integration tests (#1003) * Validate that users who are slashed fully can redeposit once undelegated * removing arraylib use * test for updating eigenpod state -> slash/undelegate * removing unnecessary logging function * fixing strategy set * beacon chain tests in progress --------- Co-authored-by: Michael --- src/test/integration/IntegrationBase.t.sol | 62 +++++- src/test/integration/IntegrationChecks.t.sol | 50 +++++ ...egate_Allocate_Slash_Queue_Redeposit.t.sol | 97 ++++++++++ .../integration/tests/Slashing_Combined.sol | 177 ++++++++++++++++++ .../tests/WithdrawalSlashing_Combined.sol | 124 ++++++++++++ 5 files changed, 509 insertions(+), 1 deletion(-) create mode 100644 src/test/integration/tests/Deposit_Delegate_Allocate_Slash_Queue_Redeposit.t.sol create mode 100644 src/test/integration/tests/Slashing_Combined.sol create mode 100644 src/test/integration/tests/WithdrawalSlashing_Combined.sol diff --git a/src/test/integration/IntegrationBase.t.sol b/src/test/integration/IntegrationBase.t.sol index 852352e910..1df949a05e 100644 --- a/src/test/integration/IntegrationBase.t.sol +++ b/src/test/integration/IntegrationBase.t.sol @@ -186,6 +186,36 @@ abstract contract IntegrationBase is IntegrationDeployer { return result; } + + /// @dev Choose a random subset of validators (selects AT LEAST ONE but NOT ALL) + function _chooseSubset(uint40[] memory validators) internal returns (uint40[] memory) { + require(validators.length >= 2, "Need at least 2 validators to choose subset"); + + uint40[] memory result = new uint40[](validators.length); + uint newLen; + + uint rand = _randUint({ min: 1, max: validators.length ** 2 }); + for (uint i = 0; i < validators.length; i++) { + if (rand >> i & 1 == 1) { + result[newLen] = validators[i]; + newLen++; + } + } + + // If we picked all, remove one random validator + if (newLen == validators.length) { + uint indexToRemove = _randUint({ min: 0, max: validators.length - 1 }); + for (uint i = indexToRemove; i < newLen - 1; i++) { + result[i] = result[i + 1]; + } + newLen--; + } + + // Update array length + assembly { mstore(result, newLen) } + + return result; + } function _getTokenName(IERC20 token) internal view returns (string memory) { if (token == NATIVE_ETH) { @@ -561,8 +591,11 @@ abstract contract IntegrationBase is IntegrationDeployer { uint wadToSlash = slashingParams.wadsToSlash[slashingParams.strategies.indexOf(strat)]; slashedShares = prevShares[i].mulWadRoundUp(allocateParams.newMagnitudes[i].mulWadRoundUp(wadToSlash)); } + console.log(prevShares[i]); + console.log(slashedShares); + console.log(curShares[i]); - assertApproxEqAbs(prevShares[i] - slashedShares, curShares[i], 1, err); + assertApproxEqAbs(prevShares[i] - slashedShares, curShares[i], 1000, err); } } @@ -1133,6 +1166,21 @@ abstract contract IntegrationBase is IntegrationDeployer { return (strategies.sort(), wadsToSlash); } + + function _strategiesAndWadsForFullSlash( + OperatorSet memory operatorSet + ) internal view returns (IStrategy[] memory strategies, uint[] memory wadsToSlash) { + // Get list of all strategies in an operator set. + strategies = allocationManager.getStrategiesInOperatorSet(operatorSet); + + wadsToSlash = new uint[](strategies.length); + + for (uint i; i < strategies.length; ++i) { + wadsToSlash[i] = 1 ether; + } + + return (strategies.sort(), wadsToSlash); + } function _randMagnitudes(uint64 sum, uint256 len) internal returns (uint64[] memory magnitudes) { magnitudes = new uint64[](len); @@ -1151,6 +1199,18 @@ abstract contract IntegrationBase is IntegrationDeployer { } } + function _maxMagnitudes(OperatorSet memory operatorSet, User operator) internal view returns (uint64[] memory magnitudes) { + IStrategy[] memory strategies = allocationManager.getStrategiesInOperatorSet(operatorSet); + uint256 len = strategies.length; + magnitudes = new uint64[](len); + + if (len == 0) return magnitudes; + + for (uint256 i; i < len; ++i) { + magnitudes[i] = allocationManager.getMaxMagnitude(address(operator), strategies[i]); + } + } + function _randWithdrawal( IStrategy[] memory strategies, uint[] memory shares diff --git a/src/test/integration/IntegrationChecks.t.sol b/src/test/integration/IntegrationChecks.t.sol index 6229e74e73..cc44298170 100644 --- a/src/test/integration/IntegrationChecks.t.sol +++ b/src/test/integration/IntegrationChecks.t.sol @@ -390,6 +390,56 @@ contract IntegrationCheckUtils is IntegrationBase { } } + function check_Withdrawal_AsTokens_State_AfterBeaconSlash( + User staker, + User operator, + IDelegationManagerTypes.Withdrawal memory withdrawal, + IAllocationManagerTypes.AllocateParams memory allocateParams, + IAllocationManagerTypes.SlashingParams memory slashingParams, + uint[] memory expectedTokens + ) internal { + IERC20[] memory tokens = new IERC20[](withdrawal.strategies.length); + + for (uint i; i < withdrawal.strategies.length; i++) { + IStrategy strat = withdrawal.strategies[i]; + + bool isBeaconChainETHStrategy = strat == beaconChainETHStrategy; + + tokens[i] = isBeaconChainETHStrategy ? NATIVE_ETH : withdrawal.strategies[i].underlyingToken(); + + if (slashingParams.strategies.contains(strat)) { + uint wadToSlash = slashingParams.wadsToSlash[slashingParams.strategies.indexOf(strat)]; + + expectedTokens[i] -= expectedTokens[i] + .mulWadRoundUp(allocateParams.newMagnitudes[i].mulWadRoundUp(wadToSlash)); + + uint256 max = allocationManager.getMaxMagnitude(address(operator), strat); + + withdrawal.scaledShares[i] -= withdrawal.scaledShares[i].calcSlashedAmount(WAD, max); + + // Round down to the nearest gwei for beaconchain ETH strategy. + if (isBeaconChainETHStrategy) { + expectedTokens[i] -= expectedTokens[i] % 1 gwei; + } + } + } + + // Common checks + assert_WithdrawalNotPending(delegationManager.calculateWithdrawalRoot(withdrawal), "staker withdrawal should no longer be pending"); + + // assert_Snap_Added_TokenBalances(staker, tokens, expectedTokens, "staker should have received expected tokens"); + assert_Snap_Unchanged_StakerDepositShares(staker, "staker shares should not have changed"); + assert_Snap_Removed_StrategyShares(withdrawal.strategies, withdrawal.scaledShares, "strategies should have total shares decremented"); + + // Checks specific to an operator that the Staker has delegated to + if (operator != User(payable(0))) { + if (operator != staker) { + assert_Snap_Unchanged_TokenBalances(operator, "operator token balances should not have changed"); + } + assert_Snap_Unchanged_OperatorShares(operator, "operator shares should not have changed"); + } + } + function check_Withdrawal_AsShares_State_AfterSlash( User staker, User operator, diff --git a/src/test/integration/tests/Deposit_Delegate_Allocate_Slash_Queue_Redeposit.t.sol b/src/test/integration/tests/Deposit_Delegate_Allocate_Slash_Queue_Redeposit.t.sol new file mode 100644 index 0000000000..fcfc65b444 --- /dev/null +++ b/src/test/integration/tests/Deposit_Delegate_Allocate_Slash_Queue_Redeposit.t.sol @@ -0,0 +1,97 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.27; + +import "src/test/integration/IntegrationChecks.t.sol"; +import "src/test/integration/users/User.t.sol"; +import {console} from "forge-std/console.sol"; + +contract Integration_Deposit_Delegate_Allocate_Slash_Queue_Redeposit is IntegrationCheckUtils, IDelegationManagerTypes { + + function testFuzz_deposit_delegate_allocate_fullSlash_queue_complete_redeposit( + uint24 _random + ) public { + _configRand({_randomSeed: _random, _assetTypes: HOLDS_LST, _userTypes: DEFAULT}); + _upgradeEigenLayerContracts(); + + (User staker, IStrategy[] memory strategies, uint256[] memory tokenBalances) = _newRandomStaker(); + (User operator,,) = _newRandomOperator(); + (AVS avs,) = _newRandomAVS(); + + uint256[] memory tokensToDeposit = new uint256[](tokenBalances.length); + uint256[] memory numTokensRemaining = new uint256[](tokenBalances.length); + for (uint256 i = 0; i < tokenBalances.length; i++) { + tokensToDeposit[i] = tokenBalances[i]/2; + numTokensRemaining[i] = tokenBalances[i] - tokensToDeposit[i]; + } + + uint256[] memory shares = _calculateExpectedShares(strategies, tokensToDeposit); + + // 1. Deposit Into Strategies + staker.depositIntoEigenlayer(strategies, tokensToDeposit); + check_Deposit_State_PartialDeposit(staker, strategies, shares, numTokensRemaining); + + // 2. Delegate to operator + staker.delegateTo(operator); + check_Delegation_State(staker, operator, strategies, shares); + + // Create operator set and register operator + OperatorSet memory operatorSet = avs.createOperatorSet(strategies); + operator.registerForOperatorSet(operatorSet); + + // 3. Allocate to operator set + IAllocationManagerTypes.AllocateParams memory allocateParams = + operator.modifyAllocations(operatorSet, _maxMagnitudes(operatorSet, operator)); + + assert_Snap_Allocations_Modified( + operator, + allocateParams, + false, + "operator allocations should be updated before delay" + ); + + _rollBlocksForCompleteAllocation(operator, operatorSet, strategies); + + assert_Snap_Allocations_Modified( + operator, + allocateParams, + true, + "operator allocations should be updated after delay" + ); + + // 4. Fully slash operator + IAllocationManagerTypes.SlashingParams memory slashingParams; + { + (IStrategy[] memory strategiesToSlash, uint256[] memory wadsToSlash) = + _strategiesAndWadsForFullSlash(operatorSet); + + slashingParams = avs.slashOperator(operator, operatorSet.id, strategiesToSlash, wadsToSlash); + assert_Snap_Allocations_Slashed(slashingParams, operatorSet, true, "operator allocations should be slashed"); + assert_Snap_Unchanged_StakerDepositShares(staker, "staker deposit shares should be unchanged after slashing"); + assert_Snap_StakerWithdrawableShares_AfterSlash(staker, allocateParams, slashingParams, "staker deposit shares should be slashed"); + } + + // 5. Undelegate from an operator + IDelegationManagerTypes.Withdrawal[] memory withdrawals = staker.undelegate(); + bytes32[] memory withdrawalRoots = _getWithdrawalHashes(withdrawals); + + // 6. Complete withdrawal + _rollBlocksForCompleteWithdrawals(withdrawals); + for (uint256 i = 0; i < withdrawals.length; ++i) { + uint256[] memory expectedTokens = + _calculateExpectedTokens(withdrawals[i].strategies, withdrawals[i].scaledShares); + for (uint256 i = 0; i < expectedTokens.length; i++) { + } + staker.completeWithdrawalAsTokens(withdrawals[i]); + check_Withdrawal_AsTokens_State_AfterSlash(staker, operator, withdrawals[i], allocateParams, slashingParams, expectedTokens); + } + + // 7. Redeposit + shares = _calculateExpectedShares(strategies, numTokensRemaining); + staker.depositIntoEigenlayer(strategies, numTokensRemaining); + check_Deposit_State(staker, strategies, shares); + + // Final state checks + assert_HasExpectedShares(staker, strategies, shares, "staker should have expected shares after redeposit"); + assert_NoWithdrawalsPending(withdrawalRoots, "all withdrawals should be removed from pending"); + } +} \ No newline at end of file diff --git a/src/test/integration/tests/Slashing_Combined.sol b/src/test/integration/tests/Slashing_Combined.sol new file mode 100644 index 0000000000..fff647ba46 --- /dev/null +++ b/src/test/integration/tests/Slashing_Combined.sol @@ -0,0 +1,177 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.27; + +import "src/test/integration/IntegrationChecks.t.sol"; +import "src/test/integration/users/User.t.sol"; + +contract Integration_Slashing_Combined is IntegrationCheckUtils { + // Helper struct to reduce stack variables + struct TestContext { + User staker; + User operator; + AVS avs; + IStrategy[] strategies; + uint256[] tokenBalances; + uint40[] validators; + OperatorSet operatorSet; + IAllocationManagerTypes.AllocateParams allocateParams; + IAllocationManagerTypes.SlashingParams slashingParams; + } + + function testFuzz_deposit_slashBeacon_delegate_slashEigen_withdraw(uint24 _random) public { + TestContext memory ctx; + + // Initial setup and configuration + _configRand({ + _randomSeed: _random, + _assetTypes: HOLDS_ETH, + _userTypes: DEFAULT + }); + + _upgradeEigenLayerContracts(); + + // Initialize actors and store in context + (ctx.staker, ctx.strategies, ctx.tokenBalances) = _newRandomStaker(); + (ctx.operator,,) = _newRandomOperator(); + (ctx.avs,) = _newRandomAVS(); + + // Handle validator setup and slashing + _handleValidatorSetupAndSlashing(ctx); + + // Handle delegation and operator setup + _handleDelegationAndOperatorSetup(ctx); + + // Handle EigenLayer slashing + _handleEigenLayerSlashing(ctx); + + // Handle withdrawal + _handleWithdrawal(ctx); + } + + function _handleValidatorSetupAndSlashing(TestContext memory ctx) internal { + // Create and verify validators + (ctx.validators,) = ctx.staker.startValidators(); + beaconChain.advanceEpoch_NoRewards(); + ctx.staker.verifyWithdrawalCredentials(ctx.validators); + + // Slash validators and record via checkpoint + uint40[] memory slashedValidators = _chooseSubset(ctx.validators); + uint64 slashedGwei = beaconChain.slashValidators(slashedValidators); + beaconChain.advanceEpoch_NoRewards(); + + ctx.staker.startCheckpoint(); + console.log("Active validator count after starting checkpoint:", ctx.staker.pod().activeValidatorCount()); + ctx.staker.completeCheckpoint(); + console.log("Active validator count after completing checkpoint:", ctx.staker.pod().activeValidatorCount()); + check_CompleteCheckpoint_WithSlashing_HandleRoundDown_State(ctx.staker, slashedValidators, slashedGwei); + } + + function _handleDelegationAndOperatorSetup(TestContext memory ctx) internal { + // Handle delegation + ctx.staker.delegateTo(ctx.operator); + check_Delegation_State( + ctx.staker, + ctx.operator, + ctx.strategies, + _getStakerDepositShares(ctx.staker, ctx.strategies) + ); + + // Setup operator set + ctx.operatorSet = ctx.avs.createOperatorSet(ctx.strategies); + ctx.operator.registerForOperatorSet(ctx.operatorSet); + + ctx.allocateParams = ctx.operator.modifyAllocations( + ctx.operatorSet, + _randMagnitudes({sum: 1 ether, len: ctx.strategies.length}) + ); + _rollBlocksForCompleteAllocation(ctx.operator, ctx.operatorSet, ctx.strategies); + } + + function _handleEigenLayerSlashing(TestContext memory ctx) internal { + (IStrategy[] memory strategiesToSlash, uint256[] memory wadsToSlash) = + _randStrategiesAndWadsToSlash(ctx.operatorSet); + + ctx.slashingParams = ctx.avs.slashOperator( + ctx.operator, + ctx.operatorSet.id, + strategiesToSlash, + wadsToSlash + ); + + assert_Snap_Allocations_Slashed( + ctx.slashingParams, + ctx.operatorSet, + true, + "operator allocations should be slashed" + ); + assert_Snap_Unchanged_StakerDepositShares( + ctx.staker, + "staker deposit shares should be unchanged after slashing" + ); + assert_Snap_StakerWithdrawableShares_AfterSlash( + ctx.staker, + ctx.allocateParams, + ctx.slashingParams, + "staker deposit shares should be slashed" + ); + } + + function _handleWithdrawal(TestContext memory ctx) internal { + EigenPod pod = ctx.staker.pod(); + console.log("Before checkpoint:"); + console.log("Restaked execution layer gwei:", pod.withdrawableRestakedExecutionLayerGwei()); + console.log("Total shares:", eigenPodManager.stakerDepositShares(address(ctx.staker), beaconChainETHStrategy)); + + // Advance beacon chain epoch + beaconChain.advanceEpoch_NoRewards(); + + // checkpoint + //ctx.staker.startCheckpoint(); + //ctx.staker.completeCheckpoint(); + + console.log("After checkpoint:"); + console.log("Restaked execution layer gwei:", pod.withdrawableRestakedExecutionLayerGwei()); + console.log("Total shares:", eigenPodManager.stakerDepositShares(address(ctx.staker), beaconChainETHStrategy)); + + // Queue withdrawal + IDelegationManagerTypes.Withdrawal[] memory withdrawals = ctx.staker.undelegate(); + bytes32[] memory withdrawalRoots = _getWithdrawalHashes(withdrawals); + + console.log("After undelegate:"); + console.log("withdrawals length:", withdrawals.length); + for (uint i = 0; i < withdrawals.length; i++) { + console.log("Is pending?", delegationManager.pendingWithdrawals(withdrawalRoots[i])); + } + + // Complete withdrawals after delay + _rollBlocksForCompleteWithdrawals(withdrawals); + + for (uint256 i = 0; i < withdrawals.length; i++) { + console.log("Attempting to complete withdrawal", i); + console.log("Is pending before completion?", delegationManager.pendingWithdrawals(withdrawalRoots[i])); + + uint[] memory expectedTokens = _calculateExpectedTokens( + withdrawals[i].strategies, + withdrawals[i].scaledShares + ); + + for (uint256 i = 0; i < expectedTokens.length; i++) { + console.log(expectedTokens[i]); + } + IERC20[] memory tokens = ctx.staker.completeWithdrawalAsTokens(withdrawals[i]); + check_Withdrawal_AsTokens_State_AfterSlash( + ctx.staker, + ctx.operator, + withdrawals[i], + ctx.allocateParams, + ctx.slashingParams, + expectedTokens + ); + } + + // Final state checks + assert_HasNoDelegatableShares(ctx.staker, "staker should have withdrawn all shares"); + assert_NoWithdrawalsPending(withdrawalRoots, "all withdrawals should be completed"); + } + +} \ No newline at end of file diff --git a/src/test/integration/tests/WithdrawalSlashing_Combined.sol b/src/test/integration/tests/WithdrawalSlashing_Combined.sol new file mode 100644 index 0000000000..b91fb550b8 --- /dev/null +++ b/src/test/integration/tests/WithdrawalSlashing_Combined.sol @@ -0,0 +1,124 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.27; + +import "src/test/integration/IntegrationChecks.t.sol"; +import "src/test/integration/users/User.t.sol"; + +contract Integration_WithdrawalSlashing_Combined is IntegrationCheckUtils { + // Helper struct to reduce stack variables + struct TestContext { + User staker; + User operator; + IStrategy[] strategies; + uint256[] tokenBalances; + uint40[] validators; + bytes32[] withdrawalRoots; + IDelegationManagerTypes.Withdrawal[] withdrawals; + uint64 slashedGwei; + } + function testFuzz_deposit_delegate_queueWithdrawal_slashBeacon_checkpoint(uint24 _random) public { + TestContext memory ctx; + + // Initial setup and configuration + _configRand({ + _randomSeed: _random, + _assetTypes: HOLDS_ETH, + _userTypes: DEFAULT + }); + + _upgradeEigenLayerContracts(); + + // Initialize actors and store in context + (ctx.staker, ctx.strategies, ctx.tokenBalances) = _newRandomStaker(); + (ctx.operator,,) = _newRandomOperator(); + + // Handle validator setup and delegation + _handleValidatorSetupAndDelegation(ctx); + + // Queue withdrawal before slashing + _handleQueueWithdrawal(ctx); + + // Execute slashing while withdrawal is in queue + _handleBeaconChainSlashing(ctx); + + // Start a checkpoint to reflect slashing + _handlePostSlashingCheckpoint(ctx); + + // Complete the withdrawal and verify slashing was applied + _handleWithdrawalCompletion(ctx); + } + + function _handleValidatorSetupAndDelegation(TestContext memory ctx) internal { + // Create and verify validators + (ctx.validators,) = ctx.staker.startValidators(); + beaconChain.advanceEpoch_NoRewards(); + ctx.staker.verifyWithdrawalCredentials(ctx.validators); + + // Delegate to operator + ctx.staker.delegateTo(ctx.operator); + check_Delegation_State( + ctx.staker, + ctx.operator, + ctx.strategies, + _getStakerDepositShares(ctx.staker, ctx.strategies) + ); + } + + function _handleQueueWithdrawal(TestContext memory ctx) internal { + // Queue withdrawal by undelegating + ctx.withdrawals = ctx.staker.undelegate(); + ctx.withdrawalRoots = _getWithdrawalHashes(ctx.withdrawals); + + // Verify withdrawal state + assert_AllWithdrawalsPending(ctx.withdrawalRoots, "withdrawals should be pending"); + assert_ValidWithdrawalHashes(ctx.withdrawals, ctx.withdrawalRoots, "withdrawal hashes should be valid"); + } + + function _handleBeaconChainSlashing(TestContext memory ctx) internal { + // Choose subset of validators to slash + uint40[] memory slashedValidators = _chooseSubset(ctx.validators); + + // Execute slashing on beacon chain + ctx.slashedGwei = beaconChain.slashValidators(slashedValidators); + beaconChain.advanceEpoch_NoRewards(); + + console.log("Slashed amount (gwei)", ctx.slashedGwei); + } + + function _handlePostSlashingCheckpoint(TestContext memory ctx) internal { + // Start and complete checkpoint to reflect slashing + ctx.staker.startCheckpoint(); + ctx.staker.completeCheckpoint(); + console.log("Active validator count after completing checkpoint:", ctx.staker.pod().activeValidatorCount()); + + } + + function _handleWithdrawalCompletion(TestContext memory ctx) internal { + // Advance blocks to complete withdrawal + _rollBlocksForCompleteWithdrawals(ctx.withdrawals); + + // Complete each withdrawal and verify state + for (uint i = 0; i < ctx.withdrawals.length; i++) { + uint[] memory expectedTokens = _calculateExpectedTokens( + ctx.withdrawals[i].strategies, + ctx.withdrawals[i].scaledShares + ); + + IERC20[] memory tokens = ctx.staker.completeWithdrawalAsTokens(ctx.withdrawals[i]); + + check_Withdrawal_AsTokens_State( + ctx.staker, + ctx.operator, + ctx.withdrawals[i], + ctx.withdrawals[i].strategies, + ctx.withdrawals[i].scaledShares, + tokens, + expectedTokens + ); + } + + // Final checks + assert_HasNoDelegatableShares(ctx.staker, "staker should have no shares after withdrawal"); + assert_NoWithdrawalsPending(ctx.withdrawalRoots, "all withdrawals should be completed"); + } +} \ No newline at end of file From 7bf205577aee168ee38c5d76b5bade71019ddccc Mon Sep 17 00:00:00 2001 From: eigenmikem Date: Thu, 9 Jan 2025 13:07:17 -0500 Subject: [PATCH 02/35] chore: revert "Slashing integration tests (#1003)" (#1007) This reverts commit e945d8d37b16bef70081f9764d52eab294acd3b0. --- src/test/integration/IntegrationBase.t.sol | 62 +----- src/test/integration/IntegrationChecks.t.sol | 50 ----- ...egate_Allocate_Slash_Queue_Redeposit.t.sol | 97 ---------- .../integration/tests/Slashing_Combined.sol | 177 ------------------ .../tests/WithdrawalSlashing_Combined.sol | 124 ------------ 5 files changed, 1 insertion(+), 509 deletions(-) delete mode 100644 src/test/integration/tests/Deposit_Delegate_Allocate_Slash_Queue_Redeposit.t.sol delete mode 100644 src/test/integration/tests/Slashing_Combined.sol delete mode 100644 src/test/integration/tests/WithdrawalSlashing_Combined.sol diff --git a/src/test/integration/IntegrationBase.t.sol b/src/test/integration/IntegrationBase.t.sol index 1df949a05e..852352e910 100644 --- a/src/test/integration/IntegrationBase.t.sol +++ b/src/test/integration/IntegrationBase.t.sol @@ -186,36 +186,6 @@ abstract contract IntegrationBase is IntegrationDeployer { return result; } - - /// @dev Choose a random subset of validators (selects AT LEAST ONE but NOT ALL) - function _chooseSubset(uint40[] memory validators) internal returns (uint40[] memory) { - require(validators.length >= 2, "Need at least 2 validators to choose subset"); - - uint40[] memory result = new uint40[](validators.length); - uint newLen; - - uint rand = _randUint({ min: 1, max: validators.length ** 2 }); - for (uint i = 0; i < validators.length; i++) { - if (rand >> i & 1 == 1) { - result[newLen] = validators[i]; - newLen++; - } - } - - // If we picked all, remove one random validator - if (newLen == validators.length) { - uint indexToRemove = _randUint({ min: 0, max: validators.length - 1 }); - for (uint i = indexToRemove; i < newLen - 1; i++) { - result[i] = result[i + 1]; - } - newLen--; - } - - // Update array length - assembly { mstore(result, newLen) } - - return result; - } function _getTokenName(IERC20 token) internal view returns (string memory) { if (token == NATIVE_ETH) { @@ -591,11 +561,8 @@ abstract contract IntegrationBase is IntegrationDeployer { uint wadToSlash = slashingParams.wadsToSlash[slashingParams.strategies.indexOf(strat)]; slashedShares = prevShares[i].mulWadRoundUp(allocateParams.newMagnitudes[i].mulWadRoundUp(wadToSlash)); } - console.log(prevShares[i]); - console.log(slashedShares); - console.log(curShares[i]); - assertApproxEqAbs(prevShares[i] - slashedShares, curShares[i], 1000, err); + assertApproxEqAbs(prevShares[i] - slashedShares, curShares[i], 1, err); } } @@ -1166,21 +1133,6 @@ abstract contract IntegrationBase is IntegrationDeployer { return (strategies.sort(), wadsToSlash); } - - function _strategiesAndWadsForFullSlash( - OperatorSet memory operatorSet - ) internal view returns (IStrategy[] memory strategies, uint[] memory wadsToSlash) { - // Get list of all strategies in an operator set. - strategies = allocationManager.getStrategiesInOperatorSet(operatorSet); - - wadsToSlash = new uint[](strategies.length); - - for (uint i; i < strategies.length; ++i) { - wadsToSlash[i] = 1 ether; - } - - return (strategies.sort(), wadsToSlash); - } function _randMagnitudes(uint64 sum, uint256 len) internal returns (uint64[] memory magnitudes) { magnitudes = new uint64[](len); @@ -1199,18 +1151,6 @@ abstract contract IntegrationBase is IntegrationDeployer { } } - function _maxMagnitudes(OperatorSet memory operatorSet, User operator) internal view returns (uint64[] memory magnitudes) { - IStrategy[] memory strategies = allocationManager.getStrategiesInOperatorSet(operatorSet); - uint256 len = strategies.length; - magnitudes = new uint64[](len); - - if (len == 0) return magnitudes; - - for (uint256 i; i < len; ++i) { - magnitudes[i] = allocationManager.getMaxMagnitude(address(operator), strategies[i]); - } - } - function _randWithdrawal( IStrategy[] memory strategies, uint[] memory shares diff --git a/src/test/integration/IntegrationChecks.t.sol b/src/test/integration/IntegrationChecks.t.sol index cc44298170..6229e74e73 100644 --- a/src/test/integration/IntegrationChecks.t.sol +++ b/src/test/integration/IntegrationChecks.t.sol @@ -390,56 +390,6 @@ contract IntegrationCheckUtils is IntegrationBase { } } - function check_Withdrawal_AsTokens_State_AfterBeaconSlash( - User staker, - User operator, - IDelegationManagerTypes.Withdrawal memory withdrawal, - IAllocationManagerTypes.AllocateParams memory allocateParams, - IAllocationManagerTypes.SlashingParams memory slashingParams, - uint[] memory expectedTokens - ) internal { - IERC20[] memory tokens = new IERC20[](withdrawal.strategies.length); - - for (uint i; i < withdrawal.strategies.length; i++) { - IStrategy strat = withdrawal.strategies[i]; - - bool isBeaconChainETHStrategy = strat == beaconChainETHStrategy; - - tokens[i] = isBeaconChainETHStrategy ? NATIVE_ETH : withdrawal.strategies[i].underlyingToken(); - - if (slashingParams.strategies.contains(strat)) { - uint wadToSlash = slashingParams.wadsToSlash[slashingParams.strategies.indexOf(strat)]; - - expectedTokens[i] -= expectedTokens[i] - .mulWadRoundUp(allocateParams.newMagnitudes[i].mulWadRoundUp(wadToSlash)); - - uint256 max = allocationManager.getMaxMagnitude(address(operator), strat); - - withdrawal.scaledShares[i] -= withdrawal.scaledShares[i].calcSlashedAmount(WAD, max); - - // Round down to the nearest gwei for beaconchain ETH strategy. - if (isBeaconChainETHStrategy) { - expectedTokens[i] -= expectedTokens[i] % 1 gwei; - } - } - } - - // Common checks - assert_WithdrawalNotPending(delegationManager.calculateWithdrawalRoot(withdrawal), "staker withdrawal should no longer be pending"); - - // assert_Snap_Added_TokenBalances(staker, tokens, expectedTokens, "staker should have received expected tokens"); - assert_Snap_Unchanged_StakerDepositShares(staker, "staker shares should not have changed"); - assert_Snap_Removed_StrategyShares(withdrawal.strategies, withdrawal.scaledShares, "strategies should have total shares decremented"); - - // Checks specific to an operator that the Staker has delegated to - if (operator != User(payable(0))) { - if (operator != staker) { - assert_Snap_Unchanged_TokenBalances(operator, "operator token balances should not have changed"); - } - assert_Snap_Unchanged_OperatorShares(operator, "operator shares should not have changed"); - } - } - function check_Withdrawal_AsShares_State_AfterSlash( User staker, User operator, diff --git a/src/test/integration/tests/Deposit_Delegate_Allocate_Slash_Queue_Redeposit.t.sol b/src/test/integration/tests/Deposit_Delegate_Allocate_Slash_Queue_Redeposit.t.sol deleted file mode 100644 index fcfc65b444..0000000000 --- a/src/test/integration/tests/Deposit_Delegate_Allocate_Slash_Queue_Redeposit.t.sol +++ /dev/null @@ -1,97 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.27; - -import "src/test/integration/IntegrationChecks.t.sol"; -import "src/test/integration/users/User.t.sol"; -import {console} from "forge-std/console.sol"; - -contract Integration_Deposit_Delegate_Allocate_Slash_Queue_Redeposit is IntegrationCheckUtils, IDelegationManagerTypes { - - function testFuzz_deposit_delegate_allocate_fullSlash_queue_complete_redeposit( - uint24 _random - ) public { - _configRand({_randomSeed: _random, _assetTypes: HOLDS_LST, _userTypes: DEFAULT}); - _upgradeEigenLayerContracts(); - - (User staker, IStrategy[] memory strategies, uint256[] memory tokenBalances) = _newRandomStaker(); - (User operator,,) = _newRandomOperator(); - (AVS avs,) = _newRandomAVS(); - - uint256[] memory tokensToDeposit = new uint256[](tokenBalances.length); - uint256[] memory numTokensRemaining = new uint256[](tokenBalances.length); - for (uint256 i = 0; i < tokenBalances.length; i++) { - tokensToDeposit[i] = tokenBalances[i]/2; - numTokensRemaining[i] = tokenBalances[i] - tokensToDeposit[i]; - } - - uint256[] memory shares = _calculateExpectedShares(strategies, tokensToDeposit); - - // 1. Deposit Into Strategies - staker.depositIntoEigenlayer(strategies, tokensToDeposit); - check_Deposit_State_PartialDeposit(staker, strategies, shares, numTokensRemaining); - - // 2. Delegate to operator - staker.delegateTo(operator); - check_Delegation_State(staker, operator, strategies, shares); - - // Create operator set and register operator - OperatorSet memory operatorSet = avs.createOperatorSet(strategies); - operator.registerForOperatorSet(operatorSet); - - // 3. Allocate to operator set - IAllocationManagerTypes.AllocateParams memory allocateParams = - operator.modifyAllocations(operatorSet, _maxMagnitudes(operatorSet, operator)); - - assert_Snap_Allocations_Modified( - operator, - allocateParams, - false, - "operator allocations should be updated before delay" - ); - - _rollBlocksForCompleteAllocation(operator, operatorSet, strategies); - - assert_Snap_Allocations_Modified( - operator, - allocateParams, - true, - "operator allocations should be updated after delay" - ); - - // 4. Fully slash operator - IAllocationManagerTypes.SlashingParams memory slashingParams; - { - (IStrategy[] memory strategiesToSlash, uint256[] memory wadsToSlash) = - _strategiesAndWadsForFullSlash(operatorSet); - - slashingParams = avs.slashOperator(operator, operatorSet.id, strategiesToSlash, wadsToSlash); - assert_Snap_Allocations_Slashed(slashingParams, operatorSet, true, "operator allocations should be slashed"); - assert_Snap_Unchanged_StakerDepositShares(staker, "staker deposit shares should be unchanged after slashing"); - assert_Snap_StakerWithdrawableShares_AfterSlash(staker, allocateParams, slashingParams, "staker deposit shares should be slashed"); - } - - // 5. Undelegate from an operator - IDelegationManagerTypes.Withdrawal[] memory withdrawals = staker.undelegate(); - bytes32[] memory withdrawalRoots = _getWithdrawalHashes(withdrawals); - - // 6. Complete withdrawal - _rollBlocksForCompleteWithdrawals(withdrawals); - for (uint256 i = 0; i < withdrawals.length; ++i) { - uint256[] memory expectedTokens = - _calculateExpectedTokens(withdrawals[i].strategies, withdrawals[i].scaledShares); - for (uint256 i = 0; i < expectedTokens.length; i++) { - } - staker.completeWithdrawalAsTokens(withdrawals[i]); - check_Withdrawal_AsTokens_State_AfterSlash(staker, operator, withdrawals[i], allocateParams, slashingParams, expectedTokens); - } - - // 7. Redeposit - shares = _calculateExpectedShares(strategies, numTokensRemaining); - staker.depositIntoEigenlayer(strategies, numTokensRemaining); - check_Deposit_State(staker, strategies, shares); - - // Final state checks - assert_HasExpectedShares(staker, strategies, shares, "staker should have expected shares after redeposit"); - assert_NoWithdrawalsPending(withdrawalRoots, "all withdrawals should be removed from pending"); - } -} \ No newline at end of file diff --git a/src/test/integration/tests/Slashing_Combined.sol b/src/test/integration/tests/Slashing_Combined.sol deleted file mode 100644 index fff647ba46..0000000000 --- a/src/test/integration/tests/Slashing_Combined.sol +++ /dev/null @@ -1,177 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.27; - -import "src/test/integration/IntegrationChecks.t.sol"; -import "src/test/integration/users/User.t.sol"; - -contract Integration_Slashing_Combined is IntegrationCheckUtils { - // Helper struct to reduce stack variables - struct TestContext { - User staker; - User operator; - AVS avs; - IStrategy[] strategies; - uint256[] tokenBalances; - uint40[] validators; - OperatorSet operatorSet; - IAllocationManagerTypes.AllocateParams allocateParams; - IAllocationManagerTypes.SlashingParams slashingParams; - } - - function testFuzz_deposit_slashBeacon_delegate_slashEigen_withdraw(uint24 _random) public { - TestContext memory ctx; - - // Initial setup and configuration - _configRand({ - _randomSeed: _random, - _assetTypes: HOLDS_ETH, - _userTypes: DEFAULT - }); - - _upgradeEigenLayerContracts(); - - // Initialize actors and store in context - (ctx.staker, ctx.strategies, ctx.tokenBalances) = _newRandomStaker(); - (ctx.operator,,) = _newRandomOperator(); - (ctx.avs,) = _newRandomAVS(); - - // Handle validator setup and slashing - _handleValidatorSetupAndSlashing(ctx); - - // Handle delegation and operator setup - _handleDelegationAndOperatorSetup(ctx); - - // Handle EigenLayer slashing - _handleEigenLayerSlashing(ctx); - - // Handle withdrawal - _handleWithdrawal(ctx); - } - - function _handleValidatorSetupAndSlashing(TestContext memory ctx) internal { - // Create and verify validators - (ctx.validators,) = ctx.staker.startValidators(); - beaconChain.advanceEpoch_NoRewards(); - ctx.staker.verifyWithdrawalCredentials(ctx.validators); - - // Slash validators and record via checkpoint - uint40[] memory slashedValidators = _chooseSubset(ctx.validators); - uint64 slashedGwei = beaconChain.slashValidators(slashedValidators); - beaconChain.advanceEpoch_NoRewards(); - - ctx.staker.startCheckpoint(); - console.log("Active validator count after starting checkpoint:", ctx.staker.pod().activeValidatorCount()); - ctx.staker.completeCheckpoint(); - console.log("Active validator count after completing checkpoint:", ctx.staker.pod().activeValidatorCount()); - check_CompleteCheckpoint_WithSlashing_HandleRoundDown_State(ctx.staker, slashedValidators, slashedGwei); - } - - function _handleDelegationAndOperatorSetup(TestContext memory ctx) internal { - // Handle delegation - ctx.staker.delegateTo(ctx.operator); - check_Delegation_State( - ctx.staker, - ctx.operator, - ctx.strategies, - _getStakerDepositShares(ctx.staker, ctx.strategies) - ); - - // Setup operator set - ctx.operatorSet = ctx.avs.createOperatorSet(ctx.strategies); - ctx.operator.registerForOperatorSet(ctx.operatorSet); - - ctx.allocateParams = ctx.operator.modifyAllocations( - ctx.operatorSet, - _randMagnitudes({sum: 1 ether, len: ctx.strategies.length}) - ); - _rollBlocksForCompleteAllocation(ctx.operator, ctx.operatorSet, ctx.strategies); - } - - function _handleEigenLayerSlashing(TestContext memory ctx) internal { - (IStrategy[] memory strategiesToSlash, uint256[] memory wadsToSlash) = - _randStrategiesAndWadsToSlash(ctx.operatorSet); - - ctx.slashingParams = ctx.avs.slashOperator( - ctx.operator, - ctx.operatorSet.id, - strategiesToSlash, - wadsToSlash - ); - - assert_Snap_Allocations_Slashed( - ctx.slashingParams, - ctx.operatorSet, - true, - "operator allocations should be slashed" - ); - assert_Snap_Unchanged_StakerDepositShares( - ctx.staker, - "staker deposit shares should be unchanged after slashing" - ); - assert_Snap_StakerWithdrawableShares_AfterSlash( - ctx.staker, - ctx.allocateParams, - ctx.slashingParams, - "staker deposit shares should be slashed" - ); - } - - function _handleWithdrawal(TestContext memory ctx) internal { - EigenPod pod = ctx.staker.pod(); - console.log("Before checkpoint:"); - console.log("Restaked execution layer gwei:", pod.withdrawableRestakedExecutionLayerGwei()); - console.log("Total shares:", eigenPodManager.stakerDepositShares(address(ctx.staker), beaconChainETHStrategy)); - - // Advance beacon chain epoch - beaconChain.advanceEpoch_NoRewards(); - - // checkpoint - //ctx.staker.startCheckpoint(); - //ctx.staker.completeCheckpoint(); - - console.log("After checkpoint:"); - console.log("Restaked execution layer gwei:", pod.withdrawableRestakedExecutionLayerGwei()); - console.log("Total shares:", eigenPodManager.stakerDepositShares(address(ctx.staker), beaconChainETHStrategy)); - - // Queue withdrawal - IDelegationManagerTypes.Withdrawal[] memory withdrawals = ctx.staker.undelegate(); - bytes32[] memory withdrawalRoots = _getWithdrawalHashes(withdrawals); - - console.log("After undelegate:"); - console.log("withdrawals length:", withdrawals.length); - for (uint i = 0; i < withdrawals.length; i++) { - console.log("Is pending?", delegationManager.pendingWithdrawals(withdrawalRoots[i])); - } - - // Complete withdrawals after delay - _rollBlocksForCompleteWithdrawals(withdrawals); - - for (uint256 i = 0; i < withdrawals.length; i++) { - console.log("Attempting to complete withdrawal", i); - console.log("Is pending before completion?", delegationManager.pendingWithdrawals(withdrawalRoots[i])); - - uint[] memory expectedTokens = _calculateExpectedTokens( - withdrawals[i].strategies, - withdrawals[i].scaledShares - ); - - for (uint256 i = 0; i < expectedTokens.length; i++) { - console.log(expectedTokens[i]); - } - IERC20[] memory tokens = ctx.staker.completeWithdrawalAsTokens(withdrawals[i]); - check_Withdrawal_AsTokens_State_AfterSlash( - ctx.staker, - ctx.operator, - withdrawals[i], - ctx.allocateParams, - ctx.slashingParams, - expectedTokens - ); - } - - // Final state checks - assert_HasNoDelegatableShares(ctx.staker, "staker should have withdrawn all shares"); - assert_NoWithdrawalsPending(withdrawalRoots, "all withdrawals should be completed"); - } - -} \ No newline at end of file diff --git a/src/test/integration/tests/WithdrawalSlashing_Combined.sol b/src/test/integration/tests/WithdrawalSlashing_Combined.sol deleted file mode 100644 index b91fb550b8..0000000000 --- a/src/test/integration/tests/WithdrawalSlashing_Combined.sol +++ /dev/null @@ -1,124 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.27; - -import "src/test/integration/IntegrationChecks.t.sol"; -import "src/test/integration/users/User.t.sol"; - -contract Integration_WithdrawalSlashing_Combined is IntegrationCheckUtils { - // Helper struct to reduce stack variables - struct TestContext { - User staker; - User operator; - IStrategy[] strategies; - uint256[] tokenBalances; - uint40[] validators; - bytes32[] withdrawalRoots; - IDelegationManagerTypes.Withdrawal[] withdrawals; - uint64 slashedGwei; - } - function testFuzz_deposit_delegate_queueWithdrawal_slashBeacon_checkpoint(uint24 _random) public { - TestContext memory ctx; - - // Initial setup and configuration - _configRand({ - _randomSeed: _random, - _assetTypes: HOLDS_ETH, - _userTypes: DEFAULT - }); - - _upgradeEigenLayerContracts(); - - // Initialize actors and store in context - (ctx.staker, ctx.strategies, ctx.tokenBalances) = _newRandomStaker(); - (ctx.operator,,) = _newRandomOperator(); - - // Handle validator setup and delegation - _handleValidatorSetupAndDelegation(ctx); - - // Queue withdrawal before slashing - _handleQueueWithdrawal(ctx); - - // Execute slashing while withdrawal is in queue - _handleBeaconChainSlashing(ctx); - - // Start a checkpoint to reflect slashing - _handlePostSlashingCheckpoint(ctx); - - // Complete the withdrawal and verify slashing was applied - _handleWithdrawalCompletion(ctx); - } - - function _handleValidatorSetupAndDelegation(TestContext memory ctx) internal { - // Create and verify validators - (ctx.validators,) = ctx.staker.startValidators(); - beaconChain.advanceEpoch_NoRewards(); - ctx.staker.verifyWithdrawalCredentials(ctx.validators); - - // Delegate to operator - ctx.staker.delegateTo(ctx.operator); - check_Delegation_State( - ctx.staker, - ctx.operator, - ctx.strategies, - _getStakerDepositShares(ctx.staker, ctx.strategies) - ); - } - - function _handleQueueWithdrawal(TestContext memory ctx) internal { - // Queue withdrawal by undelegating - ctx.withdrawals = ctx.staker.undelegate(); - ctx.withdrawalRoots = _getWithdrawalHashes(ctx.withdrawals); - - // Verify withdrawal state - assert_AllWithdrawalsPending(ctx.withdrawalRoots, "withdrawals should be pending"); - assert_ValidWithdrawalHashes(ctx.withdrawals, ctx.withdrawalRoots, "withdrawal hashes should be valid"); - } - - function _handleBeaconChainSlashing(TestContext memory ctx) internal { - // Choose subset of validators to slash - uint40[] memory slashedValidators = _chooseSubset(ctx.validators); - - // Execute slashing on beacon chain - ctx.slashedGwei = beaconChain.slashValidators(slashedValidators); - beaconChain.advanceEpoch_NoRewards(); - - console.log("Slashed amount (gwei)", ctx.slashedGwei); - } - - function _handlePostSlashingCheckpoint(TestContext memory ctx) internal { - // Start and complete checkpoint to reflect slashing - ctx.staker.startCheckpoint(); - ctx.staker.completeCheckpoint(); - console.log("Active validator count after completing checkpoint:", ctx.staker.pod().activeValidatorCount()); - - } - - function _handleWithdrawalCompletion(TestContext memory ctx) internal { - // Advance blocks to complete withdrawal - _rollBlocksForCompleteWithdrawals(ctx.withdrawals); - - // Complete each withdrawal and verify state - for (uint i = 0; i < ctx.withdrawals.length; i++) { - uint[] memory expectedTokens = _calculateExpectedTokens( - ctx.withdrawals[i].strategies, - ctx.withdrawals[i].scaledShares - ); - - IERC20[] memory tokens = ctx.staker.completeWithdrawalAsTokens(ctx.withdrawals[i]); - - check_Withdrawal_AsTokens_State( - ctx.staker, - ctx.operator, - ctx.withdrawals[i], - ctx.withdrawals[i].strategies, - ctx.withdrawals[i].scaledShares, - tokens, - expectedTokens - ); - } - - // Final checks - assert_HasNoDelegatableShares(ctx.staker, "staker should have no shares after withdrawal"); - assert_NoWithdrawalsPending(ctx.withdrawalRoots, "all withdrawals should be completed"); - } -} \ No newline at end of file From c09dfbbd03851bdf3404e2530e1589c0330eb3c0 Mon Sep 17 00:00:00 2001 From: eigenmikem Date: Mon, 13 Jan 2025 12:22:27 -0500 Subject: [PATCH 03/35] fix: fixing 0 withdrawal issues (#1019) * fix: fixing 0 withdrawal issues * style: white space * docs: changing description for test --------- Co-authored-by: Michael --- src/contracts/core/DelegationManager.sol | 5 ++++ src/test/unit/DelegationUnit.t.sol | 36 ++++++++++++++---------- 2 files changed, 26 insertions(+), 15 deletions(-) diff --git a/src/contracts/core/DelegationManager.sol b/src/contracts/core/DelegationManager.sol index ecb6e0327b..1678c139cb 100644 --- a/src/contracts/core/DelegationManager.sol +++ b/src/contracts/core/DelegationManager.sol @@ -562,6 +562,11 @@ contract DelegationManager is slashingFactor: prevSlashingFactors[i] }); + //Do nothing if 0 shares to withdraw + if (sharesToWithdraw == 0) { + continue; + } + if (receiveAsTokens) { // Withdraws `shares` in `strategy` to `withdrawer`. If the shares are virtual beaconChainETH shares, // then a call is ultimately forwarded to the `staker`s EigenPod; otherwise a call is ultimately forwarded diff --git a/src/test/unit/DelegationUnit.t.sol b/src/test/unit/DelegationUnit.t.sol index 1619bbf3a1..da504d2637 100644 --- a/src/test/unit/DelegationUnit.t.sol +++ b/src/test/unit/DelegationUnit.t.sol @@ -5946,8 +5946,8 @@ contract DelegationManagerUnitTests_completeQueuedWithdrawal is DelegationManage delegationManager.completeQueuedWithdrawal(withdrawal, tokens, receiveAsTokens); } - /// @notice Verifies that when we complete a withdrawal as shares after a full slash, we revert - function test_revert_fullySlashed() public { + /// @notice Verifies that when we complete a withdrawal as shares after a full slash, we clear the withdrawal + function test_clearWithdrawal_fullySlashed() public { // Register operator _registerOperatorWithBaseDetails(defaultOperator); _setOperatorMagnitude(defaultOperator, strategyMock, WAD); @@ -5978,12 +5978,22 @@ contract DelegationManagerUnitTests_completeQueuedWithdrawal is DelegationManage cheats.prank(address(allocationManagerMock)); delegationManager.slashOperatorShares(defaultOperator, strategyMock, WAD, 0); - // Complete withdrawal as shares and assert that operator has no shares increased + // Complete withdrawal as shares and check that withdrawal was cleared cheats.roll(block.number + 1); IERC20[] memory tokens = strategyMock.underlyingToken().toArray(); - cheats.expectRevert(FullySlashed.selector); + + bytes32 withdrawalRoot = delegationManager.calculateWithdrawalRoot(withdrawal); + assertTrue(delegationManager.pendingWithdrawals(withdrawalRoot), "withdrawal should be pending before completion"); + cheats.prank(defaultStaker); delegationManager.completeQueuedWithdrawal(withdrawal, tokens, false); + + assertFalse(delegationManager.pendingWithdrawals(withdrawalRoot), "withdrawal should be cleared after completion"); + + // Assert that no shares were added back + assertEq(delegationManager.operatorShares(defaultOperator, strategyMock), 0, "operator shares should remain 0"); + (uint256[] memory withdrawableShares, ) = delegationManager.getWithdrawableShares(defaultStaker, strategyMock.toArray()); + assertEq(withdrawableShares[0], 0, "withdrawable shares should be 0"); } /** @@ -6631,22 +6641,18 @@ contract DelegationManagerUnitTests_slashingShares is DelegationManagerUnitTests uint256 slashableSharesInQueueAfter = delegationManager.getSlashableSharesInQueue(defaultOperator, strategyMock); - // Complete withdrawal as tokens and assert that nothing is returned + // Complete withdrawal as tokens and assert that nothing is returned and withdrawal is cleared cheats.roll(block.number + 1); IERC20[] memory tokens = strategyMock.underlyingToken().toArray(); - cheats.expectCall( - address(strategyManagerMock), - abi.encodeWithSelector( - IShareManager.withdrawSharesAsTokens.selector, - defaultStaker, - strategyMock, - strategyMock.underlyingToken(), - 0 - ) - ); + + bytes32 withdrawalRoot = delegationManager.calculateWithdrawalRoot(withdrawal); + assertTrue(delegationManager.pendingWithdrawals(withdrawalRoot), "withdrawal should be pending before completion"); + cheats.prank(defaultStaker); delegationManager.completeQueuedWithdrawal(withdrawal, tokens, true); + assertFalse(delegationManager.pendingWithdrawals(withdrawalRoot), "withdrawal should be cleared after completion"); + assertEq( slashableSharesInQueue, depositAmount, From 718e1ea5fd9ae7923db6ea28679966114152f209 Mon Sep 17 00:00:00 2001 From: Alex <18387287+wadealexc@users.noreply.github.com> Date: Tue, 14 Jan 2025 10:48:52 -0500 Subject: [PATCH 04/35] test: remove unneeded logic from integration test setup (#1023) --- src/test/integration/IntegrationBase.t.sol | 12 +- .../integration/IntegrationDeployer.t.sol | 609 ++++++------------ .../integration/mocks/BeaconChainMock.t.sol | 3 + 3 files changed, 195 insertions(+), 429 deletions(-) diff --git a/src/test/integration/IntegrationBase.t.sol b/src/test/integration/IntegrationBase.t.sol index 852352e910..eeea43720e 100644 --- a/src/test/integration/IntegrationBase.t.sol +++ b/src/test/integration/IntegrationBase.t.sol @@ -147,6 +147,10 @@ abstract contract IntegrationBase is IntegrationDeployer { emit log("_upgradeEigenLayerContracts: upgrading mainnet to slashing"); _upgradeMainnetContracts(); + // Unpause EigenPodManager + cheats.prank(eigenLayerPauserReg.unpauser()); + eigenPodManager.unpause(0); + // Bump block.timestamp forward to allow verifyWC proofs for migrated pods emit log("advancing block time to start of next epoch:"); @@ -154,14 +158,6 @@ abstract contract IntegrationBase is IntegrationDeployer { emit log("======"); - isUpgraded = true; - emit log("_upgradeEigenLayerContracts: slashing upgrade complete"); - } else if (forkType == HOLESKY) { - require(!isUpgraded, "_upgradeEigenLayerContracts: already performed slashing upgrade"); - - emit log("_upgradeEigenLayerContracts: upgrading holesky to slashing"); - _upgradeHoleskyContracts(); - isUpgraded = true; emit log("_upgradeEigenLayerContracts: slashing upgrade complete"); } diff --git a/src/test/integration/IntegrationDeployer.t.sol b/src/test/integration/IntegrationDeployer.t.sol index 8f69e208a4..e71cccd1e3 100644 --- a/src/test/integration/IntegrationDeployer.t.sol +++ b/src/test/integration/IntegrationDeployer.t.sol @@ -30,20 +30,6 @@ import "src/test/integration/users/User_M2.t.sol"; import "script/utils/ExistingDeploymentParser.sol"; -// DelegationManager -uint8 constant PAUSED_NEW_DELEGATION = 0; -uint8 constant PAUSED_ENTER_WITHDRAWAL_QUEUE = 1; -uint8 constant PAUSED_EXIT_WITHDRAWAL_QUEUE = 2; -// StrategyManager -uint8 constant PAUSED_DEPOSITS = 0; -// EigenpodManager -uint8 constant PAUSED_NEW_EIGENPODS = 0; -uint8 constant PAUSED_WITHDRAW_RESTAKED_ETH = 1; -uint8 constant PAUSED_EIGENPODS_VERIFY_CREDENTIALS = 2; -uint8 constant PAUSED_EIGENPODS_VERIFY_BALANCE_UPDATE = 3; -uint8 constant PAUSED_EIGENPODS_VERIFY_WITHDRAWAL = 4; -uint8 constant PAUSED_NON_PROOF_WITHDRAWALS = 5; - IStrategy constant beaconChainETHStrategy = IStrategy(0xbeaC0eeEeeeeEEeEeEEEEeeEEeEeeeEeeEEBEaC0); abstract contract IntegrationDeployer is ExistingDeploymentParser { @@ -51,21 +37,18 @@ abstract contract IntegrationDeployer is ExistingDeploymentParser { // Fork ids for specific fork tests bool isUpgraded; - uint mainnetForkBlock = 20_847_130; // Post PI upgrade - uint mainnetForkId; - uint holeskyForkBLock = 1_213_950; - uint holeskyForkId; - uint64 constant DENEB_FORK_TIMESTAMP = 1_705_473_120; + uint mainnetForkBlock = 21_616_692; // Post Protocol Council upgrade // Beacon chain genesis time when running locally // Multiple of 12 for sanity's sake uint64 constant GENESIS_TIME_LOCAL = 1 hours * 12; uint64 constant GENESIS_TIME_MAINNET = 1_606_824_023; + uint64 BEACON_GENESIS_TIME; // set after forkType is decided - uint8 constant NUM_LST_STRATS = 32; - - TimeMachine public timeMachine; + // Beacon chain deposit contract. The BeaconChainMock contract etchs ETHPOSDepositMock code here. + IETHPOSDeposit constant DEPOSIT_CONTRACT = IETHPOSDeposit(0x00000000219ab540356cBB839Cbe05303d7705Fa); + uint8 constant NUM_LST_STRATS = 32; // Lists of strategies used in the system // // When we select random user assets, we use the `assetType` to determine @@ -79,11 +62,10 @@ abstract contract IntegrationDeployer is ExistingDeploymentParser { mapping(address => bool) public tokensNotTested; // Mock Contracts to deploy - ETHPOSDepositMock ethPOSDeposit; + TimeMachine public timeMachine; BeaconChainMock public beaconChain; // Admin Addresses - address eigenLayerReputedMultisig = address(this); // admin address address constant pauser = address(555); address constant unpauser = address(556); @@ -96,9 +78,6 @@ abstract contract IntegrationDeployer is ExistingDeploymentParser { // Set only once in setUp, if FORK_MAINNET env is set uint forkType; - // Constants - uint64 constant MAX_RESTAKED_BALANCE_GWEI_PER_VALIDATOR = 32e9; - constructor() { address stETH_Holesky = 0x3F1c547b21f65e10480dE3ad8E19fAAC46C95034; address stETH_Mainnet = 0xae7ab96520DE3A18E5e111B5EaAb095312D7fE84; @@ -137,22 +116,20 @@ abstract contract IntegrationDeployer is ExistingDeploymentParser { bool forkMainnet = _hash("forktest") == _hash(cheats.envOr(string("FOUNDRY_PROFILE"), string("default"))); if (forkMainnet) { - console.log("Setting up `%s` integration tests:", "MAINNET_FORK".green().bold()); - console.log("RPC:", cheats.rpcUrl("mainnet")); - console.log("Block:", mainnetForkBlock); - - cheats.createSelectFork(cheats.rpcUrl("mainnet"), mainnetForkBlock); forkType = MAINNET; + _setUpMainnet(); } else { - console.log("Setting up `%s` integration tests:", "LOCAL".yellow().bold()); - forkType = LOCAL; + _setUpLocal(); } - - _deployOrFetchContracts(); } + /// Deploy EigenLayer locally function _setUpLocal() public virtual { + console.log("Setting up `%s` integration tests:", "LOCAL".yellow().bold()); + // Bypass upgrade tests when running locally + isUpgraded = true; + // Deploy ProxyAdmin eigenLayerProxyAdmin = new ProxyAdmin(); executorMultisig = address(eigenLayerProxyAdmin.owner()); @@ -163,138 +140,25 @@ abstract contract IntegrationDeployer is ExistingDeploymentParser { eigenLayerPauserReg = new PauserRegistry(pausers, unpauser); // Deploy mocks - EmptyContract emptyContract = new EmptyContract(); - ethPOSDeposit = new ETHPOSDepositMock(); + emptyContract = new EmptyContract(); // Matching parameters to testnet DELEGATION_MANAGER_MIN_WITHDRAWAL_DELAY_BLOCKS = 50; DEALLOCATION_DELAY = 50; ALLOCATION_CONFIGURATION_DELAY = 75; - /** - * First, deploy upgradeable proxy contracts that **will point** to the implementations. Since the implementation contracts are - * not yet deployed, we give these proxies an empty contract as the initial implementation, to act as if they have no code. - */ - delegationManager = DelegationManager( - address(new TransparentUpgradeableProxy(address(emptyContract), address(eigenLayerProxyAdmin), "")) - ); - strategyManager = StrategyManager( - address(new TransparentUpgradeableProxy(address(emptyContract), address(eigenLayerProxyAdmin), "")) - ); - eigenPodManager = EigenPodManager( - address(new TransparentUpgradeableProxy(address(emptyContract), address(eigenLayerProxyAdmin), "")) - ); - avsDirectory = AVSDirectory( - address(new TransparentUpgradeableProxy(address(emptyContract), address(eigenLayerProxyAdmin), "")) - ); - strategyFactory = StrategyFactory( - address(new TransparentUpgradeableProxy(address(emptyContract), address(eigenLayerProxyAdmin), "")) - ); - allocationManager = AllocationManager( - address(new TransparentUpgradeableProxy(address(emptyContract), address(eigenLayerProxyAdmin), "")) - ); - permissionController = PermissionController( - address(new TransparentUpgradeableProxy(address(emptyContract), address(eigenLayerProxyAdmin), "")) - ); - - // Deploy EigenPod Contracts - eigenPodImplementation = new EigenPod(ethPOSDeposit, eigenPodManager, GENESIS_TIME_LOCAL); - - eigenPodBeacon = new UpgradeableBeacon(address(eigenPodImplementation)); - // Second, deploy the *implementation* contracts, using the *proxy contracts* as inputs - delegationManagerImplementation = new DelegationManager(strategyManager, eigenPodManager, allocationManager, eigenLayerPauserReg, permissionController, DELEGATION_MANAGER_MIN_WITHDRAWAL_DELAY_BLOCKS); - strategyManagerImplementation = new StrategyManager(delegationManager, eigenLayerPauserReg); - eigenPodManagerImplementation = new EigenPodManager( - ethPOSDeposit, - eigenPodBeacon, - delegationManager, - eigenLayerPauserReg - ); - strategyManagerImplementation = new StrategyManager(delegationManager, eigenLayerPauserReg); - eigenPodManagerImplementation = new EigenPodManager(ethPOSDeposit, eigenPodBeacon, delegationManager, eigenLayerPauserReg); - avsDirectoryImplementation = new AVSDirectory(delegationManager, eigenLayerPauserReg); - strategyFactoryImplementation = new StrategyFactory(strategyManager, eigenLayerPauserReg); - allocationManagerImplementation = new AllocationManager(delegationManager, eigenLayerPauserReg, permissionController, DEALLOCATION_DELAY, ALLOCATION_CONFIGURATION_DELAY); - permissionControllerImplementation = new PermissionController(); - - // Third, upgrade the proxy contracts to point to the implementations - // DelegationManager - eigenLayerProxyAdmin.upgradeAndCall( - ITransparentUpgradeableProxy(payable(address(delegationManager))), - address(delegationManagerImplementation), - abi.encodeWithSelector( - DelegationManager.initialize.selector, - eigenLayerReputedMultisig, // initialOwner - 0 /* initialPausedStatus */ - ) - ); - // StrategyManager - eigenLayerProxyAdmin.upgradeAndCall( - ITransparentUpgradeableProxy(payable(address(strategyManager))), - address(strategyManagerImplementation), - abi.encodeWithSelector( - StrategyManager.initialize.selector, - eigenLayerReputedMultisig, //initialOwner - eigenLayerReputedMultisig, //initial whitelister - 0 // initialPausedStatus - ) - ); - // EigenPodManager - eigenLayerProxyAdmin.upgradeAndCall( - ITransparentUpgradeableProxy(payable(address(eigenPodManager))), - address(eigenPodManagerImplementation), - abi.encodeWithSelector( - EigenPodManager.initialize.selector, - eigenLayerReputedMultisig, // initialOwner - 0 // initialPausedStatus - ) - ); - // AVSDirectory - eigenLayerProxyAdmin.upgradeAndCall( - ITransparentUpgradeableProxy(payable(address(avsDirectory))), - address(avsDirectoryImplementation), - abi.encodeWithSelector( - AVSDirectory.initialize.selector, - eigenLayerReputedMultisig, // initialOwner - 0 // initialPausedStatus - ) - ); - // AllocationManager - eigenLayerProxyAdmin.upgradeAndCall( - ITransparentUpgradeableProxy(payable(address(allocationManager))), - address(allocationManagerImplementation), - abi.encodeWithSelector( - AllocationManager.initialize.selector, - eigenLayerReputedMultisig, // initialOwner - 0 // initialPausedStatus - ) - ); - //PermissionController - eigenLayerProxyAdmin.upgrade( - ITransparentUpgradeableProxy(payable(address(permissionController))), - address(permissionControllerImplementation) - ); - // Create base strategy implementation and deploy a few strategies - baseStrategyImplementation = new StrategyBase(strategyManager, eigenLayerPauserReg); - - // Create a proxy beacon for base strategy implementation - strategyBeacon = new UpgradeableBeacon(address(baseStrategyImplementation)); - - // Strategy Factory, upgrade and initialized - eigenLayerProxyAdmin.upgradeAndCall( - ITransparentUpgradeableProxy(payable(address(strategyFactory))), - address(strategyFactoryImplementation), - abi.encodeWithSelector( - StrategyFactory.initialize.selector, - eigenLayerReputedMultisig, - 0, // initial paused status - IBeacon(strategyBeacon) - ) - ); + REWARDS_COORDINATOR_CALCULATION_INTERVAL_SECONDS = 86400; + REWARDS_COORDINATOR_MAX_REWARDS_DURATION = 6048000; + REWARDS_COORDINATOR_MAX_RETROACTIVE_LENGTH = 7776000; + REWARDS_COORDINATOR_MAX_FUTURE_LENGTH = 2592000; + REWARDS_COORDINATOR_GENESIS_REWARDS_TIMESTAMP = 1710979200; - cheats.prank(eigenLayerReputedMultisig); - strategyManager.setStrategyWhitelister(address(strategyFactory)); + _deployProxies(); + _deployImplementations(); + _upgradeProxies(); + _initializeProxies(); + // Deploy and configure strategies and tokens for (uint i = 1; i < NUM_LST_STRATS + 1; ++i) { string memory name = string.concat("LST-Strat", cheats.toString(i), " token"); string memory symbol = string.concat("lstStrat", cheats.toString(i)); @@ -307,24 +171,49 @@ abstract contract IntegrationDeployer is ExistingDeploymentParser { allTokens.push(NATIVE_ETH); // Create time machine and beacon chain. Set block time to beacon chain genesis time - // TODO: update if needed to sane timestamp - cheats.warp(GENESIS_TIME_LOCAL); + BEACON_GENESIS_TIME = GENESIS_TIME_LOCAL; + cheats.warp(BEACON_GENESIS_TIME); timeMachine = new TimeMachine(); - beaconChain = new BeaconChainMock(eigenPodManager, GENESIS_TIME_LOCAL); + beaconChain = new BeaconChainMock(eigenPodManager, BEACON_GENESIS_TIME); } - /** - * @notice deploy current implementation contracts and upgrade the existing proxy EigenLayer contracts - * on Mainnet. Setup for integration tests on mainnet fork. - * - * Note that beacon chain oracle and eth deposit contracts are mocked and pointed to different addresses for these tests. - */ + /// Parse existing contracts from mainnet + function _setUpMainnet() public virtual { + console.log("Setting up `%s` integration tests:", "MAINNET_FORK".green().bold()); + console.log("RPC:", cheats.rpcUrl("mainnet")); + console.log("Block:", mainnetForkBlock); + + cheats.createSelectFork(cheats.rpcUrl("mainnet"), mainnetForkBlock); + + string memory deploymentInfoPath = "script/configs/mainnet/mainnet-addresses.config.json"; + _parseDeployedContracts(deploymentInfoPath); + string memory existingDeploymentParams = "script/configs/mainnet.json"; + _parseParamsForIntegrationUpgrade(existingDeploymentParams); + + // Add deployed strategies to lstStrats and allStrats + for (uint i; i < deployedStrategyArray.length; i++) { + IStrategy strategy = IStrategy(deployedStrategyArray[i]); + + if (tokensNotTested[address(strategy.underlyingToken())]) { + continue; + } + + // Add to lstStrats and allStrats + lstStrats.push(strategy); + allStrats.push(strategy); + allTokens.push(strategy.underlyingToken()); + } + + // Create time machine and mock beacon chain + BEACON_GENESIS_TIME = GENESIS_TIME_MAINNET; + timeMachine = new TimeMachine(); + beaconChain = new BeaconChainMock(eigenPodManager, BEACON_GENESIS_TIME); + } + + /// Deploy current implementation contracts and upgrade existing proxies function _upgradeMainnetContracts() public virtual { cheats.startPrank(address(executorMultisig)); - ethPOSDeposit = new ETHPOSDepositMock(); - ETHPOSDepositAddress = address(ethPOSDeposit); // overwrite for upgrade checks later - // First, deploy the new contracts as empty contracts emptyContract = new EmptyContract(); allocationManager = AllocationManager( @@ -334,7 +223,58 @@ abstract contract IntegrationDeployer is ExistingDeploymentParser { address(new TransparentUpgradeableProxy(address(emptyContract), address(eigenLayerProxyAdmin), "")) ); - // Second, deploy the *implementation* contracts, using the *proxy contracts* as inputs + emit log_named_uint("EPM pause status", eigenPodManager.paused()); + + // Deploy new implementation contracts and upgrade all proxies to point to them + _deployImplementations(); + _upgradeProxies(); + + emit log_named_uint("EPM pause status", eigenPodManager.paused()); + + // Initialize the newly-deployed proxy + allocationManager.initialize({ + initialOwner: executorMultisig, + initialPausedStatus: 0 + }); + + cheats.stopPrank(); + + ethStrats.push(BEACONCHAIN_ETH_STRAT); + allStrats.push(BEACONCHAIN_ETH_STRAT); + allTokens.push(NATIVE_ETH); + } + + function _deployProxies() public { + delegationManager = DelegationManager( + address(new TransparentUpgradeableProxy(address(emptyContract), address(eigenLayerProxyAdmin), "")) + ); + strategyManager = StrategyManager( + address(new TransparentUpgradeableProxy(address(emptyContract), address(eigenLayerProxyAdmin), "")) + ); + eigenPodManager = EigenPodManager( + address(new TransparentUpgradeableProxy(address(emptyContract), address(eigenLayerProxyAdmin), "")) + ); + rewardsCoordinator = RewardsCoordinator( + address(new TransparentUpgradeableProxy(address(emptyContract), address(eigenLayerProxyAdmin), "")) + ); + avsDirectory = AVSDirectory( + address(new TransparentUpgradeableProxy(address(emptyContract), address(eigenLayerProxyAdmin), "")) + ); + strategyFactory = StrategyFactory( + address(new TransparentUpgradeableProxy(address(emptyContract), address(eigenLayerProxyAdmin), "")) + ); + allocationManager = AllocationManager( + address(new TransparentUpgradeableProxy(address(emptyContract), address(eigenLayerProxyAdmin), "")) + ); + permissionController = PermissionController( + address(new TransparentUpgradeableProxy(address(emptyContract), address(eigenLayerProxyAdmin), "")) + ); + eigenPodBeacon = new UpgradeableBeacon(address(emptyContract)); + strategyBeacon = new UpgradeableBeacon(address(emptyContract)); + } + + /// Deploy an implementation contract for each contract in the system + function _deployImplementations() public { allocationManagerImplementation = new AllocationManager(delegationManager, eigenLayerPauserReg, permissionController, DEALLOCATION_DELAY, ALLOCATION_CONFIGURATION_DELAY); permissionControllerImplementation = new PermissionController(); delegationManagerImplementation = new DelegationManager(strategyManager, eigenPodManager, allocationManager, eigenLayerPauserReg, permissionController, DELEGATION_MANAGER_MIN_WITHDRAWAL_DELAY_BLOCKS); @@ -353,141 +293,75 @@ abstract contract IntegrationDeployer is ExistingDeploymentParser { ); avsDirectoryImplementation = new AVSDirectory(delegationManager, eigenLayerPauserReg); eigenPodManagerImplementation = new EigenPodManager( - ethPOSDeposit, + DEPOSIT_CONTRACT, eigenPodBeacon, delegationManager, eigenLayerPauserReg ); - eigenPodImplementation = new EigenPod(ethPOSDeposit, eigenPodManager, GENESIS_TIME_MAINNET); strategyFactoryImplementation = new StrategyFactory(strategyManager, eigenLayerPauserReg); + + // Beacon implementations + eigenPodImplementation = new EigenPod(DEPOSIT_CONTRACT, eigenPodManager, BEACON_GENESIS_TIME); baseStrategyImplementation = new StrategyBase(strategyManager, eigenLayerPauserReg); - // Third, upgrade the proxy contracts to point to the implementations - - // Initialize the newly deployed contracts - eigenLayerProxyAdmin.upgradeAndCall( - ITransparentUpgradeableProxy(payable(address(allocationManager))), - address(allocationManagerImplementation), - abi.encodeWithSelector( - AllocationManager.initialize.selector, - executorMultisig, - 0 // initialPausedStatus - ) - ); - eigenLayerProxyAdmin.upgrade( - ITransparentUpgradeableProxy(payable(address(permissionController))), - address(permissionControllerImplementation) - ); + // Pre-longtail StrategyBaseTVLLimits implementation + // TODO - need to update ExistingDeploymentParser + } + function _upgradeProxies() public { // DelegationManager eigenLayerProxyAdmin.upgrade( - ITransparentUpgradeableProxy(payable(address(delegationManager))), address(delegationManagerImplementation) + ITransparentUpgradeableProxy(payable(address(delegationManager))), + address(delegationManagerImplementation) ); + // StrategyManager eigenLayerProxyAdmin.upgrade( - ITransparentUpgradeableProxy(payable(address(strategyManager))), address(strategyManagerImplementation) - ); - // RewardsCoordinator - eigenLayerProxyAdmin.upgrade( - ITransparentUpgradeableProxy(payable(address(rewardsCoordinator))), address(rewardsCoordinatorImplementation) - ); - // AVSDirectory - eigenLayerProxyAdmin.upgrade( - ITransparentUpgradeableProxy(payable(address(avsDirectory))), address(avsDirectoryImplementation) + ITransparentUpgradeableProxy(payable(address(strategyManager))), + address(strategyManagerImplementation) ); + // EigenPodManager eigenLayerProxyAdmin.upgrade( - ITransparentUpgradeableProxy(payable(address(eigenPodManager))), address(eigenPodManagerImplementation) - ); - // EigenPod - eigenPodBeacon.upgradeTo(address(eigenPodImplementation)); - // StrategyFactory - eigenLayerProxyAdmin.upgrade( - ITransparentUpgradeableProxy(payable(address(strategyFactory))), address(strategyFactoryImplementation) + ITransparentUpgradeableProxy(payable(address(eigenPodManager))), + address(eigenPodManagerImplementation) ); - // Strategy Beacon - strategyBeacon.upgradeTo(address(baseStrategyImplementation)); - // Upgrade All deployed strategy contracts to new base strategy - for (uint i = 0; i < numStrategiesDeployed; i++) { - // Upgrade existing strategy - eigenLayerProxyAdmin.upgrade( - ITransparentUpgradeableProxy(payable(address(deployedStrategyArray[i]))), - address(baseStrategyImplementation) - ); - } - - // Third, unpause core contracts - delegationManager.unpause(0); - eigenPodManager.unpause(0); - strategyManager.unpause(0); - - cheats.stopPrank(); - - ethStrats.push(BEACONCHAIN_ETH_STRAT); - allStrats.push(BEACONCHAIN_ETH_STRAT); - allTokens.push(NATIVE_ETH); - } - - /** - * @notice deploy current implementation contracts and upgrade the existing proxy EigenLayer contracts - * on Holesky. Setup for integration tests on Holesky fork. - * - * Note that beacon chain oracle and eth deposit contracts are mocked and pointed to different addresses for these tests. - */ - function _upgradeHoleskyContracts() public virtual { - cheats.startPrank(address(executorMultisig)); - - ethPOSDeposit = new ETHPOSDepositMock(); - ETHPOSDepositAddress = address(ethPOSDeposit); // overwrite for upgrade checks later - - // Deploy EigenPod Contracts - eigenPodImplementation = new EigenPod(ethPOSDeposit, eigenPodManager, 0); - eigenPodBeacon.upgradeTo(address(eigenPodImplementation)); - // Deploy AVSDirectory, contract has not been deployed on mainnet yet - avsDirectory = AVSDirectory( - address(new TransparentUpgradeableProxy(address(emptyContract), address(eigenLayerProxyAdmin), "")) + // RewardsCoordinator + eigenLayerProxyAdmin.upgrade( + ITransparentUpgradeableProxy(payable(address(rewardsCoordinator))), + address(rewardsCoordinatorImplementation) ); - // First, deploy the *implementation* contracts, using the *proxy contracts* as inputs - delegationManagerImplementation = new DelegationManager(strategyManager, eigenPodManager, allocationManager, eigenLayerPauserReg, permissionController, DELEGATION_MANAGER_MIN_WITHDRAWAL_DELAY_BLOCKS); - strategyManagerImplementation = new StrategyManager(delegationManager, eigenLayerPauserReg); - eigenPodManagerImplementation = new EigenPodManager( - ethPOSDeposit, - eigenPodBeacon, - delegationManager, - eigenLayerPauserReg + // AVSDirectory + eigenLayerProxyAdmin.upgrade( + ITransparentUpgradeableProxy(payable(address(avsDirectory))), + address(avsDirectoryImplementation) ); - strategyManagerImplementation = new StrategyManager(delegationManager, eigenLayerPauserReg); - eigenPodManagerImplementation = new EigenPodManager(ethPOSDeposit, eigenPodBeacon, delegationManager, eigenLayerPauserReg); - avsDirectoryImplementation = new AVSDirectory(delegationManager, eigenLayerPauserReg); - // Second, upgrade the proxy contracts to point to the implementations - // DelegationManager + // AllocationManager eigenLayerProxyAdmin.upgrade( - ITransparentUpgradeableProxy(payable(address(delegationManager))), address(delegationManagerImplementation) + ITransparentUpgradeableProxy(payable(address(allocationManager))), + address(allocationManagerImplementation) ); - // StrategyManager + + // PermissionController eigenLayerProxyAdmin.upgrade( - ITransparentUpgradeableProxy(payable(address(strategyManager))), address(strategyManagerImplementation) + ITransparentUpgradeableProxy(payable(address(permissionController))), + address(permissionControllerImplementation) ); - // EigenPodManager + + // StrategyFactory eigenLayerProxyAdmin.upgrade( - ITransparentUpgradeableProxy(payable(address(eigenPodManager))), address(eigenPodManagerImplementation) - ); - // AVSDirectory, upgrade and initialized - eigenLayerProxyAdmin.upgradeAndCall( - ITransparentUpgradeableProxy(payable(address(avsDirectory))), - address(avsDirectoryImplementation), - abi.encodeWithSelector( - AVSDirectory.initialize.selector, - executorMultisig, - 0 // initialPausedStatus - ) + ITransparentUpgradeableProxy(payable(address(strategyFactory))), + address(strategyFactoryImplementation) ); - // Create base strategy implementation and deploy a few strategies - baseStrategyImplementation = new StrategyBase(strategyManager, eigenLayerPauserReg); + // EigenPod beacon + eigenPodBeacon.upgradeTo(address(eigenPodImplementation)); + + // StrategyBase Beacon + strategyBeacon.upgradeTo(address(baseStrategyImplementation)); // Upgrade All deployed strategy contracts to new base strategy for (uint i = 0; i < numStrategiesDeployed; i++) { @@ -497,17 +371,40 @@ abstract contract IntegrationDeployer is ExistingDeploymentParser { address(baseStrategyImplementation) ); } + } - // Third, unpause core contracts - delegationManager.unpause(0); - eigenPodManager.unpause(0); - strategyManager.unpause(0); - - cheats.stopPrank(); - - ethStrats.push(BEACONCHAIN_ETH_STRAT); - allStrats.push(BEACONCHAIN_ETH_STRAT); - allTokens.push(NATIVE_ETH); + function _initializeProxies() public { + delegationManager.initialize({ + initialOwner: executorMultisig, + initialPausedStatus: 0 + }); + + strategyManager.initialize({ + initialOwner: executorMultisig, + initialStrategyWhitelister: address(strategyFactory), + initialPausedStatus: 0 + }); + + eigenPodManager.initialize({ + initialOwner: executorMultisig, + _initPausedStatus: 0 + }); + + avsDirectory.initialize({ + initialOwner: executorMultisig, + initialPausedStatus: 0 + }); + + allocationManager.initialize({ + initialOwner: executorMultisig, + initialPausedStatus: 0 + }); + + strategyFactory.initialize({ + _initialOwner: executorMultisig, + _initialPausedStatus: 0, + _strategyBeacon: strategyBeacon + }); } /// @dev Deploy a strategy and its underlying token, push to global lists of tokens/strategies, and whitelist @@ -541,15 +438,8 @@ abstract contract IntegrationDeployer is ExistingDeploymentParser { IStrategy[] memory strategies = new IStrategy[](1); strategies[0] = strategy; - if (forkType == MAINNET) { - cheats.prank(strategyManager.strategyWhitelister()); - IStrategyManager_DeprecatedM1(address(strategyManager)).addStrategiesToDepositWhitelist(strategies); - cheats.prank(eigenLayerPauserReg.unpauser()); - StrategyBaseTVLLimits(address(strategy)).setTVLLimits(type(uint).max, type(uint).max); - } else { - cheats.prank(strategyManager.strategyWhitelister()); - strategyManager.addStrategiesToDepositWhitelist(strategies); - } + cheats.prank(strategyManager.strategyWhitelister()); + strategyManager.addStrategiesToDepositWhitelist(strategies); // Add to lstStrats and allStrats lstStrats.push(strategy); @@ -570,89 +460,6 @@ abstract contract IntegrationDeployer is ExistingDeploymentParser { assertTrue(userTypes.length != 0, "_configRand: no user types selected"); } - /** - * Depending on the forkType, either deploy contracts locally or parse existing contracts - * from network. - * - * Note: for non-LOCAL forktypes, upgrade of contracts will be performed after user initialization. - */ - function _deployOrFetchContracts() internal { - if (forkType == LOCAL) { - _setUpLocal(); - // Set Upgraded as local setup deploys most up to date contracts - isUpgraded = true; - } else if (forkType == MAINNET) { - // cheats.selectFork(mainnetForkId); - string memory deploymentInfoPath = "script/configs/mainnet/mainnet-addresses.config.json"; - _parseDeployedContracts(deploymentInfoPath); - string memory existingDeploymentParams = "script/configs/mainnet.json"; - _parseParamsForIntegrationUpgrade(existingDeploymentParams); - - // Unpause to enable deposits and withdrawals for initializing random user state - cheats.prank(eigenLayerPauserReg.unpauser()); - strategyManager.unpause(0); - - // Add deployed strategies to lstStrats and allStrats - for (uint i; i < deployedStrategyArray.length; i++) { - IStrategy strategy = IStrategy(deployedStrategyArray[i]); - - if (tokensNotTested[address(strategy.underlyingToken())]) { - continue; - } - - // Add to lstStrats and allStrats - lstStrats.push(strategy); - allStrats.push(strategy); - allTokens.push(strategy.underlyingToken()); - } - - // Create time machine and mock beacon chain - timeMachine = new TimeMachine(); - beaconChain = new BeaconChainMock(eigenPodManager, GENESIS_TIME_MAINNET); - } else if (forkType == HOLESKY) { - revert("_deployOrFetchContracts - holesky tests currently broken sorry"); - // // cheats.selectFork(holeskyForkId); - // string memory deploymentInfoPath = "script/configs/holesky/Holesky_current_deployment.config.json"; - // _parseDeployedContracts(deploymentInfoPath); - - // // Add deployed strategies to lstStrats and allStrats - // for (uint i; i < deployedStrategyArray.length; i++) { - // IStrategy strategy = IStrategy(deployedStrategyArray[i]); - - // if (tokensNotTested[address(strategy.underlyingToken())]) { - // continue; - // } - - // // Add to lstStrats and allStrats - // lstStrats.push(strategy); - // allStrats.push(strategy); - // allTokens.push(strategy.underlyingToken()); - // } - - // // Update deposit contract to be a mock - // ethPOSDeposit = new ETHPOSDepositMock(); - // eigenPodImplementation = new EigenPod( - // ethPOSDeposit, - // eigenPodImplementation.delayedWithdrawalRouter(), - // eigenPodImplementation.eigenPodManager(), - // eigenPodImplementation.MAX_RESTAKED_BALANCE_GWEI_PER_VALIDATOR(), - // 0 - // ); - // // Create time machine and set block timestamp forward so we can create EigenPod proofs in the past - // timeMachine = new TimeMachine(); - // beaconChainOracle = new BeaconChainOracleMock(); - // // Create mock beacon chain / proof gen interface - // beaconChain = new BeaconChainMock(timeMachine, beaconChainOracle, eigenPodManager); - - // cheats.startPrank(executorMultisig); - // eigenPodBeacon.upgradeTo(address(eigenPodImplementation)); - // eigenPodManager.updateBeaconChainOracle(beaconChainOracle); - // cheats.stopPrank(); - } else { - revert("_deployOrFetchContracts: unimplemented forkType"); - } - } - /** * @dev Create a new User with a random config using the range defined in `_configRand` * @@ -731,20 +538,6 @@ abstract contract IntegrationDeployer is ExistingDeploymentParser { } else { revert("_randUser: unimplemented userType"); } - } else if (forkType == HOLESKY) { - // User deployment for Holesky is exact same as holesky. - // Current Holesky deployment is up to date and no deprecated interfaces have been added. - - user = new User(name); - - if (userType == DEFAULT) { - user = new User(name); - } else if (userType == ALT_METHODS) { - // User will use nonstandard methods like `depositIntoStrategyWithSignature` - user = User(new User_AltMethods(name)); - } else { - revert("_randUser: unimplemented userType"); - } } else { revert("_randUser: unimplemented forkType"); } @@ -757,8 +550,6 @@ abstract contract IntegrationDeployer is ExistingDeploymentParser { avs = new AVS(name); } else if (forkType == MAINNET) { avs = new AVS(name); - } else if (forkType == HOLESKY) { - avs = new AVS(name); } else { revert("_genRandAVS: unimplemented forkType"); } @@ -837,30 +628,6 @@ abstract contract IntegrationDeployer is ExistingDeploymentParser { return (strategies, tokenBalances); } - /// @dev By default will have a assetType of HOLDS_LST - function _dealRandAssets_M1( - User user - ) internal returns (IStrategy[] memory, uint[] memory) { - // Select a random number of assets - uint numAssets = _randUint({min: 1, max: lstStrats.length}); - - IStrategy[] memory strategies = new IStrategy[](numAssets); - uint[] memory tokenBalances = new uint[](numAssets); - - // For each asset, award the user a random balance of the underlying token - for (uint i = 0; i < numAssets; i++) { - IStrategy strat = lstStrats[i]; - IERC20 underlyingToken = strat.underlyingToken(); - uint balance = _randUint({min: MIN_BALANCE, max: MAX_BALANCE}); - - StdCheats.deal(address(underlyingToken), address(user), balance); - tokenBalances[i] = balance; - strategies[i] = strat; - } - - return (strategies, tokenBalances); - } - /// @dev Uses `random` to return a random uint, with a range given by `min` and `max` (inclusive) /// @return `min` <= result <= `max` function _randUint(uint min, uint max) internal returns (uint) { diff --git a/src/test/integration/mocks/BeaconChainMock.t.sol b/src/test/integration/mocks/BeaconChainMock.t.sol index 414d18b666..5f4fdfcc41 100644 --- a/src/test/integration/mocks/BeaconChainMock.t.sol +++ b/src/test/integration/mocks/BeaconChainMock.t.sol @@ -7,6 +7,7 @@ import "src/contracts/libraries/BeaconChainProofs.sol"; import "src/contracts/libraries/Merkle.sol"; import "src/contracts/pods/EigenPodManager.sol"; +import "src/test/mocks/ETHDepositMock.sol"; import "src/test/integration/mocks/EIP_4788_Oracle_Mock.t.sol"; import "src/test/utils/Logger.t.sol"; @@ -79,6 +80,7 @@ contract BeaconChainMock is Logger { uint64 public nextTimestamp; EigenPodManager eigenPodManager; + IETHPOSDeposit constant DEPOSIT_CONTRACT = IETHPOSDeposit(0x00000000219ab540356cBB839Cbe05303d7705Fa); EIP_4788_Oracle_Mock constant EIP_4788_ORACLE = EIP_4788_Oracle_Mock(0x000F3df6D732807Ef1319fB7B8bB8522d0Beac02); /** @@ -126,6 +128,7 @@ contract BeaconChainMock is Logger { eigenPodManager = _eigenPodManager; // Create mock 4788 oracle + cheats.etch(address(DEPOSIT_CONTRACT), type(ETHPOSDepositMock).runtimeCode); cheats.etch(address(EIP_4788_ORACLE), type(EIP_4788_Oracle_Mock).runtimeCode); // Calculate nodes of empty merkle tree From ec0f505900e2d2d3986e32e559a95a6cb0845c75 Mon Sep 17 00:00:00 2001 From: eigenmikem Date: Tue, 14 Jan 2025 11:10:28 -0500 Subject: [PATCH 05/35] test: non-beacon-chain slashing integration tests (#1010) * Slashing integration tests (#1003) * Validate that users who are slashed fully can redeposit once undelegated * removing arraylib use * test for updating eigenpod state -> slash/undelegate * removing unnecessary logging function * fixing strategy set * beacon chain tests in progress --------- Co-authored-by: Michael * Revert "Slashing integration tests (#1003)" (#1007) This reverts commit e945d8d37b16bef70081f9764d52eab294acd3b0. * integration tests for full eigenlayer slashes * comment re: beacon chain eth partial deposits * fix: fixing 0 withdrawal issues (#1019) * fix: fixing 0 withdrawal issues * style: white space * docs: changing description for test --------- Co-authored-by: Michael * test: withdraw as shares for random subset of strategies fully slashed * style: removing debugging stubs and updating comment --------- Co-authored-by: Michael --- src/test/integration/IntegrationBase.t.sol | 51 +++ ...egate_Allocate_Slash_Queue_Redeposit.t.sol | 341 ++++++++++++++++++ 2 files changed, 392 insertions(+) create mode 100644 src/test/integration/tests/Deposit_Delegate_Allocate_Slash_Queue_Redeposit.t.sol diff --git a/src/test/integration/IntegrationBase.t.sol b/src/test/integration/IntegrationBase.t.sol index eeea43720e..871bdde215 100644 --- a/src/test/integration/IntegrationBase.t.sol +++ b/src/test/integration/IntegrationBase.t.sol @@ -1129,6 +1129,45 @@ abstract contract IntegrationBase is IntegrationDeployer { return (strategies.sort(), wadsToSlash); } + + function _strategiesAndWadsForFullSlash( + OperatorSet memory operatorSet + ) internal view returns (IStrategy[] memory strategies, uint[] memory wadsToSlash) { + // Get list of all strategies in an operator set. + strategies = allocationManager.getStrategiesInOperatorSet(operatorSet); + + wadsToSlash = new uint[](strategies.length); + + for (uint i; i < strategies.length; ++i) { + wadsToSlash[i] = 1 ether; + } + + return(strategies.sort(), wadsToSlash); + } + + function _strategiesAndWadsForRandFullSlash( + OperatorSet memory operatorSet + ) internal returns (IStrategy[] memory strategies, uint[] memory wadsToSlash) { + // Get list of all strategies in an operator set. + strategies = allocationManager.getStrategiesInOperatorSet(operatorSet); + + // Randomly select a subset of strategies to slash. + uint len = _randUint({ min: 1, max: strategies.length-1 }); + + // Update length of strategies array. + assembly { + mstore(strategies, len) + } + + wadsToSlash = new uint[](len); + + // Fully slash each selected strategy + for (uint i; i < len; ++i) { + wadsToSlash[i] = 1 ether; + } + + return (strategies.sort(), wadsToSlash); + } function _randMagnitudes(uint64 sum, uint256 len) internal returns (uint64[] memory magnitudes) { magnitudes = new uint64[](len); @@ -1147,6 +1186,18 @@ abstract contract IntegrationBase is IntegrationDeployer { } } + function _maxMagnitudes(OperatorSet memory operatorSet, User operator) internal view returns (uint64[] memory magnitudes) { + IStrategy[] memory strategies = allocationManager.getStrategiesInOperatorSet(operatorSet); + uint256 len = strategies.length; + magnitudes = new uint64[](len); + + if (len == 0) return magnitudes; + + for (uint256 i; i < len; ++i) { + magnitudes[i] = allocationManager.getMaxMagnitude(address(operator), strategies[i]); + } + } + function _randWithdrawal( IStrategy[] memory strategies, uint[] memory shares diff --git a/src/test/integration/tests/Deposit_Delegate_Allocate_Slash_Queue_Redeposit.t.sol b/src/test/integration/tests/Deposit_Delegate_Allocate_Slash_Queue_Redeposit.t.sol new file mode 100644 index 0000000000..9922805802 --- /dev/null +++ b/src/test/integration/tests/Deposit_Delegate_Allocate_Slash_Queue_Redeposit.t.sol @@ -0,0 +1,341 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.27; + +import "src/test/integration/IntegrationChecks.t.sol"; +import "src/test/integration/users/User.t.sol"; +import {console} from "forge-std/console.sol"; + +contract Integration_Deposit_Delegate_Allocate_Slash_Queue_Redeposit is IntegrationCheckUtils, IDelegationManagerTypes { + + // TODO: Partial deposits don't work when beacon chain eth balance is initialized to < 64 ETH, need to write _newRandomStaker variant that ensures beacon chain ETH balance + // greater than or equal to 64 + function testFuzz_deposit_delegate_allocate_fullSlash_queue_complete_redeposit( + uint24 _random + ) public { + _configRand({_randomSeed: _random, _assetTypes: HOLDS_LST, _userTypes: DEFAULT}); + _upgradeEigenLayerContracts(); + + (User staker, IStrategy[] memory strategies, uint256[] memory tokenBalances) = _newRandomStaker(); + (User operator,,) = _newRandomOperator(); + (AVS avs,) = _newRandomAVS(); + + uint256[] memory tokensToDeposit = new uint256[](tokenBalances.length); + uint256[] memory numTokensRemaining = new uint256[](tokenBalances.length); + for (uint256 i = 0; i < tokenBalances.length; i++) { + tokensToDeposit[i] = tokenBalances[i]/2; + numTokensRemaining[i] = tokenBalances[i] - tokensToDeposit[i]; + } + + uint256[] memory shares = _calculateExpectedShares(strategies, tokensToDeposit); + + // 1. Deposit Into Strategies + staker.depositIntoEigenlayer(strategies, tokensToDeposit); + check_Deposit_State_PartialDeposit(staker, strategies, shares, numTokensRemaining); + + // 2. Delegate to operator + staker.delegateTo(operator); + check_Delegation_State(staker, operator, strategies, shares); + + // Create operator set and register operator + OperatorSet memory operatorSet = avs.createOperatorSet(strategies); + operator.registerForOperatorSet(operatorSet); + + // 3. Allocate to operator set + IAllocationManagerTypes.AllocateParams memory allocateParams = + operator.modifyAllocations(operatorSet, _maxMagnitudes(operatorSet, operator)); + + assert_Snap_Allocations_Modified( + operator, + allocateParams, + false, + "operator allocations should be updated before delay" + ); + + _rollBlocksForCompleteAllocation(operator, operatorSet, strategies); + + assert_Snap_Allocations_Modified( + operator, + allocateParams, + true, + "operator allocations should be updated after delay" + ); + + // 4. Fully slash operator + IAllocationManagerTypes.SlashingParams memory slashingParams; + { + (IStrategy[] memory strategiesToSlash, uint256[] memory wadsToSlash) = + _strategiesAndWadsForFullSlash(operatorSet); + + slashingParams = avs.slashOperator(operator, operatorSet.id, strategiesToSlash, wadsToSlash); + assert_Snap_Allocations_Slashed(slashingParams, operatorSet, true, "operator allocations should be slashed"); + assert_Snap_Unchanged_StakerDepositShares(staker, "staker deposit shares should be unchanged after slashing"); + assert_Snap_StakerWithdrawableShares_AfterSlash(staker, allocateParams, slashingParams, "staker deposit shares should be slashed"); + } + + // 5. Undelegate from an operator + IDelegationManagerTypes.Withdrawal[] memory withdrawals = staker.undelegate(); + bytes32[] memory withdrawalRoots = _getWithdrawalHashes(withdrawals); + + // 6. Complete withdrawal + _rollBlocksForCompleteWithdrawals(withdrawals); + for (uint256 i = 0; i < withdrawals.length; ++i) { + uint256[] memory expectedTokens = + _calculateExpectedTokens(withdrawals[i].strategies, withdrawals[i].scaledShares); + staker.completeWithdrawalAsTokens(withdrawals[i]); + check_Withdrawal_AsTokens_State_AfterSlash(staker, operator, withdrawals[i], allocateParams, slashingParams, expectedTokens); + } + + // 7. Redeposit + shares = _calculateExpectedShares(strategies, numTokensRemaining); + staker.depositIntoEigenlayer(strategies, numTokensRemaining); + check_Deposit_State(staker, strategies, shares); + + // Final state checks + assert_HasExpectedShares(staker, strategies, shares, "staker should have expected shares after redeposit"); + assert_NoWithdrawalsPending(withdrawalRoots, "all withdrawals should be removed from pending"); + } + + function testFuzz_deposit_delegate_allocate_queue_fullSlash_complete_redeposit( + uint24 _random + ) public { + _configRand({_randomSeed: _random, _assetTypes: HOLDS_LST, _userTypes: DEFAULT}); + _upgradeEigenLayerContracts(); + + (User staker, IStrategy[] memory strategies, uint256[] memory tokenBalances) = _newRandomStaker(); + (User operator,,) = _newRandomOperator(); + (AVS avs,) = _newRandomAVS(); + + uint256[] memory tokensToDeposit = new uint256[](tokenBalances.length); + uint256[] memory numTokensRemaining = new uint256[](tokenBalances.length); + for (uint256 i = 0; i < tokenBalances.length; i++) { + tokensToDeposit[i] = tokenBalances[i]/2; + numTokensRemaining[i] = tokenBalances[i] - tokensToDeposit[i]; + } + + uint256[] memory shares = _calculateExpectedShares(strategies, tokensToDeposit); + + // 1. Deposit Into Strategies + staker.depositIntoEigenlayer(strategies, tokensToDeposit); + check_Deposit_State_PartialDeposit(staker, strategies, shares, numTokensRemaining); + + // 2. Delegate to operator + staker.delegateTo(operator); + check_Delegation_State(staker, operator, strategies, shares); + + // Create operator set and register operator + OperatorSet memory operatorSet = avs.createOperatorSet(strategies); + operator.registerForOperatorSet(operatorSet); + + // 3. Allocate to operator set + IAllocationManagerTypes.AllocateParams memory allocateParams = + operator.modifyAllocations(operatorSet, _maxMagnitudes(operatorSet, operator)); + + assert_Snap_Allocations_Modified( + operator, + allocateParams, + false, + "operator allocations should be updated before delay" + ); + + _rollBlocksForCompleteAllocation(operator, operatorSet, strategies); + + assert_Snap_Allocations_Modified( + operator, + allocateParams, + true, + "operator allocations should be updated after delay" + ); + + // 4. Undelegate from an operator + IDelegationManagerTypes.Withdrawal[] memory withdrawals = staker.undelegate(); + bytes32[] memory withdrawalRoots = _getWithdrawalHashes(withdrawals); + + // 5. Fully slash operator + IAllocationManagerTypes.SlashingParams memory slashingParams; + { + (IStrategy[] memory strategiesToSlash, uint256[] memory wadsToSlash) = + _strategiesAndWadsForFullSlash(operatorSet); + + slashingParams = avs.slashOperator(operator, operatorSet.id, strategiesToSlash, wadsToSlash); + assert_Snap_Allocations_Slashed(slashingParams, operatorSet, true, "operator allocations should be slashed"); + assert_Snap_Unchanged_StakerDepositShares(staker, "staker deposit shares should be unchanged after slashing"); + assert_Snap_StakerWithdrawableShares_AfterSlash(staker, allocateParams, slashingParams, "staker deposit shares should be slashed"); + } + + // 6. Complete withdrawal + _rollBlocksForCompleteWithdrawals(withdrawals); + for (uint256 i = 0; i < withdrawals.length; ++i) { + uint256[] memory expectedTokens = + _calculateExpectedTokens(withdrawals[i].strategies, withdrawals[i].scaledShares); + staker.completeWithdrawalAsTokens(withdrawals[i]); + check_Withdrawal_AsTokens_State_AfterSlash(staker, operator, withdrawals[i], allocateParams, slashingParams, expectedTokens); + } + + // 7. Redeposit + shares = _calculateExpectedShares(strategies, numTokensRemaining); + staker.depositIntoEigenlayer(strategies, numTokensRemaining); + check_Deposit_State(staker, strategies, shares); + + // Final state checks + assert_HasExpectedShares(staker, strategies, shares, "staker should have expected shares after redeposit"); + assert_NoWithdrawalsPending(withdrawalRoots, "all withdrawals should be removed from pending"); + } + + function testFuzz_deposit_delegate_allocateMultSets_fullSlash_queue_complete_redeposit( + uint24 _random + ) public { + _configRand({_randomSeed: _random, _assetTypes: HOLDS_LST, _userTypes: DEFAULT}); + _upgradeEigenLayerContracts(); + + (User staker, IStrategy[] memory strategies, uint256[] memory tokenBalances) = _newRandomStaker(); + (User operator,,) = _newRandomOperator(); + (AVS avs,) = _newRandomAVS(); + OperatorSet memory operatorSet; + + uint256[] memory tokensToDeposit = new uint256[](tokenBalances.length); + uint256[] memory numTokensRemaining = new uint256[](tokenBalances.length); + for (uint256 i = 0; i < tokenBalances.length; i++) { + tokensToDeposit[i] = tokenBalances[i]/2; + numTokensRemaining[i] = tokenBalances[i] - tokensToDeposit[i]; + } + + uint256[] memory shares = _calculateExpectedShares(strategies, tokensToDeposit); + + // 1. Deposit Into Strategies + staker.depositIntoEigenlayer(strategies, tokensToDeposit); + check_Deposit_State_PartialDeposit(staker, strategies, shares, numTokensRemaining); + + // 2. Delegate to operator + staker.delegateTo(operator); + check_Delegation_State(staker, operator, strategies, shares); + + // Create operator sets and register operator + { + uint numOpSets = _randUint({min: 2, max: 4}); + OperatorSet[] memory operatorSets = new OperatorSet[](numOpSets); + for (uint i = 0; i < numOpSets; i++){ + operatorSets[i] = avs.createOperatorSet(strategies); + } + operatorSet = operatorSets[_randUint({min: 0, max: numOpSets-1})]; + } + + operator.registerForOperatorSet(operatorSet); + + // 3. Allocate to operator set + IAllocationManagerTypes.AllocateParams memory allocateParams = + operator.modifyAllocations(operatorSet, _maxMagnitudes(operatorSet, operator)); + + assert_Snap_Allocations_Modified( + operator, + allocateParams, + false, + "operator allocations should be updated before delay" + ); + + _rollBlocksForCompleteAllocation(operator, operatorSet, strategies); + + assert_Snap_Allocations_Modified( + operator, + allocateParams, + true, + "operator allocations should be updated after delay" + ); + + // 4. Fully slash operator + IAllocationManagerTypes.SlashingParams memory slashingParams; + { + (IStrategy[] memory strategiesToSlash, uint256[] memory wadsToSlash) = + _strategiesAndWadsForFullSlash(operatorSet); + + slashingParams = avs.slashOperator(operator, operatorSet.id, strategiesToSlash, wadsToSlash); + assert_Snap_Allocations_Slashed(slashingParams, operatorSet, true, "operator allocations should be slashed"); + assert_Snap_Unchanged_StakerDepositShares(staker, "staker deposit shares should be unchanged after slashing"); + assert_Snap_StakerWithdrawableShares_AfterSlash(staker, allocateParams, slashingParams, "staker deposit shares should be slashed"); + } + + // 5. Undelegate from an operator + IDelegationManagerTypes.Withdrawal[] memory withdrawals = staker.undelegate(); + bytes32[] memory withdrawalRoots = _getWithdrawalHashes(withdrawals); + + // 6. Complete withdrawal + _rollBlocksForCompleteWithdrawals(withdrawals); + for (uint256 i = 0; i < withdrawals.length; ++i) { + uint256[] memory expectedTokens = + _calculateExpectedTokens(withdrawals[i].strategies, withdrawals[i].scaledShares); + staker.completeWithdrawalAsTokens(withdrawals[i]); + check_Withdrawal_AsTokens_State_AfterSlash(staker, operator, withdrawals[i], allocateParams, slashingParams, expectedTokens); + } + + // 7. Redeposit + shares = _calculateExpectedShares(strategies, numTokensRemaining); + staker.depositIntoEigenlayer(strategies, numTokensRemaining); + check_Deposit_State(staker, strategies, shares); + + // Final state checks + assert_HasExpectedShares(staker, strategies, shares, "staker should have expected shares after redeposit"); + assert_NoWithdrawalsPending(withdrawalRoots, "all withdrawals should be removed from pending"); + } + + function testFuzz_deposit_delegate_allocate_fullSlash_undelegate_completeAsShares( + uint24 _random + ) public { + _configRand({_randomSeed: _random, _assetTypes: HOLDS_ALL, _userTypes: DEFAULT}); + _upgradeEigenLayerContracts(); // Upgrade contracts if forkType is not local + + (User staker, IStrategy[] memory strategies, uint256[] memory tokenBalances) = _newRandomStaker(); + (User operator,,) = _newRandomOperator(); + (AVS avs,) = _newRandomAVS(); + + + // 1. Deposit Into Strategies + staker.depositIntoEigenlayer(strategies, tokenBalances); + uint256[] memory shares = _calculateExpectedShares(strategies, tokenBalances); + // TODO - post-deposit and post-delegate checks? + + // 2. Delegate to an operator + staker.delegateTo(operator); + + // Create an operator set and register an operator. + OperatorSet memory operatorSet = avs.createOperatorSet(strategies); + operator.registerForOperatorSet(operatorSet); + + // 3. Allocate to operator set. + IAllocationManagerTypes.AllocateParams memory allocateParams = + operator.modifyAllocations(operatorSet, _maxMagnitudes(operatorSet, operator)); + assert_Snap_Allocations_Modified( + operator, allocateParams, false, "operator allocations should be updated before delay" + ); + _rollBlocksForCompleteAllocation(operator, operatorSet, strategies); + assert_Snap_Allocations_Modified( + operator, allocateParams, true, "operator allocations should be updated after delay" + ); + + // 4. Fully slash random proper subset of operators strategies + IAllocationManagerTypes.SlashingParams memory slashingParams; + { + (IStrategy[] memory strategiesToSlash, uint256[] memory wadsToSlash) = + _strategiesAndWadsForRandFullSlash(operatorSet); + slashingParams = avs.slashOperator(operator, operatorSet.id, strategiesToSlash, wadsToSlash); + assert_Snap_Allocations_Slashed(slashingParams, operatorSet, true, "operator allocations should be slashed"); + assert_Snap_Unchanged_StakerDepositShares(staker, "staker deposit shares should be unchanged after slashing"); + assert_Snap_StakerWithdrawableShares_AfterSlash(staker, allocateParams, slashingParams, "staker deposit shares should be slashed"); + } + + // 5. Undelegate from an operator + IDelegationManagerTypes.Withdrawal[] memory withdrawals = staker.undelegate(); + bytes32[] memory withdrawalRoots = _getWithdrawalHashes(withdrawals); + + // 6. Complete withdrawal as shares + // Fast forward to when we can complete the withdrawal + _rollBlocksForCompleteWithdrawals(withdrawals); + + for (uint256 i = 0; i < withdrawals.length; ++i) { + staker.completeWithdrawalAsShares(withdrawals[i]); + check_Withdrawal_AsShares_State_AfterSlash(staker, operator, withdrawals[i], allocateParams, slashingParams); + } + + // Check final state: + assert_HasNoUnderlyingTokenBalance(staker, strategies, "staker not have any underlying tokens"); + assert_NoWithdrawalsPending(withdrawalRoots, "all withdrawals should be removed from pending"); + } +} \ No newline at end of file From 0156d76e3fc525335cc871c5e3b645d1cb5f059f Mon Sep 17 00:00:00 2001 From: Alex <18387287+wadealexc@users.noreply.github.com> Date: Thu, 16 Jan 2025 10:16:04 -0500 Subject: [PATCH 06/35] test: separate upgrade test functionality from main integration tests (#1031) * refactor(test): clean up random config and upgrade tests * test: move test to upgrade tests --- src/test/integration/IntegrationBase.t.sol | 26 +---- src/test/integration/IntegrationChecks.t.sol | 11 -- .../integration/IntegrationDeployer.t.sol | 63 ++++++++--- src/test/integration/UpgradeTest.t.sol | 38 +++++++ .../Delegate_Deposit_Queue_Complete.t.sol | 26 +---- .../tests/Deposit_Delegate_Allocate.t.sol | 86 ++------------ ...egate_Allocate_Slash_Queue_Redeposit.t.sol | 29 +++-- .../Deposit_Delegate_Queue_Complete.t.sol | 54 +-------- ...Deposit_Delegate_Redelegate_Complete.t.sol | 66 ++--------- ...Deposit_Delegate_Undelegate_Complete.t.sol | 49 +------- .../tests/Deposit_Queue_Complete.t.sol | 22 +--- ...it_Register_QueueWithdrawal_Complete.t.sol | 23 +--- .../VerifyWC_StartCP_CompleteCP.t.sol | 88 +++++--------- .../Complete_PreSlashing_Withdrawal.t.sol | 107 ++++++++++++++++++ .../upgrade/Delegate_Upgrade_Allocate.t.sol | 41 +++++++ .../EigenPod_Slashing_Migration.t.sol | 23 ++-- src/test/integration/tests/upgrade/README.md | 45 ++++++++ 17 files changed, 369 insertions(+), 428 deletions(-) create mode 100644 src/test/integration/UpgradeTest.t.sol create mode 100644 src/test/integration/tests/upgrade/Complete_PreSlashing_Withdrawal.t.sol create mode 100644 src/test/integration/tests/upgrade/Delegate_Upgrade_Allocate.t.sol rename src/test/integration/tests/{eigenpod => upgrade}/EigenPod_Slashing_Migration.t.sol (78%) create mode 100644 src/test/integration/tests/upgrade/README.md diff --git a/src/test/integration/IntegrationBase.t.sol b/src/test/integration/IntegrationBase.t.sol index 871bdde215..b0ecefd066 100644 --- a/src/test/integration/IntegrationBase.t.sol +++ b/src/test/integration/IntegrationBase.t.sol @@ -138,31 +138,7 @@ abstract contract IntegrationBase is IntegrationDeployer { return (gweiSent, remainderSent); } - - /// @dev If we're on mainnet, upgrade contracts to slashing and migrate stakers/operators - function _upgradeEigenLayerContracts() internal { - if (forkType == MAINNET) { - require(!isUpgraded, "_upgradeEigenLayerContracts: already performed slashing upgrade"); - - emit log("_upgradeEigenLayerContracts: upgrading mainnet to slashing"); - _upgradeMainnetContracts(); - - // Unpause EigenPodManager - cheats.prank(eigenLayerPauserReg.unpauser()); - eigenPodManager.unpause(0); - - // Bump block.timestamp forward to allow verifyWC proofs for migrated pods - emit log("advancing block time to start of next epoch:"); - - beaconChain.advanceEpoch_NoRewards(); - - emit log("======"); - - isUpgraded = true; - emit log("_upgradeEigenLayerContracts: slashing upgrade complete"); - } - } - + /// @dev Choose a random subset of validators (selects AT LEAST ONE) function _choose(uint40[] memory validators) internal returns (uint40[] memory) { uint rand = _randUint({ min: 1, max: validators.length ** 2 }); diff --git a/src/test/integration/IntegrationChecks.t.sol b/src/test/integration/IntegrationChecks.t.sol index 6229e74e73..973d53d919 100644 --- a/src/test/integration/IntegrationChecks.t.sol +++ b/src/test/integration/IntegrationChecks.t.sol @@ -15,17 +15,6 @@ contract IntegrationCheckUtils is IntegrationBase { EIGENPOD CHECKS *******************************************************************************/ - function check_VerifyWC_State( - User_M2 staker, - uint40[] memory validators, - uint64 beaconBalanceGwei - ) internal { - uint beaconBalanceWei = beaconBalanceGwei * GWEI_TO_WEI; - assert_Snap_Added_Staker_DepositShares(staker, BEACONCHAIN_ETH_STRAT, beaconBalanceWei, "staker should have added deposit shares to beacon chain strat"); - assert_Snap_Added_ActiveValidatorCount(staker, validators.length, "staker should have increased active validator count"); - assert_Snap_Added_ActiveValidators(staker, validators, "validators should each be active"); - } - function check_VerifyWC_State( User staker, uint40[] memory validators, diff --git a/src/test/integration/IntegrationDeployer.t.sol b/src/test/integration/IntegrationDeployer.t.sol index e71cccd1e3..77ef046c64 100644 --- a/src/test/integration/IntegrationDeployer.t.sol +++ b/src/test/integration/IntegrationDeployer.t.sol @@ -78,6 +78,23 @@ abstract contract IntegrationDeployer is ExistingDeploymentParser { // Set only once in setUp, if FORK_MAINNET env is set uint forkType; + /// @dev used to configure randomness and default user/asset types + /// + /// Tests that want alternate user/asset types can still use this modifier, + /// and then configure user/asset types individually using the methods: + /// _configAssetTypes(...) + /// _configUserTypes(...) + /// + /// (Alternatively, this modifier can be overwritten) + modifier rand(uint24 r) virtual { + _configRand({ + _randomSeed: r, + _assetTypes: HOLDS_LST | HOLDS_ETH | HOLDS_ALL, + _userTypes: DEFAULT | ALT_METHODS + }); + _; + } + constructor() { address stETH_Holesky = 0x3F1c547b21f65e10480dE3ad8E19fAAC46C95034; address stETH_Mainnet = 0xae7ab96520DE3A18E5e111B5EaAb095312D7fE84; @@ -91,6 +108,10 @@ abstract contract IntegrationDeployer is ExistingDeploymentParser { tokensNotTested[osETH_Holesky] = true; tokensNotTested[osETH_Mainnet] = true; tokensNotTested[cbETH_Holesky] = true; + + // Use current contracts by default. Upgrade tests are only run with mainnet fork tests + // using the `UpgradeTest.t.sol` mixin. + isUpgraded = true; } function NAME() public view virtual override returns (string memory) { @@ -105,15 +126,7 @@ abstract contract IntegrationDeployer is ExistingDeploymentParser { * Note that forkIds are also created so you can make explicit fork tests using cheats.selectFork(forkId) */ function setUp() public virtual { - isUpgraded = false; - - /** - * env FOUNDRY_PROFILE=forktest forge t --mc Integration - * - * Running foundry like this will trigger the fork test profile, - * lowering fuzz runs and using a remote RPC to test against mainnet state - */ - bool forkMainnet = _hash("forktest") == _hash(cheats.envOr(string("FOUNDRY_PROFILE"), string("default"))); + bool forkMainnet = isForktest(); if (forkMainnet) { forkType = MAINNET; @@ -124,11 +137,19 @@ abstract contract IntegrationDeployer is ExistingDeploymentParser { } } + /** + * env FOUNDRY_PROFILE=forktest forge t --mc Integration + * + * Running foundry like this will trigger the fork test profile, + * lowering fuzz runs and using a remote RPC to test against mainnet state + */ + function isForktest() public view returns (bool) { + return _hash("forktest") == _hash(cheats.envOr(string("FOUNDRY_PROFILE"), string("default"))); + } + /// Deploy EigenLayer locally function _setUpLocal() public virtual { console.log("Setting up `%s` integration tests:", "LOCAL".yellow().bold()); - // Bypass upgrade tests when running locally - isUpgraded = true; // Deploy ProxyAdmin eigenLayerProxyAdmin = new ProxyAdmin(); @@ -203,14 +224,19 @@ abstract contract IntegrationDeployer is ExistingDeploymentParser { allStrats.push(strategy); allTokens.push(strategy.underlyingToken()); } - + // Create time machine and mock beacon chain BEACON_GENESIS_TIME = GENESIS_TIME_MAINNET; timeMachine = new TimeMachine(); beaconChain = new BeaconChainMock(eigenPodManager, BEACON_GENESIS_TIME); + + // Since we haven't done the slashing upgrade on mainnet yet, upgrade mainnet contracts + // prior to test. `isUpgraded` is true by default, but is set to false in `UpgradeTest.t.sol` + if (isUpgraded) { + _upgradeMainnetContracts(); + } } - /// Deploy current implementation contracts and upgrade existing proxies function _upgradeMainnetContracts() public virtual { cheats.startPrank(address(executorMultisig)); @@ -453,10 +479,17 @@ abstract contract IntegrationDeployer is ExistingDeploymentParser { random = _hash(_randomSeed); // Convert flag bitmaps to bytes of set bits for easy use with _randUint - assetTypes = _bitmapToBytes(_assetTypes); - userTypes = _bitmapToBytes(_userTypes); + _configAssetTypes(_assetTypes); + _configUserTypes(_userTypes); + } + function _configAssetTypes(uint _assetTypes) internal { + assetTypes = _bitmapToBytes(_assetTypes); assertTrue(assetTypes.length != 0, "_configRand: no asset types selected"); + } + + function _configUserTypes(uint _userTypes) internal { + userTypes = _bitmapToBytes(_userTypes); assertTrue(userTypes.length != 0, "_configRand: no user types selected"); } diff --git a/src/test/integration/UpgradeTest.t.sol b/src/test/integration/UpgradeTest.t.sol new file mode 100644 index 0000000000..eed86ead6c --- /dev/null +++ b/src/test/integration/UpgradeTest.t.sol @@ -0,0 +1,38 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.27; + +import "src/test/integration/IntegrationDeployer.t.sol"; +import "src/test/integration/IntegrationChecks.t.sol"; + +abstract contract UpgradeTest is IntegrationCheckUtils { + + /// Only run upgrade tests on mainnet forks + function setUp() public virtual override { + if (!isForktest()) { + cheats.skip(true); + } else { + isUpgraded = false; + super.setUp(); + } + } + + /// Deploy current implementation contracts and upgrade existing proxies + function _upgradeEigenLayerContracts() public virtual { + require(forkType == MAINNET, "_upgradeEigenLayerContracts: somehow running upgrade test locally"); + require(!isUpgraded, "_upgradeEigenLayerContracts: already performed upgrade"); + + emit log("_upgradeEigenLayerContracts: upgrading mainnet to slashing"); + + _upgradeMainnetContracts(); + + // Bump block.timestamp forward to allow verifyWC proofs for migrated pods + emit log("advancing block time to start of next epoch:"); + + beaconChain.advanceEpoch_NoRewards(); + + emit log("======"); + + isUpgraded = true; + emit log("_upgradeEigenLayerContracts: slashing upgrade complete"); + } +} \ No newline at end of file diff --git a/src/test/integration/tests/Delegate_Deposit_Queue_Complete.t.sol b/src/test/integration/tests/Delegate_Deposit_Queue_Complete.t.sol index 0ef86e4b04..ad4fe205eb 100644 --- a/src/test/integration/tests/Delegate_Deposit_Queue_Complete.t.sol +++ b/src/test/integration/tests/Delegate_Deposit_Queue_Complete.t.sol @@ -5,13 +5,8 @@ import "src/test/integration/IntegrationChecks.t.sol"; import "src/test/integration/users/User.t.sol"; contract Integration_Delegate_Deposit_Queue_Complete is IntegrationCheckUtils { - function testFuzz_delegate_deposit_queue_completeAsShares(uint24 _random) public { - // Configure the random parameters for the test - _configRand({ - _randomSeed: _random, - _assetTypes: HOLDS_LST | HOLDS_ETH | HOLDS_ALL, - _userTypes: DEFAULT | ALT_METHODS - }); + + function testFuzz_delegate_deposit_queue_completeAsShares(uint24 _random) public rand(_random) { // Create a staker and an operator with a nonzero balance and corresponding strategies (User staker, IStrategy[] memory strategies, uint[] memory tokenBalances) = _newRandomStaker(); (User operator, ,) = _newRandomOperator(); @@ -33,9 +28,6 @@ contract Integration_Delegate_Deposit_Queue_Complete is IntegrationCheckUtils { bytes32[] memory withdrawalRoots = _getWithdrawalHashes(withdrawals); check_QueuedWithdrawal_State(staker, operator, strategies, shares, withdrawals, withdrawalRoots); - // Upgrade contracts if forkType is not local - _upgradeEigenLayerContracts(); - // 4. Complete Queued Withdrawal _rollBlocksForCompleteWithdrawals(withdrawals); for (uint i = 0; i < withdrawals.length; i++) { @@ -44,14 +36,7 @@ contract Integration_Delegate_Deposit_Queue_Complete is IntegrationCheckUtils { } } - function testFuzz_delegate_deposit_queue_completeAsTokens(uint24 _random) public { - // Configure the random parameters for the test - _configRand({ - _randomSeed: _random, - _assetTypes: HOLDS_LST | HOLDS_ETH | HOLDS_ALL, - _userTypes: DEFAULT | ALT_METHODS - }); - + function testFuzz_delegate_deposit_queue_completeAsTokens(uint24 _random) public rand(_random) { // Create a staker and an operator with a nonzero balance and corresponding strategies (User staker, IStrategy[] memory strategies, uint[] memory tokenBalances) = _newRandomStaker(); (User operator, ,) = _newRandomOperator(); @@ -63,6 +48,7 @@ contract Integration_Delegate_Deposit_Queue_Complete is IntegrationCheckUtils { // 2. Deposit into strategy staker.depositIntoEigenlayer(strategies, tokenBalances); uint[] memory shares = _calculateExpectedShares(strategies, tokenBalances); + uint[] memory expectedTokens = _calculateExpectedTokens(strategies, shares); // Check that the deposit increased operator shares the staker is delegated to check_Deposit_State(staker, strategies, shares); @@ -73,13 +59,9 @@ contract Integration_Delegate_Deposit_Queue_Complete is IntegrationCheckUtils { bytes32[] memory withdrawalRoots = _getWithdrawalHashes(withdrawals); check_QueuedWithdrawal_State(staker, operator, strategies, shares, withdrawals, withdrawalRoots); - // Upgrade contracts if forkType is not local - _upgradeEigenLayerContracts(); - // 4. Complete Queued Withdrawal _rollBlocksForCompleteWithdrawals(withdrawals); for (uint i = 0; i < withdrawals.length; i++) { - uint[] memory expectedTokens = _calculateExpectedTokens(strategies, shares); IERC20[] memory tokens = staker.completeWithdrawalAsTokens(withdrawals[i]); check_Withdrawal_AsTokens_State(staker, operator, withdrawals[i], strategies, shares, tokens, expectedTokens); } diff --git a/src/test/integration/tests/Deposit_Delegate_Allocate.t.sol b/src/test/integration/tests/Deposit_Delegate_Allocate.t.sol index 03f9ede012..85f3f6f9fc 100644 --- a/src/test/integration/tests/Deposit_Delegate_Allocate.t.sol +++ b/src/test/integration/tests/Deposit_Delegate_Allocate.t.sol @@ -4,20 +4,8 @@ pragma solidity ^0.8.27; import "src/test/integration/IntegrationChecks.t.sol"; import "src/test/integration/users/User.t.sol"; -// TODO: move randomness from tests - contract Integration_Deposit_Delegate_Allocate is IntegrationCheckUtils { - function testFuzz_deposit_delegate_allocate( - uint24 _random - ) public { - // Configure the random parameters for the test - _configRand({ - _randomSeed: _random, - _assetTypes: HOLDS_LST | HOLDS_ETH | HOLDS_ALL, - _userTypes: DEFAULT | ALT_METHODS - }); - _upgradeEigenLayerContracts(); // Upgrade contracts if forkType is not local - + function testFuzz_deposit_delegate_allocate(uint24 _random) public rand(_random) { (User staker, IStrategy[] memory strategies, uint256[] memory tokenBalances) = _newRandomStaker(); (User operator,,) = _newRandomOperator(); (AVS avs,) = _newRandomAVS(); @@ -44,54 +32,9 @@ contract Integration_Deposit_Delegate_Allocate is IntegrationCheckUtils { ); } - function testFuzz_deposit_delegate_upgrade_allocate( - uint24 _random - ) public { - // Configure the random parameters for the test - _configRand({ - _randomSeed: _random, - _assetTypes: HOLDS_LST | HOLDS_ETH | HOLDS_ALL, - _userTypes: DEFAULT | ALT_METHODS - }); - - (User staker, IStrategy[] memory strategies, uint256[] memory tokenBalances) = _newRandomStaker(); - (User operator,,) = _newRandomOperator(); - - // 1. Deposit Into Strategies - staker.depositIntoEigenlayer(strategies, tokenBalances); - - // 2. Delegate to an operator - staker.delegateTo(operator); - - _upgradeEigenLayerContracts(); // Upgrade contracts if forkType is not local - (AVS avs,) = _newRandomAVS(); - - // 3. Set allocation delay for operator - operator.setAllocationDelay(1); - rollForward({blocks: ALLOCATION_CONFIGURATION_DELAY}); - - // 4. Create an operator set and register an operator. - OperatorSet memory operatorSet = avs.createOperatorSet(strategies); - operator.registerForOperatorSet(operatorSet); - - // 5. Allocate to operator set. - IAllocationManagerTypes.AllocateParams memory allocateParams = - operator.modifyAllocations(operatorSet, _randMagnitudes({sum: 1 ether, len: strategies.length})); - assert_Snap_Allocations_Modified( - operator, allocateParams, false, "operator allocations should be updated before delay" - ); - _rollBlocksForCompleteAllocation(operator, operatorSet, strategies); - assert_Snap_Allocations_Modified( - operator, allocateParams, true, "operator allocations should be updated after delay" - ); - } - function testFuzz_deposit_delegate_allocate_slash_undelegate_completeAsTokens( uint24 _random - ) public { - _configRand({_randomSeed: _random, _assetTypes: HOLDS_ALL, _userTypes: DEFAULT}); - _upgradeEigenLayerContracts(); // Upgrade contracts if forkType is not local - + ) public rand(_random) { (User staker, IStrategy[] memory strategies, uint256[] memory tokenBalances) = _newRandomStaker(); (User operator,,) = _newRandomOperator(); (AVS avs,) = _newRandomAVS(); @@ -155,10 +98,7 @@ contract Integration_Deposit_Delegate_Allocate is IntegrationCheckUtils { function testFuzz_deposit_delegate_allocate_slash_undelegate_completeAsShares( uint24 _random - ) public { - _configRand({_randomSeed: _random, _assetTypes: HOLDS_ALL, _userTypes: DEFAULT}); - _upgradeEigenLayerContracts(); // Upgrade contracts if forkType is not local - + ) public rand(_random) { (User staker, IStrategy[] memory strategies, uint256[] memory tokenBalances) = _newRandomStaker(); (User operator,,) = _newRandomOperator(); (AVS avs,) = _newRandomAVS(); @@ -217,10 +157,7 @@ contract Integration_Deposit_Delegate_Allocate is IntegrationCheckUtils { function testFuzz_deposit_delegate_allocate_queue_slash_completeAsTokens( uint24 _random - ) public { - _configRand({_randomSeed: _random, _assetTypes: HOLDS_ALL, _userTypes: DEFAULT}); - _upgradeEigenLayerContracts(); // Upgrade contracts if forkType is not local - + ) public rand(_random) { (User staker, IStrategy[] memory strategies, uint256[] memory tokenBalances) = _newRandomStaker(); (User operator,,) = _newRandomOperator(); (AVS avs,) = _newRandomAVS(); @@ -286,10 +223,7 @@ contract Integration_Deposit_Delegate_Allocate is IntegrationCheckUtils { function testFuzz_deposit_delegate_allocate_queue_slash_completeAsShares( uint24 _random - ) public { - _configRand({_randomSeed: _random, _assetTypes: HOLDS_ALL, _userTypes: DEFAULT}); - _upgradeEigenLayerContracts(); // Upgrade contracts if forkType is not local - + ) public rand(_random) { (User staker, IStrategy[] memory strategies, uint256[] memory tokenBalances) = _newRandomStaker(); (User operator,,) = _newRandomOperator(); (AVS avs,) = _newRandomAVS(); @@ -347,10 +281,7 @@ contract Integration_Deposit_Delegate_Allocate is IntegrationCheckUtils { function testFuzz_deposit_delegate_allocate_deallocate_slash_queue_completeAsTokens( uint24 _random - ) public { - _configRand({_randomSeed: _random, _assetTypes: HOLDS_ALL, _userTypes: DEFAULT}); - _upgradeEigenLayerContracts(); // Upgrade contracts if forkType is not local - + ) public rand(_random) { (User staker, IStrategy[] memory strategies, uint256[] memory tokenBalances) = _newRandomStaker(); (User operator,,) = _newRandomOperator(); (AVS avs,) = _newRandomAVS(); @@ -420,10 +351,7 @@ contract Integration_Deposit_Delegate_Allocate is IntegrationCheckUtils { function testFuzz_deposit_delegate_allocate_deregister_slash( uint24 _random - ) public { - _configRand({_randomSeed: _random, _assetTypes: HOLDS_ALL, _userTypes: DEFAULT}); - _upgradeEigenLayerContracts(); // Upgrade contracts if forkType is not local - + ) public rand(_random) { (User staker, IStrategy[] memory strategies, uint256[] memory tokenBalances) = _newRandomStaker(); (User operator,,) = _newRandomOperator(); (AVS avs,) = _newRandomAVS(); diff --git a/src/test/integration/tests/Deposit_Delegate_Allocate_Slash_Queue_Redeposit.t.sol b/src/test/integration/tests/Deposit_Delegate_Allocate_Slash_Queue_Redeposit.t.sol index 9922805802..3ea423dfc8 100644 --- a/src/test/integration/tests/Deposit_Delegate_Allocate_Slash_Queue_Redeposit.t.sol +++ b/src/test/integration/tests/Deposit_Delegate_Allocate_Slash_Queue_Redeposit.t.sol @@ -9,12 +9,18 @@ contract Integration_Deposit_Delegate_Allocate_Slash_Queue_Redeposit is Integrat // TODO: Partial deposits don't work when beacon chain eth balance is initialized to < 64 ETH, need to write _newRandomStaker variant that ensures beacon chain ETH balance // greater than or equal to 64 + modifier rand(uint24 r) override { + _configRand({ + _randomSeed: r, + _assetTypes: HOLDS_LST, + _userTypes: DEFAULT + }); + _; + } + function testFuzz_deposit_delegate_allocate_fullSlash_queue_complete_redeposit( uint24 _random - ) public { - _configRand({_randomSeed: _random, _assetTypes: HOLDS_LST, _userTypes: DEFAULT}); - _upgradeEigenLayerContracts(); - + ) public rand(_random) { (User staker, IStrategy[] memory strategies, uint256[] memory tokenBalances) = _newRandomStaker(); (User operator,,) = _newRandomOperator(); (AVS avs,) = _newRandomAVS(); @@ -97,10 +103,7 @@ contract Integration_Deposit_Delegate_Allocate_Slash_Queue_Redeposit is Integrat function testFuzz_deposit_delegate_allocate_queue_fullSlash_complete_redeposit( uint24 _random - ) public { - _configRand({_randomSeed: _random, _assetTypes: HOLDS_LST, _userTypes: DEFAULT}); - _upgradeEigenLayerContracts(); - + ) public rand(_random) { (User staker, IStrategy[] memory strategies, uint256[] memory tokenBalances) = _newRandomStaker(); (User operator,,) = _newRandomOperator(); (AVS avs,) = _newRandomAVS(); @@ -183,10 +186,7 @@ contract Integration_Deposit_Delegate_Allocate_Slash_Queue_Redeposit is Integrat function testFuzz_deposit_delegate_allocateMultSets_fullSlash_queue_complete_redeposit( uint24 _random - ) public { - _configRand({_randomSeed: _random, _assetTypes: HOLDS_LST, _userTypes: DEFAULT}); - _upgradeEigenLayerContracts(); - + ) public rand(_random) { (User staker, IStrategy[] memory strategies, uint256[] memory tokenBalances) = _newRandomStaker(); (User operator,,) = _newRandomOperator(); (AVS avs,) = _newRandomAVS(); @@ -278,9 +278,8 @@ contract Integration_Deposit_Delegate_Allocate_Slash_Queue_Redeposit is Integrat function testFuzz_deposit_delegate_allocate_fullSlash_undelegate_completeAsShares( uint24 _random - ) public { - _configRand({_randomSeed: _random, _assetTypes: HOLDS_ALL, _userTypes: DEFAULT}); - _upgradeEigenLayerContracts(); // Upgrade contracts if forkType is not local + ) public rand(_random) { + _configAssetTypes(HOLDS_ALL); (User staker, IStrategy[] memory strategies, uint256[] memory tokenBalances) = _newRandomStaker(); (User operator,,) = _newRandomOperator(); diff --git a/src/test/integration/tests/Deposit_Delegate_Queue_Complete.t.sol b/src/test/integration/tests/Deposit_Delegate_Queue_Complete.t.sol index 8c2c4e086c..c1184a8d46 100644 --- a/src/test/integration/tests/Deposit_Delegate_Queue_Complete.t.sol +++ b/src/test/integration/tests/Deposit_Delegate_Queue_Complete.t.sol @@ -16,14 +16,7 @@ contract Integration_Deposit_Delegate_Queue_Complete is IntegrationCheckUtils { /// 2. delegates to an operator /// 3. queues a withdrawal for a ALL shares /// 4. completes the queued withdrawal as tokens - function testFuzz_deposit_delegate_queue_completeAsTokens(uint24 _random) public { - // When new Users are created, they will choose a random configuration from these params: - _configRand({ - _randomSeed: _random, - _assetTypes: HOLDS_LST | HOLDS_ETH | HOLDS_ALL, - _userTypes: DEFAULT | ALT_METHODS - }); - + function testFuzz_deposit_delegate_queue_completeAsTokens(uint24 _random) public rand(_random) { /// 0. Create an operator and a staker with: // - some nonzero underlying token balances // - corresponding to a random subset of valid strategies (StrategyManager and/or EigenPodManager) @@ -35,8 +28,6 @@ contract Integration_Deposit_Delegate_Queue_Complete is IntegrationCheckUtils { uint[] memory tokenBalances ) = _newRandomStaker(); (User operator, ,) = _newRandomOperator(); - // Upgrade contracts if forkType is not local - _upgradeEigenLayerContracts(); uint[] memory shares = _calculateExpectedShares(strategies, tokenBalances); @@ -78,14 +69,7 @@ contract Integration_Deposit_Delegate_Queue_Complete is IntegrationCheckUtils { /// 2. delegates to an operator /// 3. queues a withdrawal for a ALL shares /// 4. completes the queued withdrawal as shares - function testFuzz_deposit_delegate_queue_completeAsShares(uint24 _random) public { - // When new Users are created, they will choose a random configuration from these params: - _configRand({ - _randomSeed: _random, - _assetTypes: HOLDS_LST | HOLDS_ETH | HOLDS_ALL, - _userTypes: DEFAULT | ALT_METHODS - }); - + function testFuzz_deposit_delegate_queue_completeAsShares(uint24 _random) public rand(_random) { /// 0. Create an operator and a staker with: // - some nonzero underlying token balances // - corresponding to a random subset of valid strategies (StrategyManager and/or EigenPodManager) @@ -97,8 +81,6 @@ contract Integration_Deposit_Delegate_Queue_Complete is IntegrationCheckUtils { uint[] memory tokenBalances ) = _newRandomStaker(); (User operator, ,) = _newRandomOperator(); - // Upgrade contracts if forkType is not local - _upgradeEigenLayerContracts(); uint[] memory shares = _calculateExpectedShares(strategies, tokenBalances); @@ -143,14 +125,7 @@ contract Integration_Deposit_Delegate_Queue_Complete is IntegrationCheckUtils { /// 2. delegates to an operator /// 3. queues a withdrawal for a random subset of shares /// 4. completes the queued withdrawal as tokens - function testFuzz_deposit_delegate_queueRand_completeAsTokens(uint24 _random) public { - // When new Users are created, they will choose a random configuration from these params: - _configRand({ - _randomSeed: _random, - _assetTypes: HOLDS_LST | HOLDS_ETH | HOLDS_ALL, - _userTypes: DEFAULT | ALT_METHODS - }); - + function testFuzz_deposit_delegate_queueRand_completeAsTokens(uint24 _random) public rand(_random) { /// 0. Create an operator and a staker with: // - some nonzero underlying token balances // - corresponding to a random subset of valid strategies (StrategyManager and/or EigenPodManager) @@ -162,8 +137,6 @@ contract Integration_Deposit_Delegate_Queue_Complete is IntegrationCheckUtils { uint[] memory tokenBalances ) = _newRandomStaker(); (User operator, ,) = _newRandomOperator(); - // Upgrade contracts if forkType is not local - _upgradeEigenLayerContracts(); uint[] memory shares = _calculateExpectedShares(strategies, tokenBalances); @@ -208,14 +181,7 @@ contract Integration_Deposit_Delegate_Queue_Complete is IntegrationCheckUtils { /// 2. delegates to an operator /// 3. queues a withdrawal for a random subset of shares /// 4. completes the queued withdrawal as shares - function testFuzz_deposit_delegate_queueRand_completeAsShares(uint24 _random) public { - // When new Users are created, they will choose a random configuration from these params: - _configRand({ - _randomSeed: _random, - _assetTypes: HOLDS_LST | HOLDS_ETH | HOLDS_ALL, - _userTypes: DEFAULT | ALT_METHODS - }); - + function testFuzz_deposit_delegate_queueRand_completeAsShares(uint24 _random) public rand(_random) { /// 0. Create an operator and a staker with: // - some nonzero underlying token balances // - corresponding to a random subset of valid strategies (StrategyManager and/or EigenPodManager) @@ -227,8 +193,6 @@ contract Integration_Deposit_Delegate_Queue_Complete is IntegrationCheckUtils { uint[] memory tokenBalances ) = _newRandomStaker(); (User operator, ,) = _newRandomOperator(); - // Upgrade contracts if forkType is not local - _upgradeEigenLayerContracts(); uint[] memory shares = _calculateExpectedShares(strategies, tokenBalances); @@ -280,12 +244,8 @@ contract Integration_Deposit_Delegate_Queue_Complete is IntegrationCheckUtils { /// 2. delegates to an operator /// /// ... we check that the final step fails - function testFuzz_deposit_delegate_revert_alreadyDelegated(uint24 _random) public { - _configRand({ - _randomSeed: _random, - _assetTypes: NO_ASSETS | HOLDS_LST | HOLDS_ETH | HOLDS_ALL, - _userTypes: DEFAULT | ALT_METHODS - }); + function testFuzz_deposit_delegate_revert_alreadyDelegated(uint24 _random) public rand(_random) { + _configAssetTypes(NO_ASSETS | HOLDS_LST | HOLDS_ETH | HOLDS_ALL); /// 0. Create a staker and operator ( @@ -294,8 +254,6 @@ contract Integration_Deposit_Delegate_Queue_Complete is IntegrationCheckUtils { uint[] memory tokenBalances ) = _newRandomStaker(); (User operator, ,) = _newRandomOperator(); - // Upgrade contracts if forkType is not local - _upgradeEigenLayerContracts(); uint[] memory shares = _calculateExpectedShares(strategies, tokenBalances); diff --git a/src/test/integration/tests/Deposit_Delegate_Redelegate_Complete.t.sol b/src/test/integration/tests/Deposit_Delegate_Redelegate_Complete.t.sol index 7825645917..9936fce413 100644 --- a/src/test/integration/tests/Deposit_Delegate_Redelegate_Complete.t.sol +++ b/src/test/integration/tests/Deposit_Delegate_Redelegate_Complete.t.sol @@ -13,14 +13,7 @@ contract Integration_Deposit_Delegate_Redelegate_Complete is IntegrationCheckUti /// 5. delegate to a new operator /// 5. queueWithdrawal /// 7. complete their queued withdrawal as tokens - function testFuzz_deposit_delegate_reDelegate_completeAsTokens(uint24 _random) public { - // When new Users are created, they will choose a random configuration from these params: - _configRand({ - _randomSeed: _random, - _assetTypes: HOLDS_LST | HOLDS_ETH | HOLDS_ALL, - _userTypes: DEFAULT | ALT_METHODS - }); - + function testFuzz_deposit_delegate_reDelegate_completeAsTokens(uint24 _random) public rand(_random) { /// 0. Create an operator and a staker with: // - some nonzero underlying token balances // - corresponding to a random number of strategies @@ -34,8 +27,6 @@ contract Integration_Deposit_Delegate_Redelegate_Complete is IntegrationCheckUti ) = _newRandomStaker(); (User operator1, ,) = _newRandomOperator(); (User operator2, ,) = _newRandomOperator(); - // Upgrade contracts if forkType is not local - _upgradeEigenLayerContracts(); uint[] memory shares = _calculateExpectedShares(strategies, tokenBalances); @@ -85,14 +76,7 @@ contract Integration_Deposit_Delegate_Redelegate_Complete is IntegrationCheckUti } } - function testFuzz_deposit_delegate_reDelegate_completeAsShares(uint24 _random) public { - // When new Users are created, they will choose a random configuration from these params: - _configRand({ - _randomSeed: _random, - _assetTypes: HOLDS_LST | HOLDS_ETH | HOLDS_ALL, - _userTypes: DEFAULT | ALT_METHODS - }); - + function testFuzz_deposit_delegate_reDelegate_completeAsShares(uint24 _random) public rand(_random) { /// 0. Create an operator and a staker with: // - some nonzero underlying token balances // - corresponding to a random number of strategies @@ -106,8 +90,6 @@ contract Integration_Deposit_Delegate_Redelegate_Complete is IntegrationCheckUti ) = _newRandomStaker(); (User operator1, ,) = _newRandomOperator(); (User operator2, ,) = _newRandomOperator(); - // Upgrade contracts if forkType is not local - _upgradeEigenLayerContracts(); uint[] memory shares = _calculateExpectedShares(strategies, tokenBalances); @@ -170,13 +152,8 @@ contract Integration_Deposit_Delegate_Redelegate_Complete is IntegrationCheckUti ); } - function testFuzz_deposit_delegate_reDelegate_depositAfterRedelegate(uint24 _random) public { - // When new Users are created, they will choose a random configuration from these params: - _configRand({ - _randomSeed: _random, - _assetTypes: HOLDS_LST, // not holding ETH since we can only deposit 32 ETH multiples - _userTypes: DEFAULT | ALT_METHODS - }); + function testFuzz_deposit_delegate_reDelegate_depositAfterRedelegate(uint24 _random) public rand(_random) { + _configAssetTypes(HOLDS_LST); // not holding ETH since we can only deposit 32 ETH multiples /// 0. Create an operator and a staker with: // - some nonzero underlying token balances @@ -191,8 +168,6 @@ contract Integration_Deposit_Delegate_Redelegate_Complete is IntegrationCheckUti ) = _newRandomStaker(); (User operator1, ,) = _newRandomOperator(); (User operator2, ,) = _newRandomOperator(); - // Upgrade contracts if forkType is not local - _upgradeEigenLayerContracts(); uint[] memory shares = _calculateExpectedShares(strategies, tokenBalances); @@ -262,13 +237,8 @@ contract Integration_Deposit_Delegate_Redelegate_Complete is IntegrationCheckUti } } - function testFuzz_deposit_delegate_reDelegate_depositBeforeRedelegate(uint24 _random) public { - // When new Users are created, they will choose a random configuration from these params: - _configRand({ - _randomSeed: _random, - _assetTypes: HOLDS_LST, // not holding ETH since we can only deposit 32 ETH multiples - _userTypes: DEFAULT | ALT_METHODS - }); + function testFuzz_deposit_delegate_reDelegate_depositBeforeRedelegate(uint24 _random) public rand(_random) { + _configAssetTypes(HOLDS_LST); // not holding ETH since we can only deposit 32 ETH multiples /// 0. Create an operator and a staker with: // - some nonzero underlying token balances @@ -283,8 +253,6 @@ contract Integration_Deposit_Delegate_Redelegate_Complete is IntegrationCheckUti ) = _newRandomStaker(); (User operator1, ,) = _newRandomOperator(); (User operator2, ,) = _newRandomOperator(); - // Upgrade contracts if forkType is not local - _upgradeEigenLayerContracts(); uint[] memory shares = _calculateExpectedShares(strategies, tokenBalances); @@ -354,14 +322,7 @@ contract Integration_Deposit_Delegate_Redelegate_Complete is IntegrationCheckUti } } - function testFuzz_deposit_delegate_undelegate_withdrawAsTokens_reDelegate_completeAsTokens(uint24 _random) public { - // When new Users are created, they will choose a random configuration from these params: - _configRand({ - _randomSeed: _random, - _assetTypes: HOLDS_LST | HOLDS_ETH | HOLDS_ALL, - _userTypes: DEFAULT | ALT_METHODS - }); - + function testFuzz_deposit_delegate_undelegate_withdrawAsTokens_reDelegate_completeAsTokens(uint24 _random) public rand(_random) { /// 0. Create operators and a staker ( User staker, @@ -370,8 +331,6 @@ contract Integration_Deposit_Delegate_Redelegate_Complete is IntegrationCheckUti ) = _newRandomStaker(); (User operator1, ,) = _newRandomOperator(); (User operator2, ,) = _newRandomOperator(); - // Upgrade contracts if forkType is not local - _upgradeEigenLayerContracts(); uint[] memory shares = _calculateExpectedShares(strategies, tokenBalances); @@ -428,14 +387,7 @@ contract Integration_Deposit_Delegate_Redelegate_Complete is IntegrationCheckUti } } - function testFuzz_deposit_delegate_undelegate_withdrawAsTokens_reDelegate_completeAsShares(uint24 _random) public { - // When new Users are created, they will choose a random configuration from these params: - _configRand({ - _randomSeed: _random, - _assetTypes: HOLDS_LST | HOLDS_ETH | HOLDS_ALL, - _userTypes: DEFAULT | ALT_METHODS - }); - + function testFuzz_deposit_delegate_undelegate_withdrawAsTokens_reDelegate_completeAsShares(uint24 _random) public rand(_random) { /// 0. Create operators and a staker ( User staker, @@ -444,8 +396,6 @@ contract Integration_Deposit_Delegate_Redelegate_Complete is IntegrationCheckUti ) = _newRandomStaker(); (User operator1, ,) = _newRandomOperator(); (User operator2, ,) = _newRandomOperator(); - // Upgrade contracts if forkType is not local - _upgradeEigenLayerContracts(); uint[] memory shares = _calculateExpectedShares(strategies, tokenBalances); diff --git a/src/test/integration/tests/Deposit_Delegate_Undelegate_Complete.t.sol b/src/test/integration/tests/Deposit_Delegate_Undelegate_Complete.t.sol index ab157f0ced..41b61cff31 100644 --- a/src/test/integration/tests/Deposit_Delegate_Undelegate_Complete.t.sol +++ b/src/test/integration/tests/Deposit_Delegate_Undelegate_Complete.t.sol @@ -10,14 +10,7 @@ contract Integration_Deposit_Delegate_Undelegate_Complete is IntegrationCheckUti /// 2. delegate to an operator /// 3. undelegates from the operator /// 4. complete their queued withdrawal as tokens - function testFuzz_deposit_undelegate_completeAsTokens(uint24 _random) public { - // When new Users are created, they will choose a random configuration from these params: - _configRand({ - _randomSeed: _random, - _assetTypes: HOLDS_LST | HOLDS_ETH | HOLDS_ALL, - _userTypes: DEFAULT | ALT_METHODS - }); - + function testFuzz_deposit_undelegate_completeAsTokens(uint24 _random) public rand(_random) { /// 0. Create an operator and a staker with: // - some nonzero underlying token balances // - corresponding to a random number of strategies @@ -30,8 +23,6 @@ contract Integration_Deposit_Delegate_Undelegate_Complete is IntegrationCheckUti uint[] memory tokenBalances ) = _newRandomStaker(); (User operator, ,) = _newRandomOperator(); - // Upgrade contracts if forkType is not local - _upgradeEigenLayerContracts(); uint[] memory shares = _calculateExpectedShares(strategies, tokenBalances); @@ -73,14 +64,7 @@ contract Integration_Deposit_Delegate_Undelegate_Complete is IntegrationCheckUti /// 2. delegate to an operator /// 3. undelegates from the operator /// 4. complete their queued withdrawal as shares - function testFuzz_deposit_undelegate_completeAsShares(uint24 _random) public { - // When new Users are created, they will choose a random configuration from these params: - _configRand({ - _randomSeed: _random, - _assetTypes: HOLDS_LST | HOLDS_ETH | HOLDS_ALL, - _userTypes: DEFAULT | ALT_METHODS - }); - + function testFuzz_deposit_undelegate_completeAsShares(uint24 _random) public rand(_random) { /// 0. Create an operator and a staker with: // - some nonzero underlying token balances // - corresponding to a random number of strategies @@ -93,8 +77,6 @@ contract Integration_Deposit_Delegate_Undelegate_Complete is IntegrationCheckUti uint[] memory tokenBalances ) = _newRandomStaker(); (User operator, ,) = _newRandomOperator(); - // Upgrade contracts if forkType is not local - _upgradeEigenLayerContracts(); uint[] memory shares = _calculateExpectedShares(strategies, tokenBalances); @@ -129,14 +111,7 @@ contract Integration_Deposit_Delegate_Undelegate_Complete is IntegrationCheckUti assert_NoWithdrawalsPending(withdrawalRoots, "all withdrawals should be removed from pending"); } - function testFuzz_deposit_delegate_forceUndelegate_completeAsTokens(uint24 _random) public { - // When new Users are created, they will choose a random configuration from these params: - _configRand({ - _randomSeed: _random, - _assetTypes: HOLDS_LST | HOLDS_ETH | HOLDS_ALL, - _userTypes: DEFAULT | ALT_METHODS - }); - + function testFuzz_deposit_delegate_forceUndelegate_completeAsTokens(uint24 _random) public rand(_random) { /// 0. Create an operator and a staker with: // - some nonzero underlying token balances // - corresponding to a random number of strategies @@ -149,8 +124,6 @@ contract Integration_Deposit_Delegate_Undelegate_Complete is IntegrationCheckUti uint[] memory tokenBalances ) = _newRandomStaker(); (User operator, ,) = _newRandomOperator(); - // Upgrade contracts if forkType is not local - _upgradeEigenLayerContracts(); uint[] memory shares = _calculateExpectedShares(strategies, tokenBalances); @@ -186,14 +159,7 @@ contract Integration_Deposit_Delegate_Undelegate_Complete is IntegrationCheckUti assert_NoWithdrawalsPending(withdrawalRoots, "all withdrawals should be removed from pending"); } - function testFuzz_deposit_delegate_forceUndelegate_completeAsShares(uint24 _random) public { - // When new Users are created, they will choose a random configuration from these params: - _configRand({ - _randomSeed: _random, - _assetTypes: HOLDS_LST | HOLDS_ETH | HOLDS_ALL, - _userTypes: DEFAULT | ALT_METHODS - }); - + function testFuzz_deposit_delegate_forceUndelegate_completeAsShares(uint24 _random) public rand(_random) { /// 0. Create an operator and a staker with: // - some nonzero underlying token balances // - corresponding to a random number of strategies @@ -206,8 +172,6 @@ contract Integration_Deposit_Delegate_Undelegate_Complete is IntegrationCheckUti uint[] memory tokenBalances ) = _newRandomStaker(); (User operator, ,) = _newRandomOperator(); - // Upgrade contracts if forkType is not local - _upgradeEigenLayerContracts(); uint[] memory shares = _calculateExpectedShares(strategies, tokenBalances); @@ -243,9 +207,8 @@ contract Integration_Deposit_Delegate_Undelegate_Complete is IntegrationCheckUti function testFuzz_deposit_delegate_undelegate_completeAsTokens_Max_Strategies( uint24 _random - ) public { - _configRand({_randomSeed: _random, _assetTypes: HOLDS_MAX, _userTypes: DEFAULT}); - _upgradeEigenLayerContracts(); // Upgrade contracts if forkType is not local + ) public rand(_random) { + _configAssetTypes(HOLDS_MAX); (User staker, IStrategy[] memory strategies, uint256[] memory tokenBalances) = _newRandomStaker(); (User operator,,) = _newRandomOperator(); diff --git a/src/test/integration/tests/Deposit_Queue_Complete.t.sol b/src/test/integration/tests/Deposit_Queue_Complete.t.sol index 748b2bfa24..c119c7e1ba 100644 --- a/src/test/integration/tests/Deposit_Queue_Complete.t.sol +++ b/src/test/integration/tests/Deposit_Queue_Complete.t.sol @@ -9,18 +9,9 @@ contract Integration_Deposit_QueueWithdrawal_Complete is IntegrationCheckUtils { /// 1. deposit into strategy /// 2. queueWithdrawal /// 3. completeQueuedWithdrawal" - function testFuzz_deposit_queueWithdrawal_completeAsTokens(uint24 _random) public { - // Configure the random parameters for the test - _configRand({ - _randomSeed: _random, - _assetTypes: HOLDS_LST | HOLDS_ETH | HOLDS_ALL, - _userTypes: DEFAULT | ALT_METHODS - }); - + function testFuzz_deposit_queueWithdrawal_completeAsTokens(uint24 _random) public rand(_random) { // Create a staker with a nonzero balance and corresponding strategies (User staker, IStrategy[] memory strategies, uint[] memory tokenBalances) = _newRandomStaker(); - // Upgrade contracts if forkType is not local - _upgradeEigenLayerContracts(); // 1. Deposit into strategy staker.depositIntoEigenlayer(strategies, tokenBalances); @@ -45,18 +36,9 @@ contract Integration_Deposit_QueueWithdrawal_Complete is IntegrationCheckUtils { assertFalse(delegationManager.isDelegated(address(staker)), "Staker should still not be delegated after withdrawal"); } - function testFuzz_deposit_queueWithdrawal_completeAsShares(uint24 _random) public { - // Configure the random parameters for the test - _configRand({ - _randomSeed: _random, - _assetTypes: HOLDS_LST | HOLDS_ETH | HOLDS_ALL, - _userTypes: DEFAULT | ALT_METHODS - }); - + function testFuzz_deposit_queueWithdrawal_completeAsShares(uint24 _random) public rand(_random) { // Create a staker with a nonzero balance and corresponding strategies (User staker, IStrategy[] memory strategies, uint[] memory tokenBalances) = _newRandomStaker(); - // Upgrade contracts if forkType is not local - _upgradeEigenLayerContracts(); // 1. Deposit into strategy staker.depositIntoEigenlayer(strategies, tokenBalances); diff --git a/src/test/integration/tests/Deposit_Register_QueueWithdrawal_Complete.t.sol b/src/test/integration/tests/Deposit_Register_QueueWithdrawal_Complete.t.sol index b0482c8551..1875cf0b27 100644 --- a/src/test/integration/tests/Deposit_Register_QueueWithdrawal_Complete.t.sol +++ b/src/test/integration/tests/Deposit_Register_QueueWithdrawal_Complete.t.sol @@ -5,18 +5,9 @@ import "src/test/integration/users/User.t.sol"; import "src/test/integration/IntegrationChecks.t.sol"; contract Integration_Deposit_Register_QueueWithdrawal_Complete is IntegrationCheckUtils { - function testFuzz_deposit_registerOperator_queueWithdrawal_completeAsShares(uint24 _random) public { - // Configure the random parameters for the test - _configRand({ - _randomSeed: _random, - _assetTypes: HOLDS_LST | HOLDS_ETH | HOLDS_ALL, - _userTypes: DEFAULT | ALT_METHODS - }); - + function testFuzz_deposit_registerOperator_queueWithdrawal_completeAsShares(uint24 _random) public rand(_random) { // Create a staker with a nonzero balance and corresponding strategies (User staker, IStrategy[] memory strategies, uint[] memory tokenBalances) = _newRandomStaker(); - // Upgrade contracts if forkType is not local - _upgradeEigenLayerContracts(); // 1. Staker deposits into strategy staker.depositIntoEigenlayer(strategies, tokenBalances); @@ -40,19 +31,9 @@ contract Integration_Deposit_Register_QueueWithdrawal_Complete is IntegrationChe } } - function testFuzz_deposit_registerOperator_queueWithdrawal_completeAsTokens(uint24 _random) public { - // Configure the random parameters for the test - _configRand({ - _randomSeed: _random, - _assetTypes: HOLDS_LST | HOLDS_ETH | HOLDS_ALL, - _userTypes: DEFAULT | ALT_METHODS - }); - + function testFuzz_deposit_registerOperator_queueWithdrawal_completeAsTokens(uint24 _random) public rand(_random) { // Create a staker with a nonzero balance and corresponding strategies (User staker, IStrategy[] memory strategies, uint[] memory tokenBalances) = _newRandomStaker(); - // Upgrade contracts if forkType is not local - _upgradeEigenLayerContracts(); - // 1. Staker deposits into strategy staker.depositIntoEigenlayer(strategies, tokenBalances); uint[] memory shares = _calculateExpectedShares(strategies, tokenBalances); diff --git a/src/test/integration/tests/eigenpod/VerifyWC_StartCP_CompleteCP.t.sol b/src/test/integration/tests/eigenpod/VerifyWC_StartCP_CompleteCP.t.sol index 2c425d3a5d..90374d679a 100644 --- a/src/test/integration/tests/eigenpod/VerifyWC_StartCP_CompleteCP.t.sol +++ b/src/test/integration/tests/eigenpod/VerifyWC_StartCP_CompleteCP.t.sol @@ -6,19 +6,18 @@ import "src/test/integration/users/User.t.sol"; contract Integration_VerifyWC_StartCP_CompleteCP is IntegrationCheckUtils { - modifier r(uint24 _rand) { + modifier rand(uint24 r) override { _configRand({ - _randomSeed: _rand, + _randomSeed: r, _assetTypes: HOLDS_ETH, _userTypes: DEFAULT }); - _; } - function test_GasMetering() public r(0) { + function test_GasMetering() public rand(0) { (User staker, ,) = _newRandomStaker(); - _upgradeEigenLayerContracts(); + // Deal user 20 full stakers worth of ETH emit log_named_string("Dealing 20 * 32 ETH to", staker.NAME()); cheats.deal(address(staker), 32 ether * 20); @@ -81,9 +80,8 @@ contract Integration_VerifyWC_StartCP_CompleteCP is IntegrationCheckUtils { /// 2. start a checkpoint /// 3. complete a checkpoint /// => no change in shares between 1 and 3 - function test_VerifyWC_StartCP_CompleteCP(uint24 _rand) public r(_rand) { + function test_VerifyWC_StartCP_CompleteCP(uint24 _rand) public rand(_rand) { (User staker, ,) = _newRandomStaker(); - _upgradeEigenLayerContracts(); (uint40[] memory validators, uint64 beaconBalanceGwei) = staker.startValidators(); beaconChain.advanceEpoch_NoRewards(); @@ -101,9 +99,8 @@ contract Integration_VerifyWC_StartCP_CompleteCP is IntegrationCheckUtils { /// 1. Verify validators' withdrawal credentials /// 2. Verify validators' withdrawal credentials again /// => This should fail - function test_VerifyWC_VerifyWC_Fails(uint24 _rand) public r(_rand) { + function test_VerifyWC_VerifyWC_Fails(uint24 _rand) public rand(_rand) { (User staker, ,) = _newRandomStaker(); - _upgradeEigenLayerContracts(); (uint40[] memory validators, uint64 beaconBalanceGwei) = staker.startValidators(); beaconChain.advanceEpoch_NoRewards(); @@ -119,9 +116,8 @@ contract Integration_VerifyWC_StartCP_CompleteCP is IntegrationCheckUtils { /// 2. start a checkpoint /// 3. start a checkpoint again /// => This should fail - function test_VerifyWC_StartCP_StartCP_Fails(uint24 _rand) public r(_rand) { + function test_VerifyWC_StartCP_StartCP_Fails(uint24 _rand) public rand(_rand) { (User staker, ,) = _newRandomStaker(); - _upgradeEigenLayerContracts(); (uint40[] memory validators, uint64 beaconBalanceGwei) = staker.startValidators(); beaconChain.advanceEpoch_NoRewards(); @@ -141,9 +137,8 @@ contract Integration_VerifyWC_StartCP_CompleteCP is IntegrationCheckUtils { /// 3. complete a checkpoint /// 4. start a checkpoint without advancing a block /// => this should fail - function test_VerifyWC_StartCP_CompleteCP_StartCP_Fails(uint24 _rand) public r(_rand) { + function test_VerifyWC_StartCP_CompleteCP_StartCP_Fails(uint24 _rand) public rand(_rand) { (User staker, ,) = _newRandomStaker(); - _upgradeEigenLayerContracts(); (uint40[] memory validators, uint64 beaconBalanceGwei) = staker.startValidators(); beaconChain.advanceEpoch_NoRewards(); @@ -166,9 +161,8 @@ contract Integration_VerifyWC_StartCP_CompleteCP is IntegrationCheckUtils { /// 2. start a checkpoint /// 3. complete a checkpoint /// => no change in shares between 1 and 3 - function test_VerifyWC_Advance_StartCP_CompleteCP(uint24 _rand) public r(_rand) { + function test_VerifyWC_Advance_StartCP_CompleteCP(uint24 _rand) public rand(_rand) { (User staker, ,) = _newRandomStaker(); - _upgradeEigenLayerContracts(); (uint40[] memory validators, uint64 beaconBalanceGwei) = staker.startValidators(); beaconChain.advanceEpoch_NoRewards(); @@ -191,9 +185,8 @@ contract Integration_VerifyWC_StartCP_CompleteCP is IntegrationCheckUtils { /// -- move forward 1 or more epochs /// 3. complete a checkpoint /// => no change in shares between 1 and 3 - function test_VerifyWC_StartCP_Advance_CompleteCP(uint24 _rand) public r(_rand) { + function test_VerifyWC_StartCP_Advance_CompleteCP(uint24 _rand) public rand(_rand) { (User staker, ,) = _newRandomStaker(); - _upgradeEigenLayerContracts(); (uint40[] memory validators, uint64 beaconBalanceGwei) = staker.startValidators(); beaconChain.advanceEpoch_NoRewards(); @@ -219,9 +212,8 @@ contract Integration_VerifyWC_StartCP_CompleteCP is IntegrationCheckUtils { /// -- Fully exit validators before verifying withdrawal credentials /// 1. Verify validators' withdrawal credentials /// => This should fail - function test_ExitValidators_VerifyWC_Fails(uint24 _rand) public r(_rand) { + function test_ExitValidators_VerifyWC_Fails(uint24 _rand) public rand(_rand) { (User staker, ,) = _newRandomStaker(); - _upgradeEigenLayerContracts(); (uint40[] memory validators, ) = staker.startValidators(); staker.exitValidators(validators); @@ -236,9 +228,8 @@ contract Integration_VerifyWC_StartCP_CompleteCP is IntegrationCheckUtils { /// 2. start a checkpoint /// 3. complete a checkpoint /// => no change in shares between 1 and 3 - function test_VerifyWC_ExitValidators_StartCP_CompleteCP(uint24 _rand) public r(_rand) { + function test_VerifyWC_ExitValidators_StartCP_CompleteCP(uint24 _rand) public rand(_rand) { (User staker, ,) = _newRandomStaker(); - _upgradeEigenLayerContracts(); (uint40[] memory validators, uint64 beaconBalanceGwei) = staker.startValidators(); beaconChain.advanceEpoch_NoRewards(); @@ -267,9 +258,8 @@ contract Integration_VerifyWC_StartCP_CompleteCP is IntegrationCheckUtils { /// 4. start a checkpoint /// 5. complete a checkpoint /// => exited balance should be reflected in 4 and 5 - function test_VerifyWC_StartCP_ExitValidators_CompleteCP(uint24 _rand) public r(_rand) { + function test_VerifyWC_StartCP_ExitValidators_CompleteCP(uint24 _rand) public rand(_rand) { (User staker, ,) = _newRandomStaker(); - _upgradeEigenLayerContracts(); (uint40[] memory validators, uint64 beaconBalanceGwei) = staker.startValidators(); beaconChain.advanceEpoch_NoRewards(); @@ -303,9 +293,8 @@ contract Integration_VerifyWC_StartCP_CompleteCP is IntegrationCheckUtils { /// -- get slashed on beacon chain /// 1. Try to verify validators' withdrawal credentials /// => this should fail - function test_SlashToPod_VerifyWC_Fails(uint24 _rand) public r(_rand) { + function test_SlashToPod_VerifyWC_Fails(uint24 _rand) public rand(_rand) { (User staker, ,) = _newRandomStaker(); - _upgradeEigenLayerContracts(); (uint40[] memory validators, ) = staker.startValidators(); beaconChain.slashValidators(validators); @@ -321,9 +310,8 @@ contract Integration_VerifyWC_StartCP_CompleteCP is IntegrationCheckUtils { /// 2. start a checkpoint /// 3. complete a checkpoint /// => after 3, shares should decrease by slashed amount - function test_VerifyWC_SlashToPod_StartCP_CompleteCP(uint24 _rand) public r(_rand) { + function test_VerifyWC_SlashToPod_StartCP_CompleteCP(uint24 _rand) public rand(_rand) { (User staker, ,) = _newRandomStaker(); - _upgradeEigenLayerContracts(); (uint40[] memory validators, uint64 beaconBalanceGwei) = staker.startValidators(); // Advance epoch without generating rewards @@ -351,9 +339,8 @@ contract Integration_VerifyWC_StartCP_CompleteCP is IntegrationCheckUtils { /// 4. start a checkpoint /// 5. complete a checkpoint /// => slashed balance should be reflected in 4 and 5 - function test_VerifyWC_StartCP_SlashToPod_CompleteCP(uint24 _rand) public r(_rand) { + function test_VerifyWC_StartCP_SlashToPod_CompleteCP(uint24 _rand) public rand(_rand) { (User staker, ,) = _newRandomStaker(); - _upgradeEigenLayerContracts(); (uint40[] memory validators, uint64 beaconBalanceGwei) = staker.startValidators(); // Advance epoch without generating rewards @@ -384,9 +371,8 @@ contract Integration_VerifyWC_StartCP_CompleteCP is IntegrationCheckUtils { /// 4. verify withdrawal credentials for another validator while checkpoint in progress /// 5. complete a checkpoint /// => Increase in shares between 1 and 4 should reflect the new validator, less the slashed amount - function test_VerifyWC_Slash_StartCP_VerifyWC_CompleteCP(uint24 _rand) public r(_rand) { + function test_VerifyWC_Slash_StartCP_VerifyWC_CompleteCP(uint24 _rand) public rand(_rand) { (User staker, ,) = _newRandomStaker(); - _upgradeEigenLayerContracts(); (uint40[] memory validators, uint64 beaconBalanceGwei) = staker.startValidators(); beaconChain.advanceEpoch_NoRewards(); @@ -422,9 +408,8 @@ contract Integration_VerifyWC_StartCP_CompleteCP is IntegrationCheckUtils { /// 2. start a checkpoint /// 3. complete a checkpoint /// => after 3, shares should decrease by slashed amount - function test_VerifyWC_SlashToPod_VerifyStale_CompleteCP(uint24 _rand) public r(_rand) { + function test_VerifyWC_SlashToPod_VerifyStale_CompleteCP(uint24 _rand) public rand(_rand) { (User staker, ,) = _newRandomStaker(); - _upgradeEigenLayerContracts(); (uint40[] memory validators, uint64 beaconBalanceGwei) = staker.startValidators(); // Advance epoch without generating rewards @@ -448,9 +433,8 @@ contract Integration_VerifyWC_StartCP_CompleteCP is IntegrationCheckUtils { /// 2. start a checkpoint /// 3. complete a checkpoint /// => after 3, shares should decrease by slashed amount - function test_VerifyWC_SlashToCL_VerifyStale_CompleteCP_SlashAgain(uint24 _rand) public r(_rand) { + function test_VerifyWC_SlashToCL_VerifyStale_CompleteCP_SlashAgain(uint24 _rand) public rand(_rand) { (User staker, ,) = _newRandomStaker(); - _upgradeEigenLayerContracts(); (uint40[] memory validators, uint64 beaconBalanceGwei) = staker.startValidators(); // Advance epoch without generating rewards @@ -489,9 +473,8 @@ contract Integration_VerifyWC_StartCP_CompleteCP is IntegrationCheckUtils { /// 4. start a checkpoint /// 5. complete a checkpoint /// => slashed balance should be reflected in 4 and 5 - function test_VerifyWC_StartCP_SlashToPod_CompleteCP_VerifyStale(uint24 _rand) public r(_rand) { + function test_VerifyWC_StartCP_SlashToPod_CompleteCP_VerifyStale(uint24 _rand) public rand(_rand) { (User staker, ,) = _newRandomStaker(); - _upgradeEigenLayerContracts(); (uint40[] memory validators, uint64 beaconBalanceGwei) = staker.startValidators(); // Advance epoch without generating rewards @@ -526,9 +509,8 @@ contract Integration_VerifyWC_StartCP_CompleteCP is IntegrationCheckUtils { /// 2. start a checkpoint /// 3. complete a checkpoint /// => after 3, shares increase by rewards earned on beacon chain - function test_EarnOnBeacon_VerifyWC_StartCP_CompleteCP(uint24 _rand) public r(_rand) { + function test_EarnOnBeacon_VerifyWC_StartCP_CompleteCP(uint24 _rand) public rand(_rand) { (User staker, ,) = _newRandomStaker(); - _upgradeEigenLayerContracts(); (uint40[] memory validators, uint64 beaconBalanceGwei) = staker.startValidators(); // Advance epoch and generate consensus rewards, but don't withdraw to pod @@ -550,9 +532,8 @@ contract Integration_VerifyWC_StartCP_CompleteCP is IntegrationCheckUtils { /// 2. start a checkpoint /// 3. complete a checkpoint /// => after 3, shares increase by rewards earned on beacon chain - function test_VerifyWC_EarnOnBeacon_StartCP_CompleteCP(uint24 _rand) public r(_rand) { + function test_VerifyWC_EarnOnBeacon_StartCP_CompleteCP(uint24 _rand) public rand(_rand) { (User staker, ,) = _newRandomStaker(); - _upgradeEigenLayerContracts(); (uint40[] memory validators, uint64 beaconBalanceGwei) = staker.startValidators(); beaconChain.advanceEpoch_NoRewards(); @@ -576,9 +557,8 @@ contract Integration_VerifyWC_StartCP_CompleteCP is IntegrationCheckUtils { /// -- earn rewards on beacon chain (not withdrawn to pod) /// 3. complete a checkpoint /// => no change in shares between 1 and 3 - function test_VerifyWC_StartCP_EarnOnBeacon_CompleteCP(uint24 _rand) public r(_rand) { + function test_VerifyWC_StartCP_EarnOnBeacon_CompleteCP(uint24 _rand) public rand(_rand) { (User staker, ,) = _newRandomStaker(); - _upgradeEigenLayerContracts(); (uint40[] memory validators, uint64 beaconBalanceGwei) = staker.startValidators(); beaconChain.advanceEpoch_NoRewards(); @@ -606,9 +586,8 @@ contract Integration_VerifyWC_StartCP_CompleteCP is IntegrationCheckUtils { /// 2. start a checkpoint /// 3. complete a checkpoint /// => after 3, shares increase by rewards withdrawn to pod - function test_EarnToPod_VerifyWC_StartCP_CompleteCP(uint24 _rand) public r(_rand) { + function test_EarnToPod_VerifyWC_StartCP_CompleteCP(uint24 _rand) public rand(_rand) { (User staker, ,) = _newRandomStaker(); - _upgradeEigenLayerContracts(); (uint40[] memory validators, uint64 beaconBalanceGwei) = staker.startValidators(); // Advance epoch, generating consensus rewards and withdrawing anything over 32 ETH @@ -630,9 +609,8 @@ contract Integration_VerifyWC_StartCP_CompleteCP is IntegrationCheckUtils { /// 2. start a checkpoint /// 3. complete a checkpoint /// => after 3, shares increase by rewards withdrawn to pod - function test_VerifyWC_EarnToPod_StartCP_CompleteCP(uint24 _rand) public r(_rand) { + function test_VerifyWC_EarnToPod_StartCP_CompleteCP(uint24 _rand) public rand(_rand) { (User staker, ,) = _newRandomStaker(); - _upgradeEigenLayerContracts(); (uint40[] memory validators, uint64 beaconBalanceGwei) = staker.startValidators(); beaconChain.advanceEpoch_NoRewards(); @@ -656,9 +634,8 @@ contract Integration_VerifyWC_StartCP_CompleteCP is IntegrationCheckUtils { /// -- earn rewards on beacon chain (withdrawn to pod) /// 3. complete a checkpoint /// => no change in shares between 1 and 3 - function test_VerifyWC_StartCP_EarnToPod_CompleteCP(uint24 _rand) public r(_rand) { + function test_VerifyWC_StartCP_EarnToPod_CompleteCP(uint24 _rand) public rand(_rand) { (User staker, ,) = _newRandomStaker(); - _upgradeEigenLayerContracts(); (uint40[] memory validators, uint64 beaconBalanceGwei) = staker.startValidators(); beaconChain.advanceEpoch_NoRewards(); @@ -689,9 +666,9 @@ contract Integration_VerifyWC_StartCP_CompleteCP is IntegrationCheckUtils { /// -- Pod receives native ETH via fallback /// 1. start a checkpoint /// => checkpoint should auto-complete, awarding shares for ETH in pod - function test_NativeETH_StartCP(uint24 _rand) public r(_rand) { + function test_NativeETH_StartCP(uint24 _rand) public rand(_rand) { (User staker, ,) = _newRandomStaker(); - _upgradeEigenLayerContracts(); + // Send a random amount of ETH to staker's fallback (uint64 gweiSent, ) = _sendRandomETH(address(staker.pod())); @@ -708,9 +685,8 @@ contract Integration_VerifyWC_StartCP_CompleteCP is IntegrationCheckUtils { /// 2. start a checkpoint /// 3. complete a checkpoint /// => after 3, shares should account for native ETH - function test_NativeETH_VerifyWC_StartCP_CompleteCP(uint24 _rand) public r(_rand) { + function test_NativeETH_VerifyWC_StartCP_CompleteCP(uint24 _rand) public rand(_rand) { (User staker, ,) = _newRandomStaker(); - _upgradeEigenLayerContracts(); (uint40[] memory validators, uint64 beaconBalanceGwei) = staker.startValidators(); beaconChain.advanceEpoch_NoRewards(); @@ -736,9 +712,8 @@ contract Integration_VerifyWC_StartCP_CompleteCP is IntegrationCheckUtils { /// 2. start a checkpoint /// 3. complete a checkpoint /// => after 3, shares should account for native ETH - function test_VerifyWC_NativeETH_StartCP_CompleteCP(uint24 _rand) public r(_rand) { + function test_VerifyWC_NativeETH_StartCP_CompleteCP(uint24 _rand) public rand(_rand) { (User staker, ,) = _newRandomStaker(); - _upgradeEigenLayerContracts(); (uint40[] memory validators, uint64 beaconBalanceGwei) = staker.startValidators(); beaconChain.advanceEpoch_NoRewards(); @@ -764,9 +739,8 @@ contract Integration_VerifyWC_StartCP_CompleteCP is IntegrationCheckUtils { /// -- Pod receives native ETH via fallback /// 3. complete a checkpoint /// => no change in shares between 1 and 3 - function test_VerifyWC_StartCP_NativeETH_CompleteCP(uint24 _rand) public r(_rand) { + function test_VerifyWC_StartCP_NativeETH_CompleteCP(uint24 _rand) public rand(_rand) { (User staker, ,) = _newRandomStaker(); - _upgradeEigenLayerContracts(); (uint40[] memory validators, uint64 beaconBalanceGwei) = staker.startValidators(); beaconChain.advanceEpoch_NoRewards(); diff --git a/src/test/integration/tests/upgrade/Complete_PreSlashing_Withdrawal.t.sol b/src/test/integration/tests/upgrade/Complete_PreSlashing_Withdrawal.t.sol new file mode 100644 index 0000000000..f161a3d9d0 --- /dev/null +++ b/src/test/integration/tests/upgrade/Complete_PreSlashing_Withdrawal.t.sol @@ -0,0 +1,107 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.27; + +import "src/test/integration/UpgradeTest.t.sol"; + +contract Integration_Upgrade_Complete_PreSlashing_Withdrawal is UpgradeTest { + + function testFuzz_deposit_queue_upgrade_completeAsShares(uint24 _random) public rand(_random) { + /// Pre-upgrade: + /// 1. Create staker with some assets + /// 2. Staker deposits into EigenLayer + /// 3. Staker queues a withdrawal + (User staker, IStrategy[] memory strategies, uint[] memory tokenBalances) = _newRandomStaker(); + User operator = User(payable(0)); + + staker.depositIntoEigenlayer(strategies, tokenBalances); + uint[] memory shares = _calculateExpectedShares(strategies, tokenBalances); + IDelegationManagerTypes.Withdrawal[] memory withdrawals = staker.queueWithdrawals(strategies, shares); + + /// Upgrade to slashing contracts + _upgradeEigenLayerContracts(); + + // Complete pre-slashing withdrawals as shares + _rollBlocksForCompleteWithdrawals(withdrawals); + for (uint i = 0; i < withdrawals.length; i++) { + staker.completeWithdrawalAsShares(withdrawals[i]); + check_Withdrawal_AsShares_State(staker, operator, withdrawals[i], strategies, shares); + } + } + + function testFuzz_delegate_deposit_queue_completeAsShares(uint24 _random) public rand(_random) { + /// Pre-upgrade: + /// 1. Create staker and operator with some asset amounts + /// 2. Staker delegates to operator + /// 3. Staker deposits into EigenLayer + /// 4. Staker queues a withdrawal + (User staker, IStrategy[] memory strategies, uint[] memory tokenBalances) = _newRandomStaker(); + (User operator, ,) = _newRandomOperator(); + + staker.delegateTo(operator); + staker.depositIntoEigenlayer(strategies, tokenBalances); + uint[] memory shares = _calculateExpectedShares(strategies, tokenBalances); + IDelegationManagerTypes.Withdrawal[] memory withdrawals = staker.queueWithdrawals(strategies, shares); + + /// Upgrade to slashing contracts + _upgradeEigenLayerContracts(); + + // Complete pre-slashing withdrawals as shares + _rollBlocksForCompleteWithdrawals(withdrawals); + for (uint i = 0; i < withdrawals.length; i++) { + staker.completeWithdrawalAsShares(withdrawals[i]); + check_Withdrawal_AsShares_State(staker, operator, withdrawals[i], strategies, shares); + } + } + + function testFuzz_deposit_queue_upgrade_completeAsTokens(uint24 _random) public rand(_random) { + /// Pre-upgrade: + /// 1. Create staker with some assets + /// 2. Staker deposits into EigenLayer + /// 3. Staker queues a withdrawal + (User staker, IStrategy[] memory strategies, uint[] memory tokenBalances) = _newRandomStaker(); + User operator = User(payable(0)); + + staker.depositIntoEigenlayer(strategies, tokenBalances); + uint[] memory shares = _calculateExpectedShares(strategies, tokenBalances); + uint[] memory expectedTokens = _calculateExpectedTokens(strategies, shares); + IDelegationManagerTypes.Withdrawal[] memory withdrawals = staker.queueWithdrawals(strategies, shares); + + /// Upgrade to slashing contracts + _upgradeEigenLayerContracts(); + + // Complete pre-slashing withdrawals as tokens + _rollBlocksForCompleteWithdrawals(withdrawals); + for (uint i = 0; i < withdrawals.length; i++) { + IERC20[] memory tokens = staker.completeWithdrawalAsTokens(withdrawals[i]); + check_Withdrawal_AsTokens_State(staker, operator, withdrawals[i], strategies, shares, tokens, expectedTokens); + } + } + + function testFuzz_delegate_deposit_queue_completeAsTokens(uint24 _random) public rand(_random) { + /// Pre-upgrade: + /// 1. Create staker and operator with some asset amounts + /// 2. Staker delegates to operator + /// 3. Staker deposits into EigenLayer + /// 4. Staker queues a withdrawal + (User staker, IStrategy[] memory strategies, uint[] memory tokenBalances) = _newRandomStaker(); + (User operator, ,) = _newRandomOperator(); + + staker.delegateTo(operator); + staker.depositIntoEigenlayer(strategies, tokenBalances); + uint[] memory shares = _calculateExpectedShares(strategies, tokenBalances); + uint[] memory expectedTokens = _calculateExpectedTokens(strategies, shares); + IDelegationManagerTypes.Withdrawal[] memory withdrawals = staker.queueWithdrawals(strategies, shares); + + /// Upgrade to slashing contracts + _upgradeEigenLayerContracts(); + + // Complete pre-slashing withdrawals as tokens + _rollBlocksForCompleteWithdrawals(withdrawals); + for (uint i = 0; i < withdrawals.length; i++) { + IERC20[] memory tokens = staker.completeWithdrawalAsTokens(withdrawals[i]); + check_Withdrawal_AsTokens_State(staker, operator, withdrawals[i], strategies, shares, tokens, expectedTokens); + } + } + + /// TODO - complete pre-upgrade withdrawal after earliest possible operator slashing +} diff --git a/src/test/integration/tests/upgrade/Delegate_Upgrade_Allocate.t.sol b/src/test/integration/tests/upgrade/Delegate_Upgrade_Allocate.t.sol new file mode 100644 index 0000000000..6c9ee61c65 --- /dev/null +++ b/src/test/integration/tests/upgrade/Delegate_Upgrade_Allocate.t.sol @@ -0,0 +1,41 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.27; + +import "src/test/integration/UpgradeTest.t.sol"; + +contract Integration_Upgrade_Deposit_Delegate_Allocate is UpgradeTest { + + function testFuzz_deposit_delegate_upgrade_allocate(uint24 _random) public rand(_random) { + (User staker, IStrategy[] memory strategies, uint256[] memory tokenBalances) = _newRandomStaker(); + (User operator,,) = _newRandomOperator(); + + // Pre-upgrade: + // 1. Create staker and operator with assets, then deposit into EigenLayer + // 2. Delegate to operator + staker.depositIntoEigenlayer(strategies, tokenBalances); + staker.delegateTo(operator); + + // Upgrade to slashing release + _upgradeEigenLayerContracts(); + (AVS avs,) = _newRandomAVS(); + + // 3. Set allocation delay for operator + operator.setAllocationDelay(1); + rollForward({blocks: ALLOCATION_CONFIGURATION_DELAY}); + + // 4. Create an operator set and register an operator. + OperatorSet memory operatorSet = avs.createOperatorSet(strategies); + operator.registerForOperatorSet(operatorSet); + + // 5. Allocate to operator set. + IAllocationManagerTypes.AllocateParams memory allocateParams = + operator.modifyAllocations(operatorSet, _randMagnitudes({sum: 1 ether, len: strategies.length})); + assert_Snap_Allocations_Modified( + operator, allocateParams, false, "operator allocations should be updated before delay" + ); + _rollBlocksForCompleteAllocation(operator, operatorSet, strategies); + assert_Snap_Allocations_Modified( + operator, allocateParams, true, "operator allocations should be updated after delay" + ); + } +} \ No newline at end of file diff --git a/src/test/integration/tests/eigenpod/EigenPod_Slashing_Migration.t.sol b/src/test/integration/tests/upgrade/EigenPod_Slashing_Migration.t.sol similarity index 78% rename from src/test/integration/tests/eigenpod/EigenPod_Slashing_Migration.t.sol rename to src/test/integration/tests/upgrade/EigenPod_Slashing_Migration.t.sol index 79a29826ca..47bb30b470 100644 --- a/src/test/integration/tests/eigenpod/EigenPod_Slashing_Migration.t.sol +++ b/src/test/integration/tests/upgrade/EigenPod_Slashing_Migration.t.sol @@ -1,17 +1,16 @@ // SPDX-License-Identifier: BUSL-1.1 pragma solidity ^0.8.27; -import "src/test/integration/IntegrationChecks.t.sol"; -import "src/test/integration/users/User.t.sol"; +import "src/test/integration/UpgradeTest.t.sol"; -contract Integration_EigenPod_Slashing_Migration is IntegrationCheckUtils, EigenPodPausingConstants { - modifier r(uint24 _rand) { +contract Integration_Upgrade_EigenPod_Slashing_Migration is UpgradeTest, EigenPodPausingConstants { + + modifier rand(uint24 _rand) override { _configRand({ _randomSeed: _rand, _assetTypes: HOLDS_ETH, _userTypes: DEFAULT }); - _; } @@ -24,12 +23,7 @@ contract Integration_EigenPod_Slashing_Migration is IntegrationCheckUtils, Eigen * 5. Upgrade EigenPod contracts * 6. Exit subset of Validators */ - function test_upgrade_eigenpod_migration(uint24 _rand) public r(_rand) { - // Only run this test as a fork test - if (forkType == LOCAL) { - return; - } - + function test_upgrade_eigenpod_migration(uint24 _rand) public rand(_rand) { // Initialize state (User staker, ,) = _newRandomStaker(); @@ -41,7 +35,6 @@ contract Integration_EigenPod_Slashing_Migration is IntegrationCheckUtils, Eigen // Advance epoch, generating consensus rewards and withdrawing anything over 32 ETH beaconChain.advanceEpoch(); - uint64 expectedWithdrawnGwei = uint64(validators.length) * beaconChain.CONSENSUS_REWARD_AMOUNT_GWEI(); // 2. Start a checkpoint staker.startCheckpoint(); @@ -49,17 +42,19 @@ contract Integration_EigenPod_Slashing_Migration is IntegrationCheckUtils, Eigen // 3. Pause checkpoint starting cheats.prank(pauserMultisig); eigenPodManager.pause(2 ** PAUSED_START_CHECKPOINT); - cheats.expectRevert("EigenPod.onlyWhenNotPaused: index is paused in EigenPodManager"); staker.startCheckpoint(); // 4. Complete in progress checkpoint staker.completeCheckpoint(); - check_CompleteCheckpoint_WithPodBalance_State(staker, expectedWithdrawnGwei); // 5. Upgrade Contracts for slashing _upgradeEigenLayerContracts(); + // Unpause EigenPodManager + cheats.prank(eigenLayerPauserReg.unpauser()); + eigenPodManager.unpause(0); + // 6. Exit validators // Fully exit one or more validators and advance epoch without generating rewards uint40[] memory subset = _choose(validators); diff --git a/src/test/integration/tests/upgrade/README.md b/src/test/integration/tests/upgrade/README.md new file mode 100644 index 0000000000..c9844a3143 --- /dev/null +++ b/src/test/integration/tests/upgrade/README.md @@ -0,0 +1,45 @@ +## Upgrade Tests + +This folder contains specific tests we want to conduct to determine upgrade compatibility. Tests in this folder are only run if the `forktest` profile is selected, e.g: + +`env FOUNDRY_PROFILE=forktest forge t --mc Upgrade` + +#### How to Write + +Upgrade tests inherit from the `UpgradeTest` mixin, which imports everything you need for a standard integration test. A standard integration test automatically upgrades all contracts to the latest repo contracts, even when forking from mainnet. + +In contrast, the `UpgradeTest` mixin ensures that (when a test begins) the contracts we're working with are _not upgraded_. This allows the test writer to perform some initial setup actions before calling `_upgradeEigenLayerContracts()`, after which we can check that the upgrade correctly handles pre-upgrade state. + +#### Example + +Say we want to check that withdrawals initiated before the slashing upgrade are completable after the slashing upgrade. This example test shows how: + +```solidity +contract Integration_Upgrade_Complete_PreSlashing_Withdrawal is UpgradeTest { + + function testFuzz_deposit_queue_upgrade_completeAsShares(uint24 _random) public rand(_random) { + /// Pre-upgrade: + /// 1. Create staker with some assets + /// 2. Staker deposits into EigenLayer + /// 3. Staker queues a withdrawal + (User staker, IStrategy[] memory strategies, uint[] memory tokenBalances) = _newRandomStaker(); + User operator = User(payable(0)); + + staker.depositIntoEigenlayer(strategies, tokenBalances); + uint[] memory shares = _calculateExpectedShares(strategies, tokenBalances); + IDelegationManagerTypes.Withdrawal[] memory withdrawals = staker.queueWithdrawals(strategies, shares); + + /// Upgrade to slashing contracts + _upgradeEigenLayerContracts(); + + // Complete pre-slashing withdrawals as shares + _rollBlocksForCompleteWithdrawals(withdrawals); + for (uint i = 0; i < withdrawals.length; i++) { + staker.completeWithdrawalAsShares(withdrawals[i]); + check_Withdrawal_AsShares_State(staker, operator, withdrawals[i], strategies, shares); + } + } +} +``` + +**Note** how the initial staker actions are NOT followed by `check_X_State` methods. This is because, before calling `_upgradeEigenLayerContracts`, the test is being run on old contracts. Adding invariant checks to old state transitions is not the point of this test and would add a lot of maintenance overhead. \ No newline at end of file From 0f6d618d2ddff5cbda5ebeb5742d71289876c560 Mon Sep 17 00:00:00 2001 From: Alex <18387287+wadealexc@users.noreply.github.com> Date: Fri, 17 Jan 2025 12:22:50 -0500 Subject: [PATCH 07/35] test: enable shared setups for integration tests (#1036) * test: improve integration invariants * also removes unneeded fork logic * adds checks to some invariants * fixes some broken tests * test(integration): enable shared setups --- src/test/integration/IntegrationBase.t.sol | 147 +++++------ src/test/integration/IntegrationChecks.t.sol | 36 +-- .../integration/IntegrationDeployer.t.sol | 13 +- ...egate_Allocate_Slash_Queue_Redeposit.t.sol | 22 +- ...Deposit_Delegate_Redelegate_Complete.t.sol | 37 +-- ...locate.t.sol => SlashingWithdrawals.t.sol} | 240 ++++-------------- .../VerifyWC_StartCP_CompleteCP.t.sol | 10 +- .../Complete_PreSlashing_Withdrawal.t.sol | 4 +- .../upgrade/EigenPod_Slashing_Migration.t.sol | 10 +- 9 files changed, 201 insertions(+), 318 deletions(-) rename src/test/integration/tests/{Deposit_Delegate_Allocate.t.sol => SlashingWithdrawals.t.sol} (51%) diff --git a/src/test/integration/IntegrationBase.t.sol b/src/test/integration/IntegrationBase.t.sol index b0ecefd066..cb178b3c27 100644 --- a/src/test/integration/IntegrationBase.t.sol +++ b/src/test/integration/IntegrationBase.t.sol @@ -20,7 +20,7 @@ abstract contract IntegrationBase is IntegrationDeployer { using Strings for *; using print for *; - using ArrayLib for IStrategy[]; + using ArrayLib for *; uint numStakers = 0; uint numOperators = 0; @@ -49,7 +49,7 @@ abstract contract IntegrationBase is IntegrationDeployer { IStrategy[] memory strategies; uint[] memory tokenBalances; - if (forkType == MAINNET && !isUpgraded) { + if (!isUpgraded) { stakerName = string.concat("M2Staker", cheats.toString(numStakers)); (staker, strategies, tokenBalances) = _randUser(stakerName); @@ -79,7 +79,7 @@ abstract contract IntegrationBase is IntegrationDeployer { uint[] memory tokenBalances; uint[] memory addedShares; - if (forkType == MAINNET && !isUpgraded) { + if (!isUpgraded) { string memory operatorName = string.concat("M2Operator", numOperators.toString()); // Create an operator for M2. @@ -102,11 +102,12 @@ abstract contract IntegrationBase is IntegrationDeployer { operator.registerAsOperator(); operator.depositIntoEigenlayer(strategies, tokenBalances); - // Roll passed the allocation configuration delay + // Roll past the allocation configuration delay rollForward({blocks: ALLOCATION_CONFIGURATION_DELAY}); - } - assert_Snap_Added_Staker_DepositShares(operator, strategies, addedShares, "_newRandomOperator: failed to add delegatable shares"); + assert_Snap_Added_Staker_DepositShares(operator, strategies, addedShares, "_newRandomOperator: failed to add delegatable shares"); + } + assert_Snap_Added_OperatorShares(operator, strategies, addedShares, "_newRandomOperator: failed to award shares to operator"); assertTrue(delegationManager.isOperator(address(operator)), "_newRandomOperator: operator should be registered"); @@ -141,13 +142,13 @@ abstract contract IntegrationBase is IntegrationDeployer { /// @dev Choose a random subset of validators (selects AT LEAST ONE) function _choose(uint40[] memory validators) internal returns (uint40[] memory) { - uint rand = _randUint({ min: 1, max: validators.length ** 2 }); + uint _rand = _randUint({ min: 1, max: validators.length ** 2 }); uint40[] memory result = new uint40[](validators.length); uint newLen; for (uint i = 0; i < validators.length; i++) { // if bit set, add validator - if (rand >> i & 1 == 1) { + if (_rand >> i & 1 == 1) { result[newLen] = validators[i]; newLen++; } @@ -645,20 +646,15 @@ abstract contract IntegrationBase is IntegrationDeployer { function assert_Snap_Added_Staker_DepositShares( User staker, IStrategy strat, - uint _addedShares, + uint addedShares, string memory err ) internal { - IStrategy[] memory strategies = new IStrategy[](1); - uint[] memory addedShares = new uint[](1); - strategies[0] = strat; - addedShares[0] = _addedShares; - - assert_Snap_Added_Staker_DepositShares(staker, strategies, addedShares, err); + assert_Snap_Added_Staker_DepositShares(staker, strat.toArray(), addedShares.toArrayU256(), err); } /// @dev Check that the staker has `removedShares` fewer delegatable shares /// for each strategy since the last snapshot - function assert_Snap_Removed_StakerDepositShares( + function assert_Snap_Removed_Staker_DepositShares( User staker, IStrategy[] memory strategies, uint[] memory removedShares, @@ -674,22 +670,52 @@ abstract contract IntegrationBase is IntegrationDeployer { } } - function assert_Snap_Removed_StakerDepositShares( + function assert_Snap_Removed_Staker_DepositShares( User staker, IStrategy strat, - uint _removedShares, + uint removedShares, + string memory err + ) internal { + assert_Snap_Removed_Staker_DepositShares(staker, strat.toArray(), removedShares.toArrayU256(), err); + } + + /// @dev Check that the staker's delegatable shares in ALL strategies have not changed + /// since the last snapshot + function assert_Snap_Unchanged_Staker_DepositShares( + User staker, string memory err ) internal { - IStrategy[] memory strategies = new IStrategy[](1); - uint[] memory removedShares = new uint[](1); - strategies[0] = strat; - removedShares[0] = _removedShares; + IStrategy[] memory strategies = allStrats; + + uint[] memory curShares = _getStakerDepositShares(staker, strategies); + // Use timewarp to get previous staker shares + uint[] memory prevShares = _getPrevStakerDepositShares(staker, strategies); - assert_Snap_Removed_StakerDepositShares(staker, strategies, removedShares, err); + // For each strategy, check (prev == cur) + for (uint i = 0; i < strategies.length; i++) { + assertEq(prevShares[i], curShares[i], err); + } } /// @dev Check that the staker's withdrawable shares have decreased by `removedShares` - function assert_Snap_Removed_StakerWithdrawableShares( + function assert_Snap_Added_Staker_WithdrawableShares( + User staker, + IStrategy[] memory strategies, + uint[] memory addedShares, + string memory err + ) internal { + uint[] memory curShares = _getStakerWithdrawableShares(staker, strategies); + // Use timewarp to get previous staker shares + uint[] memory prevShares = _getPrevStakerWithdrawableShares(staker, strategies); + + // For each strategy, check (prev - removed == cur) + for (uint i = 0; i < strategies.length; i++) { + assertEq(prevShares[i] + addedShares[i], curShares[i], err); + } + } + + /// @dev Check that the staker's withdrawable shares have decreased by `removedShares` + function assert_Snap_Removed_Staker_WithdrawableShares( User staker, IStrategy[] memory strategies, uint[] memory removedShares, @@ -705,18 +731,30 @@ abstract contract IntegrationBase is IntegrationDeployer { } } - function assert_Snap_Removed_StakerWithdrawableShares( + function assert_Snap_Removed_Staker_WithdrawableShares( User staker, IStrategy strat, - uint _removedShares, + uint removedShares, + string memory err + ) internal { + assert_Snap_Removed_Staker_WithdrawableShares(staker, strat.toArray(), removedShares.toArrayU256(), err); + } + + /// @dev Check that the staker's withdrawable shares have decreased by `removedShares` + function assert_Snap_Unchanged_Staker_WithdrawableShares( + User staker, string memory err ) internal { - IStrategy[] memory strategies = new IStrategy[](1); - uint[] memory removedShares = new uint[](1); - strategies[0] = strat; - removedShares[0] = _removedShares; + IStrategy[] memory strategies = allStrats; + + uint[] memory curShares = _getStakerWithdrawableShares(staker, strategies); + // Use timewarp to get previous staker shares + uint[] memory prevShares = _getPrevStakerWithdrawableShares(staker, strategies); - assert_Snap_Removed_StakerWithdrawableShares(staker, strategies, removedShares, err); + // For each strategy, check (prev - removed == cur) + for (uint i = 0; i < strategies.length; i++) { + assertEq(prevShares[i], curShares[i], err); + } } /// @dev Check that the staker's withdrawable shares have decreased by at least `removedShares` @@ -743,30 +781,7 @@ abstract contract IntegrationBase is IntegrationDeployer { uint removedShares, string memory err ) internal { - IStrategy[] memory strategies = new IStrategy[](1); - uint[] memory removedSharesArr = new uint[](1); - strategies[0] = strat; - removedSharesArr[0] = removedShares; - - assert_Snap_Removed_Staker_WithdrawableShares_AtLeast(staker, strategies, removedSharesArr, err); - } - - /// @dev Check that the staker's delegatable shares in ALL strategies have not changed - /// since the last snapshot - function assert_Snap_Unchanged_StakerDepositShares( - User staker, - string memory err - ) internal { - IStrategy[] memory strategies = allStrats; - - uint[] memory curShares = _getStakerDepositShares(staker, strategies); - // Use timewarp to get previous staker shares - uint[] memory prevShares = _getPrevStakerDepositShares(staker, strategies); - - // For each strategy, check (prev == cur) - for (uint i = 0; i < strategies.length; i++) { - assertEq(prevShares[i], curShares[i], err); - } + assert_Snap_Removed_Staker_WithdrawableShares_AtLeast(staker, strat.toArray(), removedShares.toArrayU256(), err); } function assert_Snap_Delta_StakerShares( @@ -1485,12 +1500,7 @@ abstract contract IntegrationBase is IntegrationDeployer { // This method should only be used for tests that handle positive // balances. Negative balances are an edge case that require // the own tests and helper methods. - int shares; - if (forkType != LOCAL && !isUpgraded) { - shares = int(IEigenPodManager_DeprecatedM2(address(eigenPodManager)).podOwnerShares(address(staker))); - } else { - shares = int(eigenPodManager.podOwnerDepositShares(address(staker))); - } + int shares = eigenPodManager.podOwnerDepositShares(address(staker)); if (shares < 0) { revert("_getStakerDepositShares: negative shares"); @@ -1498,11 +1508,7 @@ abstract contract IntegrationBase is IntegrationDeployer { curShares[i] = uint(shares); } else { - if (forkType != LOCAL && !isUpgraded) { - curShares[i] = IStrategyManager_DeprecatedM2(address(strategyManager)).stakerStrategyShares(address(staker), strat); - } else { - curShares[i] = strategyManager.stakerDepositShares(address(staker), strat); - } + curShares[i] = strategyManager.stakerDepositShares(address(staker), strat); } } @@ -1656,13 +1662,8 @@ abstract contract IntegrationBase is IntegrationDeployer { } function _getCheckpointPodBalanceGwei(User staker) internal view returns (uint64) { - if (forkType != LOCAL && !isUpgraded) { - IEigenPod_DeprecatedM2 pod = IEigenPod_DeprecatedM2(address(staker.pod())); - return uint64(pod.currentCheckpoint().podBalanceGwei); - } else { - EigenPod pod = staker.pod(); - return uint64(pod.currentCheckpoint().podBalanceGwei); - } + EigenPod pod = staker.pod(); + return uint64(pod.currentCheckpoint().podBalanceGwei); } function _getPrevCheckpointPodBalanceGwei(User staker) internal timewarp() returns (uint64) { diff --git a/src/test/integration/IntegrationChecks.t.sol b/src/test/integration/IntegrationChecks.t.sol index 973d53d919..10ed4c758b 100644 --- a/src/test/integration/IntegrationChecks.t.sol +++ b/src/test/integration/IntegrationChecks.t.sol @@ -88,8 +88,8 @@ contract IntegrationCheckUtils is IntegrationBase { ) internal { check_CompleteCheckpoint_State(staker); - assert_Snap_Unchanged_StakerDepositShares(staker, "staker shares should not have decreased"); - assert_Snap_Removed_StakerWithdrawableShares(staker, BEACONCHAIN_ETH_STRAT, slashedAmountGwei * GWEI_TO_WEI, "should have decreased withdrawable shares by slashed amount"); + assert_Snap_Unchanged_Staker_DepositShares(staker, "staker shares should not have decreased"); + assert_Snap_Removed_Staker_WithdrawableShares(staker, BEACONCHAIN_ETH_STRAT, slashedAmountGwei * GWEI_TO_WEI, "should have decreased withdrawable shares by slashed amount"); assert_Snap_Removed_ActiveValidatorCount(staker, slashedValidators.length, "should have decreased active validator count"); assert_Snap_Removed_ActiveValidators(staker, slashedValidators, "exited validators should each be WITHDRAWN"); } @@ -101,7 +101,7 @@ contract IntegrationCheckUtils is IntegrationBase { ) internal { check_CompleteCheckpoint_State(staker); - assert_Snap_Unchanged_StakerDepositShares(staker, "staker shares should not have decreased"); + assert_Snap_Unchanged_Staker_DepositShares(staker, "staker shares should not have decreased"); assert_Snap_Removed_Staker_WithdrawableShares_AtLeast(staker, BEACONCHAIN_ETH_STRAT, slashedAmountGwei * GWEI_TO_WEI, "should have decreased withdrawable shares by at least slashed amount"); assert_Snap_Removed_ActiveValidatorCount(staker, slashedValidators.length, "should have decreased active validator count"); assert_Snap_Removed_ActiveValidators(staker, slashedValidators, "exited validators should each be WITHDRAWN"); @@ -113,7 +113,7 @@ contract IntegrationCheckUtils is IntegrationBase { ) internal { check_CompleteCheckpoint_State(staker); - assert_Snap_Unchanged_StakerDepositShares(staker, "staker shares should not have decreased"); + assert_Snap_Unchanged_Staker_DepositShares(staker, "staker shares should not have decreased"); assert_Snap_Removed_Staker_WithdrawableShares_AtLeast(staker, BEACONCHAIN_ETH_STRAT, slashedAmountGwei * GWEI_TO_WEI, "should have decreased withdrawable shares by at least slashed amount"); assert_Snap_Unchanged_ActiveValidatorCount(staker, "should not have changed active validator count"); } @@ -124,8 +124,8 @@ contract IntegrationCheckUtils is IntegrationBase { ) internal { check_CompleteCheckpoint_State(staker); - assert_Snap_Unchanged_StakerDepositShares(staker, "staker shares should not have decreased"); - assert_Snap_Removed_StakerWithdrawableShares(staker, BEACONCHAIN_ETH_STRAT, slashedAmountGwei * GWEI_TO_WEI, "should have decreased withdrawable shares by slashed amount"); + assert_Snap_Unchanged_Staker_DepositShares(staker, "staker shares should not have decreased"); + assert_Snap_Removed_Staker_WithdrawableShares(staker, BEACONCHAIN_ETH_STRAT, slashedAmountGwei * GWEI_TO_WEI, "should have decreased withdrawable shares by slashed amount"); assert_Snap_Unchanged_ActiveValidatorCount(staker, "should not have changed active validator count"); } @@ -136,7 +136,7 @@ contract IntegrationCheckUtils is IntegrationBase { ) internal { check_CompleteCheckpoint_WithPodBalance_State(staker, exitedBalanceGwei); - assert_Snap_Unchanged_StakerDepositShares(staker, "staker should not have changed shares"); + assert_Snap_Unchanged_Staker_DepositShares(staker, "staker should not have changed shares"); assert_Snap_Added_BalanceExitedGwei(staker, exitedBalanceGwei, "should have attributed expected gwei to exited balance"); assert_Snap_Removed_ActiveValidatorCount(staker, exitedValidators.length, "should have decreased active validator count"); assert_Snap_Removed_ActiveValidators(staker, exitedValidators, "exited validators should each be WITHDRAWN"); @@ -159,8 +159,8 @@ contract IntegrationCheckUtils is IntegrationBase { // and that the staker now has the expected amount of delegated shares in each strategy assert_HasNoUnderlyingTokenBalance(staker, strategies, "staker should have transferred all underlying tokens"); assert_Snap_Added_Staker_DepositShares(staker, strategies, shares, "staker should expect shares in each strategy after depositing"); + assert_Snap_Added_Staker_WithdrawableShares(staker, strategies, shares, "deposit should increase withdrawable shares"); } - function check_Deposit_State_PartialDeposit(User staker, IStrategy[] memory strategies, uint[] memory shares, uint[] memory tokenBalances) internal { /// Deposit into strategies: @@ -171,6 +171,7 @@ contract IntegrationCheckUtils is IntegrationBase { // and that the staker now has the expected amount of delegated shares in each strategy assert_HasUnderlyingTokenBalances(staker, strategies, tokenBalances, "staker should have transferred some underlying tokens"); assert_Snap_Added_Staker_DepositShares(staker, strategies, shares, "staker should expected shares in each strategy after depositing"); + assert_Snap_Added_Staker_WithdrawableShares(staker, strategies, shares, "deposit should increase withdrawable shares"); } function check_Delegation_State( @@ -186,9 +187,9 @@ contract IntegrationCheckUtils is IntegrationBase { assertTrue(delegationManager.isDelegated(address(staker)), "staker should be delegated"); assertEq(address(operator), delegationManager.delegatedTo(address(staker)), "staker should be delegated to operator"); assert_HasExpectedShares(staker, strategies, shares, "staker should still have expected shares after delegating"); - assert_Snap_Unchanged_StakerDepositShares(staker, "staker shares should be unchanged after delegating"); - // TODO: fix this assertion - // assert_Snap_Added_OperatorShares(operator, strategies, shares, "operator should have received shares"); + assert_Snap_Unchanged_Staker_DepositShares(staker, "staker shares should be unchanged after delegating"); + assert_Snap_Unchanged_Staker_WithdrawableShares(staker, "withdrawable shares should be unchanged after delegating"); + assert_Snap_Added_OperatorShares(operator, strategies, shares, "operator should have received shares"); } function check_QueuedWithdrawal_State( @@ -213,8 +214,10 @@ contract IntegrationCheckUtils is IntegrationBase { "check_QueuedWithdrawal_State: staker should have increased nonce by withdrawals.length"); assert_Snap_Removed_OperatorShares(operator, strategies, shares, "check_QueuedWithdrawal_State: failed to remove operator shares"); - assert_Snap_Removed_StakerDepositShares(staker, strategies, shares, + assert_Snap_Removed_Staker_DepositShares(staker, strategies, shares, "check_QueuedWithdrawal_State: failed to remove staker shares"); + assert_Snap_Removed_Staker_WithdrawableShares(staker, strategies, shares, + "check_QueuedWithdrawal_State: failed to remove staker withdrawable shares"); } function check_Undelegate_State( @@ -240,8 +243,10 @@ contract IntegrationCheckUtils is IntegrationBase { "check_Undelegate_State: staker should have increased nonce by withdrawals.length"); assert_Snap_Removed_OperatorShares(operator, strategies, shares, "check_Undelegate_State: failed to remove operator shares"); - assert_Snap_Removed_StakerDepositShares(staker, strategies, shares, + assert_Snap_Removed_Staker_DepositShares(staker, strategies, shares, "check_Undelegate_State: failed to remove staker shares"); + assert_Snap_Removed_Staker_WithdrawableShares(staker, strategies, shares, + "check_QueuedWithdrawal_State: failed to remove staker withdrawable shares"); } /** @@ -267,7 +272,7 @@ contract IntegrationCheckUtils is IntegrationBase { assert_WithdrawalNotPending(delegationManager.calculateWithdrawalRoot(withdrawal), "staker withdrawal should no longer be pending"); assert_Snap_Added_TokenBalances(staker, tokens, expectedTokens, "staker should have received expected tokens"); - assert_Snap_Unchanged_StakerDepositShares(staker, "staker shares should not have changed"); + assert_Snap_Unchanged_Staker_DepositShares(staker, "staker shares should not have changed"); assert_Snap_Removed_StrategyShares(strategies, shares, "strategies should have total shares decremented"); // Checks specific to an operator that the Staker has delegated to @@ -366,8 +371,9 @@ contract IntegrationCheckUtils is IntegrationBase { // Common checks assert_WithdrawalNotPending(delegationManager.calculateWithdrawalRoot(withdrawal), "staker withdrawal should no longer be pending"); + // TODO FIXME // assert_Snap_Added_TokenBalances(staker, tokens, expectedTokens, "staker should have received expected tokens"); - assert_Snap_Unchanged_StakerDepositShares(staker, "staker shares should not have changed"); + assert_Snap_Unchanged_Staker_DepositShares(staker, "staker shares should not have changed"); assert_Snap_Removed_StrategyShares(withdrawal.strategies, withdrawal.scaledShares, "strategies should have total shares decremented"); // Checks specific to an operator that the Staker has delegated to diff --git a/src/test/integration/IntegrationDeployer.t.sol b/src/test/integration/IntegrationDeployer.t.sol index 77ef046c64..f3f758f004 100644 --- a/src/test/integration/IntegrationDeployer.t.sol +++ b/src/test/integration/IntegrationDeployer.t.sol @@ -10,6 +10,7 @@ import "@openzeppelin/contracts/proxy/beacon/UpgradeableBeacon.sol"; import "forge-std/Test.sol"; import "src/contracts/core/DelegationManager.sol"; +import "src/contracts/core/AllocationManager.sol"; import "src/contracts/core/StrategyManager.sol"; import "src/contracts/strategies/StrategyFactory.sol"; import "src/contracts/strategies/StrategyBase.sol"; @@ -92,6 +93,10 @@ abstract contract IntegrationDeployer is ExistingDeploymentParser { _assetTypes: HOLDS_LST | HOLDS_ETH | HOLDS_ALL, _userTypes: DEFAULT | ALT_METHODS }); + + // Used to create shared setups between tests + _init(); + _; } @@ -137,6 +142,12 @@ abstract contract IntegrationDeployer is ExistingDeploymentParser { } } + /// @dev Used to create shared setup between tests. This method is called + /// when the `rand` modifier is run, before a test starts + function _init() internal virtual { + return; + } + /** * env FOUNDRY_PROFILE=forktest forge t --mc Integration * @@ -473,7 +484,7 @@ abstract contract IntegrationDeployer is ExistingDeploymentParser { allTokens.push(underlyingToken); } - function _configRand(uint24 _randomSeed, uint _assetTypes, uint _userTypes) internal { + function _configRand(uint24 _randomSeed, uint _assetTypes, uint _userTypes) private { // Using uint24 for the seed type so that if a test fails, it's easier // to manually use the seed to replay the same test. random = _hash(_randomSeed); diff --git a/src/test/integration/tests/Deposit_Delegate_Allocate_Slash_Queue_Redeposit.t.sol b/src/test/integration/tests/Deposit_Delegate_Allocate_Slash_Queue_Redeposit.t.sol index 3ea423dfc8..b85b22ccdc 100644 --- a/src/test/integration/tests/Deposit_Delegate_Allocate_Slash_Queue_Redeposit.t.sol +++ b/src/test/integration/tests/Deposit_Delegate_Allocate_Slash_Queue_Redeposit.t.sol @@ -7,15 +7,11 @@ import {console} from "forge-std/console.sol"; contract Integration_Deposit_Delegate_Allocate_Slash_Queue_Redeposit is IntegrationCheckUtils, IDelegationManagerTypes { - // TODO: Partial deposits don't work when beacon chain eth balance is initialized to < 64 ETH, need to write _newRandomStaker variant that ensures beacon chain ETH balance - // greater than or equal to 64 - modifier rand(uint24 r) override { - _configRand({ - _randomSeed: r, - _assetTypes: HOLDS_LST, - _userTypes: DEFAULT - }); - _; + function _init() internal override { + // TODO: Partial deposits don't work when beacon chain eth balance is initialized to < 64 ETH, need to write _newRandomStaker variant that ensures beacon chain ETH balance + // greater than or equal to 64 + _configAssetTypes(HOLDS_LST); + _configUserTypes(DEFAULT); } function testFuzz_deposit_delegate_allocate_fullSlash_queue_complete_redeposit( @@ -74,7 +70,7 @@ contract Integration_Deposit_Delegate_Allocate_Slash_Queue_Redeposit is Integrat slashingParams = avs.slashOperator(operator, operatorSet.id, strategiesToSlash, wadsToSlash); assert_Snap_Allocations_Slashed(slashingParams, operatorSet, true, "operator allocations should be slashed"); - assert_Snap_Unchanged_StakerDepositShares(staker, "staker deposit shares should be unchanged after slashing"); + assert_Snap_Unchanged_Staker_DepositShares(staker, "staker deposit shares should be unchanged after slashing"); assert_Snap_StakerWithdrawableShares_AfterSlash(staker, allocateParams, slashingParams, "staker deposit shares should be slashed"); } @@ -161,7 +157,7 @@ contract Integration_Deposit_Delegate_Allocate_Slash_Queue_Redeposit is Integrat slashingParams = avs.slashOperator(operator, operatorSet.id, strategiesToSlash, wadsToSlash); assert_Snap_Allocations_Slashed(slashingParams, operatorSet, true, "operator allocations should be slashed"); - assert_Snap_Unchanged_StakerDepositShares(staker, "staker deposit shares should be unchanged after slashing"); + assert_Snap_Unchanged_Staker_DepositShares(staker, "staker deposit shares should be unchanged after slashing"); assert_Snap_StakerWithdrawableShares_AfterSlash(staker, allocateParams, slashingParams, "staker deposit shares should be slashed"); } @@ -249,7 +245,7 @@ contract Integration_Deposit_Delegate_Allocate_Slash_Queue_Redeposit is Integrat slashingParams = avs.slashOperator(operator, operatorSet.id, strategiesToSlash, wadsToSlash); assert_Snap_Allocations_Slashed(slashingParams, operatorSet, true, "operator allocations should be slashed"); - assert_Snap_Unchanged_StakerDepositShares(staker, "staker deposit shares should be unchanged after slashing"); + assert_Snap_Unchanged_Staker_DepositShares(staker, "staker deposit shares should be unchanged after slashing"); assert_Snap_StakerWithdrawableShares_AfterSlash(staker, allocateParams, slashingParams, "staker deposit shares should be slashed"); } @@ -316,7 +312,7 @@ contract Integration_Deposit_Delegate_Allocate_Slash_Queue_Redeposit is Integrat _strategiesAndWadsForRandFullSlash(operatorSet); slashingParams = avs.slashOperator(operator, operatorSet.id, strategiesToSlash, wadsToSlash); assert_Snap_Allocations_Slashed(slashingParams, operatorSet, true, "operator allocations should be slashed"); - assert_Snap_Unchanged_StakerDepositShares(staker, "staker deposit shares should be unchanged after slashing"); + assert_Snap_Unchanged_Staker_DepositShares(staker, "staker deposit shares should be unchanged after slashing"); assert_Snap_StakerWithdrawableShares_AfterSlash(staker, allocateParams, slashingParams, "staker deposit shares should be slashed"); } 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 9936fce413..ff558d79d7 100644 --- a/src/test/integration/tests/Deposit_Delegate_Redelegate_Complete.t.sol +++ b/src/test/integration/tests/Deposit_Delegate_Redelegate_Complete.t.sol @@ -5,6 +5,8 @@ import "src/test/integration/users/User.t.sol"; import "src/test/integration/IntegrationChecks.t.sol"; contract Integration_Deposit_Delegate_Redelegate_Complete is IntegrationCheckUtils { + using ArrayLib for *; + /// Randomly generates a user with different held assets. Then: /// 1. deposit into strategy /// 2. delegate to an operator @@ -254,7 +256,7 @@ contract Integration_Deposit_Delegate_Redelegate_Complete is IntegrationCheckUti (User operator1, ,) = _newRandomOperator(); (User operator2, ,) = _newRandomOperator(); - uint[] memory shares = _calculateExpectedShares(strategies, tokenBalances); + uint[] memory totalShares = new uint[](strategies.length); assert_HasNoDelegatableShares(staker, "staker should not have delegatable shares before depositing"); assertFalse(delegationManager.isDelegated(address(staker)), "staker should not be delegated"); @@ -263,24 +265,24 @@ contract Integration_Deposit_Delegate_Redelegate_Complete is IntegrationCheckUti // Divide shares by 2 in new array to do deposits after redelegate uint[] memory numTokensToDeposit = new uint[](tokenBalances.length); uint[] memory numTokensRemaining = new uint[](tokenBalances.length); - for (uint i = 0; i < shares.length; i++) { + for (uint i = 0; i < strategies.length; i++) { numTokensToDeposit[i] = tokenBalances[i] / 2; numTokensRemaining[i] = tokenBalances[i] - numTokensToDeposit[i]; } - uint[] memory halfShares = _calculateExpectedShares(strategies, numTokensToDeposit); + uint[] memory sharesFromFirstDeposit = _calculateExpectedShares(strategies, numTokensToDeposit); /// 1. Deposit Into Strategies staker.depositIntoEigenlayer(strategies, numTokensToDeposit); - check_Deposit_State_PartialDeposit(staker, strategies, halfShares, numTokensRemaining); + check_Deposit_State_PartialDeposit(staker, strategies, sharesFromFirstDeposit, numTokensRemaining); // 2. Delegate to an operator staker.delegateTo(operator1); - check_Delegation_State(staker, operator1, strategies, halfShares); + check_Delegation_State(staker, operator1, strategies, sharesFromFirstDeposit); // 3. Undelegate from an operator IDelegationManagerTypes.Withdrawal[] memory withdrawals = staker.undelegate(); bytes32[] memory withdrawalRoots = _getWithdrawalHashes(withdrawals); - check_Undelegate_State(staker, operator1, withdrawals, withdrawalRoots, strategies, halfShares); + check_Undelegate_State(staker, operator1, withdrawals, withdrawalRoots, strategies, sharesFromFirstDeposit); // 4. Complete withdrawal as shares // Fast forward to when we can complete the withdrawal @@ -291,23 +293,27 @@ contract Integration_Deposit_Delegate_Redelegate_Complete is IntegrationCheckUti } // 5. Deposit into Strategies - uint[] memory sharesAdded = _calculateExpectedShares(strategies, numTokensRemaining); + uint[] memory sharesFromSecondDeposit = _calculateExpectedShares(strategies, numTokensRemaining); + for (uint i = 0; i < strategies.length; i++) { + totalShares[i] = sharesFromFirstDeposit[i] + sharesFromSecondDeposit[i]; + } + staker.depositIntoEigenlayer(strategies, numTokensRemaining); - tokenBalances = _calculateExpectedTokens(strategies, shares); - check_Deposit_State(staker, strategies, sharesAdded); + tokenBalances = _calculateExpectedTokens(strategies, totalShares); + check_Deposit_State(staker, strategies, sharesFromSecondDeposit); // 6. Delegate to a new operator staker.delegateTo(operator2); - check_Delegation_State(staker, operator2, strategies, shares); + check_Delegation_State(staker, operator2, strategies, totalShares); assertNotEq(address(operator1), delegationManager.delegatedTo(address(staker)), "staker should not be delegated to operator1"); } { // 7. Queue Withdrawal - shares = _calculateExpectedShares(strategies, tokenBalances); - IDelegationManagerTypes.Withdrawal[] memory newWithdrawals = staker.queueWithdrawals(strategies, shares); + totalShares = _calculateExpectedShares(strategies, tokenBalances); + IDelegationManagerTypes.Withdrawal[] memory newWithdrawals = staker.queueWithdrawals(strategies, totalShares); bytes32[] memory newWithdrawalRoots = _getWithdrawalHashes(newWithdrawals); - check_QueuedWithdrawal_State(staker, operator2, strategies, shares, newWithdrawals, newWithdrawalRoots); + check_QueuedWithdrawal_State(staker, operator2, strategies, totalShares, newWithdrawals, newWithdrawalRoots); // 8. Complete withdrawal // Fast forward to when we can complete the withdrawal @@ -317,7 +323,7 @@ contract Integration_Deposit_Delegate_Redelegate_Complete is IntegrationCheckUti for (uint i = 0; i < newWithdrawals.length; i++) { uint[] memory expectedTokens = _calculateExpectedTokens(newWithdrawals[i].strategies, newWithdrawals[i].scaledShares); IERC20[] memory tokens = staker.completeWithdrawalAsTokens(newWithdrawals[i]); - check_Withdrawal_AsTokens_State(staker, operator2, newWithdrawals[i], strategies, shares, tokens, expectedTokens); + check_Withdrawal_AsTokens_State(staker, operator2, newWithdrawals[i], strategies, totalShares, tokens, expectedTokens); } } } @@ -425,7 +431,8 @@ contract Integration_Deposit_Delegate_Redelegate_Complete is IntegrationCheckUti check_Withdrawal_AsTokens_State(staker, operator1, withdrawals[i], withdrawals[i].strategies, withdrawals[i].scaledShares, tokens, expectedTokens); } - //5. Deposit into Strategies + // 5. Deposit into Strategies + shares = _calculateExpectedShares(strategies, withdrawnTokenBalances); staker.depositIntoEigenlayer(strategies, withdrawnTokenBalances); check_Deposit_State(staker, strategies, shares); diff --git a/src/test/integration/tests/Deposit_Delegate_Allocate.t.sol b/src/test/integration/tests/SlashingWithdrawals.t.sol similarity index 51% rename from src/test/integration/tests/Deposit_Delegate_Allocate.t.sol rename to src/test/integration/tests/SlashingWithdrawals.t.sol index 85f3f6f9fc..fb2cff0927 100644 --- a/src/test/integration/tests/Deposit_Delegate_Allocate.t.sol +++ b/src/test/integration/tests/SlashingWithdrawals.t.sol @@ -2,27 +2,48 @@ pragma solidity ^0.8.27; import "src/test/integration/IntegrationChecks.t.sol"; -import "src/test/integration/users/User.t.sol"; -contract Integration_Deposit_Delegate_Allocate is IntegrationCheckUtils { - function testFuzz_deposit_delegate_allocate(uint24 _random) public rand(_random) { - (User staker, IStrategy[] memory strategies, uint256[] memory tokenBalances) = _newRandomStaker(); - (User operator,,) = _newRandomOperator(); - (AVS avs,) = _newRandomAVS(); +contract SlashingWithdrawals is IntegrationCheckUtils { + + AVS avs; + OperatorSet operatorSet; + + User operator; + IAllocationManagerTypes.AllocateParams allocateParams; + + User staker; + IStrategy[] strategies; + uint[] initTokenBalances; + + /// Shared setup: + /// + /// 1. Generate staker, operator, and AVS + /// 2. Staker deposits and delegates to operator + /// 3. AVS creates an operator set containing the strategies held by the staker + /// 4. Operator registers for operator set (default allocation delay) + /// 5. Operator allocates to operator set + function _init() internal override { + (staker, strategies, initTokenBalances) = _newRandomStaker(); + (operator,,) = _newRandomOperator(); + (avs,) = _newRandomAVS(); // 1. Deposit Into Strategies - staker.depositIntoEigenlayer(strategies, tokenBalances); + staker.depositIntoEigenlayer(strategies, initTokenBalances); + uint[] memory shares = _calculateExpectedShares(strategies, initTokenBalances); + check_Deposit_State(staker, strategies, shares); // 2. Delegate to an operator staker.delegateTo(operator); + check_Delegation_State(staker, operator, strategies, shares); - // Create an operator set and register an operator. - OperatorSet memory operatorSet = avs.createOperatorSet(strategies); + // 3. Create an operator set and register an operator. + operatorSet = avs.createOperatorSet(strategies); + // TODO invariant checks here operator.registerForOperatorSet(operatorSet); - - // 3. Allocate to operator set. - IAllocationManagerTypes.AllocateParams memory allocateParams = - operator.modifyAllocations(operatorSet, _randMagnitudes({sum: 1 ether, len: strategies.length})); + // TODO invariant checks here + + // 4. Allocate to operator set + allocateParams = operator.modifyAllocations(operatorSet, _randMagnitudes({sum: 1 ether, len: strategies.length})); assert_Snap_Allocations_Modified( operator, allocateParams, false, "operator allocations should be updated before delay" ); @@ -32,34 +53,9 @@ contract Integration_Deposit_Delegate_Allocate is IntegrationCheckUtils { ); } - function testFuzz_deposit_delegate_allocate_slash_undelegate_completeAsTokens( + function testFuzz_slash_undelegate_completeAsTokens( uint24 _random ) public rand(_random) { - (User staker, IStrategy[] memory strategies, uint256[] memory tokenBalances) = _newRandomStaker(); - (User operator,,) = _newRandomOperator(); - (AVS avs,) = _newRandomAVS(); - - // 1. Deposit Into Strategies - staker.depositIntoEigenlayer(strategies, tokenBalances); - - // 2. Delegate to an operator - staker.delegateTo(operator); - - // Create an operator set and register an operator. - OperatorSet memory operatorSet = avs.createOperatorSet(strategies); - operator.registerForOperatorSet(operatorSet); - - // 3. Allocate to operator set. - IAllocationManagerTypes.AllocateParams memory allocateParams = - operator.modifyAllocations(operatorSet, _randMagnitudes({sum: 1 ether, len: strategies.length})); - assert_Snap_Allocations_Modified( - operator, allocateParams, false, "operator allocations should be updated before delay" - ); - _rollBlocksForCompleteAllocation(operator, operatorSet, strategies); - assert_Snap_Allocations_Modified( - operator, allocateParams, true, "operator allocations should be updated after delay" - ); - // 4. Slash operator IAllocationManagerTypes.SlashingParams memory slashingParams; { @@ -67,7 +63,7 @@ contract Integration_Deposit_Delegate_Allocate is IntegrationCheckUtils { _randStrategiesAndWadsToSlash(operatorSet); slashingParams = avs.slashOperator(operator, operatorSet.id, strategiesToSlash, wadsToSlash); assert_Snap_Allocations_Slashed(slashingParams, operatorSet, true, "operator allocations should be slashed"); - assert_Snap_Unchanged_StakerDepositShares(staker, "staker deposit shares should be unchanged after slashing"); + assert_Snap_Unchanged_Staker_DepositShares(staker, "staker deposit shares should be unchanged after slashing"); assert_Snap_StakerWithdrawableShares_AfterSlash(staker, allocateParams, slashingParams, "staker deposit shares should be slashed"); } @@ -90,42 +86,15 @@ contract Integration_Deposit_Delegate_Allocate is IntegrationCheckUtils { staker, allocateParams, slashingParams, - tokenBalances, - "staker should once again have original token tokenBalances minus slashed" + initTokenBalances, + "staker should once again have original token initTokenBalances minus slashed" ); assert_NoWithdrawalsPending(withdrawalRoots, "all withdrawals should be removed from pending"); } - function testFuzz_deposit_delegate_allocate_slash_undelegate_completeAsShares( + function testFuzz_slash_undelegate_completeAsShares( uint24 _random ) public rand(_random) { - (User staker, IStrategy[] memory strategies, uint256[] memory tokenBalances) = _newRandomStaker(); - (User operator,,) = _newRandomOperator(); - (AVS avs,) = _newRandomAVS(); - - - // 1. Deposit Into Strategies - staker.depositIntoEigenlayer(strategies, tokenBalances); - // TODO - post-deposit and post-delegate checks? - - // 2. Delegate to an operator - staker.delegateTo(operator); - - // Create an operator set and register an operator. - OperatorSet memory operatorSet = avs.createOperatorSet(strategies); - operator.registerForOperatorSet(operatorSet); - - // 3. Allocate to operator set. - IAllocationManagerTypes.AllocateParams memory allocateParams = - operator.modifyAllocations(operatorSet, _randMagnitudes({sum: 1 ether, len: strategies.length})); - assert_Snap_Allocations_Modified( - operator, allocateParams, false, "operator allocations should be updated before delay" - ); - _rollBlocksForCompleteAllocation(operator, operatorSet, strategies); - assert_Snap_Allocations_Modified( - operator, allocateParams, true, "operator allocations should be updated after delay" - ); - // 4. Slash operator IAllocationManagerTypes.SlashingParams memory slashingParams; { @@ -133,7 +102,7 @@ contract Integration_Deposit_Delegate_Allocate is IntegrationCheckUtils { _randStrategiesAndWadsToSlash(operatorSet); slashingParams = avs.slashOperator(operator, operatorSet.id, strategiesToSlash, wadsToSlash); assert_Snap_Allocations_Slashed(slashingParams, operatorSet, true, "operator allocations should be slashed"); - assert_Snap_Unchanged_StakerDepositShares(staker, "staker deposit shares should be unchanged after slashing"); + assert_Snap_Unchanged_Staker_DepositShares(staker, "staker deposit shares should be unchanged after slashing"); assert_Snap_StakerWithdrawableShares_AfterSlash(staker, allocateParams, slashingParams, "staker deposit shares should be slashed"); } @@ -155,36 +124,12 @@ contract Integration_Deposit_Delegate_Allocate is IntegrationCheckUtils { assert_NoWithdrawalsPending(withdrawalRoots, "all withdrawals should be removed from pending"); } - function testFuzz_deposit_delegate_allocate_queue_slash_completeAsTokens( + function testFuzz_queue_slash_completeAsTokens( uint24 _random ) public rand(_random) { - (User staker, IStrategy[] memory strategies, uint256[] memory tokenBalances) = _newRandomStaker(); - (User operator,,) = _newRandomOperator(); - (AVS avs,) = _newRandomAVS(); - - // 1. Deposit Into Strategies - staker.depositIntoEigenlayer(strategies, tokenBalances); - // 2. Delegate to an operator - staker.delegateTo(operator); - - // Create an operator set and register an operator. - OperatorSet memory operatorSet = avs.createOperatorSet(strategies); - operator.registerForOperatorSet(operatorSet); - - // 3. Allocate to operator set. - IAllocationManagerTypes.AllocateParams memory allocateParams = - operator.modifyAllocations(operatorSet, _randMagnitudes({sum: 1 ether, len: strategies.length})); - assert_Snap_Allocations_Modified( - operator, allocateParams, false, "operator allocations should be updated before delay" - ); - _rollBlocksForCompleteAllocation(operator, operatorSet, strategies); - assert_Snap_Allocations_Modified( - operator, allocateParams, true, "operator allocations should be updated after delay" - ); - // 4. Queue withdrawal IDelegationManagerTypes.Withdrawal[] memory withdrawals = - staker.queueWithdrawals(strategies, _calculateExpectedShares(strategies, tokenBalances)); + staker.queueWithdrawals(strategies, _calculateExpectedShares(strategies, initTokenBalances)); bytes32[] memory withdrawalRoots = _getWithdrawalHashes(withdrawals); // 5. Slash operator @@ -194,7 +139,7 @@ contract Integration_Deposit_Delegate_Allocate is IntegrationCheckUtils { _randStrategiesAndWadsToSlash(operatorSet); slashingParams = avs.slashOperator(operator, operatorSet.id, strategiesToSlash, wadsToSlash); assert_Snap_Allocations_Slashed(slashingParams, operatorSet, true, "operator allocations should be slashed"); - assert_Snap_Unchanged_StakerDepositShares(staker, "staker deposit shares should be unchanged after slashing"); + assert_Snap_Unchanged_Staker_DepositShares(staker, "staker deposit shares should be unchanged after slashing"); assert_Snap_StakerWithdrawableShares_AfterSlash(staker, allocateParams, slashingParams, "staker deposit shares should be slashed"); } @@ -215,43 +160,18 @@ contract Integration_Deposit_Delegate_Allocate is IntegrationCheckUtils { staker, allocateParams, slashingParams, - tokenBalances, - "staker should once again have original token tokenBalances minus slashed" + initTokenBalances, + "staker should once again have original token initTokenBalances minus slashed" ); assert_NoWithdrawalsPending(withdrawalRoots, "all withdrawals should be removed from pending"); } - function testFuzz_deposit_delegate_allocate_queue_slash_completeAsShares( + function testFuzz_queue_slash_completeAsShares( uint24 _random ) public rand(_random) { - (User staker, IStrategy[] memory strategies, uint256[] memory tokenBalances) = _newRandomStaker(); - (User operator,,) = _newRandomOperator(); - (AVS avs,) = _newRandomAVS(); - - // 1. Deposit Into Strategies - staker.depositIntoEigenlayer(strategies, tokenBalances); - // 2. Delegate to an operator - staker.delegateTo(operator); - - // Create an operator set and register an operator. - OperatorSet memory operatorSet = avs.createOperatorSet(strategies); - operator.registerForOperatorSet(operatorSet); - operator.setAllocationDelay(1); - - // 3. Allocate to operator set. - IAllocationManagerTypes.AllocateParams memory allocateParams = - operator.modifyAllocations(operatorSet, _randMagnitudes({sum: 1 ether, len: strategies.length})); - assert_Snap_Allocations_Modified( - operator, allocateParams, false, "operator allocations should be updated before delay" - ); - _rollBlocksForCompleteAllocation(operator, operatorSet, strategies); - assert_Snap_Allocations_Modified( - operator, allocateParams, true, "operator allocations should be updated after delay" - ); - // 4. Queue withdrawal IDelegationManagerTypes.Withdrawal[] memory withdrawals = - staker.queueWithdrawals(strategies, _calculateExpectedShares(strategies, tokenBalances)); + staker.queueWithdrawals(strategies, _calculateExpectedShares(strategies, initTokenBalances)); bytes32[] memory withdrawalRoots = _getWithdrawalHashes(withdrawals); // 5. Slash operator @@ -261,7 +181,7 @@ contract Integration_Deposit_Delegate_Allocate is IntegrationCheckUtils { _randStrategiesAndWadsToSlash(operatorSet); slashingParams = avs.slashOperator(operator, operatorSet.id, strategiesToSlash, wadsToSlash); assert_Snap_Allocations_Slashed(slashingParams, operatorSet, true, "operator allocations should be slashed"); - assert_Snap_Unchanged_StakerDepositShares(staker, "staker deposit shares should be unchanged after slashing"); + assert_Snap_Unchanged_Staker_DepositShares(staker, "staker deposit shares should be unchanged after slashing"); assert_Snap_StakerWithdrawableShares_AfterSlash(staker, allocateParams, slashingParams, "staker deposit shares should be slashed"); } @@ -279,35 +199,9 @@ contract Integration_Deposit_Delegate_Allocate is IntegrationCheckUtils { assert_NoWithdrawalsPending(withdrawalRoots, "all withdrawals should be removed from pending"); } - function testFuzz_deposit_delegate_allocate_deallocate_slash_queue_completeAsTokens( + function testFuzz_deallocate_slash_queue_completeAsTokens( uint24 _random ) public rand(_random) { - (User staker, IStrategy[] memory strategies, uint256[] memory tokenBalances) = _newRandomStaker(); - (User operator,,) = _newRandomOperator(); - (AVS avs,) = _newRandomAVS(); - - // 1. Deposit Into Strategies - staker.depositIntoEigenlayer(strategies, tokenBalances); - // 2. Delegate to an operator - staker.delegateTo(operator); - - // Create an operator set and register an operator. - OperatorSet memory operatorSet = avs.createOperatorSet(strategies); - operator.registerForOperatorSet(operatorSet); - operator.setAllocationDelay(1); - - console.log("block allocated", block.number); - // 3. Allocate to operator set. - IAllocationManagerTypes.AllocateParams memory allocateParams = - operator.modifyAllocations(operatorSet, _randMagnitudes({sum: 1 ether, len: strategies.length})); - assert_Snap_Allocations_Modified( - operator, allocateParams, false, "operator allocations should be updated before delay" - ); - _rollBlocksForCompleteAllocation(operator, operatorSet, strategies); - assert_Snap_Allocations_Modified( - operator, allocateParams, true, "operator allocations should be updated after delay" - ); - // 4. Deallocate all. IAllocationManagerTypes.AllocateParams memory deallocateParams = operator.deallocateAll(operatorSet); _rollBlocksForCompleteAllocation(operator, operatorSet, strategies); @@ -319,13 +213,13 @@ contract Integration_Deposit_Delegate_Allocate is IntegrationCheckUtils { _randStrategiesAndWadsToSlash(operatorSet); slashingParams = avs.slashOperator(operator, operatorSet.id, strategiesToSlash, wadsToSlash); assert_Snap_Allocations_Slashed(slashingParams, operatorSet, true, "operator allocations should be slashed"); - assert_Snap_Unchanged_StakerDepositShares(staker, "staker deposit shares should be unchanged after slashing"); + assert_Snap_Unchanged_Staker_DepositShares(staker, "staker deposit shares should be unchanged after slashing"); assert_Snap_StakerWithdrawableShares_AfterSlash(staker, deallocateParams, slashingParams, "staker deposit shares should be slashed"); } // 6. Queue withdrawals IDelegationManagerTypes.Withdrawal[] memory withdrawals = - staker.queueWithdrawals(strategies, _calculateExpectedShares(strategies, tokenBalances)); + staker.queueWithdrawals(strategies, _calculateExpectedShares(strategies, initTokenBalances)); bytes32[] memory withdrawalRoots = _getWithdrawalHashes(withdrawals); // 7. Complete withdrawal @@ -343,39 +237,15 @@ contract Integration_Deposit_Delegate_Allocate is IntegrationCheckUtils { assert_HasUnderlyingTokenBalances( staker, allocateParams.strategies, - tokenBalances, + initTokenBalances, "staker should have withdrawn all shares" ); assert_NoWithdrawalsPending(withdrawalRoots, "all withdrawals should be removed from pending"); } - function testFuzz_deposit_delegate_allocate_deregister_slash( + function testFuzz_deregister_slash( uint24 _random ) public rand(_random) { - (User staker, IStrategy[] memory strategies, uint256[] memory tokenBalances) = _newRandomStaker(); - (User operator,,) = _newRandomOperator(); - (AVS avs,) = _newRandomAVS(); - - // 1. Deposit Into Strategies - staker.depositIntoEigenlayer(strategies, tokenBalances); - // 2. Delegate to an operator - staker.delegateTo(operator); - - // Create an operator set and register an operator. - OperatorSet memory operatorSet = avs.createOperatorSet(strategies); - operator.registerForOperatorSet(operatorSet); - - // 3. Allocate to operator set. - IAllocationManagerTypes.AllocateParams memory allocateParams = - operator.modifyAllocations(operatorSet, _randMagnitudes({sum: 1 ether, len: strategies.length})); - assert_Snap_Allocations_Modified( - operator, allocateParams, false, "operator allocations should be updated before delay" - ); - _rollBlocksForCompleteAllocation(operator, operatorSet, strategies); - assert_Snap_Allocations_Modified( - operator, allocateParams, true, "operator allocations should be updated after delay" - ); - // 4. Deregister. operator.deregisterFromOperatorSet(operatorSet); @@ -386,8 +256,8 @@ contract Integration_Deposit_Delegate_Allocate is IntegrationCheckUtils { _randStrategiesAndWadsToSlash(operatorSet); slashingParams = avs.slashOperator(operator, operatorSet.id, strategiesToSlash, wadsToSlash); assert_Snap_Allocations_Slashed(slashingParams, operatorSet, true, "operator allocations should be slashed"); - assert_Snap_Unchanged_StakerDepositShares(staker, "staker deposit shares should be unchanged after slashing"); + assert_Snap_Unchanged_Staker_DepositShares(staker, "staker deposit shares should be unchanged after slashing"); assert_Snap_StakerWithdrawableShares_AfterSlash(staker, allocateParams, slashingParams, "staker deposit shares should be slashed"); } } -} +} \ No newline at end of file diff --git a/src/test/integration/tests/eigenpod/VerifyWC_StartCP_CompleteCP.t.sol b/src/test/integration/tests/eigenpod/VerifyWC_StartCP_CompleteCP.t.sol index 90374d679a..e72a39a0cb 100644 --- a/src/test/integration/tests/eigenpod/VerifyWC_StartCP_CompleteCP.t.sol +++ b/src/test/integration/tests/eigenpod/VerifyWC_StartCP_CompleteCP.t.sol @@ -6,13 +6,9 @@ import "src/test/integration/users/User.t.sol"; contract Integration_VerifyWC_StartCP_CompleteCP is IntegrationCheckUtils { - modifier rand(uint24 r) override { - _configRand({ - _randomSeed: r, - _assetTypes: HOLDS_ETH, - _userTypes: DEFAULT - }); - _; + function _init() internal override { + _configAssetTypes(HOLDS_ETH); + _configUserTypes(DEFAULT); } function test_GasMetering() public rand(0) { diff --git a/src/test/integration/tests/upgrade/Complete_PreSlashing_Withdrawal.t.sol b/src/test/integration/tests/upgrade/Complete_PreSlashing_Withdrawal.t.sol index f161a3d9d0..347b0543db 100644 --- a/src/test/integration/tests/upgrade/Complete_PreSlashing_Withdrawal.t.sol +++ b/src/test/integration/tests/upgrade/Complete_PreSlashing_Withdrawal.t.sol @@ -28,7 +28,7 @@ contract Integration_Upgrade_Complete_PreSlashing_Withdrawal is UpgradeTest { } } - function testFuzz_delegate_deposit_queue_completeAsShares(uint24 _random) public rand(_random) { + function testFuzz_delegate_deposit_queue_upgrade_completeAsShares(uint24 _random) public rand(_random) { /// Pre-upgrade: /// 1. Create staker and operator with some asset amounts /// 2. Staker delegates to operator @@ -77,7 +77,7 @@ contract Integration_Upgrade_Complete_PreSlashing_Withdrawal is UpgradeTest { } } - function testFuzz_delegate_deposit_queue_completeAsTokens(uint24 _random) public rand(_random) { + function testFuzz_delegate_deposit_queue_upgrade_completeAsTokens(uint24 _random) public rand(_random) { /// Pre-upgrade: /// 1. Create staker and operator with some asset amounts /// 2. Staker delegates to operator diff --git a/src/test/integration/tests/upgrade/EigenPod_Slashing_Migration.t.sol b/src/test/integration/tests/upgrade/EigenPod_Slashing_Migration.t.sol index 47bb30b470..f7ed80228e 100644 --- a/src/test/integration/tests/upgrade/EigenPod_Slashing_Migration.t.sol +++ b/src/test/integration/tests/upgrade/EigenPod_Slashing_Migration.t.sol @@ -5,13 +5,9 @@ import "src/test/integration/UpgradeTest.t.sol"; contract Integration_Upgrade_EigenPod_Slashing_Migration is UpgradeTest, EigenPodPausingConstants { - modifier rand(uint24 _rand) override { - _configRand({ - _randomSeed: _rand, - _assetTypes: HOLDS_ETH, - _userTypes: DEFAULT - }); - _; + function _init() internal override { + _configAssetTypes(HOLDS_ETH); + _configUserTypes(DEFAULT); } /** From edaaee7e0f39de7837814e2560b981783562656e Mon Sep 17 00:00:00 2001 From: Bowen Li Date: Fri, 17 Jan 2025 11:04:57 -0800 Subject: [PATCH 08/35] fix: remove token param from Deposit event and related APIs (#1013) * fix: remove token param from Deposit event and related APIs * fix: forge fmt * fix: rebase * fix: update EigenPodManager and test * fix: update tests * fix: update eigenpodmanager tests * fix: update StrategyManagerMock * feat: add bindings * fix: update docs --- docs/core/EigenPodManager.md | 1 - docs/core/StrategyManager.md | 2 - pkg/bindings/AVSDirectory/binding.go | 2 +- pkg/bindings/AllocationManager/binding.go | 4 +- pkg/bindings/BackingEigen/binding.go | 2 +- pkg/bindings/BeaconChainProofs/binding.go | 2 +- pkg/bindings/BytesLib/binding.go | 2 +- pkg/bindings/DelegationManager/binding.go | 2 +- pkg/bindings/Eigen/binding.go | 2 +- pkg/bindings/EigenPod/binding.go | 2 +- pkg/bindings/EigenPodManager/binding.go | 28 ++++++------- .../EigenPodManagerStorage/binding.go | 26 ++++++------ pkg/bindings/EigenStrategy/binding.go | 2 +- pkg/bindings/Endian/binding.go | 2 +- pkg/bindings/IAllocationManager/binding.go | 33 ++++++++++++++- pkg/bindings/IEigenPodManager/binding.go | 26 ++++++------ pkg/bindings/IShareManager/binding.go | 26 ++++++------ pkg/bindings/IStrategyManager/binding.go | 39 +++++++++--------- pkg/bindings/Merkle/binding.go | 2 +- pkg/bindings/OperatorSetLib/binding.go | 2 +- pkg/bindings/PauserRegistry/binding.go | 2 +- pkg/bindings/PermissionController/binding.go | 2 +- pkg/bindings/RewardsCoordinator/binding.go | 5 +++ pkg/bindings/SlashingLib/binding.go | 2 +- pkg/bindings/Snapshots/binding.go | 2 +- pkg/bindings/StrategyBase/binding.go | 2 +- pkg/bindings/StrategyBaseTVLLimits/binding.go | 2 +- pkg/bindings/StrategyFactory/binding.go | 2 +- pkg/bindings/StrategyManager/binding.go | 41 +++++++++---------- .../StrategyManagerStorage/binding.go | 39 +++++++++--------- src/contracts/core/DelegationManager.sol | 1 - src/contracts/core/StrategyManager.sol | 15 ++----- src/contracts/interfaces/IShareManager.sol | 8 +--- src/contracts/interfaces/IStrategyManager.sol | 3 +- src/contracts/pods/EigenPodManager.sol | 1 - src/test/mocks/DelegationManagerMock.sol | 3 +- src/test/mocks/EigenPodManagerMock.sol | 1 - src/test/mocks/StrategyManagerMock.sol | 3 +- src/test/unit/EigenPodManagerUnit.t.sol | 10 ++--- src/test/unit/StrategyManagerUnit.t.sol | 18 ++++---- 40 files changed, 190 insertions(+), 179 deletions(-) diff --git a/docs/core/EigenPodManager.md b/docs/core/EigenPodManager.md index 8ebbca0c41..322ef3cdb7 100644 --- a/docs/core/EigenPodManager.md +++ b/docs/core/EigenPodManager.md @@ -223,7 +223,6 @@ Note that the amount of deposit shares removed while in the withdrawal queue may function addShares( address staker, IStrategy strategy, - IERC20, uint256 shares ) external diff --git a/docs/core/StrategyManager.md b/docs/core/StrategyManager.md index f698f1809f..5e10461e3a 100644 --- a/docs/core/StrategyManager.md +++ b/docs/core/StrategyManager.md @@ -190,13 +190,11 @@ Note that the amount of deposit shares removed while in the withdrawal queue may ```solidity /// @notice Used by the DelegationManager to award a Staker some shares that have passed through the withdrawal queue /// @dev strategy must be beaconChainETH when talking to the EigenPodManager -/// @dev token is not validated; it is only emitted as an event /// @return existingDepositShares the shares the staker had before any were added /// @return addedShares the new shares added to the staker's balance function addShares( address staker, IStrategy strategy, - IERC20 token, uint256 shares ) external diff --git a/pkg/bindings/AVSDirectory/binding.go b/pkg/bindings/AVSDirectory/binding.go index 9a8a99f586..ca79d413fa 100644 --- a/pkg/bindings/AVSDirectory/binding.go +++ b/pkg/bindings/AVSDirectory/binding.go @@ -39,7 +39,7 @@ type ISignatureUtilsSignatureWithSaltAndExpiry struct { // AVSDirectoryMetaData contains all meta data concerning the AVSDirectory contract. var AVSDirectoryMetaData = &bind.MetaData{ ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"_delegation\",\"type\":\"address\",\"internalType\":\"contractIDelegationManager\"},{\"name\":\"_pauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"OPERATOR_AVS_REGISTRATION_TYPEHASH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"OPERATOR_SET_FORCE_DEREGISTRATION_TYPEHASH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"OPERATOR_SET_REGISTRATION_TYPEHASH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"avsOperatorStatus\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"enumIAVSDirectoryTypes.OperatorAVSRegistrationStatus\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"calculateOperatorAVSRegistrationDigestHash\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"cancelSalt\",\"inputs\":[{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"delegation\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIDelegationManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"deregisterOperatorFromAVS\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"domainSeparator\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"initialOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"initialPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"operatorSaltIsSpent\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"isSpent\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"pauseAll\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[{\"name\":\"index\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pauserRegistry\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"registerOperatorToAVS\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSignature\",\"type\":\"tuple\",\"internalType\":\"structISignatureUtils.SignatureWithSaltAndExpiry\",\"components\":[{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"updateAVSMetadataURI\",\"inputs\":[{\"name\":\"metadataURI\",\"type\":\"string\",\"internalType\":\"string\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"AVSMetadataURIUpdated\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"metadataURI\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorAVSRegistrationStatusUpdated\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"avs\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"status\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"enumIAVSDirectoryTypes.OperatorAVSRegistrationStatus\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"CurrentlyPaused\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InputAddressZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidNewPausedStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidSignature\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyPauser\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyUnpauser\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OperatorAlreadyRegisteredToAVS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OperatorNotRegisteredToAVS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OperatorNotRegisteredToEigenLayer\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SaltSpent\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SignatureExpired\",\"inputs\":[]}]", - Bin: "0x610100604052348015610010575f5ffd5b5060405161170438038061170483398101604081905261002f916101ed565b81816001600160a01b038116610058576040516339b190bb60e11b815260040160405180910390fd5b6001600160a01b039081166080521660a0524660c052610108604080518082018252600a81526922b4b3b2b72630bcb2b960b11b60209182015281517f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a866818301527f71b625cfad44bac63b13dba07f2e1d6084ee04b6f8752101ece6126d584ee6ea81840152466060820152306080808301919091528351808303909101815260a0909101909252815191012090565b60e05261011361011a565b5050610225565b5f54610100900460ff16156101855760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff908116146101d4575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b03811681146101ea575f5ffd5b50565b5f5f604083850312156101fe575f5ffd5b8251610209816101d6565b602084015190925061021a816101d6565b809150509250929050565b60805160a05160c05160e0516114906102745f395f610b7a01525f610aba01525f8181610340015261063d01525f818161021c015281816103d8015281816104ad0152610b9e01526114905ff3fe608060405234801561000f575f5ffd5b506004361061013d575f3560e01c8063a364f4da116100b4578063dce974b911610079578063dce974b914610314578063df5cf7231461033b578063ec76f44214610362578063f2fde38b14610395578063f698da25146103a8578063fabc1cbc146103b0575f5ffd5b8063a364f4da1461028d578063a98fb355146102a0578063c825fe68146102b3578063cd6dc687146102da578063d79aceab146102ed575f5ffd5b80635c975abb116101055780635c975abb146101fd578063715018a61461020f578063886f1195146102175780638da5cb5b146102565780639926ee7d14610267578063a1060c881461027a575f5ffd5b8063136439dd14610141578063374823b51461015657806349075da314610198578063595c6a67146101d25780635ac86ab7146101da575b5f5ffd5b61015461014f366004611075565b6103c3565b005b6101836101643660046110a0565b609960209081525f928352604080842090915290825290205460ff1681565b60405190151581526020015b60405180910390f35b6101c56101a63660046110ca565b609860209081525f928352604080842090915290825290205460ff1681565b60405161018f9190611115565b610154610498565b6101836101e836600461113b565b606654600160ff9092169190911b9081161490565b6066545b60405190815260200161018f565b610154610547565b61023e7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200161018f565b6033546001600160a01b031661023e565b6101546102753660046111d0565b610558565b6102016102883660046112bd565b610777565b61015461029b366004611300565b6107f6565b6101546102ae36600461131b565b6108db565b6102017f809c5ac049c45b7a7f050a20f00c16cf63797efbf8b1eb8d749fdfa39ff8f92981565b6101546102e83660046110a0565b610922565b6102017fda2c89bafdd34776a2b8bb9c83c82f419e20cc8c67207f70edd58249b92661bd81565b6102017f4ee65f64218c67b68da66fd0db16560040a6b973290b9e71912d661ee53fe49581565b61023e7f000000000000000000000000000000000000000000000000000000000000000081565b610154610370366004611075565b335f90815260996020908152604080832093835292905220805460ff19166001179055565b6101546103a3366004611300565b610a3e565b610201610ab7565b6101546103be366004611075565b610b9c565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa158015610425573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104499190611389565b61046657604051631d77d47760e21b815260040160405180910390fd5b606654818116811461048b5760405163c61dca5d60e01b815260040160405180910390fd5b61049482610cab565b5050565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa1580156104fa573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061051e9190611389565b61053b57604051631d77d47760e21b815260040160405180910390fd5b6105455f19610cab565b565b61054f610ce8565b6105455f610d42565b6066545f906001908116036105805760405163840a48d560e01b815260040160405180910390fd5b6001335f9081526098602090815260408083206001600160a01b038816845290915290205460ff1660018111156105b9576105b9611101565b036105d757604051631aa528bb60e11b815260040160405180910390fd5b6001600160a01b0383165f90815260996020908152604080832085830151845290915290205460ff161561061e57604051630d4c4c9160e21b815260040160405180910390fd5b6040516336b87bd760e11b81526001600160a01b0384811660048301527f00000000000000000000000000000000000000000000000000000000000000001690636d70f7ae90602401602060405180830381865afa158015610682573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106a69190611389565b6106c357604051639f88c8af60e01b815260040160405180910390fd5b6106e7836106db853386602001518760400151610777565b84516040860151610d93565b6001600160a01b0383165f81815260996020908152604080832086830151845282528083208054600160ff19918216811790925533808652609885528386208787529094529382902080549094168117909355519092917ff0952b1c65271d819d39983d2abb044b9cace59bcc4d4dd389f586ebdcb15b419161076a9190611115565b60405180910390a3505050565b604080517fda2c89bafdd34776a2b8bb9c83c82f419e20cc8c67207f70edd58249b92661bd60208201526001600160a01b038087169282019290925290841660608201526080810183905260a081018290525f906107ed9060c00160405160208183030381529060405280519060200120610deb565b95945050505050565b6066545f9060019081160361081e5760405163840a48d560e01b815260040160405180910390fd5b6001335f9081526098602090815260408083206001600160a01b038716845290915290205460ff16600181111561085757610857611101565b14610875576040516352df45c960e01b815260040160405180910390fd5b335f8181526098602090815260408083206001600160a01b0387168085529252808320805460ff191690555190917ff0952b1c65271d819d39983d2abb044b9cace59bcc4d4dd389f586ebdcb15b41916108cf9190611115565b60405180910390a35050565b336001600160a01b03167fa89c1dc243d8908a96dd84944bcc97d6bc6ac00dd78e20621576be6a3c94371383836040516109169291906113a8565b60405180910390a25050565b5f54610100900460ff161580801561094057505f54600160ff909116105b806109595750303b15801561095957505f5460ff166001145b6109c15760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b5f805460ff1916600117905580156109e2575f805461ff0019166101001790555b6109eb82610cab565b6109f483610d42565b8015610a39575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050565b610a46610ce8565b6001600160a01b038116610aab5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016109b8565b610ab481610d42565b50565b5f7f00000000000000000000000000000000000000000000000000000000000000004614610b775750604080518082018252600a81526922b4b3b2b72630bcb2b960b11b60209182015281517f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a866818301527f71b625cfad44bac63b13dba07f2e1d6084ee04b6f8752101ece6126d584ee6ea81840152466060820152306080808301919091528351808303909101815260a0909101909252815191012090565b507f000000000000000000000000000000000000000000000000000000000000000090565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610bf8573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c1c91906113d6565b6001600160a01b0316336001600160a01b031614610c4d5760405163794821ff60e01b815260040160405180910390fd5b60665480198219811614610c745760405163c61dca5d60e01b815260040160405180910390fd5b606682905560405182815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c90602001610916565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a250565b6033546001600160a01b031633146105455760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016109b8565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b42811015610db457604051630819bdcd60e01b815260040160405180910390fd5b610dc86001600160a01b0385168484610e31565b610de557604051638baa579f60e01b815260040160405180910390fd5b50505050565b5f610df4610ab7565b60405161190160f01b6020820152602281019190915260428101839052606201604051602081830303815290604052805190602001209050919050565b5f5f5f610e3e8585610e8f565b90925090505f816004811115610e5657610e56611101565b148015610e745750856001600160a01b0316826001600160a01b0316145b80610e855750610e85868686610ed1565b9695505050505050565b5f5f8251604103610ec3576020830151604084015160608501515f1a610eb787828585610fb8565b94509450505050610eca565b505f905060025b9250929050565b5f5f5f856001600160a01b0316631626ba7e60e01b8686604051602401610ef99291906113f1565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b0319909416939093179092529051610f37919061142d565b5f60405180830381855afa9150503d805f8114610f6f576040519150601f19603f3d011682016040523d82523d5f602084013e610f74565b606091505b5091509150818015610f8857506020815110155b8015610e8557508051630b135d3f60e11b90610fad9083016020908101908401611443565b149695505050505050565b5f807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0831115610fed57505f9050600361106c565b604080515f8082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa15801561103e573d5f5f3e3d5ffd5b5050604051601f1901519150506001600160a01b038116611066575f6001925092505061106c565b91505f90505b94509492505050565b5f60208284031215611085575f5ffd5b5035919050565b6001600160a01b0381168114610ab4575f5ffd5b5f5f604083850312156110b1575f5ffd5b82356110bc8161108c565b946020939093013593505050565b5f5f604083850312156110db575f5ffd5b82356110e68161108c565b915060208301356110f68161108c565b809150509250929050565b634e487b7160e01b5f52602160045260245ffd5b602081016002831061113557634e487b7160e01b5f52602160045260245ffd5b91905290565b5f6020828403121561114b575f5ffd5b813560ff8116811461115b575f5ffd5b9392505050565b634e487b7160e01b5f52604160045260245ffd5b6040516060810167ffffffffffffffff8111828210171561119957611199611162565b60405290565b604051601f8201601f1916810167ffffffffffffffff811182821017156111c8576111c8611162565b604052919050565b5f5f604083850312156111e1575f5ffd5b82356111ec8161108c565b9150602083013567ffffffffffffffff811115611207575f5ffd5b830160608186031215611218575f5ffd5b611220611176565b813567ffffffffffffffff811115611236575f5ffd5b8201601f81018713611246575f5ffd5b803567ffffffffffffffff81111561126057611260611162565b611273601f8201601f191660200161119f565b818152886020838501011115611287575f5ffd5b816020840160208301375f6020928201830152835283810135908301525060409182013591810191909152919491935090915050565b5f5f5f5f608085870312156112d0575f5ffd5b84356112db8161108c565b935060208501356112eb8161108c565b93969395505050506040820135916060013590565b5f60208284031215611310575f5ffd5b813561115b8161108c565b5f5f6020838503121561132c575f5ffd5b823567ffffffffffffffff811115611342575f5ffd5b8301601f81018513611352575f5ffd5b803567ffffffffffffffff811115611368575f5ffd5b856020828401011115611379575f5ffd5b6020919091019590945092505050565b5f60208284031215611399575f5ffd5b8151801515811461115b575f5ffd5b60208152816020820152818360408301375f818301604090810191909152601f909201601f19160101919050565b5f602082840312156113e6575f5ffd5b815161115b8161108c565b828152604060208201525f82518060408401528060208501606085015e5f606082850101526060601f19601f8301168401019150509392505050565b5f82518060208501845e5f920191825250919050565b5f60208284031215611453575f5ffd5b505191905056fea26469706673582212202c42c92d65f6f44be16b51a5a779e97a22a93acc208b28e1eea0aff5bf2b14e664736f6c634300081b0033", + Bin: "0x610100604052348015610010575f5ffd5b5060405161170438038061170483398101604081905261002f916101ed565b81816001600160a01b038116610058576040516339b190bb60e11b815260040160405180910390fd5b6001600160a01b039081166080521660a0524660c052610108604080518082018252600a81526922b4b3b2b72630bcb2b960b11b60209182015281517f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a866818301527f71b625cfad44bac63b13dba07f2e1d6084ee04b6f8752101ece6126d584ee6ea81840152466060820152306080808301919091528351808303909101815260a0909101909252815191012090565b60e05261011361011a565b5050610225565b5f54610100900460ff16156101855760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff908116146101d4575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b03811681146101ea575f5ffd5b50565b5f5f604083850312156101fe575f5ffd5b8251610209816101d6565b602084015190925061021a816101d6565b809150509250929050565b60805160a05160c05160e0516114906102745f395f610b7a01525f610aba01525f8181610340015261063d01525f818161021c015281816103d8015281816104ad0152610b9e01526114905ff3fe608060405234801561000f575f5ffd5b506004361061013d575f3560e01c8063a364f4da116100b4578063dce974b911610079578063dce974b914610314578063df5cf7231461033b578063ec76f44214610362578063f2fde38b14610395578063f698da25146103a8578063fabc1cbc146103b0575f5ffd5b8063a364f4da1461028d578063a98fb355146102a0578063c825fe68146102b3578063cd6dc687146102da578063d79aceab146102ed575f5ffd5b80635c975abb116101055780635c975abb146101fd578063715018a61461020f578063886f1195146102175780638da5cb5b146102565780639926ee7d14610267578063a1060c881461027a575f5ffd5b8063136439dd14610141578063374823b51461015657806349075da314610198578063595c6a67146101d25780635ac86ab7146101da575b5f5ffd5b61015461014f366004611075565b6103c3565b005b6101836101643660046110a0565b609960209081525f928352604080842090915290825290205460ff1681565b60405190151581526020015b60405180910390f35b6101c56101a63660046110ca565b609860209081525f928352604080842090915290825290205460ff1681565b60405161018f9190611115565b610154610498565b6101836101e836600461113b565b606654600160ff9092169190911b9081161490565b6066545b60405190815260200161018f565b610154610547565b61023e7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200161018f565b6033546001600160a01b031661023e565b6101546102753660046111d0565b610558565b6102016102883660046112bd565b610777565b61015461029b366004611300565b6107f6565b6101546102ae36600461131b565b6108db565b6102017f809c5ac049c45b7a7f050a20f00c16cf63797efbf8b1eb8d749fdfa39ff8f92981565b6101546102e83660046110a0565b610922565b6102017fda2c89bafdd34776a2b8bb9c83c82f419e20cc8c67207f70edd58249b92661bd81565b6102017f4ee65f64218c67b68da66fd0db16560040a6b973290b9e71912d661ee53fe49581565b61023e7f000000000000000000000000000000000000000000000000000000000000000081565b610154610370366004611075565b335f90815260996020908152604080832093835292905220805460ff19166001179055565b6101546103a3366004611300565b610a3e565b610201610ab7565b6101546103be366004611075565b610b9c565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa158015610425573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104499190611389565b61046657604051631d77d47760e21b815260040160405180910390fd5b606654818116811461048b5760405163c61dca5d60e01b815260040160405180910390fd5b61049482610cab565b5050565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa1580156104fa573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061051e9190611389565b61053b57604051631d77d47760e21b815260040160405180910390fd5b6105455f19610cab565b565b61054f610ce8565b6105455f610d42565b6066545f906001908116036105805760405163840a48d560e01b815260040160405180910390fd5b6001335f9081526098602090815260408083206001600160a01b038816845290915290205460ff1660018111156105b9576105b9611101565b036105d757604051631aa528bb60e11b815260040160405180910390fd5b6001600160a01b0383165f90815260996020908152604080832085830151845290915290205460ff161561061e57604051630d4c4c9160e21b815260040160405180910390fd5b6040516336b87bd760e11b81526001600160a01b0384811660048301527f00000000000000000000000000000000000000000000000000000000000000001690636d70f7ae90602401602060405180830381865afa158015610682573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106a69190611389565b6106c357604051639f88c8af60e01b815260040160405180910390fd5b6106e7836106db853386602001518760400151610777565b84516040860151610d93565b6001600160a01b0383165f81815260996020908152604080832086830151845282528083208054600160ff19918216811790925533808652609885528386208787529094529382902080549094168117909355519092917ff0952b1c65271d819d39983d2abb044b9cace59bcc4d4dd389f586ebdcb15b419161076a9190611115565b60405180910390a3505050565b604080517fda2c89bafdd34776a2b8bb9c83c82f419e20cc8c67207f70edd58249b92661bd60208201526001600160a01b038087169282019290925290841660608201526080810183905260a081018290525f906107ed9060c00160405160208183030381529060405280519060200120610deb565b95945050505050565b6066545f9060019081160361081e5760405163840a48d560e01b815260040160405180910390fd5b6001335f9081526098602090815260408083206001600160a01b038716845290915290205460ff16600181111561085757610857611101565b14610875576040516352df45c960e01b815260040160405180910390fd5b335f8181526098602090815260408083206001600160a01b0387168085529252808320805460ff191690555190917ff0952b1c65271d819d39983d2abb044b9cace59bcc4d4dd389f586ebdcb15b41916108cf9190611115565b60405180910390a35050565b336001600160a01b03167fa89c1dc243d8908a96dd84944bcc97d6bc6ac00dd78e20621576be6a3c94371383836040516109169291906113a8565b60405180910390a25050565b5f54610100900460ff161580801561094057505f54600160ff909116105b806109595750303b15801561095957505f5460ff166001145b6109c15760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b5f805460ff1916600117905580156109e2575f805461ff0019166101001790555b6109eb82610cab565b6109f483610d42565b8015610a39575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050565b610a46610ce8565b6001600160a01b038116610aab5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016109b8565b610ab481610d42565b50565b5f7f00000000000000000000000000000000000000000000000000000000000000004614610b775750604080518082018252600a81526922b4b3b2b72630bcb2b960b11b60209182015281517f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a866818301527f71b625cfad44bac63b13dba07f2e1d6084ee04b6f8752101ece6126d584ee6ea81840152466060820152306080808301919091528351808303909101815260a0909101909252815191012090565b507f000000000000000000000000000000000000000000000000000000000000000090565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610bf8573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c1c91906113d6565b6001600160a01b0316336001600160a01b031614610c4d5760405163794821ff60e01b815260040160405180910390fd5b60665480198219811614610c745760405163c61dca5d60e01b815260040160405180910390fd5b606682905560405182815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c90602001610916565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a250565b6033546001600160a01b031633146105455760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016109b8565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b42811015610db457604051630819bdcd60e01b815260040160405180910390fd5b610dc86001600160a01b0385168484610e31565b610de557604051638baa579f60e01b815260040160405180910390fd5b50505050565b5f610df4610ab7565b60405161190160f01b6020820152602281019190915260428101839052606201604051602081830303815290604052805190602001209050919050565b5f5f5f610e3e8585610e8f565b90925090505f816004811115610e5657610e56611101565b148015610e745750856001600160a01b0316826001600160a01b0316145b80610e855750610e85868686610ed1565b9695505050505050565b5f5f8251604103610ec3576020830151604084015160608501515f1a610eb787828585610fb8565b94509450505050610eca565b505f905060025b9250929050565b5f5f5f856001600160a01b0316631626ba7e60e01b8686604051602401610ef99291906113f1565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b0319909416939093179092529051610f37919061142d565b5f60405180830381855afa9150503d805f8114610f6f576040519150601f19603f3d011682016040523d82523d5f602084013e610f74565b606091505b5091509150818015610f8857506020815110155b8015610e8557508051630b135d3f60e11b90610fad9083016020908101908401611443565b149695505050505050565b5f807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0831115610fed57505f9050600361106c565b604080515f8082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa15801561103e573d5f5f3e3d5ffd5b5050604051601f1901519150506001600160a01b038116611066575f6001925092505061106c565b91505f90505b94509492505050565b5f60208284031215611085575f5ffd5b5035919050565b6001600160a01b0381168114610ab4575f5ffd5b5f5f604083850312156110b1575f5ffd5b82356110bc8161108c565b946020939093013593505050565b5f5f604083850312156110db575f5ffd5b82356110e68161108c565b915060208301356110f68161108c565b809150509250929050565b634e487b7160e01b5f52602160045260245ffd5b602081016002831061113557634e487b7160e01b5f52602160045260245ffd5b91905290565b5f6020828403121561114b575f5ffd5b813560ff8116811461115b575f5ffd5b9392505050565b634e487b7160e01b5f52604160045260245ffd5b6040516060810167ffffffffffffffff8111828210171561119957611199611162565b60405290565b604051601f8201601f1916810167ffffffffffffffff811182821017156111c8576111c8611162565b604052919050565b5f5f604083850312156111e1575f5ffd5b82356111ec8161108c565b9150602083013567ffffffffffffffff811115611207575f5ffd5b830160608186031215611218575f5ffd5b611220611176565b813567ffffffffffffffff811115611236575f5ffd5b8201601f81018713611246575f5ffd5b803567ffffffffffffffff81111561126057611260611162565b611273601f8201601f191660200161119f565b818152886020838501011115611287575f5ffd5b816020840160208301375f6020928201830152835283810135908301525060409182013591810191909152919491935090915050565b5f5f5f5f608085870312156112d0575f5ffd5b84356112db8161108c565b935060208501356112eb8161108c565b93969395505050506040820135916060013590565b5f60208284031215611310575f5ffd5b813561115b8161108c565b5f5f6020838503121561132c575f5ffd5b823567ffffffffffffffff811115611342575f5ffd5b8301601f81018513611352575f5ffd5b803567ffffffffffffffff811115611368575f5ffd5b856020828401011115611379575f5ffd5b6020919091019590945092505050565b5f60208284031215611399575f5ffd5b8151801515811461115b575f5ffd5b60208152816020820152818360408301375f818301604090810191909152601f909201601f19160101919050565b5f602082840312156113e6575f5ffd5b815161115b8161108c565b828152604060208201525f82518060408401528060208501606085015e5f606082850101526060601f19601f8301168401019150509392505050565b5f82518060208501845e5f920191825250919050565b5f60208284031215611453575f5ffd5b505191905056fea2646970667358221220dd58927808a5d420cc6c9f6a25152778d4f182ee1e97e729f478130f5b06873b64736f6c634300081b0033", } // AVSDirectoryABI is the input ABI used to generate the binding from. diff --git a/pkg/bindings/AllocationManager/binding.go b/pkg/bindings/AllocationManager/binding.go index 8d9e421797..cea51cb22e 100644 --- a/pkg/bindings/AllocationManager/binding.go +++ b/pkg/bindings/AllocationManager/binding.go @@ -80,8 +80,8 @@ type OperatorSet struct { // AllocationManagerMetaData contains all meta data concerning the AllocationManager contract. var AllocationManagerMetaData = &bind.MetaData{ - ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"_delegation\",\"type\":\"address\",\"internalType\":\"contractIDelegationManager\"},{\"name\":\"_pauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"},{\"name\":\"_permissionController\",\"type\":\"address\",\"internalType\":\"contractIPermissionController\"},{\"name\":\"_DEALLOCATION_DELAY\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"_ALLOCATION_CONFIGURATION_DELAY\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"ALLOCATION_CONFIGURATION_DELAY\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"DEALLOCATION_DELAY\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"addStrategiesToOperatorSet\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetId\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"clearDeallocationQueue\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"numToClear\",\"type\":\"uint16[]\",\"internalType\":\"uint16[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"createOperatorSets\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"params\",\"type\":\"tuple[]\",\"internalType\":\"structIAllocationManagerTypes.CreateSetParams[]\",\"components\":[{\"name\":\"operatorSetId\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"delegation\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIDelegationManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"deregisterFromOperatorSets\",\"inputs\":[{\"name\":\"params\",\"type\":\"tuple\",\"internalType\":\"structIAllocationManagerTypes.DeregisterParams\",\"components\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetIds\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"encumberedMagnitude\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAVSRegistrar\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIAVSRegistrar\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAllocatableMagnitude\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAllocatedSets\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple[]\",\"internalType\":\"structOperatorSet[]\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAllocatedStrategies\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAllocation\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIAllocationManagerTypes.Allocation\",\"components\":[{\"name\":\"currentMagnitude\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"pendingDiff\",\"type\":\"int128\",\"internalType\":\"int128\"},{\"name\":\"effectBlock\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAllocationDelay\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAllocations\",\"inputs\":[{\"name\":\"operators\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple[]\",\"internalType\":\"structIAllocationManagerTypes.Allocation[]\",\"components\":[{\"name\":\"currentMagnitude\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"pendingDiff\",\"type\":\"int128\",\"internalType\":\"int128\"},{\"name\":\"effectBlock\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getMaxMagnitude\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getMaxMagnitudes\",\"inputs\":[{\"name\":\"operators\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64[]\",\"internalType\":\"uint64[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getMaxMagnitudes\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64[]\",\"internalType\":\"uint64[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getMaxMagnitudesAtBlock\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"blockNumber\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64[]\",\"internalType\":\"uint64[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getMemberCount\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getMembers\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getMinimumSlashableStake\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"operators\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"futureBlock\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[{\"name\":\"slashableStake\",\"type\":\"uint256[][]\",\"internalType\":\"uint256[][]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getOperatorSetCount\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getRegisteredSets\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple[]\",\"internalType\":\"structOperatorSet[]\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getStrategiesInOperatorSet\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getStrategyAllocations\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple[]\",\"internalType\":\"structOperatorSet[]\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"\",\"type\":\"tuple[]\",\"internalType\":\"structIAllocationManagerTypes.Allocation[]\",\"components\":[{\"name\":\"currentMagnitude\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"pendingDiff\",\"type\":\"int128\",\"internalType\":\"int128\"},{\"name\":\"effectBlock\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"initialOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"initialPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"isMemberOfOperatorSet\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isOperatorSet\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"modifyAllocations\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"params\",\"type\":\"tuple[]\",\"internalType\":\"structIAllocationManagerTypes.AllocateParams[]\",\"components\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"newMagnitudes\",\"type\":\"uint64[]\",\"internalType\":\"uint64[]\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"pauseAll\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[{\"name\":\"index\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pauserRegistry\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"permissionController\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIPermissionController\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"registerForOperatorSets\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"params\",\"type\":\"tuple\",\"internalType\":\"structIAllocationManagerTypes.RegisterParams\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetIds\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"removeStrategiesFromOperatorSet\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetId\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setAVSRegistrar\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"registrar\",\"type\":\"address\",\"internalType\":\"contractIAVSRegistrar\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setAllocationDelay\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"delay\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"slashOperator\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"params\",\"type\":\"tuple\",\"internalType\":\"structIAllocationManagerTypes.SlashingParams\",\"components\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetId\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"wadsToSlash\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"},{\"name\":\"description\",\"type\":\"string\",\"internalType\":\"string\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"updateAVSMetadataURI\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"metadataURI\",\"type\":\"string\",\"internalType\":\"string\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"AVSMetadataURIUpdated\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"metadataURI\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"AVSRegistrarSet\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"registrar\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIAVSRegistrar\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"AllocationDelaySet\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"delay\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"},{\"name\":\"effectBlock\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"AllocationUpdated\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"magnitude\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"effectBlock\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"EncumberedMagnitudeUpdated\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"encumberedMagnitude\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"MaxMagnitudeUpdated\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"maxMagnitude\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorAddedToOperatorSet\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorRemovedFromOperatorSet\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorSetCreated\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorSlashed\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"strategies\",\"type\":\"address[]\",\"indexed\":false,\"internalType\":\"contractIStrategy[]\"},{\"name\":\"wadSlashed\",\"type\":\"uint256[]\",\"indexed\":false,\"internalType\":\"uint256[]\"},{\"name\":\"description\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StrategyAddedToOperatorSet\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StrategyRemovedFromOperatorSet\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"AlreadyMemberOfSet\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"CurrentlyPaused\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"Empty\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InputAddressZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InputArrayLengthMismatch\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InsufficientMagnitude\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidAVSRegistrar\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidCaller\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidNewPausedStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidOperator\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidOperatorSet\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidPermissions\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidSnapshotOrdering\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidWadToSlash\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ModificationAlreadyPending\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotMemberOfSet\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyPauser\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyUnpauser\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OperatorNotSlashable\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OutOfBounds\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SameMagnitude\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StrategiesMustBeInAscendingOrder\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StrategyAlreadyInOperatorSet\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StrategyNotInOperatorSet\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"UninitializedAllocationDelay\",\"inputs\":[]}]", - Bin: "0x610120604052348015610010575f5ffd5b50604051615b41380380615b4183398101604081905261002f91610180565b82858383876001600160a01b03811661005b576040516339b190bb60e11b815260040160405180910390fd5b6001600160a01b0390811660805292831660a05263ffffffff91821660c0521660e052166101005261008b610095565b50505050506101e9565b5f54610100900460ff16156101005760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff9081161461014f575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b0381168114610165575f5ffd5b50565b805163ffffffff8116811461017b575f5ffd5b919050565b5f5f5f5f5f60a08688031215610194575f5ffd5b855161019f81610151565b60208701519095506101b081610151565b60408701519094506101c181610151565b92506101cf60608701610168565b91506101dd60808701610168565b90509295509295909350565b60805160a05160c05160e051610100516158c761027a5f395f81816103f901526137b301525f81816105480152613db301525f818161031e0152818161223e015261294601525f81816106fa01528181610c970152818161161c01528181611c8301528181611ced0152612c0d01525f818161056f0152818161079201528181611d92015261342a01526158c75ff3fe608060405234801561000f575f5ffd5b5060043610610281575f3560e01c80636e875dba11610156578063a984eb3a116100ca578063c221d8ae11610084578063c221d8ae146106bc578063cd6dc687146106cf578063d3d96ff4146106e2578063df5cf723146106f5578063f2fde38b1461071c578063fabc1cbc1461072f575f5ffd5b8063a984eb3a1461060e578063adc2e3d914610641578063b2447af714610654578063b66bd98914610667578063b9fbaed11461067a578063ba1a84e5146106a9575f5ffd5b80638ce648541161011b5780638ce64854146105915780638da5cb5b146105b157806394d7d00c146105c2578063952899ee146105d5578063a9333ec8146105e8578063a9821821146105fb575f5ffd5b80636e875dba14610515578063715018a61461052857806379ae50cd146105305780637bc1ef6114610543578063886f11951461056a575f5ffd5b80634657e26a116101f8578063595c6a67116101b2578063595c6a67146104875780635ac86ab71461048f5780635c975abb146104b2578063670d3ba2146104c45780636cfb4481146104d75780636e3492b514610502575f5ffd5b80634657e26a146103f45780634a10ffe51461041b5780634b5046ef1461043b57806350feea201461044e578063547afb871461046157806356c483e614610474575f5ffd5b80632981eb77116102495780632981eb77146103195780632bab2c4a14610355578063304c10cd1461037557806336352057146103a057806340120dab146103b35780634177a87c146103d4575f5ffd5b806310e1b9b814610285578063136439dd146102ae57806315fe5028146102c3578063260dc758146102e3578063261f84e014610306575b5f5ffd5b6102986102933660046147e3565b610742565b6040516102a5919061482a565b60405180910390f35b6102c16102bc36600461485d565b61077d565b005b6102d66102d1366004614874565b610852565b6040516102a591906148f2565b6102f66102f1366004614904565b610969565b60405190151581526020016102a5565b6102c161031436600461495e565b6109a0565b6103407f000000000000000000000000000000000000000000000000000000000000000081565b60405163ffffffff90911681526020016102a5565b610368610363366004614a43565b610c43565b6040516102a59190614af7565b610388610383366004614874565b610f30565b6040516001600160a01b0390911681526020016102a5565b6102c16103ae366004614b5a565b610f5f565b6103c66103c1366004614bac565b611771565b6040516102a5929190614c39565b6103e76103e2366004614904565b6118ec565b6040516102a59190614c96565b6103887f000000000000000000000000000000000000000000000000000000000000000081565b61042e610429366004614ca8565b611910565b6040516102a59190614ceb565b6102c1610449366004614d36565b6119b8565b6102c161045c366004614db6565b611a72565b61042e61046f366004614e14565b611bd0565b6102c1610482366004614e60565b611c78565b6102c1611d7d565b6102f661049d366004614e93565b606654600160ff9092169190911b9081161490565b6066545b6040519081526020016102a5565b6102f66104d2366004614eb3565b611e2c565b6104ea6104e5366004614bac565b611e3d565b6040516001600160401b0390911681526020016102a5565b6102c1610510366004614ef4565b611faa565b6103e7610523366004614904565b61238b565b6102c161239c565b6102d661053e366004614874565b6123ad565b6103407f000000000000000000000000000000000000000000000000000000000000000081565b6103887f000000000000000000000000000000000000000000000000000000000000000081565b6105a461059f366004614f25565b612487565b6040516102a59190614f68565b6033546001600160a01b0316610388565b61042e6105d0366004614f7a565b61254c565b6102c16105e3366004614fd5565b612638565b6104ea6105f6366004614bac565b612aff565b6102c161060936600461517e565b612b2e565b6104ea61061c366004614bac565b60a260209081525f92835260408084209091529082529020546001600160401b031681565b6102c161064f3660046151fc565b612b9e565b6104b6610662366004614904565b612efb565b6102c1610675366004614db6565b612f1d565b61068d610688366004614874565b613077565b60408051921515835263ffffffff9091166020830152016102a5565b6104b66106b7366004614874565b613111565b6103e76106ca366004614eb3565b613131565b6102c16106dd36600461523e565b613162565b6102c16106f0366004614bac565b61327f565b6103887f000000000000000000000000000000000000000000000000000000000000000081565b6102c161072a366004614874565b6133af565b6102c161073d36600461485d565b613428565b604080516060810182525f80825260208201819052918101829052906107718561076b8661353e565b856135a1565b925050505b9392505050565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa1580156107df573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108039190615268565b61082057604051631d77d47760e21b815260040160405180910390fd5b60665481811681146108455760405163c61dca5d60e01b815260040160405180910390fd5b61084e8261370d565b5050565b6001600160a01b0381165f908152609d60205260408120606091906108769061374a565b90505f816001600160401b0381111561089157610891614707565b6040519080825280602002602001820160405280156108d557816020015b604080518082019091525f80825260208201528152602001906001900390816108af5790505b5090505f5b82811015610961576001600160a01b0385165f908152609d6020526040902061093c906109079083613753565b604080518082019091525f80825260208201525060408051808201909152606082901c815263ffffffff909116602082015290565b82828151811061094e5761094e615287565b60209081029190910101526001016108da565b509392505050565b60208082015182516001600160a01b03165f90815260989092526040822061099a9163ffffffff9081169061375e16565b92915050565b826109aa81613775565b6109c75760405163932d94f760e01b815260040160405180910390fd5b5f5b82811015610c3c575f6040518060400160405280876001600160a01b031681526020018686858181106109fe576109fe615287565b9050602002810190610a10919061529b565b610a1e9060208101906152b9565b63ffffffff168152509050610a68816020015163ffffffff1660985f896001600160a01b03166001600160a01b031681526020019081526020015f2061381f90919063ffffffff16565b610a8557604051631fb1705560e21b815260040160405180910390fd5b7f31629285ead2335ae0933f86ed2ae63321f7af77b4e6eaabc42c057880977e6c6040518060400160405280886001600160a01b03168152602001836020015163ffffffff16815250604051610adb91906152d2565b60405180910390a15f610aed8261353e565b90505f5b868685818110610b0357610b03615287565b9050602002810190610b15919061529b565b610b239060208101906152e0565b9050811015610c3157610b99878786818110610b4157610b41615287565b9050602002810190610b53919061529b565b610b619060208101906152e0565b83818110610b7157610b71615287565b9050602002016020810190610b869190614874565b5f8481526099602052604090209061382a565b507f7ab260fe0af193db5f4986770d831bda4ea46099dc817e8b6716dcae8af8e88b83888887818110610bce57610bce615287565b9050602002810190610be0919061529b565b610bee9060208101906152e0565b84818110610bfe57610bfe615287565b9050602002016020810190610c139190614874565b604051610c21929190615325565b60405180910390a1600101610af1565b5050506001016109c9565b5050505050565b606083516001600160401b03811115610c5e57610c5e614707565b604051908082528060200260200182016040528015610c9157816020015b6060815260200190600190039081610c7c5790505b5090505f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663f0e0e67686866040518363ffffffff1660e01b8152600401610ce392919061534b565b5f60405180830381865afa158015610cfd573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610d24919081019061536f565b90505f5b8551811015610f26575f868281518110610d4457610d44615287565b6020026020010151905085516001600160401b03811115610d6757610d67614707565b604051908082528060200260200182016040528015610d90578160200160208202803683370190505b50848381518110610da357610da3615287565b60209081029190910101525f5b8651811015610f1c575f878281518110610dcc57610dcc615287565b6020908102919091018101516001600160a01b038086165f90815260a1845260408082209284168252919093528220909250610e079061383e565b9050806001600160401b03165f03610e20575050610f14565b5f610e2c858d85610742565b90508863ffffffff16816040015163ffffffff1611158015610e5457505f8160200151600f0b125b15610e7657610e6a815f01518260200151613851565b6001600160401b031681525b80515f90610e91906001600160401b03908116908516613865565b9050610ed881898981518110610ea957610ea9615287565b60200260200101518781518110610ec257610ec2615287565b602002602001015161387990919063ffffffff16565b898881518110610eea57610eea615287565b60200260200101518681518110610f0357610f03615287565b602002602001018181525050505050505b600101610db0565b5050600101610d28565b5050949350505050565b6001600160a01b038082165f908152609760205260408120549091168015610f585780610776565b5090919050565b606654600190600290811603610f885760405163840a48d560e01b815260040160405180910390fd5b82610f9281613775565b610faf5760405163932d94f760e01b815260040160405180910390fd5b5f6040518060400160405280866001600160a01b03168152602001856020016020810190610fdd91906152b9565b63ffffffff16905290505f610ffe610ff86020870187614874565b8361388d565b905061100d60608601866152e0565b905061101c60408701876152e0565b90501461103c576040516343714afd60e01b815260040160405180910390fd5b60208083015183516001600160a01b03165f9081526098909252604090912061106e9163ffffffff9081169061375e16565b61108b57604051631fb1705560e21b815260040160405180910390fd5b806110a95760405163ebbff49760e01b815260040160405180910390fd5b5f6110b760408701876152e0565b90506001600160401b038111156110d0576110d0614707565b6040519080825280602002602001820160405280156110f9578160200160208202803683370190505b5090505f5b61110b60408801886152e0565b90508110156117025780158061119e575061112960408801886152e0565b61113460018461548f565b81811061114357611143615287565b90506020020160208101906111589190614874565b6001600160a01b031661116e60408901896152e0565b8381811061117e5761117e615287565b90506020020160208101906111939190614874565b6001600160a01b0316115b6111bb57604051639f1c805360e01b815260040160405180910390fd5b6111c860608801886152e0565b828181106111d8576111d8615287565b905060200201355f1080156112185750670de0b6b3a76400006111fe60608901896152e0565b8381811061120e5761120e615287565b9050602002013511155b61123557604051631353603160e01b815260040160405180910390fd5b61129161124560408901896152e0565b8381811061125557611255615287565b905060200201602081019061126a9190614874565b60995f6112768861353e565b81526020019081526020015f2061390390919063ffffffff16565b6112ae576040516331bc342760e11b815260040160405180910390fd5b5f806113006112c060208b018b614874565b6112c98861353e565b6112d660408d018d6152e0565b878181106112e6576112e6615287565b90506020020160208101906112fb9190614874565b6135a1565b805191935091506001600160401b03165f0361131d5750506116fa565b5f61135861132e60608c018c6152e0565b8681811061133e5761133e615287565b85516001600160401b031692602090910201359050613924565b83519091506113736001600160401b03808416908316613865565b86868151811061138557611385615287565b60200260200101818152505081835f018181516113a291906154a2565b6001600160401b03169052508351829085906113bf9083906154a2565b6001600160401b03169052506020840180518391906113df9083906154a2565b6001600160401b031690525060208301515f600f9190910b12156114fa575f61144261140e60608e018e6152e0565b8881811061141e5761141e615287565b905060200201358560200151611433906154c1565b6001600160801b031690613924565b9050806001600160401b03168460200181815161145f91906154e5565b600f0b9052507f1487af5418c47ee5ea45ef4a93398668120890774a9e13487e61e9dc3baf76dd61149360208e018e614874565b8a8e80604001906114a491906152e0565b8a8181106114b4576114b4615287565b90506020020160208101906114c99190614874565b6114da885f01518960200151613851565b88604001516040516114f0959493929190615512565b60405180910390a1505b61154c61150a60208d018d614874565b6115138a61353e565b61152060408f018f6152e0565b8981811061153057611530615287565b90506020020160208101906115459190614874565b878761393a565b7f1487af5418c47ee5ea45ef4a93398668120890774a9e13487e61e9dc3baf76dd61157a60208d018d614874565b8961158860408f018f6152e0565b8981811061159857611598615287565b90506020020160208101906115ad9190614874565b86516040516115c194939291904390615512565b60405180910390a16116126115d960208d018d614874565b6115e660408e018e6152e0565b888181106115f6576115f6615287565b905060200201602081019061160b9190614874565b8651613b7a565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001663601bb36f61164e60208e018e614874565b61165b60408f018f6152e0565b8981811061166b5761166b615287565b90506020020160208101906116809190614874565b875160405160e085901b6001600160e01b03191681526001600160a01b0393841660048201529290911660248301526001600160401b0380861660448401521660648201526084015f604051808303815f87803b1580156116df575f5ffd5b505af11580156116f1573d5f5f3e3d5ffd5b50505050505050505b6001016110fe565b507f80969ad29428d6797ee7aad084f9e4a42a82fc506dcd2ca3b6fb431f85ccebe56117316020880188614874565b8461173f60408a018a6152e0565b8561174d60808d018d615563565b60405161176097969594939291906155cd565b60405180910390a150505050505050565b6001600160a01b0382165f908152609d6020526040812060609182916117969061374a565b90505f816001600160401b038111156117b1576117b1614707565b6040519080825280602002602001820160405280156117f557816020015b604080518082019091525f80825260208201528152602001906001900390816117cf5790505b5090505f826001600160401b0381111561181157611811614707565b60405190808252806020026020018201604052801561185a57816020015b604080516060810182525f80825260208083018290529282015282525f1990920191018161182f5790505b5090505f5b838110156118dd576001600160a01b0388165f908152609d6020526040812061188c906109079084613753565b9050808483815181106118a1576118a1615287565b60200260200101819052506118b789828a610742565b8383815181106118c9576118c9615287565b60209081029190910101525060010161185f565b509093509150505b9250929050565b60605f61077660995f6118fe8661353e565b81526020019081526020015f20613bfc565b60605f83516001600160401b0381111561192c5761192c614707565b604051908082528060200260200182016040528015611955578160200160208202803683370190505b5090505f5b84518110156109615761198685828151811061197857611978615287565b602002602001015185612aff565b82828151811061199857611998615287565b6001600160401b039092166020928302919091019091015260010161195a565b6066545f906001908116036119e05760405163840a48d560e01b815260040160405180910390fd5b838214611a00576040516343714afd60e01b815260040160405180910390fd5b5f5b84811015611a6957611a6187878784818110611a2057611a20615287565b9050602002016020810190611a359190614874565b868685818110611a4757611a47615287565b9050602002016020810190611a5c9190615663565b613c08565b600101611a02565b50505050505050565b83611a7c81613775565b611a995760405163932d94f760e01b815260040160405180910390fd5b604080518082019091526001600160a01b038616815263ffffffff851660208201525f611ac58261353e565b9050611b06826020015163ffffffff1660985f8a6001600160a01b03166001600160a01b031681526020019081526020015f2061375e90919063ffffffff16565b611b2357604051631fb1705560e21b815260040160405180910390fd5b5f5b84811015611bc657611b42868683818110610b7157610b71615287565b611b5f5760405163585cfb2f60e01b815260040160405180910390fd5b7f7ab260fe0af193db5f4986770d831bda4ea46099dc817e8b6716dcae8af8e88b83878784818110611b9357611b93615287565b9050602002016020810190611ba89190614874565b604051611bb6929190615325565b60405180910390a1600101611b25565b5050505050505050565b60605f82516001600160401b03811115611bec57611bec614707565b604051908082528060200260200182016040528015611c15578160200160208202803683370190505b5090505f5b835181101561096157611c4685858381518110611c3957611c39615287565b6020026020010151612aff565b828281518110611c5857611c58615287565b6001600160401b0390921660209283029190910190910152600101611c1a565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614611d7357611cb182613775565b611cce576040516348f5c3ed60e01b815260040160405180910390fd5b6040516336b87bd760e11b81526001600160a01b0383811660048301527f00000000000000000000000000000000000000000000000000000000000000001690636d70f7ae90602401602060405180830381865afa158015611d32573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611d569190615268565b611d735760405163ccea9e6f60e01b815260040160405180910390fd5b61084e8282613d0c565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa158015611ddf573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611e039190615268565b611e2057604051631d77d47760e21b815260040160405180910390fd5b611e2a5f1961370d565b565b5f61077683609a5f6112768661353e565b6001600160a01b038281165f81815260a2602090815260408083209486168084529482528083205493835260a38252808320948352939052918220546001600160401b0390911690600f81810b600160801b909204900b03825b81811015611f67576001600160a01b038087165f90815260a3602090815260408083209389168352929052908120611ecf9083613eb8565b6001600160a01b038881165f90815260a0602090815260408083208584528252808320938b16835292815290829020825160608101845290546001600160401b0381168252600160401b8104600f0b92820192909252600160c01b90910463ffffffff16918101829052919250431015611f4a575050611f67565b611f58858260200151613851565b94505050806001019050611e97565b506001600160a01b038086165f90815260a1602090815260408083209388168352929052208290611f979061383e565b611fa191906154a2565b95945050505050565b606654600290600490811603611fd35760405163840a48d560e01b815260040160405180910390fd5b611fe8611fe36020840184614874565b613775565b806120015750612001611fe36040840160208501614874565b61201e576040516348f5c3ed60e01b815260040160405180910390fd5b5f5b61202d60408401846152e0565b90508110156122ef575f60405180604001604052808560200160208101906120559190614874565b6001600160a01b0316815260200161207060408701876152e0565b8581811061208057612080615287565b905060200201602081019061209591906152b9565b63ffffffff1681525090506120e2816020015163ffffffff1660985f8760200160208101906120c49190614874565b6001600160a01b0316815260208101919091526040015f209061375e565b6120ff57604051631fb1705560e21b815260040160405180910390fd5b609e5f61210f6020870187614874565b6001600160a01b03166001600160a01b031681526020019081526020015f205f6121388361353e565b815260208101919091526040015f205460ff16612168576040516325131d4f60e01b815260040160405180910390fd5b6121a26121748261353e565b609c5f6121846020890189614874565b6001600160a01b0316815260208101919091526040015f2090613f27565b506121da6121b36020860186614874565b609a5f6121bf8561353e565b81526020019081526020015f20613f3290919063ffffffff16565b506121e86020850185614874565b6001600160a01b03167fad34c3070be1dffbcaa499d000ba2b8d9848aefcac3059df245dd95c4ece14fe8260405161222091906152d2565b60405180910390a2604080518082019091525f8152602081016122637f000000000000000000000000000000000000000000000000000000000000000043615684565b63ffffffff169052609e5f61227b6020880188614874565b6001600160a01b03166001600160a01b031681526020019081526020015f205f6122a48461353e565b81526020808201929092526040015f2082518154939092015163ffffffff166101000264ffffffff00199215159290921664ffffffffff199093169290921717905550600101612020565b506123036103836040840160208501614874565b6001600160a01b031663303ca95661231e6020850185614874565b61232e6040860160208701614874565b61233b60408701876152e0565b6040518563ffffffff1660e01b815260040161235a94939291906156d9565b5f604051808303815f87803b158015612371575f5ffd5b505af1925050508015612382575060015b1561084e575050565b606061099a609a5f6118fe8561353e565b6123a4613f46565b611e2a5f613fa0565b6001600160a01b0381165f908152609c60205260408120606091906123d19061374a565b90505f816001600160401b038111156123ec576123ec614707565b60405190808252806020026020018201604052801561243057816020015b604080518082019091525f808252602082015281526020019060019003908161240a5790505b5090505f5b82811015610961576001600160a01b0385165f908152609c60205260409020612462906109079083613753565b82828151811061247457612474615287565b6020908102919091010152600101612435565b60605f84516001600160401b038111156124a3576124a3614707565b6040519080825280602002602001820160405280156124ec57816020015b604080516060810182525f80825260208083018290529282015282525f199092019101816124c15790505b5090505f5b85518110156125435761251e86828151811061250f5761250f615287565b60200260200101518686610742565b82828151811061253057612530615287565b60209081029190910101526001016124f1565b50949350505050565b60605f83516001600160401b0381111561256857612568614707565b604051908082528060200260200182016040528015612591578160200160208202803683370190505b5090505f5b8451811015612543576001600160a01b0386165f90815260a1602052604081208651612606928792918990869081106125d1576125d1615287565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020015f20613ff190919063ffffffff16565b82828151811061261857612618615287565b6001600160401b0390921660209283029190910190910152600101612596565b6066545f906001908116036126605760405163840a48d560e01b815260040160405180910390fd5b61266983613775565b612686576040516348f5c3ed60e01b815260040160405180910390fd5b5f5f5f61269286613077565b91509150816126b45760405163fa55fc8160e01b815260040160405180910390fd5b91505f90505b8351811015610c3c578381815181106126d5576126d5615287565b602002602001015160400151518482815181106126f4576126f4615287565b602002602001015160200151511461271f576040516343714afd60e01b815260040160405180910390fd5b5f84828151811061273257612732615287565b602090810291909101810151518082015181516001600160a01b03165f908152609890935260409092209092506127729163ffffffff9081169061375e16565b61278f57604051631fb1705560e21b815260040160405180910390fd5b5f61279a878361388d565b90505f5b8684815181106127b0576127b0615287565b60200260200101516020015151811015612af4575f8785815181106127d7576127d7615287565b60200260200101516020015182815181106127f4576127f4615287565b6020026020010151905061280b898261ffff613c08565b5f5f61281a8b61076b8861353e565b915091508060200151600f0b5f1461284557604051630d8fcbe360e41b815260040160405180910390fd5b5f61285287858489614005565b9050612897825f01518c8a8151811061286d5761286d615287565b602002602001015160400151878151811061288a5761288a615287565b602002602001015161403b565b600f0b602083018190525f036128c057604051634606179360e11b815260040160405180910390fd5b5f8260200151600f0b1215612a04578015612986576129416128e18861353e565b6001600160a01b03808f165f90815260a360209081526040808320938a16835292905220908154600160801b90819004600f0b5f818152600180860160205260409091209390935583546001600160801b03908116939091011602179055565b61296b7f000000000000000000000000000000000000000000000000000000000000000043615684565b612976906001615684565b63ffffffff166040830152612a71565b61299883602001518360200151613851565b6001600160401b031660208401528a518b90899081106129ba576129ba615287565b60200260200101516040015185815181106129d7576129d7615287565b6020908102919091018101516001600160401b031683525f9083015263ffffffff43166040830152612a71565b5f8260200151600f0b1315612a7157612a2583602001518360200151613851565b6001600160401b039081166020850181905284519091161015612a5b57604051636c9be0bf60e01b815260040160405180910390fd5b612a658943615684565b63ffffffff1660408301525b612a868c612a7e8961353e565b86868661393a565b7f1487af5418c47ee5ea45ef4a93398668120890774a9e13487e61e9dc3baf76dd8c612ab46109078a61353e565b86612ac6865f01518760200151613851565b8660400151604051612adc959493929190615512565b60405180910390a150506001909201915061279e9050565b5050506001016126ba565b6001600160a01b038083165f90815260a16020908152604080832093851683529290529081206107769061383e565b82612b3881613775565b612b555760405163932d94f760e01b815260040160405180910390fd5b836001600160a01b03167fa89c1dc243d8908a96dd84944bcc97d6bc6ac00dd78e20621576be6a3c9437138484604051612b90929190615705565b60405180910390a250505050565b606654600290600490811603612bc75760405163840a48d560e01b815260040160405180910390fd5b82612bd181613775565b612bee5760405163932d94f760e01b815260040160405180910390fd5b6040516336b87bd760e11b81526001600160a01b0385811660048301527f00000000000000000000000000000000000000000000000000000000000000001690636d70f7ae90602401602060405180830381865afa158015612c52573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612c769190615268565b612c935760405163ccea9e6f60e01b815260040160405180910390fd5b5f5b612ca260208501856152e0565b9050811015612e6a57604080518082019091525f9080612cc56020880188614874565b6001600160a01b03168152602001868060200190612ce391906152e0565b85818110612cf357612cf3615287565b9050602002016020810190612d0891906152b9565b63ffffffff90811690915260208083015183516001600160a01b03165f90815260989092526040909120929350612d4492919081169061375e16565b612d6157604051631fb1705560e21b815260040160405180910390fd5b612d6b868261388d565b15612d8957604051636c6c6e2760e11b815260040160405180910390fd5b612db2612d958261353e565b6001600160a01b0388165f908152609c602052604090209061381f565b50612dde86609a5f612dc38561353e565b81526020019081526020015f2061382a90919063ffffffff16565b50856001600160a01b03167f43232edf9071753d2321e5fa7e018363ee248e5f2142e6c08edd3265bfb4895e82604051612e1891906152d2565b60405180910390a26001600160a01b0386165f908152609e60205260408120600191612e438461353e565b815260208101919091526040015f20805460ff191691151591909117905550600101612c95565b50612e7b6103836020850185614874565b6001600160a01b031663c63fd50285612e976020870187614874565b612ea460208801886152e0565b612eb160408a018a615563565b6040518763ffffffff1660e01b8152600401612ed296959493929190615718565b5f604051808303815f87803b158015612ee9575f5ffd5b505af1158015611bc6573d5f5f3e3d5ffd5b5f61099a609a5f612f0b8561353e565b81526020019081526020015f2061374a565b83612f2781613775565b612f445760405163932d94f760e01b815260040160405180910390fd5b6040805180820182526001600160a01b03871680825263ffffffff80881660208085018290525f93845260989052939091209192612f83929161375e16565b612fa057604051631fb1705560e21b815260040160405180910390fd5b5f612faa8261353e565b90505f5b84811015611bc657612ff3868683818110612fcb57612fcb615287565b9050602002016020810190612fe09190614874565b5f84815260996020526040902090613f32565b613010576040516331bc342760e11b815260040160405180910390fd5b7f7b4b073d80dcac55a11177d8459ad9f664ceeb91f71f27167bb14f8152a7eeee8387878481811061304457613044615287565b90506020020160208101906130599190614874565b604051613067929190615325565b60405180910390a1600101612fae565b6001600160a01b0381165f908152609b602090815260408083208151608081018352905463ffffffff80821680845260ff600160201b8404161515958401869052650100000000008304821694840194909452600160481b9091041660608201819052849391929190158015906130f85750826060015163ffffffff164310155b15613107575050604081015160015b9590945092505050565b6001600160a01b0381165f90815260986020526040812061099a9061374a565b6001600160a01b0382165f908152609f602052604081206060919061315a90826118fe8661353e565b949350505050565b5f54610100900460ff161580801561318057505f54600160ff909116105b806131995750303b15801561319957505f5460ff166001145b6132015760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b5f805460ff191660011790558015613222575f805461ff0019166101001790555b61322b8261370d565b61323483613fa0565b801561327a575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498906020015b60405180910390a15b505050565b8161328981613775565b6132a65760405163932d94f760e01b815260040160405180910390fd5b826001600160a01b0316826001600160a01b031663de1164bb6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156132ec573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906133109190615764565b6001600160a01b03161461333757604051631d0b13c160e31b815260040160405180910390fd5b6001600160a01b038381165f90815260976020526040902080546001600160a01b0319169184169190911790557f2ae945c40c44dc0ec263f95609c3fdc6952e0aefa22d6374e44f2c997acedf858361338f81610f30565b604080516001600160a01b03938416815292909116602083015201613271565b6133b7613f46565b6001600160a01b03811661341c5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016131f8565b61342581613fa0565b50565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015613484573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906134a89190615764565b6001600160a01b0316336001600160a01b0316146134d95760405163794821ff60e01b815260040160405180910390fd5b606654801982198116146135005760405163c61dca5d60e01b815260040160405180910390fd5b606682905560405182815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c9060200160405180910390a25050565b5f815f0151826020015163ffffffff1660405160200161358992919060609290921b6bffffffffffffffffffffffff1916825260a01b6001600160a01b031916601482015260200190565b60405160208183030381529060405261099a9061577f565b6040805180820182525f80825260208083018290528351606081018552828152808201839052808501839052845180860186526001600160a01b03898116855260a18452868520908816855290925293822092939281906136019061383e565b6001600160401b0390811682526001600160a01b038981165f81815260a260209081526040808320948c168084529482528083205486169682019690965291815260a082528481208b8252825284812092815291815290839020835160608101855290549283168152600160401b8304600f0b91810191909152600160c01b90910463ffffffff169181018290529192504310156136a3579092509050613705565b6136b4815f01518260200151613851565b6001600160401b0316815260208101515f600f9190910b12156136f2576136e382602001518260200151613851565b6001600160401b031660208301525b5f60408201819052602082015290925090505b935093915050565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a250565b5f61099a825490565b5f6107768383614052565b5f8181526001830160205260408120541515610776565b604051631beb2b9760e31b81526001600160a01b0382811660048301523360248301523060448301525f80356001600160e01b0319166064840152917f00000000000000000000000000000000000000000000000000000000000000009091169063df595cb8906084016020604051808303815f875af11580156137fb573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061099a9190615268565b5f6107768383614078565b5f610776836001600160a01b038416614078565b5f61099a82670de0b6b3a76400006140c4565b5f610776826001600160401b0385166154e5565b5f61077683670de0b6b3a764000084614108565b5f6107768383670de0b6b3a7640000614108565b6001600160a01b0382165f908152609e602052604081208190816138b08561353e565b815260208082019290925260409081015f2081518083019092525460ff8116151580835261010090910463ffffffff169282019290925291508061315a57506020015163ffffffff164311159392505050565b6001600160a01b0381165f9081526001830160205260408120541515610776565b5f6107768383670de0b6b3a764000060016141ed565b6020808301516001600160a01b038088165f90815260a284526040808220928816825291909352909120546001600160401b03908116911614613a0057602082810180516001600160a01b038881165f81815260a286526040808220938a1680835293875290819020805467ffffffffffffffff19166001600160401b0395861617905593518451918252948101919091529216908201527facf9095feb3a370c9cf692421c69ef320d4db5c66e6a7d29c7694eb02364fc559060600160405180910390a15b6001600160a01b038086165f90815260a060209081526040808320888452825280832093871683529281529082902083518154928501519385015163ffffffff16600160c01b0263ffffffff60c01b196001600160801b038616600160401b026001600160c01b03199095166001600160401b03909316929092179390931716919091179055600f0b15613ae2576001600160a01b0385165f908152609f602090815260408083208784529091529020613aba908461382a565b506001600160a01b0385165f908152609d60205260409020613adc908561381f565b50610c3c565b80516001600160401b03165f03610c3c576001600160a01b0385165f908152609f602090815260408083208784529091529020613b1f9084613f32565b506001600160a01b0385165f908152609f602090815260408083208784529091529020613b4b9061374a565b5f03610c3c576001600160a01b0385165f908152609d60205260409020613b729085613f27565b505050505050565b6001600160a01b038084165f90815260a160209081526040808320938616835292905220613ba9904383614246565b604080516001600160a01b038086168252841660208201526001600160401b038316918101919091527f1c6458079a41077d003c11faf9bf097e693bd67979e4e6500bac7b29db779b5c90606001613271565b60605f6107768361425a565b6001600160a01b038381165f90815260a360209081526040808320938616835292905290812054600f81810b600160801b909204900b035b5f81118015613c5257508261ffff1682105b15610c3c576001600160a01b038086165f90815260a3602090815260408083209388168352929052908120613c86906142b3565b90505f5f613c958884896135a1565b91509150806040015163ffffffff16431015613cb357505050610c3c565b613cc0888489858561393a565b6001600160a01b038089165f90815260a360209081526040808320938b16835292905220613ced90614305565b50613cf7856157a2565b9450613d02846157ba565b9350505050613c40565b6001600160a01b0382165f908152609b60209081526040918290208251608081018452905463ffffffff808216835260ff600160201b830416151593830193909352650100000000008104831693820193909352600160481b909204166060820181905215801590613d885750806060015163ffffffff164310155b15613da257604081015163ffffffff168152600160208201525b63ffffffff82166040820152613dd87f000000000000000000000000000000000000000000000000000000000000000043615684565b613de3906001615684565b63ffffffff90811660608381019182526001600160a01b0386165f818152609b602090815260409182902087518154838a0151858b01519851928a1664ffffffffff1990921691909117600160201b91151591909102176cffffffffffffffff0000000000191665010000000000978916979097026cffffffff000000000000000000191696909617600160481b968816968702179055815192835294871694820194909452928301919091527f4e85751d6331506c6c62335f207eb31f12a61e570f34f5c17640308785c6d4db9101613271565b5f5f613eda613ec684614382565b8554613ed59190600f0b6157cf565b6143ef565b8454909150600160801b9004600f90810b9082900b12613f0d57604051632d0483c560e21b815260040160405180910390fd5b600f0b5f9081526001939093016020525050604090205490565b5f6107768383614458565b5f610776836001600160a01b038416614458565b6033546001600160a01b03163314611e2a5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016131f8565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b5f6107768383670de0b6b3a764000061453b565b5f6140168460995f6112768961353e565b801561401f5750815b8015611fa157505090516001600160401b031615159392505050565b5f6107766001600160401b038085169084166157f6565b5f825f01828154811061406757614067615287565b905f5260205f200154905092915050565b5f8181526001830160205260408120546140bd57508154600181810184555f84815260208082209093018490558454848252828601909352604090209190915561099a565b505f61099a565b81545f908015614100576140ea846140dd60018461548f565b5f91825260209091200190565b54600160201b90046001600160e01b031661315a565b509092915050565b5f80805f19858709858702925082811083820303915050805f0361413f5783828161413557614135615823565b0492505050610776565b8084116141865760405162461bcd60e51b81526020600482015260156024820152744d6174683a206d756c446976206f766572666c6f7760581b60448201526064016131f8565b5f8486880960026001871981018816978890046003810283188082028403028082028403028082028403028082028403028082028403029081029092039091025f889003889004909101858311909403939093029303949094049190911702949350505050565b5f5f6141fa868686614108565b9050600183600281111561421057614210615837565b14801561422c57505f848061422757614227615823565b868809115b15611fa15761423c60018261584b565b9695505050505050565b61327a83836001600160401b038416614583565b6060815f018054806020026020016040519081016040528092919081815260200182805480156142a757602002820191905f5260205f20905b815481526020019060010190808311614293575b50505050509050919050565b5f6142cd8254600f81810b600160801b909204900b131590565b156142eb57604051631ed9509560e11b815260040160405180910390fd5b508054600f0b5f9081526001909101602052604090205490565b5f61431f8254600f81810b600160801b909204900b131590565b1561433d57604051631ed9509560e11b815260040160405180910390fd5b508054600f0b5f818152600180840160205260408220805492905583546fffffffffffffffffffffffffffffffff191692016001600160801b03169190911790915590565b5f6001600160ff1b038211156143eb5760405162461bcd60e51b815260206004820152602860248201527f53616665436173743a2076616c756520646f65736e27742066697420696e2061604482015267371034b73a191a9b60c11b60648201526084016131f8565b5090565b80600f81900b81146144535760405162461bcd60e51b815260206004820152602760248201527f53616665436173743a2076616c756520646f65736e27742066697420696e20316044820152663238206269747360c81b60648201526084016131f8565b919050565b5f8181526001830160205260408120548015614532575f61447a60018361548f565b85549091505f9061448d9060019061548f565b90508181146144ec575f865f0182815481106144ab576144ab615287565b905f5260205f200154905080875f0184815481106144cb576144cb615287565b5f918252602080832090910192909255918252600188019052604090208390555b85548690806144fd576144fd61585e565b600190038181905f5260205f20015f90559055856001015f8681526020019081526020015f205f90556001935050505061099a565b5f91505061099a565b82545f908161454c86868385614686565b9050801561457957614563866140dd60018461548f565b54600160201b90046001600160e01b0316610771565b5091949350505050565b82548015614639575f61459b856140dd60018561548f565b60408051808201909152905463ffffffff808216808452600160201b9092046001600160e01b0316602084015291925090851610156145ed5760405163151b8e3f60e11b815260040160405180910390fd5b805163ffffffff808616911603614637578261460e866140dd60018661548f565b80546001600160e01b0392909216600160201b0263ffffffff9092169190911790555050505050565b505b506040805180820190915263ffffffff92831681526001600160e01b03918216602080830191825285546001810187555f968752952091519051909216600160201b029190921617910155565b5f5b81831015610961575f61469b84846146d9565b5f8781526020902090915063ffffffff86169082015463ffffffff1611156146c5578092506146d3565b6146d081600161584b565b93505b50614688565b5f6146e76002848418615872565b6107769084841661584b565b6001600160a01b0381168114613425575f5ffd5b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b038111828210171561473d5761473d614707565b60405290565b604051601f8201601f191681016001600160401b038111828210171561476b5761476b614707565b604052919050565b803563ffffffff81168114614453575f5ffd5b5f60408284031215614796575f5ffd5b604080519081016001600160401b03811182821017156147b8576147b8614707565b60405290508082356147c9816146f3565b81526147d760208401614773565b60208201525092915050565b5f5f5f608084860312156147f5575f5ffd5b8335614800816146f3565b925061480f8560208601614786565b9150606084013561481f816146f3565b809150509250925092565b81516001600160401b03168152602080830151600f0b9082015260408083015163ffffffff16908201526060810161099a565b5f6020828403121561486d575f5ffd5b5035919050565b5f60208284031215614884575f5ffd5b8135610776816146f3565b80516001600160a01b0316825260209081015163ffffffff16910152565b5f8151808452602084019350602083015f5b828110156148e8576148d286835161488f565b60409590950194602091909101906001016148bf565b5093949350505050565b602081525f61077660208301846148ad565b5f60408284031215614914575f5ffd5b6107768383614786565b5f5f83601f84011261492e575f5ffd5b5081356001600160401b03811115614944575f5ffd5b6020830191508360208260051b85010111156118e5575f5ffd5b5f5f5f60408486031215614970575f5ffd5b833561497b816146f3565b925060208401356001600160401b03811115614995575f5ffd5b6149a18682870161491e565b9497909650939450505050565b5f6001600160401b038211156149c6576149c6614707565b5060051b60200190565b5f82601f8301126149df575f5ffd5b81356149f26149ed826149ae565b614743565b8082825260208201915060208360051b860101925085831115614a13575f5ffd5b602085015b83811015614a39578035614a2b816146f3565b835260209283019201614a18565b5095945050505050565b5f5f5f5f60a08587031215614a56575f5ffd5b614a608686614786565b935060408501356001600160401b03811115614a7a575f5ffd5b614a86878288016149d0565b93505060608501356001600160401b03811115614aa1575f5ffd5b614aad878288016149d0565b925050614abc60808601614773565b905092959194509250565b5f8151808452602084019350602083015f5b828110156148e8578151865260209586019590910190600101614ad9565b5f602082016020835280845180835260408501915060408160051b8601019250602086015f5b82811015614b4e57603f19878603018452614b39858351614ac7565b94506020938401939190910190600101614b1d565b50929695505050505050565b5f5f60408385031215614b6b575f5ffd5b8235614b76816146f3565b915060208301356001600160401b03811115614b90575f5ffd5b830160a08186031215614ba1575f5ffd5b809150509250929050565b5f5f60408385031215614bbd575f5ffd5b8235614bc8816146f3565b91506020830135614ba1816146f3565b5f8151808452602084019350602083015f5b828110156148e857614c2386835180516001600160401b03168252602080820151600f0b9083015260409081015163ffffffff16910152565b6060959095019460209190910190600101614bea565b604081525f614c4b60408301856148ad565b8281036020840152611fa18185614bd8565b5f8151808452602084019350602083015f5b828110156148e85781516001600160a01b0316865260209586019590910190600101614c6f565b602081525f6107766020830184614c5d565b5f5f60408385031215614cb9575f5ffd5b82356001600160401b03811115614cce575f5ffd5b614cda858286016149d0565b9250506020830135614ba1816146f3565b602080825282518282018190525f918401906040840190835b81811015614d2b5783516001600160401b0316835260209384019390920191600101614d04565b509095945050505050565b5f5f5f5f5f60608688031215614d4a575f5ffd5b8535614d55816146f3565b945060208601356001600160401b03811115614d6f575f5ffd5b614d7b8882890161491e565b90955093505060408601356001600160401b03811115614d99575f5ffd5b614da58882890161491e565b969995985093965092949392505050565b5f5f5f5f60608587031215614dc9575f5ffd5b8435614dd4816146f3565b9350614de260208601614773565b925060408501356001600160401b03811115614dfc575f5ffd5b614e088782880161491e565b95989497509550505050565b5f5f60408385031215614e25575f5ffd5b8235614e30816146f3565b915060208301356001600160401b03811115614e4a575f5ffd5b614e56858286016149d0565b9150509250929050565b5f5f60408385031215614e71575f5ffd5b8235614e7c816146f3565b9150614e8a60208401614773565b90509250929050565b5f60208284031215614ea3575f5ffd5b813560ff81168114610776575f5ffd5b5f5f60608385031215614ec4575f5ffd5b8235614ecf816146f3565b9150614e8a8460208501614786565b5f60608284031215614eee575f5ffd5b50919050565b5f60208284031215614f04575f5ffd5b81356001600160401b03811115614f19575f5ffd5b61315a84828501614ede565b5f5f5f60808486031215614f37575f5ffd5b83356001600160401b03811115614f4c575f5ffd5b614f58868287016149d0565b93505061480f8560208601614786565b602081525f6107766020830184614bd8565b5f5f5f60608486031215614f8c575f5ffd5b8335614f97816146f3565b925060208401356001600160401b03811115614fb1575f5ffd5b614fbd868287016149d0565b925050614fcc60408501614773565b90509250925092565b5f5f60408385031215614fe6575f5ffd5b8235614ff1816146f3565b915060208301356001600160401b0381111561500b575f5ffd5b8301601f8101851361501b575f5ffd5b80356150296149ed826149ae565b8082825260208201915060208360051b85010192508783111561504a575f5ffd5b602084015b8381101561516f5780356001600160401b0381111561506c575f5ffd5b85016080818b03601f19011215615081575f5ffd5b61508961471b565b6150968b60208401614786565b815260608201356001600160401b038111156150b0575f5ffd5b6150bf8c6020838601016149d0565b60208301525060808201356001600160401b038111156150dd575f5ffd5b6020818401019250508a601f8301126150f4575f5ffd5b81356151026149ed826149ae565b8082825260208201915060208360051b86010192508d831115615123575f5ffd5b6020850194505b828510156151595784356001600160401b0381168114615148575f5ffd5b82526020948501949091019061512a565b604084015250508452506020928301920161504f565b50809450505050509250929050565b5f5f5f60408486031215615190575f5ffd5b833561519b816146f3565b925060208401356001600160401b038111156151b5575f5ffd5b8401601f810186136151c5575f5ffd5b80356001600160401b038111156151da575f5ffd5b8660208284010111156151eb575f5ffd5b939660209190910195509293505050565b5f5f6040838503121561520d575f5ffd5b8235615218816146f3565b915060208301356001600160401b03811115615232575f5ffd5b614e5685828601614ede565b5f5f6040838503121561524f575f5ffd5b823561525a816146f3565b946020939093013593505050565b5f60208284031215615278575f5ffd5b81518015158114610776575f5ffd5b634e487b7160e01b5f52603260045260245ffd5b5f8235603e198336030181126152af575f5ffd5b9190910192915050565b5f602082840312156152c9575f5ffd5b61077682614773565b6040810161099a828461488f565b5f5f8335601e198436030181126152f5575f5ffd5b8301803591506001600160401b0382111561530e575f5ffd5b6020019150600581901b36038213156118e5575f5ffd5b60608101615333828561488f565b6001600160a01b039290921660409190910152919050565b604081525f61535d6040830185614c5d565b8281036020840152611fa18185614c5d565b5f6020828403121561537f575f5ffd5b81516001600160401b03811115615394575f5ffd5b8201601f810184136153a4575f5ffd5b80516153b26149ed826149ae565b8082825260208201915060208360051b8501019250868311156153d3575f5ffd5b602084015b838110156154705780516001600160401b038111156153f5575f5ffd5b8501603f81018913615405575f5ffd5b60208101516154166149ed826149ae565b808282526020820191506020808460051b8601010192508b831115615439575f5ffd5b6040840193505b8284101561545b578351825260209384019390910190615440565b865250506020938401939190910190506153d8565b509695505050505050565b634e487b7160e01b5f52601160045260245ffd5b8181038181111561099a5761099a61547b565b6001600160401b03828116828216039081111561099a5761099a61547b565b5f81600f0b60016001607f1b031981036154dd576154dd61547b565b5f0392915050565b600f81810b9083900b0160016001607f1b03811360016001607f1b03198212171561099a5761099a61547b565b6001600160a01b038616815260c0810161552f602083018761488f565b6001600160a01b039490941660608201526001600160401b0392909216608083015263ffffffff1660a09091015292915050565b5f5f8335601e19843603018112615578575f5ffd5b8301803591506001600160401b03821115615591575f5ffd5b6020019150368190038213156118e5575f5ffd5b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b6001600160a01b03881681525f60c082016155eb602084018a61488f565b60c060608401528690528660e083015f5b8881101561562c57823561560f816146f3565b6001600160a01b03168252602092830192909101906001016155fc565b50838103608085015261563f8188614ac7565b91505082810360a08401526156558185876155a5565b9a9950505050505050505050565b5f60208284031215615673575f5ffd5b813561ffff81168114610776575f5ffd5b63ffffffff818116838216019081111561099a5761099a61547b565b8183526020830192505f815f5b848110156148e85763ffffffff6156c383614773565b16865260209586019591909101906001016156ad565b6001600160a01b038581168252841660208201526060604082018190525f9061423c90830184866156a0565b602081525f61315a6020830184866155a5565b6001600160a01b038781168252861660208201526080604082018190525f9061574490830186886156a0565b82810360608401526157578185876155a5565b9998505050505050505050565b5f60208284031215615774575f5ffd5b8151610776816146f3565b80516020808301519190811015614eee575f1960209190910360031b1b16919050565b5f600182016157b3576157b361547b565b5060010190565b5f816157c8576157c861547b565b505f190190565b8082018281125f8312801582168215821617156157ee576157ee61547b565b505092915050565b600f82810b9082900b0360016001607f1b0319811260016001607f1b038213171561099a5761099a61547b565b634e487b7160e01b5f52601260045260245ffd5b634e487b7160e01b5f52602160045260245ffd5b8082018082111561099a5761099a61547b565b634e487b7160e01b5f52603160045260245ffd5b5f8261588c57634e487b7160e01b5f52601260045260245ffd5b50049056fea264697066735822122003437a6150a69bda5aa66e8a8e31488f1ec2312d4e01e92b3843843784c9e62c64736f6c634300081b0033", + ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"_delegation\",\"type\":\"address\",\"internalType\":\"contractIDelegationManager\"},{\"name\":\"_pauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"},{\"name\":\"_permissionController\",\"type\":\"address\",\"internalType\":\"contractIPermissionController\"},{\"name\":\"_DEALLOCATION_DELAY\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"_ALLOCATION_CONFIGURATION_DELAY\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"ALLOCATION_CONFIGURATION_DELAY\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"DEALLOCATION_DELAY\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"addStrategiesToOperatorSet\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetId\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"clearDeallocationQueue\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"numToClear\",\"type\":\"uint16[]\",\"internalType\":\"uint16[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"createOperatorSets\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"params\",\"type\":\"tuple[]\",\"internalType\":\"structIAllocationManagerTypes.CreateSetParams[]\",\"components\":[{\"name\":\"operatorSetId\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"delegation\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIDelegationManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"deregisterFromOperatorSets\",\"inputs\":[{\"name\":\"params\",\"type\":\"tuple\",\"internalType\":\"structIAllocationManagerTypes.DeregisterParams\",\"components\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetIds\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"encumberedMagnitude\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAVSRegistrar\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIAVSRegistrar\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAllocatableMagnitude\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAllocatedSets\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple[]\",\"internalType\":\"structOperatorSet[]\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAllocatedStrategies\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAllocation\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIAllocationManagerTypes.Allocation\",\"components\":[{\"name\":\"currentMagnitude\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"pendingDiff\",\"type\":\"int128\",\"internalType\":\"int128\"},{\"name\":\"effectBlock\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAllocationDelay\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAllocations\",\"inputs\":[{\"name\":\"operators\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple[]\",\"internalType\":\"structIAllocationManagerTypes.Allocation[]\",\"components\":[{\"name\":\"currentMagnitude\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"pendingDiff\",\"type\":\"int128\",\"internalType\":\"int128\"},{\"name\":\"effectBlock\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getMaxMagnitude\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getMaxMagnitudes\",\"inputs\":[{\"name\":\"operators\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64[]\",\"internalType\":\"uint64[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getMaxMagnitudes\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64[]\",\"internalType\":\"uint64[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getMaxMagnitudesAtBlock\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"blockNumber\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64[]\",\"internalType\":\"uint64[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getMemberCount\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getMembers\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getMinimumSlashableStake\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"operators\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"futureBlock\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[{\"name\":\"slashableStake\",\"type\":\"uint256[][]\",\"internalType\":\"uint256[][]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getOperatorSetCount\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getRegisteredSets\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple[]\",\"internalType\":\"structOperatorSet[]\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getStrategiesInOperatorSet\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getStrategyAllocations\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple[]\",\"internalType\":\"structOperatorSet[]\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"\",\"type\":\"tuple[]\",\"internalType\":\"structIAllocationManagerTypes.Allocation[]\",\"components\":[{\"name\":\"currentMagnitude\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"pendingDiff\",\"type\":\"int128\",\"internalType\":\"int128\"},{\"name\":\"effectBlock\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"initialOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"initialPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"isMemberOfOperatorSet\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isOperatorSet\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"modifyAllocations\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"params\",\"type\":\"tuple[]\",\"internalType\":\"structIAllocationManagerTypes.AllocateParams[]\",\"components\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"newMagnitudes\",\"type\":\"uint64[]\",\"internalType\":\"uint64[]\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"pauseAll\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[{\"name\":\"index\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pauserRegistry\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"permissionController\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIPermissionController\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"registerForOperatorSets\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"params\",\"type\":\"tuple\",\"internalType\":\"structIAllocationManagerTypes.RegisterParams\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetIds\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"removeStrategiesFromOperatorSet\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetId\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setAVSRegistrar\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"registrar\",\"type\":\"address\",\"internalType\":\"contractIAVSRegistrar\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setAllocationDelay\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"delay\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"slashOperator\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"params\",\"type\":\"tuple\",\"internalType\":\"structIAllocationManagerTypes.SlashingParams\",\"components\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetId\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"wadsToSlash\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"},{\"name\":\"description\",\"type\":\"string\",\"internalType\":\"string\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"updateAVSMetadataURI\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"metadataURI\",\"type\":\"string\",\"internalType\":\"string\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"AVSMetadataURIUpdated\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"metadataURI\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"AVSRegistrarSet\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"registrar\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIAVSRegistrar\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"AllocationDelaySet\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"delay\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"},{\"name\":\"effectBlock\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"AllocationUpdated\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"magnitude\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"effectBlock\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"EncumberedMagnitudeUpdated\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"encumberedMagnitude\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"MaxMagnitudeUpdated\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"maxMagnitude\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorAddedToOperatorSet\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorRemovedFromOperatorSet\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorSetCreated\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorSlashed\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"strategies\",\"type\":\"address[]\",\"indexed\":false,\"internalType\":\"contractIStrategy[]\"},{\"name\":\"wadSlashed\",\"type\":\"uint256[]\",\"indexed\":false,\"internalType\":\"uint256[]\"},{\"name\":\"description\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StrategyAddedToOperatorSet\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StrategyRemovedFromOperatorSet\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"AlreadyMemberOfSet\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"CurrentlyPaused\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"Empty\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InputAddressZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InputArrayLengthMismatch\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InsufficientMagnitude\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidCaller\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidNewPausedStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidOperator\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidOperatorSet\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidPermissions\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidSnapshotOrdering\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidWadToSlash\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ModificationAlreadyPending\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotMemberOfSet\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyPauser\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyUnpauser\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OperatorNotSlashable\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OutOfBounds\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SameMagnitude\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StrategiesMustBeInAscendingOrder\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StrategyAlreadyInOperatorSet\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StrategyNotInOperatorSet\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"UninitializedAllocationDelay\",\"inputs\":[]}]", + Bin: "0x610120604052348015610010575f5ffd5b50604051615a80380380615a8083398101604081905261002f91610180565b82858383876001600160a01b03811661005b576040516339b190bb60e11b815260040160405180910390fd5b6001600160a01b0390811660805292831660a05263ffffffff91821660c0521660e052166101005261008b610095565b50505050506101e9565b5f54610100900460ff16156101005760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff9081161461014f575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b0381168114610165575f5ffd5b50565b805163ffffffff8116811461017b575f5ffd5b919050565b5f5f5f5f5f60a08688031215610194575f5ffd5b855161019f81610151565b60208701519095506101b081610151565b60408701519094506101c181610151565b92506101cf60608701610168565b91506101dd60808701610168565b90509295509295909350565b60805160a05160c05160e0516101005161580661027a5f395f81816103f9015261370301525f81816105480152613d0301525f818161031e0152818161223e015261293501525f81816106fa01528181610c970152818161161c01528181611c8301528181611ced0152612bfc01525f818161056f0152818161079201528181611d92015261337a01526158065ff3fe608060405234801561000f575f5ffd5b5060043610610281575f3560e01c80636e875dba11610156578063a984eb3a116100ca578063c221d8ae11610084578063c221d8ae146106bc578063cd6dc687146106cf578063d3d96ff4146106e2578063df5cf723146106f5578063f2fde38b1461071c578063fabc1cbc1461072f575f5ffd5b8063a984eb3a1461060e578063adc2e3d914610641578063b2447af714610654578063b66bd98914610667578063b9fbaed11461067a578063ba1a84e5146106a9575f5ffd5b80638ce648541161011b5780638ce64854146105915780638da5cb5b146105b157806394d7d00c146105c2578063952899ee146105d5578063a9333ec8146105e8578063a9821821146105fb575f5ffd5b80636e875dba14610515578063715018a61461052857806379ae50cd146105305780637bc1ef6114610543578063886f11951461056a575f5ffd5b80634657e26a116101f8578063595c6a67116101b2578063595c6a67146104875780635ac86ab71461048f5780635c975abb146104b2578063670d3ba2146104c45780636cfb4481146104d75780636e3492b514610502575f5ffd5b80634657e26a146103f45780634a10ffe51461041b5780634b5046ef1461043b57806350feea201461044e578063547afb871461046157806356c483e614610474575f5ffd5b80632981eb77116102495780632981eb77146103195780632bab2c4a14610355578063304c10cd1461037557806336352057146103a057806340120dab146103b35780634177a87c146103d4575f5ffd5b806310e1b9b814610285578063136439dd146102ae57806315fe5028146102c3578063260dc758146102e3578063261f84e014610306575b5f5ffd5b610298610293366004614733565b610742565b6040516102a5919061477a565b60405180910390f35b6102c16102bc3660046147ad565b61077d565b005b6102d66102d13660046147c4565b610852565b6040516102a59190614842565b6102f66102f1366004614854565b610969565b60405190151581526020016102a5565b6102c16103143660046148ae565b6109a0565b6103407f000000000000000000000000000000000000000000000000000000000000000081565b60405163ffffffff90911681526020016102a5565b610368610363366004614993565b610c43565b6040516102a59190614a47565b6103886103833660046147c4565b610f30565b6040516001600160a01b0390911681526020016102a5565b6102c16103ae366004614aaa565b610f5f565b6103c66103c1366004614afc565b611771565b6040516102a5929190614b89565b6103e76103e2366004614854565b6118ec565b6040516102a59190614be6565b6103887f000000000000000000000000000000000000000000000000000000000000000081565b61042e610429366004614bf8565b611910565b6040516102a59190614c3b565b6102c1610449366004614c86565b6119b8565b6102c161045c366004614d06565b611a72565b61042e61046f366004614d64565b611bd0565b6102c1610482366004614db0565b611c78565b6102c1611d7d565b6102f661049d366004614de3565b606654600160ff9092169190911b9081161490565b6066545b6040519081526020016102a5565b6102f66104d2366004614e03565b611e2c565b6104ea6104e5366004614afc565b611e3d565b6040516001600160401b0390911681526020016102a5565b6102c1610510366004614e44565b611faa565b6103e7610523366004614854565b61237a565b6102c161238b565b6102d661053e3660046147c4565b61239c565b6103407f000000000000000000000000000000000000000000000000000000000000000081565b6103887f000000000000000000000000000000000000000000000000000000000000000081565b6105a461059f366004614e75565b612476565b6040516102a59190614eb8565b6033546001600160a01b0316610388565b61042e6105d0366004614eca565b61253b565b6102c16105e3366004614f25565b612627565b6104ea6105f6366004614afc565b612aee565b6102c16106093660046150ce565b612b1d565b6104ea61061c366004614afc565b60a260209081525f92835260408084209091529082529020546001600160401b031681565b6102c161064f36600461514c565b612b8d565b6104b6610662366004614854565b612edc565b6102c1610675366004614d06565b612efe565b61068d6106883660046147c4565b613058565b60408051921515835263ffffffff9091166020830152016102a5565b6104b66106b73660046147c4565b6130f2565b6103e76106ca366004614e03565b613112565b6102c16106dd36600461518e565b613143565b6102c16106f0366004614afc565b613260565b6103887f000000000000000000000000000000000000000000000000000000000000000081565b6102c161072a3660046147c4565b6132ff565b6102c161073d3660046147ad565b613378565b604080516060810182525f80825260208201819052918101829052906107718561076b8661348e565b856134f1565b925050505b9392505050565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa1580156107df573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061080391906151b8565b61082057604051631d77d47760e21b815260040160405180910390fd5b60665481811681146108455760405163c61dca5d60e01b815260040160405180910390fd5b61084e8261365d565b5050565b6001600160a01b0381165f908152609d60205260408120606091906108769061369a565b90505f816001600160401b0381111561089157610891614657565b6040519080825280602002602001820160405280156108d557816020015b604080518082019091525f80825260208201528152602001906001900390816108af5790505b5090505f5b82811015610961576001600160a01b0385165f908152609d6020526040902061093c9061090790836136a3565b604080518082019091525f80825260208201525060408051808201909152606082901c815263ffffffff909116602082015290565b82828151811061094e5761094e6151d7565b60209081029190910101526001016108da565b509392505050565b60208082015182516001600160a01b03165f90815260989092526040822061099a9163ffffffff908116906136ae16565b92915050565b826109aa816136c5565b6109c75760405163932d94f760e01b815260040160405180910390fd5b5f5b82811015610c3c575f6040518060400160405280876001600160a01b031681526020018686858181106109fe576109fe6151d7565b9050602002810190610a1091906151eb565b610a1e906020810190615209565b63ffffffff168152509050610a68816020015163ffffffff1660985f896001600160a01b03166001600160a01b031681526020019081526020015f2061376f90919063ffffffff16565b610a8557604051631fb1705560e21b815260040160405180910390fd5b7f31629285ead2335ae0933f86ed2ae63321f7af77b4e6eaabc42c057880977e6c6040518060400160405280886001600160a01b03168152602001836020015163ffffffff16815250604051610adb9190615222565b60405180910390a15f610aed8261348e565b90505f5b868685818110610b0357610b036151d7565b9050602002810190610b1591906151eb565b610b23906020810190615230565b9050811015610c3157610b99878786818110610b4157610b416151d7565b9050602002810190610b5391906151eb565b610b61906020810190615230565b83818110610b7157610b716151d7565b9050602002016020810190610b8691906147c4565b5f8481526099602052604090209061377a565b507f7ab260fe0af193db5f4986770d831bda4ea46099dc817e8b6716dcae8af8e88b83888887818110610bce57610bce6151d7565b9050602002810190610be091906151eb565b610bee906020810190615230565b84818110610bfe57610bfe6151d7565b9050602002016020810190610c1391906147c4565b604051610c21929190615275565b60405180910390a1600101610af1565b5050506001016109c9565b5050505050565b606083516001600160401b03811115610c5e57610c5e614657565b604051908082528060200260200182016040528015610c9157816020015b6060815260200190600190039081610c7c5790505b5090505f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663f0e0e67686866040518363ffffffff1660e01b8152600401610ce392919061529b565b5f60405180830381865afa158015610cfd573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610d2491908101906152bf565b90505f5b8551811015610f26575f868281518110610d4457610d446151d7565b6020026020010151905085516001600160401b03811115610d6757610d67614657565b604051908082528060200260200182016040528015610d90578160200160208202803683370190505b50848381518110610da357610da36151d7565b60209081029190910101525f5b8651811015610f1c575f878281518110610dcc57610dcc6151d7565b6020908102919091018101516001600160a01b038086165f90815260a1845260408082209284168252919093528220909250610e079061378e565b9050806001600160401b03165f03610e20575050610f14565b5f610e2c858d85610742565b90508863ffffffff16816040015163ffffffff1611158015610e5457505f8160200151600f0b125b15610e7657610e6a815f015182602001516137a1565b6001600160401b031681525b80515f90610e91906001600160401b039081169085166137b5565b9050610ed881898981518110610ea957610ea96151d7565b60200260200101518781518110610ec257610ec26151d7565b60200260200101516137c990919063ffffffff16565b898881518110610eea57610eea6151d7565b60200260200101518681518110610f0357610f036151d7565b602002602001018181525050505050505b600101610db0565b5050600101610d28565b5050949350505050565b6001600160a01b038082165f908152609760205260408120549091168015610f585780610776565b5090919050565b606654600190600290811603610f885760405163840a48d560e01b815260040160405180910390fd5b82610f92816136c5565b610faf5760405163932d94f760e01b815260040160405180910390fd5b5f6040518060400160405280866001600160a01b03168152602001856020016020810190610fdd9190615209565b63ffffffff16905290505f610ffe610ff860208701876147c4565b836137dd565b905061100d6060860186615230565b905061101c6040870187615230565b90501461103c576040516343714afd60e01b815260040160405180910390fd5b60208083015183516001600160a01b03165f9081526098909252604090912061106e9163ffffffff908116906136ae16565b61108b57604051631fb1705560e21b815260040160405180910390fd5b806110a95760405163ebbff49760e01b815260040160405180910390fd5b5f6110b76040870187615230565b90506001600160401b038111156110d0576110d0614657565b6040519080825280602002602001820160405280156110f9578160200160208202803683370190505b5090505f5b61110b6040880188615230565b90508110156117025780158061119e57506111296040880188615230565b6111346001846153df565b818110611143576111436151d7565b905060200201602081019061115891906147c4565b6001600160a01b031661116e6040890189615230565b8381811061117e5761117e6151d7565b905060200201602081019061119391906147c4565b6001600160a01b0316115b6111bb57604051639f1c805360e01b815260040160405180910390fd5b6111c86060880188615230565b828181106111d8576111d86151d7565b905060200201355f1080156112185750670de0b6b3a76400006111fe6060890189615230565b8381811061120e5761120e6151d7565b9050602002013511155b61123557604051631353603160e01b815260040160405180910390fd5b6112916112456040890189615230565b83818110611255576112556151d7565b905060200201602081019061126a91906147c4565b60995f6112768861348e565b81526020019081526020015f2061385390919063ffffffff16565b6112ae576040516331bc342760e11b815260040160405180910390fd5b5f806113006112c060208b018b6147c4565b6112c98861348e565b6112d660408d018d615230565b878181106112e6576112e66151d7565b90506020020160208101906112fb91906147c4565b6134f1565b805191935091506001600160401b03165f0361131d5750506116fa565b5f61135861132e60608c018c615230565b8681811061133e5761133e6151d7565b85516001600160401b031692602090910201359050613874565b83519091506113736001600160401b038084169083166137b5565b868681518110611385576113856151d7565b60200260200101818152505081835f018181516113a291906153f2565b6001600160401b03169052508351829085906113bf9083906153f2565b6001600160401b03169052506020840180518391906113df9083906153f2565b6001600160401b031690525060208301515f600f9190910b12156114fa575f61144261140e60608e018e615230565b8881811061141e5761141e6151d7565b90506020020135856020015161143390615411565b6001600160801b031690613874565b9050806001600160401b03168460200181815161145f9190615435565b600f0b9052507f1487af5418c47ee5ea45ef4a93398668120890774a9e13487e61e9dc3baf76dd61149360208e018e6147c4565b8a8e80604001906114a49190615230565b8a8181106114b4576114b46151d7565b90506020020160208101906114c991906147c4565b6114da885f015189602001516137a1565b88604001516040516114f0959493929190615462565b60405180910390a1505b61154c61150a60208d018d6147c4565b6115138a61348e565b61152060408f018f615230565b89818110611530576115306151d7565b905060200201602081019061154591906147c4565b878761388a565b7f1487af5418c47ee5ea45ef4a93398668120890774a9e13487e61e9dc3baf76dd61157a60208d018d6147c4565b8961158860408f018f615230565b89818110611598576115986151d7565b90506020020160208101906115ad91906147c4565b86516040516115c194939291904390615462565b60405180910390a16116126115d960208d018d6147c4565b6115e660408e018e615230565b888181106115f6576115f66151d7565b905060200201602081019061160b91906147c4565b8651613aca565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001663601bb36f61164e60208e018e6147c4565b61165b60408f018f615230565b8981811061166b5761166b6151d7565b905060200201602081019061168091906147c4565b875160405160e085901b6001600160e01b03191681526001600160a01b0393841660048201529290911660248301526001600160401b0380861660448401521660648201526084015f604051808303815f87803b1580156116df575f5ffd5b505af11580156116f1573d5f5f3e3d5ffd5b50505050505050505b6001016110fe565b507f80969ad29428d6797ee7aad084f9e4a42a82fc506dcd2ca3b6fb431f85ccebe561173160208801886147c4565b8461173f60408a018a615230565b8561174d60808d018d6154b3565b604051611760979695949392919061551d565b60405180910390a150505050505050565b6001600160a01b0382165f908152609d6020526040812060609182916117969061369a565b90505f816001600160401b038111156117b1576117b1614657565b6040519080825280602002602001820160405280156117f557816020015b604080518082019091525f80825260208201528152602001906001900390816117cf5790505b5090505f826001600160401b0381111561181157611811614657565b60405190808252806020026020018201604052801561185a57816020015b604080516060810182525f80825260208083018290529282015282525f1990920191018161182f5790505b5090505f5b838110156118dd576001600160a01b0388165f908152609d6020526040812061188c9061090790846136a3565b9050808483815181106118a1576118a16151d7565b60200260200101819052506118b789828a610742565b8383815181106118c9576118c96151d7565b60209081029190910101525060010161185f565b509093509150505b9250929050565b60605f61077660995f6118fe8661348e565b81526020019081526020015f20613b4c565b60605f83516001600160401b0381111561192c5761192c614657565b604051908082528060200260200182016040528015611955578160200160208202803683370190505b5090505f5b845181101561096157611986858281518110611978576119786151d7565b602002602001015185612aee565b828281518110611998576119986151d7565b6001600160401b039092166020928302919091019091015260010161195a565b6066545f906001908116036119e05760405163840a48d560e01b815260040160405180910390fd5b838214611a00576040516343714afd60e01b815260040160405180910390fd5b5f5b84811015611a6957611a6187878784818110611a2057611a206151d7565b9050602002016020810190611a3591906147c4565b868685818110611a4757611a476151d7565b9050602002016020810190611a5c91906155b3565b613b58565b600101611a02565b50505050505050565b83611a7c816136c5565b611a995760405163932d94f760e01b815260040160405180910390fd5b604080518082019091526001600160a01b038616815263ffffffff851660208201525f611ac58261348e565b9050611b06826020015163ffffffff1660985f8a6001600160a01b03166001600160a01b031681526020019081526020015f206136ae90919063ffffffff16565b611b2357604051631fb1705560e21b815260040160405180910390fd5b5f5b84811015611bc657611b42868683818110610b7157610b716151d7565b611b5f5760405163585cfb2f60e01b815260040160405180910390fd5b7f7ab260fe0af193db5f4986770d831bda4ea46099dc817e8b6716dcae8af8e88b83878784818110611b9357611b936151d7565b9050602002016020810190611ba891906147c4565b604051611bb6929190615275565b60405180910390a1600101611b25565b5050505050505050565b60605f82516001600160401b03811115611bec57611bec614657565b604051908082528060200260200182016040528015611c15578160200160208202803683370190505b5090505f5b835181101561096157611c4685858381518110611c3957611c396151d7565b6020026020010151612aee565b828281518110611c5857611c586151d7565b6001600160401b0390921660209283029190910190910152600101611c1a565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614611d7357611cb1826136c5565b611cce576040516348f5c3ed60e01b815260040160405180910390fd5b6040516336b87bd760e11b81526001600160a01b0383811660048301527f00000000000000000000000000000000000000000000000000000000000000001690636d70f7ae90602401602060405180830381865afa158015611d32573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611d5691906151b8565b611d735760405163ccea9e6f60e01b815260040160405180910390fd5b61084e8282613c5c565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa158015611ddf573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611e0391906151b8565b611e2057604051631d77d47760e21b815260040160405180910390fd5b611e2a5f1961365d565b565b5f61077683609a5f6112768661348e565b6001600160a01b038281165f81815260a2602090815260408083209486168084529482528083205493835260a38252808320948352939052918220546001600160401b0390911690600f81810b600160801b909204900b03825b81811015611f67576001600160a01b038087165f90815260a3602090815260408083209389168352929052908120611ecf9083613e08565b6001600160a01b038881165f90815260a0602090815260408083208584528252808320938b16835292815290829020825160608101845290546001600160401b0381168252600160401b8104600f0b92820192909252600160c01b90910463ffffffff16918101829052919250431015611f4a575050611f67565b611f588582602001516137a1565b94505050806001019050611e97565b506001600160a01b038086165f90815260a1602090815260408083209388168352929052208290611f979061378e565b611fa191906153f2565b95945050505050565b606654600290600490811603611fd35760405163840a48d560e01b815260040160405180910390fd5b611fe8611fe360208401846147c4565b6136c5565b806120015750612001611fe360408401602085016147c4565b61201e576040516348f5c3ed60e01b815260040160405180910390fd5b5f5b61202d6040840184615230565b90508110156122ef575f604051806040016040528085602001602081019061205591906147c4565b6001600160a01b031681526020016120706040870187615230565b85818110612080576120806151d7565b90506020020160208101906120959190615209565b63ffffffff1681525090506120e2816020015163ffffffff1660985f8760200160208101906120c491906147c4565b6001600160a01b0316815260208101919091526040015f20906136ae565b6120ff57604051631fb1705560e21b815260040160405180910390fd5b609e5f61210f60208701876147c4565b6001600160a01b03166001600160a01b031681526020019081526020015f205f6121388361348e565b815260208101919091526040015f205460ff16612168576040516325131d4f60e01b815260040160405180910390fd5b6121a26121748261348e565b609c5f61218460208901896147c4565b6001600160a01b0316815260208101919091526040015f2090613e77565b506121da6121b360208601866147c4565b609a5f6121bf8561348e565b81526020019081526020015f20613e8290919063ffffffff16565b506121e860208501856147c4565b6001600160a01b03167fad34c3070be1dffbcaa499d000ba2b8d9848aefcac3059df245dd95c4ece14fe826040516122209190615222565b60405180910390a2604080518082019091525f8152602081016122637f0000000000000000000000000000000000000000000000000000000000000000436155d4565b63ffffffff169052609e5f61227b60208801886147c4565b6001600160a01b03166001600160a01b031681526020019081526020015f205f6122a48461348e565b81526020808201929092526040015f2082518154939092015163ffffffff166101000264ffffffff00199215159290921664ffffffffff199093169290921717905550600101612020565b5061230361038360408401602085016147c4565b6001600160a01b0316639d8e0c2361231e60208501856147c4565b61232b6040860186615230565b6040518463ffffffff1660e01b815260040161234993929190615629565b5f604051808303815f87803b158015612360575f5ffd5b505af1925050508015612371575060015b1561084e575050565b606061099a609a5f6118fe8561348e565b612393613e96565b611e2a5f613ef0565b6001600160a01b0381165f908152609c60205260408120606091906123c09061369a565b90505f816001600160401b038111156123db576123db614657565b60405190808252806020026020018201604052801561241f57816020015b604080518082019091525f80825260208201528152602001906001900390816123f95790505b5090505f5b82811015610961576001600160a01b0385165f908152609c602052604090206124519061090790836136a3565b828281518110612463576124636151d7565b6020908102919091010152600101612424565b60605f84516001600160401b0381111561249257612492614657565b6040519080825280602002602001820160405280156124db57816020015b604080516060810182525f80825260208083018290529282015282525f199092019101816124b05790505b5090505f5b85518110156125325761250d8682815181106124fe576124fe6151d7565b60200260200101518686610742565b82828151811061251f5761251f6151d7565b60209081029190910101526001016124e0565b50949350505050565b60605f83516001600160401b0381111561255757612557614657565b604051908082528060200260200182016040528015612580578160200160208202803683370190505b5090505f5b8451811015612532576001600160a01b0386165f90815260a16020526040812086516125f5928792918990869081106125c0576125c06151d7565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020015f20613f4190919063ffffffff16565b828281518110612607576126076151d7565b6001600160401b0390921660209283029190910190910152600101612585565b6066545f9060019081160361264f5760405163840a48d560e01b815260040160405180910390fd5b612658836136c5565b612675576040516348f5c3ed60e01b815260040160405180910390fd5b5f5f5f61268186613058565b91509150816126a35760405163fa55fc8160e01b815260040160405180910390fd5b91505f90505b8351811015610c3c578381815181106126c4576126c46151d7565b602002602001015160400151518482815181106126e3576126e36151d7565b602002602001015160200151511461270e576040516343714afd60e01b815260040160405180910390fd5b5f848281518110612721576127216151d7565b602090810291909101810151518082015181516001600160a01b03165f908152609890935260409092209092506127619163ffffffff908116906136ae16565b61277e57604051631fb1705560e21b815260040160405180910390fd5b5f61278987836137dd565b90505f5b86848151811061279f5761279f6151d7565b60200260200101516020015151811015612ae3575f8785815181106127c6576127c66151d7565b60200260200101516020015182815181106127e3576127e36151d7565b602002602001015190506127fa898261ffff613b58565b5f5f6128098b61076b8861348e565b915091508060200151600f0b5f1461283457604051630d8fcbe360e41b815260040160405180910390fd5b5f61284187858489613f55565b9050612886825f01518c8a8151811061285c5761285c6151d7565b6020026020010151604001518781518110612879576128796151d7565b6020026020010151613f8b565b600f0b602083018190525f036128af57604051634606179360e11b815260040160405180910390fd5b5f8260200151600f0b12156129f3578015612975576129306128d08861348e565b6001600160a01b03808f165f90815260a360209081526040808320938a16835292905220908154600160801b90819004600f0b5f818152600180860160205260409091209390935583546001600160801b03908116939091011602179055565b61295a7f0000000000000000000000000000000000000000000000000000000000000000436155d4565b6129659060016155d4565b63ffffffff166040830152612a60565b612987836020015183602001516137a1565b6001600160401b031660208401528a518b90899081106129a9576129a96151d7565b60200260200101516040015185815181106129c6576129c66151d7565b6020908102919091018101516001600160401b031683525f9083015263ffffffff43166040830152612a60565b5f8260200151600f0b1315612a6057612a14836020015183602001516137a1565b6001600160401b039081166020850181905284519091161015612a4a57604051636c9be0bf60e01b815260040160405180910390fd5b612a5489436155d4565b63ffffffff1660408301525b612a758c612a6d8961348e565b86868661388a565b7f1487af5418c47ee5ea45ef4a93398668120890774a9e13487e61e9dc3baf76dd8c612aa36109078a61348e565b86612ab5865f015187602001516137a1565b8660400151604051612acb959493929190615462565b60405180910390a150506001909201915061278d9050565b5050506001016126a9565b6001600160a01b038083165f90815260a16020908152604080832093851683529290529081206107769061378e565b82612b27816136c5565b612b445760405163932d94f760e01b815260040160405180910390fd5b836001600160a01b03167fa89c1dc243d8908a96dd84944bcc97d6bc6ac00dd78e20621576be6a3c9437138484604051612b7f92919061564d565b60405180910390a250505050565b606654600290600490811603612bb65760405163840a48d560e01b815260040160405180910390fd5b82612bc0816136c5565b612bdd5760405163932d94f760e01b815260040160405180910390fd5b6040516336b87bd760e11b81526001600160a01b0385811660048301527f00000000000000000000000000000000000000000000000000000000000000001690636d70f7ae90602401602060405180830381865afa158015612c41573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612c6591906151b8565b612c825760405163ccea9e6f60e01b815260040160405180910390fd5b5f5b612c916020850185615230565b9050811015612e5957604080518082019091525f9080612cb460208801886147c4565b6001600160a01b03168152602001868060200190612cd29190615230565b85818110612ce257612ce26151d7565b9050602002016020810190612cf79190615209565b63ffffffff90811690915260208083015183516001600160a01b03165f90815260989092526040909120929350612d339291908116906136ae16565b612d5057604051631fb1705560e21b815260040160405180910390fd5b612d5a86826137dd565b15612d7857604051636c6c6e2760e11b815260040160405180910390fd5b612da1612d848261348e565b6001600160a01b0388165f908152609c602052604090209061376f565b50612dcd86609a5f612db28561348e565b81526020019081526020015f2061377a90919063ffffffff16565b50856001600160a01b03167f43232edf9071753d2321e5fa7e018363ee248e5f2142e6c08edd3265bfb4895e82604051612e079190615222565b60405180910390a26001600160a01b0386165f908152609e60205260408120600191612e328461348e565b815260208101919091526040015f20805460ff191691151591909117905550600101612c84565b50612e6a61038360208501856147c4565b6001600160a01b031663adcf73f785612e866020870187615230565b612e9360408901896154b3565b6040518663ffffffff1660e01b8152600401612eb3959493929190615660565b5f604051808303815f87803b158015612eca575f5ffd5b505af1158015611bc6573d5f5f3e3d5ffd5b5f61099a609a5f612eec8561348e565b81526020019081526020015f2061369a565b83612f08816136c5565b612f255760405163932d94f760e01b815260040160405180910390fd5b6040805180820182526001600160a01b03871680825263ffffffff80881660208085018290525f93845260989052939091209192612f6492916136ae16565b612f8157604051631fb1705560e21b815260040160405180910390fd5b5f612f8b8261348e565b90505f5b84811015611bc657612fd4868683818110612fac57612fac6151d7565b9050602002016020810190612fc191906147c4565b5f84815260996020526040902090613e82565b612ff1576040516331bc342760e11b815260040160405180910390fd5b7f7b4b073d80dcac55a11177d8459ad9f664ceeb91f71f27167bb14f8152a7eeee83878784818110613025576130256151d7565b905060200201602081019061303a91906147c4565b604051613048929190615275565b60405180910390a1600101612f8f565b6001600160a01b0381165f908152609b602090815260408083208151608081018352905463ffffffff80821680845260ff600160201b8404161515958401869052650100000000008304821694840194909452600160481b9091041660608201819052849391929190158015906130d95750826060015163ffffffff164310155b156130e8575050604081015160015b9590945092505050565b6001600160a01b0381165f90815260986020526040812061099a9061369a565b6001600160a01b0382165f908152609f602052604081206060919061313b90826118fe8661348e565b949350505050565b5f54610100900460ff161580801561316157505f54600160ff909116105b8061317a5750303b15801561317a57505f5460ff166001145b6131e25760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b5f805460ff191660011790558015613203575f805461ff0019166101001790555b61320c8261365d565b61321583613ef0565b801561325b575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498906020015b60405180910390a15b505050565b8161326a816136c5565b6132875760405163932d94f760e01b815260040160405180910390fd5b6001600160a01b038381165f90815260976020526040902080546001600160a01b0319169184169190911790557f2ae945c40c44dc0ec263f95609c3fdc6952e0aefa22d6374e44f2c997acedf85836132df81610f30565b604080516001600160a01b03938416815292909116602083015201613252565b613307613e96565b6001600160a01b03811661336c5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016131d9565b61337581613ef0565b50565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156133d4573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906133f891906156a3565b6001600160a01b0316336001600160a01b0316146134295760405163794821ff60e01b815260040160405180910390fd5b606654801982198116146134505760405163c61dca5d60e01b815260040160405180910390fd5b606682905560405182815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c9060200160405180910390a25050565b5f815f0151826020015163ffffffff166040516020016134d992919060609290921b6bffffffffffffffffffffffff1916825260a01b6001600160a01b031916601482015260200190565b60405160208183030381529060405261099a906156be565b6040805180820182525f80825260208083018290528351606081018552828152808201839052808501839052845180860186526001600160a01b03898116855260a18452868520908816855290925293822092939281906135519061378e565b6001600160401b0390811682526001600160a01b038981165f81815260a260209081526040808320948c168084529482528083205486169682019690965291815260a082528481208b8252825284812092815291815290839020835160608101855290549283168152600160401b8304600f0b91810191909152600160c01b90910463ffffffff169181018290529192504310156135f3579092509050613655565b613604815f015182602001516137a1565b6001600160401b0316815260208101515f600f9190910b121561364257613633826020015182602001516137a1565b6001600160401b031660208301525b5f60408201819052602082015290925090505b935093915050565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a250565b5f61099a825490565b5f6107768383613fa2565b5f8181526001830160205260408120541515610776565b604051631beb2b9760e31b81526001600160a01b0382811660048301523360248301523060448301525f80356001600160e01b0319166064840152917f00000000000000000000000000000000000000000000000000000000000000009091169063df595cb8906084016020604051808303815f875af115801561374b573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061099a91906151b8565b5f6107768383613fc8565b5f610776836001600160a01b038416613fc8565b5f61099a82670de0b6b3a7640000614014565b5f610776826001600160401b038516615435565b5f61077683670de0b6b3a764000084614058565b5f6107768383670de0b6b3a7640000614058565b6001600160a01b0382165f908152609e602052604081208190816138008561348e565b815260208082019290925260409081015f2081518083019092525460ff8116151580835261010090910463ffffffff169282019290925291508061313b57506020015163ffffffff164311159392505050565b6001600160a01b0381165f9081526001830160205260408120541515610776565b5f6107768383670de0b6b3a7640000600161413d565b6020808301516001600160a01b038088165f90815260a284526040808220928816825291909352909120546001600160401b0390811691161461395057602082810180516001600160a01b038881165f81815260a286526040808220938a1680835293875290819020805467ffffffffffffffff19166001600160401b0395861617905593518451918252948101919091529216908201527facf9095feb3a370c9cf692421c69ef320d4db5c66e6a7d29c7694eb02364fc559060600160405180910390a15b6001600160a01b038086165f90815260a060209081526040808320888452825280832093871683529281529082902083518154928501519385015163ffffffff16600160c01b0263ffffffff60c01b196001600160801b038616600160401b026001600160c01b03199095166001600160401b03909316929092179390931716919091179055600f0b15613a32576001600160a01b0385165f908152609f602090815260408083208784529091529020613a0a908461377a565b506001600160a01b0385165f908152609d60205260409020613a2c908561376f565b50610c3c565b80516001600160401b03165f03610c3c576001600160a01b0385165f908152609f602090815260408083208784529091529020613a6f9084613e82565b506001600160a01b0385165f908152609f602090815260408083208784529091529020613a9b9061369a565b5f03610c3c576001600160a01b0385165f908152609d60205260409020613ac29085613e77565b505050505050565b6001600160a01b038084165f90815260a160209081526040808320938616835292905220613af9904383614196565b604080516001600160a01b038086168252841660208201526001600160401b038316918101919091527f1c6458079a41077d003c11faf9bf097e693bd67979e4e6500bac7b29db779b5c90606001613252565b60605f610776836141aa565b6001600160a01b038381165f90815260a360209081526040808320938616835292905290812054600f81810b600160801b909204900b035b5f81118015613ba257508261ffff1682105b15610c3c576001600160a01b038086165f90815260a3602090815260408083209388168352929052908120613bd690614203565b90505f5f613be58884896134f1565b91509150806040015163ffffffff16431015613c0357505050610c3c565b613c10888489858561388a565b6001600160a01b038089165f90815260a360209081526040808320938b16835292905220613c3d90614255565b50613c47856156e1565b9450613c52846156f9565b9350505050613b90565b6001600160a01b0382165f908152609b60209081526040918290208251608081018452905463ffffffff808216835260ff600160201b830416151593830193909352650100000000008104831693820193909352600160481b909204166060820181905215801590613cd85750806060015163ffffffff164310155b15613cf257604081015163ffffffff168152600160208201525b63ffffffff82166040820152613d287f0000000000000000000000000000000000000000000000000000000000000000436155d4565b613d339060016155d4565b63ffffffff90811660608381019182526001600160a01b0386165f818152609b602090815260409182902087518154838a0151858b01519851928a1664ffffffffff1990921691909117600160201b91151591909102176cffffffffffffffff0000000000191665010000000000978916979097026cffffffff000000000000000000191696909617600160481b968816968702179055815192835294871694820194909452928301919091527f4e85751d6331506c6c62335f207eb31f12a61e570f34f5c17640308785c6d4db9101613252565b5f5f613e2a613e16846142d2565b8554613e259190600f0b61570e565b61433f565b8454909150600160801b9004600f90810b9082900b12613e5d57604051632d0483c560e21b815260040160405180910390fd5b600f0b5f9081526001939093016020525050604090205490565b5f61077683836143a8565b5f610776836001600160a01b0384166143a8565b6033546001600160a01b03163314611e2a5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016131d9565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b5f6107768383670de0b6b3a764000061448b565b5f613f668460995f6112768961348e565b8015613f6f5750815b8015611fa157505090516001600160401b031615159392505050565b5f6107766001600160401b03808516908416615735565b5f825f018281548110613fb757613fb76151d7565b905f5260205f200154905092915050565b5f81815260018301602052604081205461400d57508154600181810184555f84815260208082209093018490558454848252828601909352604090209190915561099a565b505f61099a565b81545f9080156140505761403a8461402d6001846153df565b5f91825260209091200190565b54600160201b90046001600160e01b031661313b565b509092915050565b5f80805f19858709858702925082811083820303915050805f0361408f5783828161408557614085615762565b0492505050610776565b8084116140d65760405162461bcd60e51b81526020600482015260156024820152744d6174683a206d756c446976206f766572666c6f7760581b60448201526064016131d9565b5f8486880960026001871981018816978890046003810283188082028403028082028403028082028403028082028403028082028403029081029092039091025f889003889004909101858311909403939093029303949094049190911702949350505050565b5f5f61414a868686614058565b9050600183600281111561416057614160615776565b14801561417c57505f848061417757614177615762565b868809115b15611fa15761418c60018261578a565b9695505050505050565b61325b83836001600160401b0384166144d3565b6060815f018054806020026020016040519081016040528092919081815260200182805480156141f757602002820191905f5260205f20905b8154815260200190600101908083116141e3575b50505050509050919050565b5f61421d8254600f81810b600160801b909204900b131590565b1561423b57604051631ed9509560e11b815260040160405180910390fd5b508054600f0b5f9081526001909101602052604090205490565b5f61426f8254600f81810b600160801b909204900b131590565b1561428d57604051631ed9509560e11b815260040160405180910390fd5b508054600f0b5f818152600180840160205260408220805492905583546fffffffffffffffffffffffffffffffff191692016001600160801b03169190911790915590565b5f6001600160ff1b0382111561433b5760405162461bcd60e51b815260206004820152602860248201527f53616665436173743a2076616c756520646f65736e27742066697420696e2061604482015267371034b73a191a9b60c11b60648201526084016131d9565b5090565b80600f81900b81146143a35760405162461bcd60e51b815260206004820152602760248201527f53616665436173743a2076616c756520646f65736e27742066697420696e20316044820152663238206269747360c81b60648201526084016131d9565b919050565b5f8181526001830160205260408120548015614482575f6143ca6001836153df565b85549091505f906143dd906001906153df565b905081811461443c575f865f0182815481106143fb576143fb6151d7565b905f5260205f200154905080875f01848154811061441b5761441b6151d7565b5f918252602080832090910192909255918252600188019052604090208390555b855486908061444d5761444d61579d565b600190038181905f5260205f20015f90559055856001015f8681526020019081526020015f205f90556001935050505061099a565b5f91505061099a565b82545f908161449c868683856145d6565b905080156144c9576144b38661402d6001846153df565b54600160201b90046001600160e01b0316610771565b5091949350505050565b82548015614589575f6144eb8561402d6001856153df565b60408051808201909152905463ffffffff808216808452600160201b9092046001600160e01b03166020840152919250908516101561453d5760405163151b8e3f60e11b815260040160405180910390fd5b805163ffffffff808616911603614587578261455e8661402d6001866153df565b80546001600160e01b0392909216600160201b0263ffffffff9092169190911790555050505050565b505b506040805180820190915263ffffffff92831681526001600160e01b03918216602080830191825285546001810187555f968752952091519051909216600160201b029190921617910155565b5f5b81831015610961575f6145eb8484614629565b5f8781526020902090915063ffffffff86169082015463ffffffff16111561461557809250614623565b61462081600161578a565b93505b506145d8565b5f61463760028484186157b1565b6107769084841661578a565b6001600160a01b0381168114613375575f5ffd5b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b038111828210171561468d5761468d614657565b60405290565b604051601f8201601f191681016001600160401b03811182821017156146bb576146bb614657565b604052919050565b803563ffffffff811681146143a3575f5ffd5b5f604082840312156146e6575f5ffd5b604080519081016001600160401b038111828210171561470857614708614657565b604052905080823561471981614643565b8152614727602084016146c3565b60208201525092915050565b5f5f5f60808486031215614745575f5ffd5b833561475081614643565b925061475f85602086016146d6565b9150606084013561476f81614643565b809150509250925092565b81516001600160401b03168152602080830151600f0b9082015260408083015163ffffffff16908201526060810161099a565b5f602082840312156147bd575f5ffd5b5035919050565b5f602082840312156147d4575f5ffd5b813561077681614643565b80516001600160a01b0316825260209081015163ffffffff16910152565b5f8151808452602084019350602083015f5b82811015614838576148228683516147df565b604095909501946020919091019060010161480f565b5093949350505050565b602081525f61077660208301846147fd565b5f60408284031215614864575f5ffd5b61077683836146d6565b5f5f83601f84011261487e575f5ffd5b5081356001600160401b03811115614894575f5ffd5b6020830191508360208260051b85010111156118e5575f5ffd5b5f5f5f604084860312156148c0575f5ffd5b83356148cb81614643565b925060208401356001600160401b038111156148e5575f5ffd5b6148f18682870161486e565b9497909650939450505050565b5f6001600160401b0382111561491657614916614657565b5060051b60200190565b5f82601f83011261492f575f5ffd5b813561494261493d826148fe565b614693565b8082825260208201915060208360051b860101925085831115614963575f5ffd5b602085015b8381101561498957803561497b81614643565b835260209283019201614968565b5095945050505050565b5f5f5f5f60a085870312156149a6575f5ffd5b6149b086866146d6565b935060408501356001600160401b038111156149ca575f5ffd5b6149d687828801614920565b93505060608501356001600160401b038111156149f1575f5ffd5b6149fd87828801614920565b925050614a0c608086016146c3565b905092959194509250565b5f8151808452602084019350602083015f5b82811015614838578151865260209586019590910190600101614a29565b5f602082016020835280845180835260408501915060408160051b8601019250602086015f5b82811015614a9e57603f19878603018452614a89858351614a17565b94506020938401939190910190600101614a6d565b50929695505050505050565b5f5f60408385031215614abb575f5ffd5b8235614ac681614643565b915060208301356001600160401b03811115614ae0575f5ffd5b830160a08186031215614af1575f5ffd5b809150509250929050565b5f5f60408385031215614b0d575f5ffd5b8235614b1881614643565b91506020830135614af181614643565b5f8151808452602084019350602083015f5b8281101561483857614b7386835180516001600160401b03168252602080820151600f0b9083015260409081015163ffffffff16910152565b6060959095019460209190910190600101614b3a565b604081525f614b9b60408301856147fd565b8281036020840152611fa18185614b28565b5f8151808452602084019350602083015f5b828110156148385781516001600160a01b0316865260209586019590910190600101614bbf565b602081525f6107766020830184614bad565b5f5f60408385031215614c09575f5ffd5b82356001600160401b03811115614c1e575f5ffd5b614c2a85828601614920565b9250506020830135614af181614643565b602080825282518282018190525f918401906040840190835b81811015614c7b5783516001600160401b0316835260209384019390920191600101614c54565b509095945050505050565b5f5f5f5f5f60608688031215614c9a575f5ffd5b8535614ca581614643565b945060208601356001600160401b03811115614cbf575f5ffd5b614ccb8882890161486e565b90955093505060408601356001600160401b03811115614ce9575f5ffd5b614cf58882890161486e565b969995985093965092949392505050565b5f5f5f5f60608587031215614d19575f5ffd5b8435614d2481614643565b9350614d32602086016146c3565b925060408501356001600160401b03811115614d4c575f5ffd5b614d588782880161486e565b95989497509550505050565b5f5f60408385031215614d75575f5ffd5b8235614d8081614643565b915060208301356001600160401b03811115614d9a575f5ffd5b614da685828601614920565b9150509250929050565b5f5f60408385031215614dc1575f5ffd5b8235614dcc81614643565b9150614dda602084016146c3565b90509250929050565b5f60208284031215614df3575f5ffd5b813560ff81168114610776575f5ffd5b5f5f60608385031215614e14575f5ffd5b8235614e1f81614643565b9150614dda84602085016146d6565b5f60608284031215614e3e575f5ffd5b50919050565b5f60208284031215614e54575f5ffd5b81356001600160401b03811115614e69575f5ffd5b61313b84828501614e2e565b5f5f5f60808486031215614e87575f5ffd5b83356001600160401b03811115614e9c575f5ffd5b614ea886828701614920565b93505061475f85602086016146d6565b602081525f6107766020830184614b28565b5f5f5f60608486031215614edc575f5ffd5b8335614ee781614643565b925060208401356001600160401b03811115614f01575f5ffd5b614f0d86828701614920565b925050614f1c604085016146c3565b90509250925092565b5f5f60408385031215614f36575f5ffd5b8235614f4181614643565b915060208301356001600160401b03811115614f5b575f5ffd5b8301601f81018513614f6b575f5ffd5b8035614f7961493d826148fe565b8082825260208201915060208360051b850101925087831115614f9a575f5ffd5b602084015b838110156150bf5780356001600160401b03811115614fbc575f5ffd5b85016080818b03601f19011215614fd1575f5ffd5b614fd961466b565b614fe68b602084016146d6565b815260608201356001600160401b03811115615000575f5ffd5b61500f8c602083860101614920565b60208301525060808201356001600160401b0381111561502d575f5ffd5b6020818401019250508a601f830112615044575f5ffd5b813561505261493d826148fe565b8082825260208201915060208360051b86010192508d831115615073575f5ffd5b6020850194505b828510156150a95784356001600160401b0381168114615098575f5ffd5b82526020948501949091019061507a565b6040840152505084525060209283019201614f9f565b50809450505050509250929050565b5f5f5f604084860312156150e0575f5ffd5b83356150eb81614643565b925060208401356001600160401b03811115615105575f5ffd5b8401601f81018613615115575f5ffd5b80356001600160401b0381111561512a575f5ffd5b86602082840101111561513b575f5ffd5b939660209190910195509293505050565b5f5f6040838503121561515d575f5ffd5b823561516881614643565b915060208301356001600160401b03811115615182575f5ffd5b614da685828601614e2e565b5f5f6040838503121561519f575f5ffd5b82356151aa81614643565b946020939093013593505050565b5f602082840312156151c8575f5ffd5b81518015158114610776575f5ffd5b634e487b7160e01b5f52603260045260245ffd5b5f8235603e198336030181126151ff575f5ffd5b9190910192915050565b5f60208284031215615219575f5ffd5b610776826146c3565b6040810161099a82846147df565b5f5f8335601e19843603018112615245575f5ffd5b8301803591506001600160401b0382111561525e575f5ffd5b6020019150600581901b36038213156118e5575f5ffd5b6060810161528382856147df565b6001600160a01b039290921660409190910152919050565b604081525f6152ad6040830185614bad565b8281036020840152611fa18185614bad565b5f602082840312156152cf575f5ffd5b81516001600160401b038111156152e4575f5ffd5b8201601f810184136152f4575f5ffd5b805161530261493d826148fe565b8082825260208201915060208360051b850101925086831115615323575f5ffd5b602084015b838110156153c05780516001600160401b03811115615345575f5ffd5b8501603f81018913615355575f5ffd5b602081015161536661493d826148fe565b808282526020820191506020808460051b8601010192508b831115615389575f5ffd5b6040840193505b828410156153ab578351825260209384019390910190615390565b86525050602093840193919091019050615328565b509695505050505050565b634e487b7160e01b5f52601160045260245ffd5b8181038181111561099a5761099a6153cb565b6001600160401b03828116828216039081111561099a5761099a6153cb565b5f81600f0b60016001607f1b0319810361542d5761542d6153cb565b5f0392915050565b600f81810b9083900b0160016001607f1b03811360016001607f1b03198212171561099a5761099a6153cb565b6001600160a01b038616815260c0810161547f60208301876147df565b6001600160a01b039490941660608201526001600160401b0392909216608083015263ffffffff1660a09091015292915050565b5f5f8335601e198436030181126154c8575f5ffd5b8301803591506001600160401b038211156154e1575f5ffd5b6020019150368190038213156118e5575f5ffd5b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b6001600160a01b03881681525f60c0820161553b602084018a6147df565b60c060608401528690528660e083015f5b8881101561557c57823561555f81614643565b6001600160a01b031682526020928301929091019060010161554c565b50838103608085015261558f8188614a17565b91505082810360a08401526155a58185876154f5565b9a9950505050505050505050565b5f602082840312156155c3575f5ffd5b813561ffff81168114610776575f5ffd5b63ffffffff818116838216019081111561099a5761099a6153cb565b8183526020830192505f815f5b848110156148385763ffffffff615613836146c3565b16865260209586019591909101906001016155fd565b6001600160a01b03841681526040602082018190525f90611fa190830184866155f0565b602081525f61313b6020830184866154f5565b6001600160a01b03861681526060602082018190525f9061568490830186886155f0565b82810360408401526156978185876154f5565b98975050505050505050565b5f602082840312156156b3575f5ffd5b815161077681614643565b80516020808301519190811015614e3e575f1960209190910360031b1b16919050565b5f600182016156f2576156f26153cb565b5060010190565b5f81615707576157076153cb565b505f190190565b8082018281125f83128015821682158216171561572d5761572d6153cb565b505092915050565b600f82810b9082900b0360016001607f1b0319811260016001607f1b038213171561099a5761099a6153cb565b634e487b7160e01b5f52601260045260245ffd5b634e487b7160e01b5f52602160045260245ffd5b8082018082111561099a5761099a6153cb565b634e487b7160e01b5f52603160045260245ffd5b5f826157cb57634e487b7160e01b5f52601260045260245ffd5b50049056fea2646970667358221220eed5160c376c397184ef01a45fd09b1e24a4957cc6c60444d3c5fcc04001e14764736f6c634300081b0033", } // AllocationManagerABI 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 773e13f221..5367ed4b91 100644 --- a/pkg/bindings/BackingEigen/binding.go +++ b/pkg/bindings/BackingEigen/binding.go @@ -38,7 +38,7 @@ type ERC20VotesUpgradeableCheckpoint struct { // BackingEigenMetaData contains all meta data concerning the BackingEigen contract. var BackingEigenMetaData = &bind.MetaData{ ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"_EIGEN\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"CLOCK_MODE\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"DOMAIN_SEPARATOR\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"EIGEN\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"allowance\",\"inputs\":[{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"spender\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"allowedFrom\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"allowedTo\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"approve\",\"inputs\":[{\"name\":\"spender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"balanceOf\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"burn\",\"inputs\":[{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"checkpoints\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"pos\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structERC20VotesUpgradeable.Checkpoint\",\"components\":[{\"name\":\"fromBlock\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"votes\",\"type\":\"uint224\",\"internalType\":\"uint224\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"clock\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint48\",\"internalType\":\"uint48\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"decimals\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"decreaseAllowance\",\"inputs\":[{\"name\":\"spender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"subtractedValue\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"delegate\",\"inputs\":[{\"name\":\"delegatee\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"delegateBySig\",\"inputs\":[{\"name\":\"delegatee\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"nonce\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"v\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"r\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"s\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"delegates\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"disableTransferRestrictions\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"eip712Domain\",\"inputs\":[],\"outputs\":[{\"name\":\"fields\",\"type\":\"bytes1\",\"internalType\":\"bytes1\"},{\"name\":\"name\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"version\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"chainId\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"verifyingContract\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"extensions\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getPastTotalSupply\",\"inputs\":[{\"name\":\"timepoint\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getPastVotes\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"timepoint\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getVotes\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"increaseAllowance\",\"inputs\":[{\"name\":\"spender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"addedValue\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"initialOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"isMinter\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"mint\",\"inputs\":[{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"name\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"nonces\",\"inputs\":[{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"numCheckpoints\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"permit\",\"inputs\":[{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"spender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"deadline\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"v\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"r\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"s\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setAllowedFrom\",\"inputs\":[{\"name\":\"from\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"isAllowedFrom\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setAllowedTo\",\"inputs\":[{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"isAllowedTo\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setIsMinter\",\"inputs\":[{\"name\":\"minterAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"newStatus\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"symbol\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"totalSupply\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"transfer\",\"inputs\":[{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"transferFrom\",\"inputs\":[{\"name\":\"from\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"transferRestrictionsDisabledAfter\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"event\",\"name\":\"Approval\",\"inputs\":[{\"name\":\"owner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"spender\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Backed\",\"inputs\":[],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegateChanged\",\"inputs\":[{\"name\":\"delegator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"fromDelegate\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"toDelegate\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegateVotesChanged\",\"inputs\":[{\"name\":\"delegate\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"previousBalance\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"newBalance\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"EIP712DomainChanged\",\"inputs\":[],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"IsMinterModified\",\"inputs\":[{\"name\":\"minterAddress\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newStatus\",\"type\":\"bool\",\"indexed\":false,\"internalType\":\"bool\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"SetAllowedFrom\",\"inputs\":[{\"name\":\"from\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"isAllowedFrom\",\"type\":\"bool\",\"indexed\":false,\"internalType\":\"bool\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"SetAllowedTo\",\"inputs\":[{\"name\":\"to\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"isAllowedTo\",\"type\":\"bool\",\"indexed\":false,\"internalType\":\"bool\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Transfer\",\"inputs\":[{\"name\":\"from\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TransferRestrictionsDisabled\",\"inputs\":[],\"anonymous\":false}]", - Bin: "0x60a060405234801561000f575f5ffd5b50604051612d11380380612d1183398101604081905261002e91610105565b6001600160a01b038116608052610043610049565b50610132565b5f54610100900460ff16156100b45760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff90811614610103575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b5f60208284031215610115575f5ffd5b81516001600160a01b038116811461012b575f5ffd5b9392505050565b608051612bb261015f5f395f81816105e901528181610dae01528181610dd90152610e040152612bb25ff3fe608060405234801561000f575f5ffd5b506004361061023f575f3560e01c80637ecebe0011610135578063aa271e1a116100b4578063dd62ed3e11610079578063dd62ed3e14610579578063eb415f451461058c578063f1127ed814610594578063f2fde38b146105d1578063fdc371ce146105e4575f5ffd5b8063aa271e1a1461050a578063b8c255941461052d578063c3cda52014610540578063c4d66de814610553578063d505accf14610566575f5ffd5b806395d89b41116100fa57806395d89b41146104bf5780639ab24eb0146104c75780639aec4bae146104da578063a457c2d7146104e4578063a9059cbb146104f7575f5ffd5b80637ecebe001461044e57806384b0196e146104615780638da5cb5b1461047c5780638e539e8c1461048d57806391ddadf4146104a0575f5ffd5b806340c10f19116101c157806366eb399f1161018657806366eb399f146103c05780636fcfff45146103d357806370a08231146103fb578063715018a61461042357806378aa33ba1461042b575f5ffd5b806340c10f191461031a57806342966c681461032d5780634bf5d7e914610340578063587cde1e1461036a5780635c19a95c146103ad575f5ffd5b806323b872dd1161020757806323b872dd146102ca578063313ce567146102dd5780633644e515146102ec57806339509351146102f45780633a46b1a814610307575f5ffd5b80630455e6941461024357806306fdde031461027b578063095ea7b31461029057806318160ddd146102a35780631ffacdef146102b5575b5f5ffd5b610266610251366004612682565b6101316020525f908152604090205460ff1681565b60405190151581526020015b60405180910390f35b61028361060b565b60405161027291906126c9565b61026661029e3660046126db565b61069b565b6067545b604051908152602001610272565b6102c86102c3366004612703565b6106b4565b005b6102666102d836600461273c565b6106ca565b60405160128152602001610272565b6102a76106ed565b6102666103023660046126db565b6106fb565b6102a76103153660046126db565b61071c565b6102c86103283660046126db565b6107a4565b6102c861033b366004612776565b61081f565b60408051808201909152600e81526d06d6f64653d74696d657374616d760941b6020820152610283565b610395610378366004612682565b6001600160a01b039081165f90815260fe60205260409020541690565b6040516001600160a01b039091168152602001610272565b6102c86103bb366004612682565b61082c565b6102c86103ce366004612703565b610836565b6103e66103e1366004612682565b6108ae565b60405163ffffffff9091168152602001610272565b6102a7610409366004612682565b6001600160a01b03165f9081526065602052604090205490565b6102c86108cf565b610266610439366004612682565b6101326020525f908152604090205460ff1681565b6102a761045c366004612682565b6108e2565b6104696108ff565b604051610272979695949392919061278d565b6033546001600160a01b0316610395565b6102a761049b366004612776565b610998565b6104a86109ff565b60405165ffffffffffff9091168152602001610272565b610283610a09565b6102a76104d5366004612682565b610a18565b6102a76101305481565b6102666104f23660046126db565b610a95565b6102666105053660046126db565b610b0f565b610266610518366004612682565b6101336020525f908152604090205460ff1681565b6102c861053b366004612703565b610b1c565b6102c861054e366004612833565b610b2e565b6102c8610561366004612682565b610c63565b6102c8610574366004612887565b610ea5565b6102a76105873660046128ed565b611006565b6102c8611030565b6105a76105a236600461291e565b6110fe565b60408051825163ffffffff1681526020928301516001600160e01b03169281019290925201610272565b6102c86105df366004612682565b61117f565b6103957f000000000000000000000000000000000000000000000000000000000000000081565b60606068805461061a90612950565b80601f016020809104026020016040519081016040528092919081815260200182805461064690612950565b80156106915780601f1061066857610100808354040283529160200191610691565b820191905f5260205f20905b81548152906001019060200180831161067457829003601f168201915b5050505050905090565b5f336106a88185856111f5565b60019150505b92915050565b6106bc611318565b6106c68282611372565b5050565b5f336106d78582856113d2565b6106e285858561144a565b506001949350505050565b5f6106f6611604565b905090565b5f336106a881858561070d8383611006565b6107179190612996565b6111f5565b5f6107256109ff565b65ffffffffffff16821061077c5760405162461bcd60e51b815260206004820152601960248201527804552433230566f7465733a20667574757265206c6f6f6b757603c1b60448201526064015b60405180910390fd5b6001600160a01b0383165f90815260ff6020526040902061079d908361160d565b9392505050565b335f908152610133602052604090205460ff166108155760405162461bcd60e51b815260206004820152602960248201527f4261636b696e67456967656e2e6d696e743a2063616c6c6572206973206e6f7460448201526810309036b4b73a32b960b91b6064820152608401610773565b6106c682826116ee565b6108293382611779565b50565b6108293382611792565b61083e611318565b816001600160a01b03167f0124b12503bddc2616c0f3f54fd23ed283f5ef0c1483a75409e42612176b8bde8260405161087b911515815260200190565b60405180910390a26001600160a01b03919091165f90815261013360205260409020805460ff1916911515919091179055565b6001600160a01b0381165f90815260ff60205260408120546106ae9061180b565b6108d7611318565b6108e05f611873565b565b6001600160a01b0381165f90815260cb60205260408120546106ae565b5f6060805f5f5f60606097545f5f1b14801561091b5750609854155b61095f5760405162461bcd60e51b81526020600482015260156024820152741152540dcc4c8e88155b9a5b9a5d1a585b1a5e9959605a1b6044820152606401610773565b6109676118c4565b61096f6118d3565b604080515f80825260208201909252600f60f81b9b939a50919850469750309650945092509050565b5f6109a16109ff565b65ffffffffffff1682106109f35760405162461bcd60e51b815260206004820152601960248201527804552433230566f7465733a20667574757265206c6f6f6b757603c1b6044820152606401610773565b6106ae6101008361160d565b5f6106f6426118e2565b60606069805461061a90612950565b6001600160a01b0381165f90815260ff60205260408120548015610a83576001600160a01b0383165f90815260ff6020526040902080545f198301908110610a6257610a626129bd565b5f9182526020909120015464010000000090046001600160e01b0316610a85565b5f5b6001600160e01b03169392505050565b5f3381610aa28286611006565b905083811015610b025760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610773565b6106e282868684036111f5565b5f336106a881858561144a565b610b24611318565b6106c68282611948565b83421115610b7e5760405162461bcd60e51b815260206004820152601d60248201527f4552433230566f7465733a207369676e617475726520657870697265640000006044820152606401610773565b604080517fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf60208201526001600160a01b0388169181019190915260608101869052608081018590525f90610bf790610bef9060a001604051602081830303815290604052805190602001206119a0565b8585856119cc565b9050610c02816119f2565b8614610c505760405162461bcd60e51b815260206004820152601960248201527f4552433230566f7465733a20696e76616c6964206e6f6e6365000000000000006044820152606401610773565b610c5a8188611792565b50505050505050565b5f54610100900460ff1615808015610c8157505f54600160ff909116105b80610c9a5750303b158015610c9a57505f5460ff166001145b610cfd5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610773565b5f805460ff191660011790558015610d1e575f805461ff0019166101001790555b610d26611a19565b610d736040518060400160405280600d81526020016c2130b1b5b4b7339022b4b3b2b760991b815250604051806040016040528060068152602001653122a4a3a2a760d11b815250611a47565b610d7c82611873565b610da3604051806040016040528060068152602001653122a4a3a2a760d11b815250611a77565b5f1961013055610dd47f00000000000000000000000000000000000000000000000000000000000000006001611372565b610dff7f00000000000000000000000000000000000000000000000000000000000000006001611948565b610e357f00000000000000000000000000000000000000000000000000000000000000006b05686877afb5cbccbf7340006116ee565b6040517fb7c23c1e2e36f298e9879a88ecfcd07e28fbb439bcfa9c78ca1363ca14370d26905f90a180156106c6575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15050565b83421115610ef55760405162461bcd60e51b815260206004820152601d60248201527f45524332305065726d69743a206578706972656420646561646c696e650000006044820152606401610773565b5f7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9888888610f238c6119f2565b6040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090505f610f7d826119a0565b90505f610f8c828787876119cc565b9050896001600160a01b0316816001600160a01b031614610fef5760405162461bcd60e51b815260206004820152601e60248201527f45524332305065726d69743a20696e76616c6964207369676e617475726500006044820152606401610773565b610ffa8a8a8a6111f5565b50505050505050505050565b6001600160a01b039182165f90815260666020908152604080832093909416825291909152205490565b611038611318565b5f1961013054146110ce5760405162461bcd60e51b815260206004820152605460248201527f4261636b696e67456967656e2e64697361626c655472616e736665725265737460448201527f72696374696f6e733a207472616e73666572207265737472696374696f6e7320606482015273185c9948185b1c9958591e48191a5cd8589b195960621b608482015260a401610773565b5f6101308190556040517f2b18986d3ba809db2f13a5d7bf17f60d357b37d9cbb55dd71cbbac8dc4060f649190a1565b604080518082019091525f80825260208201526001600160a01b0383165f90815260ff60205260409020805463ffffffff8416908110611140576111406129bd565b5f9182526020918290206040805180820190915291015463ffffffff8116825264010000000090046001600160e01b0316918101919091529392505050565b611187611318565b6001600160a01b0381166111ec5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610773565b61082981611873565b6001600160a01b0383166112575760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610773565b6001600160a01b0382166112b85760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610773565b6001600160a01b038381165f8181526066602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6033546001600160a01b031633146108e05760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610773565b6001600160a01b0382165f8181526101316020908152604091829020805460ff191685151590811790915591519182527fcf20b1ecb604b0e8888d579c64e8a3b10e590d45c1c2dddb393bed284362227191015b60405180910390a25050565b5f6113dd8484611006565b90505f19811461144457818110156114375760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610773565b61144484848484036111f5565b50505050565b6001600160a01b0383166114ae5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610773565b6001600160a01b0382166115105760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610773565b61151b838383611ac0565b6001600160a01b0383165f90815260656020526040902054818110156115925760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610773565b6001600160a01b038085165f8181526065602052604080822086860390559286168082529083902080548601905591517fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906115f19086815260200190565b60405180910390a3611444848484611b9c565b5f6106f6611bcd565b81545f9081816005811115611664575f61162684611c40565b61163090856129d1565b5f88815260209020909150869082015463ffffffff16111561165457809150611662565b61165f816001612996565b92505b505b808210156116af575f6116778383611d24565b5f88815260209020909150869082015463ffffffff16111561169b578091506116a9565b6116a6816001612996565b92505b50611664565b80156116d9575f8681526020902081015f19015464010000000090046001600160e01b03166116db565b5f5b6001600160e01b03169695505050505050565b6116f88282611d3e565b6067546001600160e01b03101561176a5760405162461bcd60e51b815260206004820152603060248201527f4552433230566f7465733a20746f74616c20737570706c79207269736b73206f60448201526f766572666c6f77696e6720766f74657360801b6064820152608401610773565b611444610100611e0f83611e1a565b6117838282611f86565b6114446101006120c983611e1a565b6001600160a01b038281165f81815260fe6020818152604080842080546065845282862054949093528787166001600160a01b03198416811790915590519190951694919391928592917f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f9190a46114448284836120d4565b5f63ffffffff82111561186f5760405162461bcd60e51b815260206004820152602660248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203360448201526532206269747360d01b6064820152608401610773565b5090565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b60606099805461061a90612950565b6060609a805461061a90612950565b5f65ffffffffffff82111561186f5760405162461bcd60e51b815260206004820152602660248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203460448201526538206269747360d01b6064820152608401610773565b6001600160a01b0382165f8181526101326020908152604091829020805460ff191685151590811790915591519182527f72a561d1af7409467dae4f1e9fc52590a9335a1dda17727e2b6aa8c4db35109b91016113c6565b5f6106ae6119ac611604565b8360405161190160f01b8152600281019290925260228201526042902090565b5f5f5f6119db8787878761220e565b915091506119e8816122cb565b5095945050505050565b6001600160a01b0381165f90815260cb602052604090208054600181018255905b50919050565b5f54610100900460ff16611a3f5760405162461bcd60e51b8152600401610773906129e4565b6108e0612414565b5f54610100900460ff16611a6d5760405162461bcd60e51b8152600401610773906129e4565b6106c68282612443565b5f54610100900460ff16611a9d5760405162461bcd60e51b8152600401610773906129e4565b61082981604051806040016040528060018152602001603160f81b815250612482565b610130544211611b97576001600160a01b0383165f908152610131602052604090205460ff1680611b0957506001600160a01b0382165f908152610132602052604090205460ff165b80611b1b57506001600160a01b038316155b611b975760405162461bcd60e51b815260206004820152604160248201527f4261636b696e67456967656e2e5f6265666f7265546f6b656e5472616e73666560448201527f723a2066726f6d206f7220746f206d7573742062652077686974656c697374656064820152601960fa1b608482015260a401610773565b505050565b6001600160a01b038381165f90815260fe6020526040808220548584168352912054611b97929182169116836120d4565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f611bf76124cf565b611bff612527565b60408051602081019490945283019190915260608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b5f815f03611c4f57505f919050565b5f6001611c5b84612557565b901c6001901b90506001818481611c7457611c74612a2f565b048201901c90506001818481611c8c57611c8c612a2f565b048201901c90506001818481611ca457611ca4612a2f565b048201901c90506001818481611cbc57611cbc612a2f565b048201901c90506001818481611cd457611cd4612a2f565b048201901c90506001818481611cec57611cec612a2f565b048201901c90506001818481611d0457611d04612a2f565b048201901c905061079d81828581611d1e57611d1e612a2f565b046125ea565b5f611d326002848418612a43565b61079d90848416612996565b6001600160a01b038216611d945760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610773565b611d9f5f8383611ac0565b8060675f828254611db09190612996565b90915550506001600160a01b0382165f818152606560209081526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a36106c65f8383611b9c565b5f61079d8284612996565b82545f908190818115611e64575f8781526020902082015f190160408051808201909152905463ffffffff8116825264010000000090046001600160e01b03166020820152611e78565b604080518082019091525f80825260208201525b905080602001516001600160e01b03169350611e9884868863ffffffff16565b92505f82118015611ec05750611eac6109ff565b65ffffffffffff16815f015163ffffffff16145b15611f0357611ece836125ff565b5f8881526020902083015f190180546001600160e01b03929092166401000000000263ffffffff909216919091179055611f7c565b866040518060400160405280611f27611f1a6109ff565b65ffffffffffff1661180b565b63ffffffff168152602001611f3b866125ff565b6001600160e01b0390811690915282546001810184555f938452602093849020835194909301519091166401000000000263ffffffff909316929092179101555b5050935093915050565b6001600160a01b038216611fe65760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401610773565b611ff1825f83611ac0565b6001600160a01b0382165f90815260656020526040902054818110156120645760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b6064820152608401610773565b6001600160a01b0383165f8181526065602090815260408083208686039055606780548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3611b97835f84611b9c565b5f61079d82846129d1565b816001600160a01b0316836001600160a01b0316141580156120f557505f81115b15611b97576001600160a01b03831615612182576001600160a01b0383165f90815260ff60205260408120819061212f906120c985611e1a565b91509150846001600160a01b03167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a7248383604051612177929190918252602082015260400190565b60405180910390a250505b6001600160a01b03821615611b97576001600160a01b0382165f90815260ff6020526040812081906121b790611e0f85611e1a565b91509150836001600160a01b03167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a72483836040516121ff929190918252602082015260400190565b60405180910390a25050505050565b5f807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a083111561224357505f905060036122c2565b604080515f8082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015612294573d5f5f3e3d5ffd5b5050604051601f1901519150506001600160a01b0381166122bc575f600192509250506122c2565b91505f90505b94509492505050565b5f8160048111156122de576122de612a62565b036122e65750565b60018160048111156122fa576122fa612a62565b036123475760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610773565b600281600481111561235b5761235b612a62565b036123a85760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610773565b60038160048111156123bc576123bc612a62565b036108295760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401610773565b5f54610100900460ff1661243a5760405162461bcd60e51b8152600401610773906129e4565b6108e033611873565b5f54610100900460ff166124695760405162461bcd60e51b8152600401610773906129e4565b60686124758382612ac1565b506069611b978282612ac1565b5f54610100900460ff166124a85760405162461bcd60e51b8152600401610773906129e4565b60996124b48382612ac1565b50609a6124c18282612ac1565b50505f609781905560985550565b5f5f6124d96118c4565b8051909150156124f0578051602090910120919050565b60975480156124ff5792915050565b7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4709250505090565b5f5f6125316118d3565b805190915015612548578051602090910120919050565b60985480156124ff5792915050565b5f80608083901c1561256b57608092831c92015b604083901c1561257d57604092831c92015b602083901c1561258f57602092831c92015b601083901c156125a157601092831c92015b600883901c156125b357600892831c92015b600483901c156125c557600492831c92015b600283901c156125d757600292831c92015b600183901c156106ae5760010192915050565b5f8183106125f8578161079d565b5090919050565b5f6001600160e01b0382111561186f5760405162461bcd60e51b815260206004820152602760248201527f53616665436173743a2076616c756520646f65736e27742066697420696e20326044820152663234206269747360c81b6064820152608401610773565b80356001600160a01b038116811461267d575f5ffd5b919050565b5f60208284031215612692575f5ffd5b61079d82612667565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f61079d602083018461269b565b5f5f604083850312156126ec575f5ffd5b6126f583612667565b946020939093013593505050565b5f5f60408385031215612714575f5ffd5b61271d83612667565b915060208301358015158114612731575f5ffd5b809150509250929050565b5f5f5f6060848603121561274e575f5ffd5b61275784612667565b925061276560208501612667565b929592945050506040919091013590565b5f60208284031215612786575f5ffd5b5035919050565b60ff60f81b8816815260e060208201525f6127ab60e083018961269b565b82810360408401526127bd818961269b565b606084018890526001600160a01b038716608085015260a0840186905283810360c0850152845180825260208087019350909101905f5b818110156128125783518352602093840193909201916001016127f4565b50909b9a5050505050505050505050565b803560ff8116811461267d575f5ffd5b5f5f5f5f5f5f60c08789031215612848575f5ffd5b61285187612667565b9550602087013594506040870135935061286d60608801612823565b9598949750929560808101359460a0909101359350915050565b5f5f5f5f5f5f5f60e0888a03121561289d575f5ffd5b6128a688612667565b96506128b460208901612667565b955060408801359450606088013593506128d060808901612823565b9699959850939692959460a0840135945060c09093013592915050565b5f5f604083850312156128fe575f5ffd5b61290783612667565b915061291560208401612667565b90509250929050565b5f5f6040838503121561292f575f5ffd5b61293883612667565b9150602083013563ffffffff81168114612731575f5ffd5b600181811c9082168061296457607f821691505b602082108103611a1357634e487b7160e01b5f52602260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b808201808211156106ae576106ae612982565b634e487b7160e01b5f52604160045260245ffd5b634e487b7160e01b5f52603260045260245ffd5b818103818111156106ae576106ae612982565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b634e487b7160e01b5f52601260045260245ffd5b5f82612a5d57634e487b7160e01b5f52601260045260245ffd5b500490565b634e487b7160e01b5f52602160045260245ffd5b601f821115611b9757805f5260205f20601f840160051c81016020851015612a9b5750805b601f840160051c820191505b81811015612aba575f8155600101612aa7565b5050505050565b815167ffffffffffffffff811115612adb57612adb6129a9565b612aef81612ae98454612950565b84612a76565b6020601f821160018114612b21575f8315612b0a5750848201515b5f19600385901b1c1916600184901b178455612aba565b5f84815260208120601f198516915b82811015612b505787850151825560209485019460019092019101612b30565b5084821015612b6d57868401515f19600387901b60f8161c191681555b50505050600190811b0190555056fea2646970667358221220e867b134dc261d7025b320d04b24d156f209a884537e24f3f733872669a3444264736f6c634300081b0033", + Bin: "0x60a060405234801561000f575f5ffd5b50604051612d11380380612d1183398101604081905261002e91610105565b6001600160a01b038116608052610043610049565b50610132565b5f54610100900460ff16156100b45760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff90811614610103575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b5f60208284031215610115575f5ffd5b81516001600160a01b038116811461012b575f5ffd5b9392505050565b608051612bb261015f5f395f81816105e901528181610dae01528181610dd90152610e040152612bb25ff3fe608060405234801561000f575f5ffd5b506004361061023f575f3560e01c80637ecebe0011610135578063aa271e1a116100b4578063dd62ed3e11610079578063dd62ed3e14610579578063eb415f451461058c578063f1127ed814610594578063f2fde38b146105d1578063fdc371ce146105e4575f5ffd5b8063aa271e1a1461050a578063b8c255941461052d578063c3cda52014610540578063c4d66de814610553578063d505accf14610566575f5ffd5b806395d89b41116100fa57806395d89b41146104bf5780639ab24eb0146104c75780639aec4bae146104da578063a457c2d7146104e4578063a9059cbb146104f7575f5ffd5b80637ecebe001461044e57806384b0196e146104615780638da5cb5b1461047c5780638e539e8c1461048d57806391ddadf4146104a0575f5ffd5b806340c10f19116101c157806366eb399f1161018657806366eb399f146103c05780636fcfff45146103d357806370a08231146103fb578063715018a61461042357806378aa33ba1461042b575f5ffd5b806340c10f191461031a57806342966c681461032d5780634bf5d7e914610340578063587cde1e1461036a5780635c19a95c146103ad575f5ffd5b806323b872dd1161020757806323b872dd146102ca578063313ce567146102dd5780633644e515146102ec57806339509351146102f45780633a46b1a814610307575f5ffd5b80630455e6941461024357806306fdde031461027b578063095ea7b31461029057806318160ddd146102a35780631ffacdef146102b5575b5f5ffd5b610266610251366004612682565b6101316020525f908152604090205460ff1681565b60405190151581526020015b60405180910390f35b61028361060b565b60405161027291906126c9565b61026661029e3660046126db565b61069b565b6067545b604051908152602001610272565b6102c86102c3366004612703565b6106b4565b005b6102666102d836600461273c565b6106ca565b60405160128152602001610272565b6102a76106ed565b6102666103023660046126db565b6106fb565b6102a76103153660046126db565b61071c565b6102c86103283660046126db565b6107a4565b6102c861033b366004612776565b61081f565b60408051808201909152600e81526d06d6f64653d74696d657374616d760941b6020820152610283565b610395610378366004612682565b6001600160a01b039081165f90815260fe60205260409020541690565b6040516001600160a01b039091168152602001610272565b6102c86103bb366004612682565b61082c565b6102c86103ce366004612703565b610836565b6103e66103e1366004612682565b6108ae565b60405163ffffffff9091168152602001610272565b6102a7610409366004612682565b6001600160a01b03165f9081526065602052604090205490565b6102c86108cf565b610266610439366004612682565b6101326020525f908152604090205460ff1681565b6102a761045c366004612682565b6108e2565b6104696108ff565b604051610272979695949392919061278d565b6033546001600160a01b0316610395565b6102a761049b366004612776565b610998565b6104a86109ff565b60405165ffffffffffff9091168152602001610272565b610283610a09565b6102a76104d5366004612682565b610a18565b6102a76101305481565b6102666104f23660046126db565b610a95565b6102666105053660046126db565b610b0f565b610266610518366004612682565b6101336020525f908152604090205460ff1681565b6102c861053b366004612703565b610b1c565b6102c861054e366004612833565b610b2e565b6102c8610561366004612682565b610c63565b6102c8610574366004612887565b610ea5565b6102a76105873660046128ed565b611006565b6102c8611030565b6105a76105a236600461291e565b6110fe565b60408051825163ffffffff1681526020928301516001600160e01b03169281019290925201610272565b6102c86105df366004612682565b61117f565b6103957f000000000000000000000000000000000000000000000000000000000000000081565b60606068805461061a90612950565b80601f016020809104026020016040519081016040528092919081815260200182805461064690612950565b80156106915780601f1061066857610100808354040283529160200191610691565b820191905f5260205f20905b81548152906001019060200180831161067457829003601f168201915b5050505050905090565b5f336106a88185856111f5565b60019150505b92915050565b6106bc611318565b6106c68282611372565b5050565b5f336106d78582856113d2565b6106e285858561144a565b506001949350505050565b5f6106f6611604565b905090565b5f336106a881858561070d8383611006565b6107179190612996565b6111f5565b5f6107256109ff565b65ffffffffffff16821061077c5760405162461bcd60e51b815260206004820152601960248201527804552433230566f7465733a20667574757265206c6f6f6b757603c1b60448201526064015b60405180910390fd5b6001600160a01b0383165f90815260ff6020526040902061079d908361160d565b9392505050565b335f908152610133602052604090205460ff166108155760405162461bcd60e51b815260206004820152602960248201527f4261636b696e67456967656e2e6d696e743a2063616c6c6572206973206e6f7460448201526810309036b4b73a32b960b91b6064820152608401610773565b6106c682826116ee565b6108293382611779565b50565b6108293382611792565b61083e611318565b816001600160a01b03167f0124b12503bddc2616c0f3f54fd23ed283f5ef0c1483a75409e42612176b8bde8260405161087b911515815260200190565b60405180910390a26001600160a01b03919091165f90815261013360205260409020805460ff1916911515919091179055565b6001600160a01b0381165f90815260ff60205260408120546106ae9061180b565b6108d7611318565b6108e05f611873565b565b6001600160a01b0381165f90815260cb60205260408120546106ae565b5f6060805f5f5f60606097545f5f1b14801561091b5750609854155b61095f5760405162461bcd60e51b81526020600482015260156024820152741152540dcc4c8e88155b9a5b9a5d1a585b1a5e9959605a1b6044820152606401610773565b6109676118c4565b61096f6118d3565b604080515f80825260208201909252600f60f81b9b939a50919850469750309650945092509050565b5f6109a16109ff565b65ffffffffffff1682106109f35760405162461bcd60e51b815260206004820152601960248201527804552433230566f7465733a20667574757265206c6f6f6b757603c1b6044820152606401610773565b6106ae6101008361160d565b5f6106f6426118e2565b60606069805461061a90612950565b6001600160a01b0381165f90815260ff60205260408120548015610a83576001600160a01b0383165f90815260ff6020526040902080545f198301908110610a6257610a626129bd565b5f9182526020909120015464010000000090046001600160e01b0316610a85565b5f5b6001600160e01b03169392505050565b5f3381610aa28286611006565b905083811015610b025760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610773565b6106e282868684036111f5565b5f336106a881858561144a565b610b24611318565b6106c68282611948565b83421115610b7e5760405162461bcd60e51b815260206004820152601d60248201527f4552433230566f7465733a207369676e617475726520657870697265640000006044820152606401610773565b604080517fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf60208201526001600160a01b0388169181019190915260608101869052608081018590525f90610bf790610bef9060a001604051602081830303815290604052805190602001206119a0565b8585856119cc565b9050610c02816119f2565b8614610c505760405162461bcd60e51b815260206004820152601960248201527f4552433230566f7465733a20696e76616c6964206e6f6e6365000000000000006044820152606401610773565b610c5a8188611792565b50505050505050565b5f54610100900460ff1615808015610c8157505f54600160ff909116105b80610c9a5750303b158015610c9a57505f5460ff166001145b610cfd5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610773565b5f805460ff191660011790558015610d1e575f805461ff0019166101001790555b610d26611a19565b610d736040518060400160405280600d81526020016c2130b1b5b4b7339022b4b3b2b760991b815250604051806040016040528060068152602001653122a4a3a2a760d11b815250611a47565b610d7c82611873565b610da3604051806040016040528060068152602001653122a4a3a2a760d11b815250611a77565b5f1961013055610dd47f00000000000000000000000000000000000000000000000000000000000000006001611372565b610dff7f00000000000000000000000000000000000000000000000000000000000000006001611948565b610e357f00000000000000000000000000000000000000000000000000000000000000006b05686877afb5cbccbf7340006116ee565b6040517fb7c23c1e2e36f298e9879a88ecfcd07e28fbb439bcfa9c78ca1363ca14370d26905f90a180156106c6575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15050565b83421115610ef55760405162461bcd60e51b815260206004820152601d60248201527f45524332305065726d69743a206578706972656420646561646c696e650000006044820152606401610773565b5f7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9888888610f238c6119f2565b6040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090505f610f7d826119a0565b90505f610f8c828787876119cc565b9050896001600160a01b0316816001600160a01b031614610fef5760405162461bcd60e51b815260206004820152601e60248201527f45524332305065726d69743a20696e76616c6964207369676e617475726500006044820152606401610773565b610ffa8a8a8a6111f5565b50505050505050505050565b6001600160a01b039182165f90815260666020908152604080832093909416825291909152205490565b611038611318565b5f1961013054146110ce5760405162461bcd60e51b815260206004820152605460248201527f4261636b696e67456967656e2e64697361626c655472616e736665725265737460448201527f72696374696f6e733a207472616e73666572207265737472696374696f6e7320606482015273185c9948185b1c9958591e48191a5cd8589b195960621b608482015260a401610773565b5f6101308190556040517f2b18986d3ba809db2f13a5d7bf17f60d357b37d9cbb55dd71cbbac8dc4060f649190a1565b604080518082019091525f80825260208201526001600160a01b0383165f90815260ff60205260409020805463ffffffff8416908110611140576111406129bd565b5f9182526020918290206040805180820190915291015463ffffffff8116825264010000000090046001600160e01b0316918101919091529392505050565b611187611318565b6001600160a01b0381166111ec5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610773565b61082981611873565b6001600160a01b0383166112575760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610773565b6001600160a01b0382166112b85760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610773565b6001600160a01b038381165f8181526066602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6033546001600160a01b031633146108e05760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610773565b6001600160a01b0382165f8181526101316020908152604091829020805460ff191685151590811790915591519182527fcf20b1ecb604b0e8888d579c64e8a3b10e590d45c1c2dddb393bed284362227191015b60405180910390a25050565b5f6113dd8484611006565b90505f19811461144457818110156114375760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610773565b61144484848484036111f5565b50505050565b6001600160a01b0383166114ae5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610773565b6001600160a01b0382166115105760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610773565b61151b838383611ac0565b6001600160a01b0383165f90815260656020526040902054818110156115925760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610773565b6001600160a01b038085165f8181526065602052604080822086860390559286168082529083902080548601905591517fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906115f19086815260200190565b60405180910390a3611444848484611b9c565b5f6106f6611bcd565b81545f9081816005811115611664575f61162684611c40565b61163090856129d1565b5f88815260209020909150869082015463ffffffff16111561165457809150611662565b61165f816001612996565b92505b505b808210156116af575f6116778383611d24565b5f88815260209020909150869082015463ffffffff16111561169b578091506116a9565b6116a6816001612996565b92505b50611664565b80156116d9575f8681526020902081015f19015464010000000090046001600160e01b03166116db565b5f5b6001600160e01b03169695505050505050565b6116f88282611d3e565b6067546001600160e01b03101561176a5760405162461bcd60e51b815260206004820152603060248201527f4552433230566f7465733a20746f74616c20737570706c79207269736b73206f60448201526f766572666c6f77696e6720766f74657360801b6064820152608401610773565b611444610100611e0f83611e1a565b6117838282611f86565b6114446101006120c983611e1a565b6001600160a01b038281165f81815260fe6020818152604080842080546065845282862054949093528787166001600160a01b03198416811790915590519190951694919391928592917f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f9190a46114448284836120d4565b5f63ffffffff82111561186f5760405162461bcd60e51b815260206004820152602660248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203360448201526532206269747360d01b6064820152608401610773565b5090565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b60606099805461061a90612950565b6060609a805461061a90612950565b5f65ffffffffffff82111561186f5760405162461bcd60e51b815260206004820152602660248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203460448201526538206269747360d01b6064820152608401610773565b6001600160a01b0382165f8181526101326020908152604091829020805460ff191685151590811790915591519182527f72a561d1af7409467dae4f1e9fc52590a9335a1dda17727e2b6aa8c4db35109b91016113c6565b5f6106ae6119ac611604565b8360405161190160f01b8152600281019290925260228201526042902090565b5f5f5f6119db8787878761220e565b915091506119e8816122cb565b5095945050505050565b6001600160a01b0381165f90815260cb602052604090208054600181018255905b50919050565b5f54610100900460ff16611a3f5760405162461bcd60e51b8152600401610773906129e4565b6108e0612414565b5f54610100900460ff16611a6d5760405162461bcd60e51b8152600401610773906129e4565b6106c68282612443565b5f54610100900460ff16611a9d5760405162461bcd60e51b8152600401610773906129e4565b61082981604051806040016040528060018152602001603160f81b815250612482565b610130544211611b97576001600160a01b0383165f908152610131602052604090205460ff1680611b0957506001600160a01b0382165f908152610132602052604090205460ff165b80611b1b57506001600160a01b038316155b611b975760405162461bcd60e51b815260206004820152604160248201527f4261636b696e67456967656e2e5f6265666f7265546f6b656e5472616e73666560448201527f723a2066726f6d206f7220746f206d7573742062652077686974656c697374656064820152601960fa1b608482015260a401610773565b505050565b6001600160a01b038381165f90815260fe6020526040808220548584168352912054611b97929182169116836120d4565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f611bf76124cf565b611bff612527565b60408051602081019490945283019190915260608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b5f815f03611c4f57505f919050565b5f6001611c5b84612557565b901c6001901b90506001818481611c7457611c74612a2f565b048201901c90506001818481611c8c57611c8c612a2f565b048201901c90506001818481611ca457611ca4612a2f565b048201901c90506001818481611cbc57611cbc612a2f565b048201901c90506001818481611cd457611cd4612a2f565b048201901c90506001818481611cec57611cec612a2f565b048201901c90506001818481611d0457611d04612a2f565b048201901c905061079d81828581611d1e57611d1e612a2f565b046125ea565b5f611d326002848418612a43565b61079d90848416612996565b6001600160a01b038216611d945760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610773565b611d9f5f8383611ac0565b8060675f828254611db09190612996565b90915550506001600160a01b0382165f818152606560209081526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a36106c65f8383611b9c565b5f61079d8284612996565b82545f908190818115611e64575f8781526020902082015f190160408051808201909152905463ffffffff8116825264010000000090046001600160e01b03166020820152611e78565b604080518082019091525f80825260208201525b905080602001516001600160e01b03169350611e9884868863ffffffff16565b92505f82118015611ec05750611eac6109ff565b65ffffffffffff16815f015163ffffffff16145b15611f0357611ece836125ff565b5f8881526020902083015f190180546001600160e01b03929092166401000000000263ffffffff909216919091179055611f7c565b866040518060400160405280611f27611f1a6109ff565b65ffffffffffff1661180b565b63ffffffff168152602001611f3b866125ff565b6001600160e01b0390811690915282546001810184555f938452602093849020835194909301519091166401000000000263ffffffff909316929092179101555b5050935093915050565b6001600160a01b038216611fe65760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401610773565b611ff1825f83611ac0565b6001600160a01b0382165f90815260656020526040902054818110156120645760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b6064820152608401610773565b6001600160a01b0383165f8181526065602090815260408083208686039055606780548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3611b97835f84611b9c565b5f61079d82846129d1565b816001600160a01b0316836001600160a01b0316141580156120f557505f81115b15611b97576001600160a01b03831615612182576001600160a01b0383165f90815260ff60205260408120819061212f906120c985611e1a565b91509150846001600160a01b03167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a7248383604051612177929190918252602082015260400190565b60405180910390a250505b6001600160a01b03821615611b97576001600160a01b0382165f90815260ff6020526040812081906121b790611e0f85611e1a565b91509150836001600160a01b03167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a72483836040516121ff929190918252602082015260400190565b60405180910390a25050505050565b5f807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a083111561224357505f905060036122c2565b604080515f8082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015612294573d5f5f3e3d5ffd5b5050604051601f1901519150506001600160a01b0381166122bc575f600192509250506122c2565b91505f90505b94509492505050565b5f8160048111156122de576122de612a62565b036122e65750565b60018160048111156122fa576122fa612a62565b036123475760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610773565b600281600481111561235b5761235b612a62565b036123a85760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610773565b60038160048111156123bc576123bc612a62565b036108295760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401610773565b5f54610100900460ff1661243a5760405162461bcd60e51b8152600401610773906129e4565b6108e033611873565b5f54610100900460ff166124695760405162461bcd60e51b8152600401610773906129e4565b60686124758382612ac1565b506069611b978282612ac1565b5f54610100900460ff166124a85760405162461bcd60e51b8152600401610773906129e4565b60996124b48382612ac1565b50609a6124c18282612ac1565b50505f609781905560985550565b5f5f6124d96118c4565b8051909150156124f0578051602090910120919050565b60975480156124ff5792915050565b7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4709250505090565b5f5f6125316118d3565b805190915015612548578051602090910120919050565b60985480156124ff5792915050565b5f80608083901c1561256b57608092831c92015b604083901c1561257d57604092831c92015b602083901c1561258f57602092831c92015b601083901c156125a157601092831c92015b600883901c156125b357600892831c92015b600483901c156125c557600492831c92015b600283901c156125d757600292831c92015b600183901c156106ae5760010192915050565b5f8183106125f8578161079d565b5090919050565b5f6001600160e01b0382111561186f5760405162461bcd60e51b815260206004820152602760248201527f53616665436173743a2076616c756520646f65736e27742066697420696e20326044820152663234206269747360c81b6064820152608401610773565b80356001600160a01b038116811461267d575f5ffd5b919050565b5f60208284031215612692575f5ffd5b61079d82612667565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f61079d602083018461269b565b5f5f604083850312156126ec575f5ffd5b6126f583612667565b946020939093013593505050565b5f5f60408385031215612714575f5ffd5b61271d83612667565b915060208301358015158114612731575f5ffd5b809150509250929050565b5f5f5f6060848603121561274e575f5ffd5b61275784612667565b925061276560208501612667565b929592945050506040919091013590565b5f60208284031215612786575f5ffd5b5035919050565b60ff60f81b8816815260e060208201525f6127ab60e083018961269b565b82810360408401526127bd818961269b565b606084018890526001600160a01b038716608085015260a0840186905283810360c0850152845180825260208087019350909101905f5b818110156128125783518352602093840193909201916001016127f4565b50909b9a5050505050505050505050565b803560ff8116811461267d575f5ffd5b5f5f5f5f5f5f60c08789031215612848575f5ffd5b61285187612667565b9550602087013594506040870135935061286d60608801612823565b9598949750929560808101359460a0909101359350915050565b5f5f5f5f5f5f5f60e0888a03121561289d575f5ffd5b6128a688612667565b96506128b460208901612667565b955060408801359450606088013593506128d060808901612823565b9699959850939692959460a0840135945060c09093013592915050565b5f5f604083850312156128fe575f5ffd5b61290783612667565b915061291560208401612667565b90509250929050565b5f5f6040838503121561292f575f5ffd5b61293883612667565b9150602083013563ffffffff81168114612731575f5ffd5b600181811c9082168061296457607f821691505b602082108103611a1357634e487b7160e01b5f52602260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b808201808211156106ae576106ae612982565b634e487b7160e01b5f52604160045260245ffd5b634e487b7160e01b5f52603260045260245ffd5b818103818111156106ae576106ae612982565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b634e487b7160e01b5f52601260045260245ffd5b5f82612a5d57634e487b7160e01b5f52601260045260245ffd5b500490565b634e487b7160e01b5f52602160045260245ffd5b601f821115611b9757805f5260205f20601f840160051c81016020851015612a9b5750805b601f840160051c820191505b81811015612aba575f8155600101612aa7565b5050505050565b815167ffffffffffffffff811115612adb57612adb6129a9565b612aef81612ae98454612950565b84612a76565b6020601f821160018114612b21575f8315612b0a5750848201515b5f19600385901b1c1916600184901b178455612aba565b5f84815260208120601f198516915b82811015612b505787850151825560209485019460019092019101612b30565b5084821015612b6d57868401515f19600387901b60f8161c191681555b50505050600190811b0190555056fea2646970667358221220bc65aa22c82ea1986fef941c8ffca5d6f9991e3fb75b2eefff53e26501e45f9064736f6c634300081b0033", } // BackingEigenABI is the input ABI used to generate the binding from. diff --git a/pkg/bindings/BeaconChainProofs/binding.go b/pkg/bindings/BeaconChainProofs/binding.go index bca107b999..3e48868c16 100644 --- a/pkg/bindings/BeaconChainProofs/binding.go +++ b/pkg/bindings/BeaconChainProofs/binding.go @@ -32,7 +32,7 @@ var ( // BeaconChainProofsMetaData contains all meta data concerning the BeaconChainProofs contract. var BeaconChainProofsMetaData = &bind.MetaData{ ABI: "[{\"type\":\"error\",\"name\":\"InvalidProof\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidProofLength\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidValidatorFieldsLength\",\"inputs\":[]}]", - Bin: "0x60556032600b8282823980515f1a607314602657634e487b7160e01b5f525f60045260245ffd5b305f52607381538281f3fe730000000000000000000000000000000000000000301460806040525f5ffdfea264697066735822122008cce030eef89bfa5bdc495fd3132a80b290f7c5211b5ff5314d2604022ce60764736f6c634300081b0033", + Bin: "0x60556032600b8282823980515f1a607314602657634e487b7160e01b5f525f60045260245ffd5b305f52607381538281f3fe730000000000000000000000000000000000000000301460806040525f5ffdfea2646970667358221220b786d81c68c50488570935b357a548005dc46a3e40dcde8c9c3cfe80240891a564736f6c634300081b0033", } // BeaconChainProofsABI is the input ABI used to generate the binding from. diff --git a/pkg/bindings/BytesLib/binding.go b/pkg/bindings/BytesLib/binding.go index 23d7c38887..80d08fb9da 100644 --- a/pkg/bindings/BytesLib/binding.go +++ b/pkg/bindings/BytesLib/binding.go @@ -32,7 +32,7 @@ var ( // BytesLibMetaData contains all meta data concerning the BytesLib contract. var BytesLibMetaData = &bind.MetaData{ ABI: "[{\"type\":\"error\",\"name\":\"OutOfBounds\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"Overflow\",\"inputs\":[]}]", - Bin: "0x60556032600b8282823980515f1a607314602657634e487b7160e01b5f525f60045260245ffd5b305f52607381538281f3fe730000000000000000000000000000000000000000301460806040525f5ffdfea26469706673582212201c49718c32c7b9955558fe081b9edb8db636f523f0b3ec1bfeea2696a9f7424464736f6c634300081b0033", + Bin: "0x60556032600b8282823980515f1a607314602657634e487b7160e01b5f525f60045260245ffd5b305f52607381538281f3fe730000000000000000000000000000000000000000301460806040525f5ffdfea2646970667358221220517c792f82001a69d55f8c03043251e3baff982c0b3c945ebf5259c111341b5664736f6c634300081b0033", } // BytesLibABI is the input ABI used to generate the binding from. diff --git a/pkg/bindings/DelegationManager/binding.go b/pkg/bindings/DelegationManager/binding.go index b72d303dc6..0471cea23f 100644 --- a/pkg/bindings/DelegationManager/binding.go +++ b/pkg/bindings/DelegationManager/binding.go @@ -56,7 +56,7 @@ 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\":\"_eigenPodManager\",\"type\":\"address\",\"internalType\":\"contractIEigenPodManager\"},{\"name\":\"_allocationManager\",\"type\":\"address\",\"internalType\":\"contractIAllocationManager\"},{\"name\":\"_pauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"},{\"name\":\"_permissionController\",\"type\":\"address\",\"internalType\":\"contractIPermissionController\"},{\"name\":\"_MIN_WITHDRAWAL_DELAY\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"DELEGATION_APPROVAL_TYPEHASH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"allocationManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIAllocationManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"beaconChainETHStrategy\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"calculateDelegationApprovalDigestHash\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"approver\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"approverSalt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"calculateWithdrawalRoot\",\"inputs\":[{\"name\":\"withdrawal\",\"type\":\"tuple\",\"internalType\":\"structIDelegationManagerTypes.Withdrawal\",\"components\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"delegatedTo\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"withdrawer\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"nonce\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startBlock\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"scaledShares\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"completeQueuedWithdrawal\",\"inputs\":[{\"name\":\"withdrawal\",\"type\":\"tuple\",\"internalType\":\"structIDelegationManagerTypes.Withdrawal\",\"components\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"delegatedTo\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"withdrawer\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"nonce\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startBlock\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"scaledShares\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}]},{\"name\":\"tokens\",\"type\":\"address[]\",\"internalType\":\"contractIERC20[]\"},{\"name\":\"receiveAsTokens\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeQueuedWithdrawals\",\"inputs\":[{\"name\":\"withdrawals\",\"type\":\"tuple[]\",\"internalType\":\"structIDelegationManagerTypes.Withdrawal[]\",\"components\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"delegatedTo\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"withdrawer\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"nonce\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startBlock\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"scaledShares\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}]},{\"name\":\"tokens\",\"type\":\"address[][]\",\"internalType\":\"contractIERC20[][]\"},{\"name\":\"receiveAsTokens\",\"type\":\"bool[]\",\"internalType\":\"bool[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"convertToDepositShares\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"withdrawableShares\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"cumulativeWithdrawalsQueued\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"totalQueued\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"decreaseDelegatedShares\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"curDepositShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"beaconChainSlashingFactorDecrease\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"delegateTo\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"approverSignatureAndExpiry\",\"type\":\"tuple\",\"internalType\":\"structISignatureUtils.SignatureWithExpiry\",\"components\":[{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"approverSalt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"delegatedTo\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"delegationApprover\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"delegationApproverSaltIsSpent\",\"inputs\":[{\"name\":\"delegationApprover\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"spent\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"depositScalingFactor\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"domainSeparator\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"eigenPodManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIEigenPodManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getDepositedShares\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getOperatorShares\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getOperatorsShares\",\"inputs\":[{\"name\":\"operators\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256[][]\",\"internalType\":\"uint256[][]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getQueuedWithdrawal\",\"inputs\":[{\"name\":\"withdrawalRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIDelegationManagerTypes.Withdrawal\",\"components\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"delegatedTo\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"withdrawer\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"nonce\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startBlock\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"scaledShares\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getQueuedWithdrawalRoots\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32[]\",\"internalType\":\"bytes32[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getQueuedWithdrawals\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"withdrawals\",\"type\":\"tuple[]\",\"internalType\":\"structIDelegationManagerTypes.Withdrawal[]\",\"components\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"delegatedTo\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"withdrawer\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"nonce\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startBlock\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"scaledShares\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}]},{\"name\":\"shares\",\"type\":\"uint256[][]\",\"internalType\":\"uint256[][]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getSlashableSharesInQueue\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getWithdrawableShares\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"outputs\":[{\"name\":\"withdrawableShares\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"},{\"name\":\"depositShares\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"increaseDelegatedShares\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"prevDepositShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"addedShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"initialOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"initialPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"isDelegated\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isOperator\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"minWithdrawalDelayBlocks\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"modifyOperatorDetails\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"newDelegationApprover\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"operatorShares\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"shares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"pauseAll\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[{\"name\":\"index\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pauserRegistry\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pendingWithdrawals\",\"inputs\":[{\"name\":\"withdrawalRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"pending\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"permissionController\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIPermissionController\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"queueWithdrawals\",\"inputs\":[{\"name\":\"params\",\"type\":\"tuple[]\",\"internalType\":\"structIDelegationManagerTypes.QueuedWithdrawalParams[]\",\"components\":[{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"depositShares\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"},{\"name\":\"__deprecated_withdrawer\",\"type\":\"address\",\"internalType\":\"address\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32[]\",\"internalType\":\"bytes32[]\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"redelegate\",\"inputs\":[{\"name\":\"newOperator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"newOperatorApproverSig\",\"type\":\"tuple\",\"internalType\":\"structISignatureUtils.SignatureWithExpiry\",\"components\":[{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"approverSalt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"withdrawalRoots\",\"type\":\"bytes32[]\",\"internalType\":\"bytes32[]\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"registerAsOperator\",\"inputs\":[{\"name\":\"initDelegationApprover\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"allocationDelay\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"metadataURI\",\"type\":\"string\",\"internalType\":\"string\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"slashOperatorShares\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"prevMaxMagnitude\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"newMaxMagnitude\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"strategyManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategyManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"undelegate\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"withdrawalRoots\",\"type\":\"bytes32[]\",\"internalType\":\"bytes32[]\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"updateOperatorMetadataURI\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"metadataURI\",\"type\":\"string\",\"internalType\":\"string\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"DelegationApproverUpdated\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newDelegationApprover\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DepositScalingFactorUpdated\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"newDepositScalingFactor\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorMetadataURIUpdated\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"metadataURI\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorRegistered\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"delegationApprover\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorSharesDecreased\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"staker\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"shares\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorSharesIncreased\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"staker\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"shares\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"SlashingWithdrawalCompleted\",\"inputs\":[{\"name\":\"withdrawalRoot\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"SlashingWithdrawalQueued\",\"inputs\":[{\"name\":\"withdrawalRoot\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"},{\"name\":\"withdrawal\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIDelegationManagerTypes.Withdrawal\",\"components\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"delegatedTo\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"withdrawer\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"nonce\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startBlock\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"scaledShares\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}]},{\"name\":\"sharesToWithdraw\",\"type\":\"uint256[]\",\"indexed\":false,\"internalType\":\"uint256[]\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StakerDelegated\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StakerForceUndelegated\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StakerUndelegated\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"ActivelyDelegated\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"CallerCannotUndelegate\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"CurrentlyPaused\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"FullySlashed\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InputAddressZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InputArrayLengthMismatch\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InputArrayLengthZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidNewPausedStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidPermissions\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidSignature\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidSnapshotOrdering\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotActivelyDelegated\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyAllocationManager\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyEigenPodManager\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyPauser\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyStrategyManagerOrEigenPodManager\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyUnpauser\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OperatorNotRegistered\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OperatorsCannotUndelegate\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SaltSpent\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SignatureExpired\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"WithdrawalDelayNotElapsed\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"WithdrawalNotQueued\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"WithdrawerNotCaller\",\"inputs\":[]}]", - Bin: "0x610180604052348015610010575f5ffd5b50604051615e0d380380615e0d83398101604081905261002f9161021c565b8186868684876001600160a01b03811661005c576040516339b190bb60e11b815260040160405180910390fd5b6001600160a01b0390811660805293841660a05291831660c05290911660e05263ffffffff16610100524661012052610125604080518082018252600a81526922b4b3b2b72630bcb2b960b11b60209182015281517f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a866818301527f71b625cfad44bac63b13dba07f2e1d6084ee04b6f8752101ece6126d584ee6ea81840152466060820152306080808301919091528351808303909101815260a0909101909252815191012090565b610140526001600160a01b03166101605261013e610149565b5050505050506102a7565b5f54610100900460ff16156101b45760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff90811614610203575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b0381168114610219575f5ffd5b50565b5f5f5f5f5f5f60c08789031215610231575f5ffd5b865161023c81610205565b602088015190965061024d81610205565b604088015190955061025e81610205565b606088015190945061026f81610205565b608088015190935061028081610205565b60a088015190925063ffffffff81168114610299575f5ffd5b809150509295509295509295565b60805160a05160c05160e05161010051610120516101405161016051615a7161039c5f395f818161042c01526132fa01525f61271601525f61265601525f818161070001528181611504015281816134f5015261383101525f818161075001528181610da901528181610f5a0152818161169f0152818161185e01528181611cb2015281816128eb01526133b101525f818161045301528181610ee0015281816117c501528181611a23015281816130e3015261363b01525f818161038901528181610eae01528181611977015261361501525f81816105ee01528181610b410152818161107a015261273a0152615a715ff3fe608060405234801561000f575f5ffd5b50600436106102cb575f3560e01c8063715018a61161017b578063bfae3fd2116100e4578063e4cc3f901161009e578063f2fde38b11610079578063f2fde38b146107de578063f698da25146107f1578063fabc1cbc146107f9578063fd8aa88d1461080c575f5ffd5b8063e4cc3f9014610798578063eea9064b146107ab578063f0e0e676146107be575f5ffd5b8063bfae3fd2146106e3578063c448feb8146106f6578063c978f7ac1461072a578063ca8aa7c71461074b578063cd6dc68714610772578063da8be86414610785575f5ffd5b80639104c319116101355780639104c319146106345780639435bb431461064f578063a178848414610662578063a33a343314610681578063b7f06ebe14610694578063bb45fef2146106b6575f5ffd5b8063715018a6146105a4578063778e55f3146105ac57806378296ec5146105d6578063886f1195146105e95780638da5cb5b146106105780639004134714610621575f5ffd5b806354b7c96c116102375780635dd68579116101f157806365da1264116101cc57806365da12641461053557806366d5ba931461055d5780636d70f7ae1461057e5780636e17444814610591575f5ffd5b80635dd68579146104ee578063601bb36f1461050f57806360a0d1ce14610522575f5ffd5b806354b7c96c14610475578063595c6a6714610488578063597b36da146104905780635ac86ab7146104a35780635c975abb146104c65780635d975e88146104ce575f5ffd5b806339b70e381161028857806339b70e38146103845780633c651cf2146103c35780633cdeb5e0146103d65780633e28391d146104045780634657e26a146104275780634665bcda1461044e575f5ffd5b806304a4f979146102cf5780630b9f487a146103095780630dd8dd021461031c578063136439dd1461033c57806325df922e146103515780632aa6d88814610371575b5f5ffd5b6102f67f14bde674c9f64b2ad00eaaee4a8bed1fabef35c7507e3c5b9cfc9436909a2dad81565b6040519081526020015b60405180910390f35b6102f661031736600461498e565b61081f565b61032f61032a366004614a25565b6108a7565b6040516103009190614a63565b61034f61034a366004614a9a565b610b2c565b005b61036461035f366004614c2f565b610c01565b6040516103009190614cdd565b61034f61037f366004614d3f565b610d61565b6103ab7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610300565b61034f6103d1366004614d9d565b610ea3565b6103ab6103e4366004614de0565b6001600160a01b039081165f908152609960205260409020600101541690565b610417610412366004614de0565b610fea565b6040519015158152602001610300565b6103ab7f000000000000000000000000000000000000000000000000000000000000000081565b6103ab7f000000000000000000000000000000000000000000000000000000000000000081565b61034f610483366004614dfb565b611009565b61034f611065565b6102f661049e366004614eee565b611114565b6104176104b1366004614f1f565b606654600160ff9092169190911b9081161490565b6066546102f6565b6104e16104dc366004614a9a565b611143565b6040516103009190614ff6565b6105016104fc366004614de0565b61125f565b604051610300929190615056565b61034f61051d3660046150d7565b611694565b61034f610530366004615130565b6117ba565b6103ab610543366004614de0565b609a6020525f90815260409020546001600160a01b031681565b61057061056b366004614de0565b61194f565b60405161030092919061516f565b61041761058c366004614de0565b611c4f565b6102f661059f366004614dfb565b611c87565b61034f611d31565b6102f66105ba366004614dfb565b609860209081525f928352604080842090915290825290205481565b61034f6105e4366004615193565b611d42565b6103ab7f000000000000000000000000000000000000000000000000000000000000000081565b6033546001600160a01b03166103ab565b61036461062f3660046151e3565b611dca565b6103ab73beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac081565b61034f61065d36600461522f565b611ea0565b6102f6610670366004614de0565b609f6020525f908152604090205481565b61032f61068f3660046152cb565b611f70565b6104176106a2366004614a9a565b609e6020525f908152604090205460ff1681565b6104176106c43660046153b2565b609c60209081525f928352604080842090915290825290205460ff1681565b6102f66106f1366004614dfb565b611f88565b60405163ffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152602001610300565b61073d6107383660046151e3565b611fc4565b6040516103009291906153dc565b6103ab7f000000000000000000000000000000000000000000000000000000000000000081565b61034f6107803660046153b2565b612251565b61032f610793366004614de0565b61236c565b61034f6107a63660046153fb565b61247c565b61034f6107b93660046152cb565b6124d2565b6107d16107cc36600461546e565b612535565b604051610300919061551b565b61034f6107ec366004614de0565b6125da565b6102f6612653565b61034f610807366004614a9a565b612738565b61032f61081a366004614de0565b61284f565b604080517f14bde674c9f64b2ad00eaaee4a8bed1fabef35c7507e3c5b9cfc9436909a2dad60208201526001600160a01b03808616928201929092528187166060820152908516608082015260a0810183905260c081018290525f9061089d9060e00160405160208183030381529060405280519060200120612872565b9695505050505050565b6066546060906001906002908116036108d35760405163840a48d560e01b815260040160405180910390fd5b5f836001600160401b038111156108ec576108ec614ab1565b604051908082528060200260200182016040528015610915578160200160208202803683370190505b50335f908152609a60205260408120549192506001600160a01b03909116905b85811015610b215786868281811061094f5761094f61552d565b90506020028101906109619190615541565b61096f90602081019061555f565b90508787838181106109835761098361552d565b90506020028101906109959190615541565b61099f908061555f565b9050146109bf576040516343714afd60e01b815260040160405180910390fd5b5f610a2933848a8a868181106109d7576109d761552d565b90506020028101906109e99190615541565b6109f3908061555f565b808060200260200160405190810160405280939291908181526020018383602002808284375f920191909152506128a092505050565b9050610afb33848a8a86818110610a4257610a4261552d565b9050602002810190610a549190615541565b610a5e908061555f565b808060200260200160405190810160405280939291908181526020018383602002808284375f920191909152508e92508d9150889050818110610aa357610aa361552d565b9050602002810190610ab59190615541565b610ac390602081019061555f565b808060200260200160405190810160405280939291908181526020018383602002808284375f920191909152508892506129e7915050565b848381518110610b0d57610b0d61552d565b602090810291909101015250600101610935565b509095945050505050565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa158015610b8e573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610bb291906155a4565b610bcf57604051631d77d47760e21b815260040160405180910390fd5b6066548181168114610bf45760405163c61dca5d60e01b815260040160405180910390fd5b610bfd82612edc565b5050565b6001600160a01b038084165f908152609a60205260408120546060921690610c2a8683876128a0565b90505f85516001600160401b03811115610c4657610c46614ab1565b604051908082528060200260200182016040528015610c6f578160200160208202803683370190505b5090505f5b8651811015610d54576001600160a01b0388165f90815260a260205260408120885182908a9085908110610caa57610caa61552d565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020015f206040518060200160405290815f820154815250509050610d2e878381518110610cfc57610cfc61552d565b6020026020010151858481518110610d1657610d1661552d565b602002602001015183612f199092919063ffffffff16565b838381518110610d4057610d4061552d565b602090810291909101015250600101610c74565b50925050505b9392505050565b610d6a33610fea565b15610d8857604051633bf2b50360e11b815260040160405180910390fd5b604051632b6241f360e11b815233600482015263ffffffff841660248201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906356c483e6906044015f604051808303815f87803b158015610df2575f5ffd5b505af1158015610e04573d5f5f3e3d5ffd5b50505050610e123385612f37565b610e1c3333612f99565b6040516001600160a01b038516815233907fa453db612af59e5521d6ab9284dc3e2d06af286eb1b1b7b771fce4716c19f2c19060200160405180910390a2336001600160a01b03167f02a919ed0e2acad1dd90f17ef2fa4ae5462ee1339170034a8531cca4b67080908383604051610e959291906155bf565b60405180910390a250505050565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161480610f025750336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016145b610f1f5760405163045206a560e21b815260040160405180910390fd5b6001600160a01b038481165f908152609a602052604080822054905163152667d960e31b8152908316600482018190528684166024830152927f0000000000000000000000000000000000000000000000000000000000000000169063a9333ec890604401602060405180830381865afa158015610f9f573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610fc391906155ed565b90505f610fd187878461309c565b9050610fe183888888888661317e565b50505050505050565b6001600160a01b039081165f908152609a602052604090205416151590565b81611013816132bc565b6110305760405163932d94f760e01b815260040160405180910390fd5b61103983611c4f565b611056576040516325ec6c1f60e01b815260040160405180910390fd5b6110608383612f37565b505050565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa1580156110c7573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110eb91906155a4565b61110857604051631d77d47760e21b815260040160405180910390fd5b6111125f19612edc565b565b5f816040516020016111269190614ff6565b604051602081830303815290604052805190602001209050919050565b61114b61484a565b5f82815260a46020908152604091829020825160e08101845281546001600160a01b03908116825260018301548116828501526002830154168185015260038201546060820152600482015463ffffffff1660808201526005820180548551818602810186019096528086529194929360a086019392908301828280156111f957602002820191905f5260205f20905b81546001600160a01b031681526001909101906020018083116111db575b505050505081526020016006820180548060200260200160405190810160405280929190818152602001828054801561124f57602002820191905f5260205f20905b81548152602001906001019080831161123b575b5050505050815250509050919050565b6060805f61126c8461284f565b8051909150806001600160401b0381111561128957611289614ab1565b6040519080825280602002602001820160405280156112c257816020015b6112af61484a565b8152602001906001900390816112a75790505b509350806001600160401b038111156112dd576112dd614ab1565b60405190808252806020026020018201604052801561131057816020015b60608152602001906001900390816112fb5790505b506001600160a01b038087165f908152609a60205260408120549295509116905b8281101561168b5760a45f85838151811061134e5761134e61552d565b60209081029190910181015182528181019290925260409081015f20815160e08101835281546001600160a01b03908116825260018301548116828601526002830154168184015260038201546060820152600482015463ffffffff1660808201526005820180548451818702810187019095528085529194929360a086019390929083018282801561140857602002820191905f5260205f20905b81546001600160a01b031681526001909101906020018083116113ea575b505050505081526020016006820180548060200260200160405190810160405280929190818152602001828054801561145e57602002820191905f5260205f20905b81548152602001906001019080831161144a575b5050505050815250508682815181106114795761147961552d565b60200260200101819052508581815181106114965761149661552d565b602002602001015160a00151516001600160401b038111156114ba576114ba614ab1565b6040519080825280602002602001820160405280156114e3578160200160208202803683370190505b508582815181106114f6576114f661552d565b60200260200101819052505f7f00000000000000000000000000000000000000000000000000000000000000008783815181106115355761153561552d565b60200260200101516080015161154b919061561c565b905060604363ffffffff168263ffffffff1610156115935761158c89858a868151811061157a5761157a61552d565b602002602001015160a0015185613366565b90506115be565b6115bb89858a86815181106115aa576115aa61552d565b602002602001015160a001516128a0565b90505b5f5b8884815181106115d2576115d261552d565b602002602001015160a001515181101561167d5761163f8985815181106115fb576115fb61552d565b602002602001015160c0015182815181106116185761161861552d565b60200260200101518383815181106116325761163261552d565b6020026020010151613494565b8885815181106116515761165161552d565b6020026020010151828151811061166a5761166a61552d565b60209081029190910101526001016115c0565b505050806001019050611331565b50505050915091565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146116dd576040516323d871a560e01b815260040160405180910390fd5b6001600160a01b038085165f90815260986020908152604080832093871683529290529081205461171b906001600160401b0380861690851661349f565b90505f61172a868686866134b7565b90505f6117378284615638565b9050611745875f8886613574565b5f61174f876135ee565b60405163debe1eab60e01b81526001600160a01b038981166004830152602482018590529192509082169063debe1eab906044015f604051808303815f87803b15801561179a575f5ffd5b505af11580156117ac573d5f5f3e3d5ffd5b505050505050505050505050565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461180357604051633213a66160e21b815260040160405180910390fd5b61180c83610fea565b15611060576001600160a01b038381165f908152609a602052604080822054905163152667d960e31b81529083166004820181905273beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac06024830152927f0000000000000000000000000000000000000000000000000000000000000000169063a9333ec890604401602060405180830381865afa1580156118a3573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906118c791906155ed565b6001600160a01b0386165f90815260a26020908152604080832073beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac084528252808320815192830190915254815291925061192d866119256001600160401b03808716908916613660565b849190613674565b9050610fe1848873beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac084613574565b6040516394f649dd60e01b81526001600160a01b03828116600483015260609182915f9182917f000000000000000000000000000000000000000000000000000000000000000016906394f649dd906024015f60405180830381865afa1580156119bb573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526119e291908101906156a6565b60405163fe243a1760e01b81526001600160a01b03888116600483015273beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac060248301529294509092505f917f0000000000000000000000000000000000000000000000000000000000000000169063fe243a1790604401602060405180830381865afa158015611a68573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a8c9190615761565b9050805f03611aa057509094909350915050565b5f83516001611aaf9190615638565b6001600160401b03811115611ac657611ac6614ab1565b604051908082528060200260200182016040528015611aef578160200160208202803683370190505b5090505f84516001611b019190615638565b6001600160401b03811115611b1857611b18614ab1565b604051908082528060200260200182016040528015611b41578160200160208202803683370190505b50905073beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac082865181518110611b6c57611b6c61552d565b60200260200101906001600160a01b031690816001600160a01b0316815250508281865181518110611ba057611ba061552d565b60209081029190910101525f5b8551811015611c4157858181518110611bc857611bc861552d565b6020026020010151838281518110611be257611be261552d565b60200260200101906001600160a01b031690816001600160a01b031681525050848181518110611c1457611c1461552d565b6020026020010151828281518110611c2e57611c2e61552d565b6020908102919091010152600101611bad565b509097909650945050505050565b5f6001600160a01b03821615801590611c8157506001600160a01b038083165f818152609a6020526040902054909116145b92915050565b60405163152667d960e31b81526001600160a01b03838116600483015282811660248301525f9182917f0000000000000000000000000000000000000000000000000000000000000000169063a9333ec890604401602060405180830381865afa158015611cf7573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611d1b91906155ed565b9050611d298484835f6134b7565b949350505050565b611d39613692565b6111125f6136ec565b82611d4c816132bc565b611d695760405163932d94f760e01b815260040160405180910390fd5b611d7284611c4f565b611d8f576040516325ec6c1f60e01b815260040160405180910390fd5b836001600160a01b03167f02a919ed0e2acad1dd90f17ef2fa4ae5462ee1339170034a8531cca4b67080908484604051610e959291906155bf565b60605f82516001600160401b03811115611de657611de6614ab1565b604051908082528060200260200182016040528015611e0f578160200160208202803683370190505b5090505f5b8351811015611e98576001600160a01b0385165f9081526098602052604081208551909190869084908110611e4b57611e4b61552d565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020015f2054828281518110611e8557611e8561552d565b6020908102919091010152600101611e14565b509392505050565b606654600290600490811603611ec95760405163840a48d560e01b815260040160405180910390fd5b611ed161373d565b855f5b81811015611f6457611f5c898983818110611ef157611ef161552d565b9050602002810190611f039190615778565b611f0c9061578c565b888884818110611f1e57611f1e61552d565b9050602002810190611f30919061555f565b888886818110611f4257611f4261552d565b9050602002016020810190611f579190615797565b613796565b600101611ed4565b5050610fe1600160c955565b6060611f7b3361236c565b9050610d5a8484846124d2565b6001600160a01b038083165f90815260a260209081526040808320938516835292815282822083519182019093529154825290610d5a90613c0f565b60608082516001600160401b03811115611fe057611fe0614ab1565b604051908082528060200260200182016040528015612009578160200160208202803683370190505b50915082516001600160401b0381111561202557612025614ab1565b60405190808252806020026020018201604052801561204e578160200160208202803683370190505b506001600160a01b038086165f908152609a60205260408120549293509116906120798683876128a0565b90505f5b8551811015612246575f6120a987838151811061209c5761209c61552d565b60200260200101516135ee565b9050806001600160a01b031663fe243a17898985815181106120cd576120cd61552d565b60200260200101516040518363ffffffff1660e01b81526004016121079291906001600160a01b0392831681529116602082015260400190565b602060405180830381865afa158015612122573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906121469190615761565b8583815181106121585761215861552d565b6020026020010181815250505f60a25f8a6001600160a01b03166001600160a01b031681526020019081526020015f205f89858151811061219b5761219b61552d565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020015f206040518060200160405290815f82015481525050905061221f8684815181106121ed576121ed61552d565b60200260200101518585815181106122075761220761552d565b6020026020010151836136749092919063ffffffff16565b8784815181106122315761223161552d565b6020908102919091010152505060010161207d565b5050505b9250929050565b5f54610100900460ff161580801561226f57505f54600160ff909116105b806122885750303b15801561228857505f5460ff166001145b6122f05760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b5f805460ff191660011790558015612311575f805461ff0019166101001790555b61231a82612edc565b612323836136ec565b8015611060575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a1505050565b606061237782610fea565b6123945760405163a5c7c44560e01b815260040160405180910390fd5b61239d82611c4f565b156123bb576040516311ca333560e31b815260040160405180910390fd5b336001600160a01b03831614612473576001600160a01b038083165f908152609a6020526040902054166123ee816132bc565b8061241457506001600160a01b038181165f908152609960205260409020600101541633145b61243157604051631e499a2360e11b815260040160405180910390fd5b806001600160a01b0316836001600160a01b03167ff0eddf07e6ea14f388b47e1e94a0f464ecbd9eed4171130e0fc0e99fb4030a8a60405160405180910390a3505b611c8182613c2e565b6066546002906004908116036124a55760405163840a48d560e01b815260040160405180910390fd5b6124ad61373d565b6124c16124b98661578c565b858585613796565b6124cb600160c955565b5050505050565b6124db33610fea565b156124f957604051633bf2b50360e11b815260040160405180910390fd5b61250283611c4f565b61251f576040516325ec6c1f60e01b815260040160405180910390fd5b61252b33848484613e8d565b6110603384612f99565b60605f83516001600160401b0381111561255157612551614ab1565b60405190808252806020026020018201604052801561258457816020015b606081526020019060019003908161256f5790505b5090505f5b8451811015611e98576125b58582815181106125a7576125a761552d565b602002602001015185611dca565b8282815181106125c7576125c761552d565b6020908102919091010152600101612589565b6125e2613692565b6001600160a01b0381166126475760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016122e7565b612650816136ec565b50565b5f7f000000000000000000000000000000000000000000000000000000000000000046146127135750604080518082018252600a81526922b4b3b2b72630bcb2b960b11b60209182015281517f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a866818301527f71b625cfad44bac63b13dba07f2e1d6084ee04b6f8752101ece6126d584ee6ea81840152466060820152306080808301919091528351808303909101815260a0909101909252815191012090565b507f000000000000000000000000000000000000000000000000000000000000000090565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612794573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906127b891906157b2565b6001600160a01b0316336001600160a01b0316146127e95760405163794821ff60e01b815260040160405180910390fd5b606654801982198116146128105760405163c61dca5d60e01b815260040160405180910390fd5b606682905560405182815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c906020015b60405180910390a25050565b6001600160a01b0381165f90815260a360205260409020606090611c8190613f52565b5f61287b612653565b60405161190160f01b6020820152602281019190915260428101839052606201611126565b60605f82516001600160401b038111156128bc576128bc614ab1565b6040519080825280602002602001820160405280156128e5578160200160208202803683370190505b5090505f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663547afb8786866040518363ffffffff1660e01b81526004016129379291906157cd565b5f60405180830381865afa158015612951573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261297891908101906157f0565b90505f5b8451811015610b21576129c28786838151811061299b5761299b61552d565b60200260200101518484815181106129b5576129b561552d565b602002602001015161309c565b8382815181106129d4576129d461552d565b602090810291909101015260010161297c565b5f6001600160a01b038616612a0f576040516339b190bb60e11b815260040160405180910390fd5b83515f03612a305760405163796cc52560e01b815260040160405180910390fd5b5f84516001600160401b03811115612a4a57612a4a614ab1565b604051908082528060200260200182016040528015612a73578160200160208202803683370190505b5090505f85516001600160401b03811115612a9057612a90614ab1565b604051908082528060200260200182016040528015612ab9578160200160208202803683370190505b5090505f5b8651811015612d0f575f612add88838151811061209c5761209c61552d565b90505f60a25f8c6001600160a01b03166001600160a01b031681526020019081526020015f205f8a8581518110612b1657612b1661552d565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020015f206040518060200160405290815f820154815250509050612b82888481518110612b6857612b6861552d565b60200260200101518885815181106122075761220761552d565b848481518110612b9457612b9461552d565b602002602001018181525050612bcc888481518110612bb557612bb561552d565b602002602001015182613f5e90919063ffffffff16565b858481518110612bde57612bde61552d565b60209081029190910101526001600160a01b038a1615612c7357612c358a8a8581518110612c0e57612c0e61552d565b6020026020010151878681518110612c2857612c2861552d565b6020026020010151613f72565b612c738a8c8b8681518110612c4c57612c4c61552d565b6020026020010151878781518110612c6657612c6661552d565b6020026020010151613574565b816001600160a01b031663724af4238c8b8681518110612c9557612c9561552d565b60200260200101518b8781518110612caf57612caf61552d565b60200260200101516040518463ffffffff1660e01b8152600401612cd59392919061587f565b5f604051808303815f87803b158015612cec575f5ffd5b505af1158015612cfe573d5f5f3e3d5ffd5b505050505050806001019050612abe565b506001600160a01b0388165f908152609f60205260408120805491829190612d36836158a3565b91905055505f6040518060e001604052808b6001600160a01b031681526020018a6001600160a01b031681526020018b6001600160a01b031681526020018381526020014363ffffffff1681526020018981526020018581525090505f612d9c82611114565b5f818152609e602090815260408083208054600160ff19909116811790915560a4835292819020865181546001600160a01b03199081166001600160a01b039283161783558885015195830180548216968316969096179095559187015160028201805490951692169190911790925560608501516003830155608085015160048301805463ffffffff191663ffffffff90921691909117905560a085015180519394508593612e5292600585019201906148a3565b5060c08201518051612e6e916006840191602090910190614906565b5050506001600160a01b038b165f90815260a360205260409020612e929082614000565b507f26b2aae26516e8719ef50ea2f6831a2efbd4e37dccdf0f6936b27bc08e793e30818386604051612ec6939291906158bb565b60405180910390a19a9950505050505050505050565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a250565b5f611d2982612f31612f2a87613c0f565b869061400b565b9061400b565b6001600160a01b038281165f8181526099602090815260409182902060010180546001600160a01b0319169486169485179055905192835290917f773b54c04d756fcc5e678111f7d730de3be98192000799eee3d63716055a87c69101612843565b6066545f90600190811603612fc15760405163840a48d560e01b815260040160405180910390fd5b6001600160a01b038381165f818152609a602052604080822080546001600160a01b0319169487169485179055517fc3ee9f2e5fda98e8066a1f745b2df9285f416fe98cf2559cd21484b3d87433049190a35f5f61301e8561194f565b915091505f61302e8686856128a0565b90505f5b8351811015610fe15761309486888684815181106130525761305261552d565b60200260200101515f87868151811061306d5761306d61552d565b60200260200101518787815181106130875761308761552d565b602002602001015161317e565b600101613032565b5f73beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeabf196001600160a01b0384160161316e5760405163a3d75e0960e01b81526001600160a01b0385811660048301525f917f00000000000000000000000000000000000000000000000000000000000000009091169063a3d75e0990602401602060405180830381865afa15801561312a573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061314e91906155ed565b90506131666001600160401b03848116908316613660565b915050610d5a565b506001600160401b031692915050565b805f0361319e57604051630a33bc6960e21b815260040160405180910390fd5b6001600160a01b038086165f90815260a2602090815260408083209388168352929052206131ce8185858561401f565b6040805160208101909152815481527f8be932bac54561f27260f95463d9b8ab37e06b2842e5ee2404157cc13df6eb8f908790879061320c90613c0f565b60405161321b9392919061587f565b60405180910390a161322c86610fea565b15610fe1576001600160a01b038088165f90815260986020908152604080832093891683529290529081208054859290613267908490615638565b92505081905550866001600160a01b03167f1ec042c965e2edd7107b51188ee0f383e22e76179041ab3a9d18ff151405166c8787866040516132ab9392919061587f565b60405180910390a250505050505050565b604051631beb2b9760e31b81526001600160a01b0382811660048301523360248301523060448301525f80356001600160e01b0319166064840152917f00000000000000000000000000000000000000000000000000000000000000009091169063df595cb8906084016020604051808303815f875af1158015613342573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611c8191906155a4565b60605f83516001600160401b0381111561338257613382614ab1565b6040519080825280602002602001820160405280156133ab578160200160208202803683370190505b5090505f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166394d7d00c8787876040518463ffffffff1660e01b81526004016133ff939291906158e5565b5f60405180830381865afa158015613419573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261344091908101906157f0565b90505f5b8551811015613488576134638887838151811061299b5761299b61552d565b8382815181106134755761347561552d565b6020908102919091010152600101613444565b50909695505050505050565b5f610d5a8383613660565b5f6134ad848385600161408e565b611d29908561591e565b6001600160a01b038085165f90815260a560209081526040808320938716835292905290812081906134e8906140e9565b90505f61354e600161351a7f000000000000000000000000000000000000000000000000000000000000000043615931565b6135249190615931565b6001600160a01b03808a165f90815260a560209081526040808320938c1683529290522090614103565b90505f61355b828461591e565b905061356881878761411f565b98975050505050505050565b6001600160a01b038085165f908152609860209081526040808320938616835292905290812080548392906135aa90849061591e565b92505081905550836001600160a01b03167f6909600037b75d7b4733aedd815442b5ec018a827751c832aaff64eba5d6d2dd848484604051610e959392919061587f565b5f6001600160a01b03821673beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac014613639577f0000000000000000000000000000000000000000000000000000000000000000611c81565b7f000000000000000000000000000000000000000000000000000000000000000092915050565b5f610d5a8383670de0b6b3a764000061413d565b5f611d298261368c61368587613c0f565b8690613660565b90613660565b6033546001600160a01b031633146111125760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016122e7565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b600260c9540361378f5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016122e7565b600260c955565b60a08401515182146137bb576040516343714afd60e01b815260040160405180910390fd5b83604001516001600160a01b0316336001600160a01b0316146137f1576040516316110d3560e21b815260040160405180910390fd5b5f6137fb85611114565b5f818152609e602052604090205490915060ff1661382c576040516387c9d21960e01b815260040160405180910390fd5b60605f7f0000000000000000000000000000000000000000000000000000000000000000876080015161385f919061561c565b90508063ffffffff164363ffffffff161161388d576040516378f67ae160e11b815260040160405180910390fd5b6138a4875f015188602001518960a0015184613366565b87516001600160a01b03165f90815260a3602052604090209092506138ca915083614222565b505f82815260a46020526040812080546001600160a01b031990811682556001820180548216905560028201805490911690556003810182905560048101805463ffffffff1916905590613921600583018261493f565b61392e600683015f61493f565b50505f828152609e602052604090819020805460ff19169055517f1f40400889274ed07b24845e5054a87a0cab969eb1277aafe61ae352e7c32a00906139779084815260200190565b60405180910390a185516001600160a01b039081165f908152609a6020526040812054885160a08a015191909316926139b19184906128a0565b90505f5b8860a0015151811015613c04575f6139dc8a60a00151838151811061209c5761209c61552d565b90505f613a128b60c0015184815181106139f8576139f861552d565b60200260200101518785815181106116325761163261552d565b90508715613ae257816001600160a01b0316632eae418c8c5f01518d60a001518681518110613a4357613a4361552d565b60200260200101518d8d88818110613a5d57613a5d61552d565b9050602002016020810190613a729190614de0565b60405160e085901b6001600160e01b03191681526001600160a01b03938416600482015291831660248301529091166044820152606481018490526084015f604051808303815f87803b158015613ac7575f5ffd5b505af1158015613ad9573d5f5f3e3d5ffd5b50505050613bfa565b5f5f836001600160a01b031663c4623ea18e5f01518f60a001518881518110613b0d57613b0d61552d565b60200260200101518f8f8a818110613b2757613b2761552d565b9050602002016020810190613b3c9190614de0565b60405160e085901b6001600160e01b03191681526001600160a01b039384166004820152918316602483015290911660448201526064810186905260840160408051808303815f875af1158015613b95573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613bb9919061594d565b91509150613bf7878e5f01518f60a001518881518110613bdb57613bdb61552d565b602002602001015185858b8b815181106130875761308761552d565b50505b50506001016139b5565b505050505050505050565b80515f9015613c1f578151611c81565b670de0b6b3a764000092915050565b606654606090600190600290811603613c5a5760405163840a48d560e01b815260040160405180910390fd5b6001600160a01b038084165f818152609a602052604080822080546001600160a01b0319811690915590519316928392917ffee30966a256b71e14bc0ebfc94315e28ef4a97a7131a9e2b7a310a73af4467691a35f5f613cb98661194f565b9150915081515f03613ccd57505050613e87565b81516001600160401b03811115613ce657613ce6614ab1565b604051908082528060200260200182016040528015613d0f578160200160208202803683370190505b5094505f613d1e8785856128a0565b90505f5b8351811015613e81576040805160018082528183019092525f916020808301908036833750506040805160018082528183019092529293505f9291506020808301908036833750506040805160018082528183019092529293505f92915060208083019080368337019050509050868481518110613da257613da261552d565b6020026020010151835f81518110613dbc57613dbc61552d565b60200260200101906001600160a01b031690816001600160a01b031681525050858481518110613dee57613dee61552d565b6020026020010151825f81518110613e0857613e0861552d565b602002602001018181525050848481518110613e2657613e2661552d565b6020026020010151815f81518110613e4057613e4061552d565b602002602001018181525050613e598b898585856129e7565b8a8581518110613e6b57613e6b61552d565b6020908102919091010152505050600101613d22565b50505050505b50919050565b6001600160a01b038084165f908152609960205260409020600101541680613eb55750613f4c565b6001600160a01b0381165f908152609c6020908152604080832085845290915290205460ff1615613ef957604051630d4c4c9160e21b815260040160405180910390fd5b6001600160a01b0381165f908152609c602090815260408083208584528252909120805460ff191660011790558301516124cb908290613f4090889088908490889061081f565b8551602087015161422d565b50505050565b60605f610d5a8361427f565b5f610d5a613f6b84613c0f565b8390613660565b6001600160a01b03821673beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac014611060576001600160a01b038084165f90815260a5602090815260408083209386168352929052908120613fc5906140e9565b9050613f4c43613fd58484615638565b6001600160a01b038088165f90815260a560209081526040808320938a1683529290522091906142d8565b5f610d5a83836142e3565b5f610d5a83670de0b6b3a76400008461413d565b825f0361403f57614038670de0b6b3a76400008261400b565b8455613f4c565b6040805160208101909152845481525f9061405b908584613674565b90505f6140688483615638565b90505f61408384612f3161407c888a615638565b859061400b565b875550505050505050565b5f5f61409b86868661413d565b905060018360028111156140b1576140b161596f565b1480156140cd57505f84806140c8576140c8615983565b868809115b156140e0576140dd600182615638565b90505b95945050505050565b5f6140f4828261432f565b6001600160e01b031692915050565b5f61410f838383614374565b6001600160e01b03169392505050565b5f611d2961412d8385615997565b85906001600160401b0316613660565b5f80805f19858709858702925082811083820303915050805f036141745783828161416a5761416a615983565b0492505050610d5a565b8084116141bb5760405162461bcd60e51b81526020600482015260156024820152744d6174683a206d756c446976206f766572666c6f7760581b60448201526064016122e7565b5f8486880960026001871981018816978890046003810283188082028403028082028403028082028403028082028403028082028403029081029092039091025f889003889004909101858311909403939093029303949094049190911702949350505050565b5f610d5a83836143bd565b4281101561424e57604051630819bdcd60e01b815260040160405180910390fd5b6142626001600160a01b03851684846144a0565b613f4c57604051638baa579f60e01b815260040160405180910390fd5b6060815f018054806020026020016040519081016040528092919081815260200182805480156142cc57602002820191905f5260205f20905b8154815260200190600101908083116142b8575b50505050509050919050565b6110608383836144f4565b5f81815260018301602052604081205461432857508154600181810184555f848152602080822090930184905584548482528286019093526040902091909155611c81565b505f611c81565b81545f90801561436c576143558461434860018461591e565b5f91825260209091200190565b5464010000000090046001600160e01b0316611d29565b509092915050565b82545f9081614385868683856145fa565b905080156143b35761439c8661434860018461591e565b5464010000000090046001600160e01b031661089d565b5091949350505050565b5f8181526001830160205260408120548015614497575f6143df60018361591e565b85549091505f906143f29060019061591e565b9050818114614451575f865f0182815481106144105761441061552d565b905f5260205f200154905080875f0184815481106144305761443061552d565b5f918252602080832090910192909255918252600188019052604090208390555b8554869080614462576144626159b6565b600190038181905f5260205f20015f90559055856001015f8681526020019081526020015f205f905560019350505050611c81565b5f915050611c81565b5f5f5f6144ad858561464d565b90925090505f8160048111156144c5576144c561596f565b1480156144e35750856001600160a01b0316826001600160a01b0316145b8061089d575061089d86868661468c565b825480156145ac575f61450c8561434860018561591e565b60408051808201909152905463ffffffff8082168084526401000000009092046001600160e01b03166020840152919250908516101561455f5760405163151b8e3f60e11b815260040160405180910390fd5b805163ffffffff8086169116036145aa57826145808661434860018661591e565b80546001600160e01b03929092166401000000000263ffffffff9092169190911790555050505050565b505b506040805180820190915263ffffffff92831681526001600160e01b03918216602080830191825285546001810187555f968752952091519051909216640100000000029190921617910155565b5f5b81831015611e98575f61460f8484614773565b5f8781526020902090915063ffffffff86169082015463ffffffff16111561463957809250614647565b614644816001615638565b93505b506145fc565b5f5f8251604103614681576020830151604084015160608501515f1a6146758782858561478d565b9450945050505061224a565b505f9050600261224a565b5f5f5f856001600160a01b0316631626ba7e60e01b86866040516024016146b49291906159ca565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b03199094169390931790925290516146f29190615a06565b5f60405180830381855afa9150503d805f811461472a576040519150601f19603f3d011682016040523d82523d5f602084013e61472f565b606091505b509150915081801561474357506020815110155b801561089d57508051630b135d3f60e11b906147689083016020908101908401615761565b149695505050505050565b5f6147816002848418615a1c565b610d5a90848416615638565b5f807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08311156147c257505f90506003614841565b604080515f8082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015614813573d5f5f3e3d5ffd5b5050604051601f1901519150506001600160a01b03811661483b575f60019250925050614841565b91505f90505b94509492505050565b6040518060e001604052805f6001600160a01b031681526020015f6001600160a01b031681526020015f6001600160a01b031681526020015f81526020015f63ffffffff16815260200160608152602001606081525090565b828054828255905f5260205f209081019282156148f6579160200282015b828111156148f657825182546001600160a01b0319166001600160a01b039091161782556020909201916001909101906148c1565b50614902929150614956565b5090565b828054828255905f5260205f209081019282156148f6579160200282015b828111156148f6578251825591602001919060010190614924565b5080545f8255905f5260205f209081019061265091905b5b80821115614902575f8155600101614957565b6001600160a01b0381168114612650575f5ffd5b80356149898161496a565b919050565b5f5f5f5f5f60a086880312156149a2575f5ffd5b85356149ad8161496a565b945060208601356149bd8161496a565b935060408601356149cd8161496a565b94979396509394606081013594506080013592915050565b5f5f83601f8401126149f5575f5ffd5b5081356001600160401b03811115614a0b575f5ffd5b6020830191508360208260051b850101111561224a575f5ffd5b5f5f60208385031215614a36575f5ffd5b82356001600160401b03811115614a4b575f5ffd5b614a57858286016149e5565b90969095509350505050565b602080825282518282018190525f918401906040840190835b81811015610b21578351835260209384019390920191600101614a7c565b5f60208284031215614aaa575f5ffd5b5035919050565b634e487b7160e01b5f52604160045260245ffd5b60405160e081016001600160401b0381118282101715614ae757614ae7614ab1565b60405290565b604080519081016001600160401b0381118282101715614ae757614ae7614ab1565b604051601f8201601f191681016001600160401b0381118282101715614b3757614b37614ab1565b604052919050565b5f6001600160401b03821115614b5757614b57614ab1565b5060051b60200190565b5f82601f830112614b70575f5ffd5b8135614b83614b7e82614b3f565b614b0f565b8082825260208201915060208360051b860101925085831115614ba4575f5ffd5b602085015b83811015614bca578035614bbc8161496a565b835260209283019201614ba9565b5095945050505050565b5f82601f830112614be3575f5ffd5b8135614bf1614b7e82614b3f565b8082825260208201915060208360051b860101925085831115614c12575f5ffd5b602085015b83811015614bca578035835260209283019201614c17565b5f5f5f60608486031215614c41575f5ffd5b8335614c4c8161496a565b925060208401356001600160401b03811115614c66575f5ffd5b614c7286828701614b61565b92505060408401356001600160401b03811115614c8d575f5ffd5b614c9986828701614bd4565b9150509250925092565b5f8151808452602084019350602083015f5b82811015614cd3578151865260209586019590910190600101614cb5565b5093949350505050565b602081525f610d5a6020830184614ca3565b803563ffffffff81168114614989575f5ffd5b5f5f83601f840112614d12575f5ffd5b5081356001600160401b03811115614d28575f5ffd5b60208301915083602082850101111561224a575f5ffd5b5f5f5f5f60608587031215614d52575f5ffd5b8435614d5d8161496a565b9350614d6b60208601614cef565b925060408501356001600160401b03811115614d85575f5ffd5b614d9187828801614d02565b95989497509550505050565b5f5f5f5f60808587031215614db0575f5ffd5b8435614dbb8161496a565b93506020850135614dcb8161496a565b93969395505050506040820135916060013590565b5f60208284031215614df0575f5ffd5b8135610d5a8161496a565b5f5f60408385031215614e0c575f5ffd5b8235614e178161496a565b91506020830135614e278161496a565b809150509250929050565b5f60e08284031215614e42575f5ffd5b614e4a614ac5565b9050614e558261497e565b8152614e636020830161497e565b6020820152614e746040830161497e565b604082015260608281013590820152614e8f60808301614cef565b608082015260a08201356001600160401b03811115614eac575f5ffd5b614eb884828501614b61565b60a08301525060c08201356001600160401b03811115614ed6575f5ffd5b614ee284828501614bd4565b60c08301525092915050565b5f60208284031215614efe575f5ffd5b81356001600160401b03811115614f13575f5ffd5b611d2984828501614e32565b5f60208284031215614f2f575f5ffd5b813560ff81168114610d5a575f5ffd5b5f8151808452602084019350602083015f5b82811015614cd35781516001600160a01b0316865260209586019590910190600101614f51565b80516001600160a01b03908116835260208083015182169084015260408083015190911690830152606080820151908301526080808201515f91614fc39085018263ffffffff169052565b5060a082015160e060a0850152614fdd60e0850182614f3f565b905060c083015184820360c08601526140e08282614ca3565b602081525f610d5a6020830184614f78565b5f82825180855260208501945060208160051b830101602085015f5b8381101561348857601f19858403018852615040838351614ca3565b6020988901989093509190910190600101615024565b5f604082016040835280855180835260608501915060608160051b8601019250602087015f5b828110156150ad57605f19878603018452615098858351614f78565b9450602093840193919091019060010161507c565b5050505082810360208401526140e08185615008565b6001600160401b0381168114612650575f5ffd5b5f5f5f5f608085870312156150ea575f5ffd5b84356150f58161496a565b935060208501356151058161496a565b92506040850135615115816150c3565b91506060850135615125816150c3565b939692955090935050565b5f5f5f60608486031215615142575f5ffd5b833561514d8161496a565b9250602084013591506040840135615164816150c3565b809150509250925092565b604081525f6151816040830185614f3f565b82810360208401526140e08185614ca3565b5f5f5f604084860312156151a5575f5ffd5b83356151b08161496a565b925060208401356001600160401b038111156151ca575f5ffd5b6151d686828701614d02565b9497909650939450505050565b5f5f604083850312156151f4575f5ffd5b82356151ff8161496a565b915060208301356001600160401b03811115615219575f5ffd5b61522585828601614b61565b9150509250929050565b5f5f5f5f5f5f60608789031215615244575f5ffd5b86356001600160401b03811115615259575f5ffd5b61526589828a016149e5565b90975095505060208701356001600160401b03811115615283575f5ffd5b61528f89828a016149e5565b90955093505060408701356001600160401b038111156152ad575f5ffd5b6152b989828a016149e5565b979a9699509497509295939492505050565b5f5f5f606084860312156152dd575f5ffd5b83356152e88161496a565b925060208401356001600160401b03811115615302575f5ffd5b840160408187031215615313575f5ffd5b61531b614aed565b81356001600160401b03811115615330575f5ffd5b8201601f81018813615340575f5ffd5b80356001600160401b0381111561535957615359614ab1565b61536c601f8201601f1916602001614b0f565b818152896020838501011115615380575f5ffd5b816020840160208301375f60209282018301528352928301359282019290925293969395505050506040919091013590565b5f5f604083850312156153c3575f5ffd5b82356153ce8161496a565b946020939093013593505050565b604081525f6151816040830185614ca3565b8015158114612650575f5ffd5b5f5f5f5f6060858703121561540e575f5ffd5b84356001600160401b03811115615423575f5ffd5b850160e08188031215615434575f5ffd5b935060208501356001600160401b0381111561544e575f5ffd5b61545a878288016149e5565b9094509250506040850135615125816153ee565b5f5f6040838503121561547f575f5ffd5b82356001600160401b03811115615494575f5ffd5b8301601f810185136154a4575f5ffd5b80356154b2614b7e82614b3f565b8082825260208201915060208360051b8501019250878311156154d3575f5ffd5b6020840193505b828410156154fe5783356154ed8161496a565b8252602093840193909101906154da565b945050505060208301356001600160401b03811115615219575f5ffd5b602081525f610d5a6020830184615008565b634e487b7160e01b5f52603260045260245ffd5b5f8235605e19833603018112615555575f5ffd5b9190910192915050565b5f5f8335601e19843603018112615574575f5ffd5b8301803591506001600160401b0382111561558d575f5ffd5b6020019150600581901b360382131561224a575f5ffd5b5f602082840312156155b4575f5ffd5b8151610d5a816153ee565b60208152816020820152818360408301375f818301604090810191909152601f909201601f19160101919050565b5f602082840312156155fd575f5ffd5b8151610d5a816150c3565b634e487b7160e01b5f52601160045260245ffd5b63ffffffff8181168382160190811115611c8157611c81615608565b80820180821115611c8157611c81615608565b5f82601f83011261565a575f5ffd5b8151615668614b7e82614b3f565b8082825260208201915060208360051b860101925085831115615689575f5ffd5b602085015b83811015614bca57805183526020928301920161568e565b5f5f604083850312156156b7575f5ffd5b82516001600160401b038111156156cc575f5ffd5b8301601f810185136156dc575f5ffd5b80516156ea614b7e82614b3f565b8082825260208201915060208360051b85010192508783111561570b575f5ffd5b6020840193505b828410156157365783516157258161496a565b825260209384019390910190615712565b8095505050505060208301516001600160401b03811115615755575f5ffd5b6152258582860161564b565b5f60208284031215615771575f5ffd5b5051919050565b5f823560de19833603018112615555575f5ffd5b5f611c813683614e32565b5f602082840312156157a7575f5ffd5b8135610d5a816153ee565b5f602082840312156157c2575f5ffd5b8151610d5a8161496a565b6001600160a01b03831681526040602082018190525f90611d2990830184614f3f565b5f60208284031215615800575f5ffd5b81516001600160401b03811115615815575f5ffd5b8201601f81018413615825575f5ffd5b8051615833614b7e82614b3f565b8082825260208201915060208360051b850101925086831115615854575f5ffd5b6020840193505b8284101561089d57835161586e816150c3565b82526020938401939091019061585b565b6001600160a01b039384168152919092166020820152604081019190915260600190565b5f600182016158b4576158b4615608565b5060010190565b838152606060208201525f6158d36060830185614f78565b828103604084015261089d8185614ca3565b6001600160a01b03841681526060602082018190525f9061590890830185614f3f565b905063ffffffff83166040830152949350505050565b81810381811115611c8157611c81615608565b63ffffffff8281168282160390811115611c8157611c81615608565b5f5f6040838503121561595e575f5ffd5b505080516020909101519092909150565b634e487b7160e01b5f52602160045260245ffd5b634e487b7160e01b5f52601260045260245ffd5b6001600160401b038281168282160390811115611c8157611c81615608565b634e487b7160e01b5f52603160045260245ffd5b828152604060208201525f82518060408401528060208501606085015e5f606082850101526060601f19601f8301168401019150509392505050565b5f82518060208501845e5f920191825250919050565b5f82615a3657634e487b7160e01b5f52601260045260245ffd5b50049056fea264697066735822122057f7bd810db4ed58c974e637c477b6ccbb7f4101a2bcaa7880fa5c371fd27d6164736f6c634300081b0033", + Bin: "0x610180604052348015610010575f5ffd5b50604051615dd6380380615dd683398101604081905261002f9161021c565b8186868684876001600160a01b03811661005c576040516339b190bb60e11b815260040160405180910390fd5b6001600160a01b0390811660805293841660a05291831660c05290911660e05263ffffffff16610100524661012052610125604080518082018252600a81526922b4b3b2b72630bcb2b960b11b60209182015281517f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a866818301527f71b625cfad44bac63b13dba07f2e1d6084ee04b6f8752101ece6126d584ee6ea81840152466060820152306080808301919091528351808303909101815260a0909101909252815191012090565b610140526001600160a01b03166101605261013e610149565b5050505050506102a7565b5f54610100900460ff16156101b45760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff90811614610203575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b0381168114610219575f5ffd5b50565b5f5f5f5f5f5f60c08789031215610231575f5ffd5b865161023c81610205565b602088015190965061024d81610205565b604088015190955061025e81610205565b606088015190945061026f81610205565b608088015190935061028081610205565b60a088015190925063ffffffff81168114610299575f5ffd5b809150509295509295509295565b60805160a05160c05160e05161010051610120516101405161016051615a3a61039c5f395f818161042c01526132fa01525f61271601525f61265601525f818161070001528181611504015281816134f5015261383101525f818161075001528181610da901528181610f5a0152818161169f0152818161185e01528181611cb2015281816128eb01526133b101525f818161045301528181610ee0015281816117c501528181611a23015281816130e3015261363b01525f818161038901528181610eae01528181611977015261361501525f81816105ee01528181610b410152818161107a015261273a0152615a3a5ff3fe608060405234801561000f575f5ffd5b50600436106102cb575f3560e01c8063715018a61161017b578063bfae3fd2116100e4578063e4cc3f901161009e578063f2fde38b11610079578063f2fde38b146107de578063f698da25146107f1578063fabc1cbc146107f9578063fd8aa88d1461080c575f5ffd5b8063e4cc3f9014610798578063eea9064b146107ab578063f0e0e676146107be575f5ffd5b8063bfae3fd2146106e3578063c448feb8146106f6578063c978f7ac1461072a578063ca8aa7c71461074b578063cd6dc68714610772578063da8be86414610785575f5ffd5b80639104c319116101355780639104c319146106345780639435bb431461064f578063a178848414610662578063a33a343314610681578063b7f06ebe14610694578063bb45fef2146106b6575f5ffd5b8063715018a6146105a4578063778e55f3146105ac57806378296ec5146105d6578063886f1195146105e95780638da5cb5b146106105780639004134714610621575f5ffd5b806354b7c96c116102375780635dd68579116101f157806365da1264116101cc57806365da12641461053557806366d5ba931461055d5780636d70f7ae1461057e5780636e17444814610591575f5ffd5b80635dd68579146104ee578063601bb36f1461050f57806360a0d1ce14610522575f5ffd5b806354b7c96c14610475578063595c6a6714610488578063597b36da146104905780635ac86ab7146104a35780635c975abb146104c65780635d975e88146104ce575f5ffd5b806339b70e381161028857806339b70e38146103845780633c651cf2146103c35780633cdeb5e0146103d65780633e28391d146104045780634657e26a146104275780634665bcda1461044e575f5ffd5b806304a4f979146102cf5780630b9f487a146103095780630dd8dd021461031c578063136439dd1461033c57806325df922e146103515780632aa6d88814610371575b5f5ffd5b6102f67f14bde674c9f64b2ad00eaaee4a8bed1fabef35c7507e3c5b9cfc9436909a2dad81565b6040519081526020015b60405180910390f35b6102f6610317366004614957565b61081f565b61032f61032a3660046149ee565b6108a7565b6040516103009190614a2c565b61034f61034a366004614a63565b610b2c565b005b61036461035f366004614bf8565b610c01565b6040516103009190614ca6565b61034f61037f366004614d08565b610d61565b6103ab7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610300565b61034f6103d1366004614d66565b610ea3565b6103ab6103e4366004614da9565b6001600160a01b039081165f908152609960205260409020600101541690565b610417610412366004614da9565b610fea565b6040519015158152602001610300565b6103ab7f000000000000000000000000000000000000000000000000000000000000000081565b6103ab7f000000000000000000000000000000000000000000000000000000000000000081565b61034f610483366004614dc4565b611009565b61034f611065565b6102f661049e366004614eb7565b611114565b6104176104b1366004614ee8565b606654600160ff9092169190911b9081161490565b6066546102f6565b6104e16104dc366004614a63565b611143565b6040516103009190614fbf565b6105016104fc366004614da9565b61125f565b60405161030092919061501f565b61034f61051d3660046150a0565b611694565b61034f6105303660046150f9565b6117ba565b6103ab610543366004614da9565b609a6020525f90815260409020546001600160a01b031681565b61057061056b366004614da9565b61194f565b604051610300929190615138565b61041761058c366004614da9565b611c4f565b6102f661059f366004614dc4565b611c87565b61034f611d31565b6102f66105ba366004614dc4565b609860209081525f928352604080842090915290825290205481565b61034f6105e436600461515c565b611d42565b6103ab7f000000000000000000000000000000000000000000000000000000000000000081565b6033546001600160a01b03166103ab565b61036461062f3660046151ac565b611dca565b6103ab73beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac081565b61034f61065d3660046151f8565b611ea0565b6102f6610670366004614da9565b609f6020525f908152604090205481565b61032f61068f366004615294565b611f70565b6104176106a2366004614a63565b609e6020525f908152604090205460ff1681565b6104176106c436600461537b565b609c60209081525f928352604080842090915290825290205460ff1681565b6102f66106f1366004614dc4565b611f88565b60405163ffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152602001610300565b61073d6107383660046151ac565b611fc4565b6040516103009291906153a5565b6103ab7f000000000000000000000000000000000000000000000000000000000000000081565b61034f61078036600461537b565b612251565b61032f610793366004614da9565b61236c565b61034f6107a63660046153c4565b61247c565b61034f6107b9366004615294565b6124d2565b6107d16107cc366004615437565b612535565b60405161030091906154e4565b61034f6107ec366004614da9565b6125da565b6102f6612653565b61034f610807366004614a63565b612738565b61032f61081a366004614da9565b61284f565b604080517f14bde674c9f64b2ad00eaaee4a8bed1fabef35c7507e3c5b9cfc9436909a2dad60208201526001600160a01b03808616928201929092528187166060820152908516608082015260a0810183905260c081018290525f9061089d9060e00160405160208183030381529060405280519060200120612872565b9695505050505050565b6066546060906001906002908116036108d35760405163840a48d560e01b815260040160405180910390fd5b5f836001600160401b038111156108ec576108ec614a7a565b604051908082528060200260200182016040528015610915578160200160208202803683370190505b50335f908152609a60205260408120549192506001600160a01b03909116905b85811015610b215786868281811061094f5761094f6154f6565b9050602002810190610961919061550a565b61096f906020810190615528565b9050878783818110610983576109836154f6565b9050602002810190610995919061550a565b61099f9080615528565b9050146109bf576040516343714afd60e01b815260040160405180910390fd5b5f610a2933848a8a868181106109d7576109d76154f6565b90506020028101906109e9919061550a565b6109f39080615528565b808060200260200160405190810160405280939291908181526020018383602002808284375f920191909152506128a092505050565b9050610afb33848a8a86818110610a4257610a426154f6565b9050602002810190610a54919061550a565b610a5e9080615528565b808060200260200160405190810160405280939291908181526020018383602002808284375f920191909152508e92508d9150889050818110610aa357610aa36154f6565b9050602002810190610ab5919061550a565b610ac3906020810190615528565b808060200260200160405190810160405280939291908181526020018383602002808284375f920191909152508892506129e7915050565b848381518110610b0d57610b0d6154f6565b602090810291909101015250600101610935565b509095945050505050565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa158015610b8e573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610bb2919061556d565b610bcf57604051631d77d47760e21b815260040160405180910390fd5b6066548181168114610bf45760405163c61dca5d60e01b815260040160405180910390fd5b610bfd82612edc565b5050565b6001600160a01b038084165f908152609a60205260408120546060921690610c2a8683876128a0565b90505f85516001600160401b03811115610c4657610c46614a7a565b604051908082528060200260200182016040528015610c6f578160200160208202803683370190505b5090505f5b8651811015610d54576001600160a01b0388165f90815260a260205260408120885182908a9085908110610caa57610caa6154f6565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020015f206040518060200160405290815f820154815250509050610d2e878381518110610cfc57610cfc6154f6565b6020026020010151858481518110610d1657610d166154f6565b602002602001015183612f199092919063ffffffff16565b838381518110610d4057610d406154f6565b602090810291909101015250600101610c74565b50925050505b9392505050565b610d6a33610fea565b15610d8857604051633bf2b50360e11b815260040160405180910390fd5b604051632b6241f360e11b815233600482015263ffffffff841660248201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906356c483e6906044015f604051808303815f87803b158015610df2575f5ffd5b505af1158015610e04573d5f5f3e3d5ffd5b50505050610e123385612f37565b610e1c3333612f99565b6040516001600160a01b038516815233907fa453db612af59e5521d6ab9284dc3e2d06af286eb1b1b7b771fce4716c19f2c19060200160405180910390a2336001600160a01b03167f02a919ed0e2acad1dd90f17ef2fa4ae5462ee1339170034a8531cca4b67080908383604051610e95929190615588565b60405180910390a250505050565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161480610f025750336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016145b610f1f5760405163045206a560e21b815260040160405180910390fd5b6001600160a01b038481165f908152609a602052604080822054905163152667d960e31b8152908316600482018190528684166024830152927f0000000000000000000000000000000000000000000000000000000000000000169063a9333ec890604401602060405180830381865afa158015610f9f573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610fc391906155b6565b90505f610fd187878461309c565b9050610fe183888888888661317e565b50505050505050565b6001600160a01b039081165f908152609a602052604090205416151590565b81611013816132bc565b6110305760405163932d94f760e01b815260040160405180910390fd5b61103983611c4f565b611056576040516325ec6c1f60e01b815260040160405180910390fd5b6110608383612f37565b505050565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa1580156110c7573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110eb919061556d565b61110857604051631d77d47760e21b815260040160405180910390fd5b6111125f19612edc565b565b5f816040516020016111269190614fbf565b604051602081830303815290604052805190602001209050919050565b61114b614813565b5f82815260a46020908152604091829020825160e08101845281546001600160a01b03908116825260018301548116828501526002830154168185015260038201546060820152600482015463ffffffff1660808201526005820180548551818602810186019096528086529194929360a086019392908301828280156111f957602002820191905f5260205f20905b81546001600160a01b031681526001909101906020018083116111db575b505050505081526020016006820180548060200260200160405190810160405280929190818152602001828054801561124f57602002820191905f5260205f20905b81548152602001906001019080831161123b575b5050505050815250509050919050565b6060805f61126c8461284f565b8051909150806001600160401b0381111561128957611289614a7a565b6040519080825280602002602001820160405280156112c257816020015b6112af614813565b8152602001906001900390816112a75790505b509350806001600160401b038111156112dd576112dd614a7a565b60405190808252806020026020018201604052801561131057816020015b60608152602001906001900390816112fb5790505b506001600160a01b038087165f908152609a60205260408120549295509116905b8281101561168b5760a45f85838151811061134e5761134e6154f6565b60209081029190910181015182528181019290925260409081015f20815160e08101835281546001600160a01b03908116825260018301548116828601526002830154168184015260038201546060820152600482015463ffffffff1660808201526005820180548451818702810187019095528085529194929360a086019390929083018282801561140857602002820191905f5260205f20905b81546001600160a01b031681526001909101906020018083116113ea575b505050505081526020016006820180548060200260200160405190810160405280929190818152602001828054801561145e57602002820191905f5260205f20905b81548152602001906001019080831161144a575b505050505081525050868281518110611479576114796154f6565b6020026020010181905250858181518110611496576114966154f6565b602002602001015160a00151516001600160401b038111156114ba576114ba614a7a565b6040519080825280602002602001820160405280156114e3578160200160208202803683370190505b508582815181106114f6576114f66154f6565b60200260200101819052505f7f0000000000000000000000000000000000000000000000000000000000000000878381518110611535576115356154f6565b60200260200101516080015161154b91906155e5565b905060604363ffffffff168263ffffffff1610156115935761158c89858a868151811061157a5761157a6154f6565b602002602001015160a0015185613366565b90506115be565b6115bb89858a86815181106115aa576115aa6154f6565b602002602001015160a001516128a0565b90505b5f5b8884815181106115d2576115d26154f6565b602002602001015160a001515181101561167d5761163f8985815181106115fb576115fb6154f6565b602002602001015160c001518281518110611618576116186154f6565b6020026020010151838381518110611632576116326154f6565b6020026020010151613494565b888581518110611651576116516154f6565b6020026020010151828151811061166a5761166a6154f6565b60209081029190910101526001016115c0565b505050806001019050611331565b50505050915091565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146116dd576040516323d871a560e01b815260040160405180910390fd5b6001600160a01b038085165f90815260986020908152604080832093871683529290529081205461171b906001600160401b0380861690851661349f565b90505f61172a868686866134b7565b90505f6117378284615601565b9050611745875f8886613574565b5f61174f876135ee565b60405163debe1eab60e01b81526001600160a01b038981166004830152602482018590529192509082169063debe1eab906044015f604051808303815f87803b15801561179a575f5ffd5b505af11580156117ac573d5f5f3e3d5ffd5b505050505050505050505050565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461180357604051633213a66160e21b815260040160405180910390fd5b61180c83610fea565b15611060576001600160a01b038381165f908152609a602052604080822054905163152667d960e31b81529083166004820181905273beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac06024830152927f0000000000000000000000000000000000000000000000000000000000000000169063a9333ec890604401602060405180830381865afa1580156118a3573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906118c791906155b6565b6001600160a01b0386165f90815260a26020908152604080832073beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac084528252808320815192830190915254815291925061192d866119256001600160401b03808716908916613660565b849190613674565b9050610fe1848873beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac084613574565b6040516394f649dd60e01b81526001600160a01b03828116600483015260609182915f9182917f000000000000000000000000000000000000000000000000000000000000000016906394f649dd906024015f60405180830381865afa1580156119bb573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526119e2919081019061566f565b60405163fe243a1760e01b81526001600160a01b03888116600483015273beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac060248301529294509092505f917f0000000000000000000000000000000000000000000000000000000000000000169063fe243a1790604401602060405180830381865afa158015611a68573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a8c919061572a565b9050805f03611aa057509094909350915050565b5f83516001611aaf9190615601565b6001600160401b03811115611ac657611ac6614a7a565b604051908082528060200260200182016040528015611aef578160200160208202803683370190505b5090505f84516001611b019190615601565b6001600160401b03811115611b1857611b18614a7a565b604051908082528060200260200182016040528015611b41578160200160208202803683370190505b50905073beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac082865181518110611b6c57611b6c6154f6565b60200260200101906001600160a01b031690816001600160a01b0316815250508281865181518110611ba057611ba06154f6565b60209081029190910101525f5b8551811015611c4157858181518110611bc857611bc86154f6565b6020026020010151838281518110611be257611be26154f6565b60200260200101906001600160a01b031690816001600160a01b031681525050848181518110611c1457611c146154f6565b6020026020010151828281518110611c2e57611c2e6154f6565b6020908102919091010152600101611bad565b509097909650945050505050565b5f6001600160a01b03821615801590611c8157506001600160a01b038083165f818152609a6020526040902054909116145b92915050565b60405163152667d960e31b81526001600160a01b03838116600483015282811660248301525f9182917f0000000000000000000000000000000000000000000000000000000000000000169063a9333ec890604401602060405180830381865afa158015611cf7573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611d1b91906155b6565b9050611d298484835f6134b7565b949350505050565b611d39613692565b6111125f6136ec565b82611d4c816132bc565b611d695760405163932d94f760e01b815260040160405180910390fd5b611d7284611c4f565b611d8f576040516325ec6c1f60e01b815260040160405180910390fd5b836001600160a01b03167f02a919ed0e2acad1dd90f17ef2fa4ae5462ee1339170034a8531cca4b67080908484604051610e95929190615588565b60605f82516001600160401b03811115611de657611de6614a7a565b604051908082528060200260200182016040528015611e0f578160200160208202803683370190505b5090505f5b8351811015611e98576001600160a01b0385165f9081526098602052604081208551909190869084908110611e4b57611e4b6154f6565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020015f2054828281518110611e8557611e856154f6565b6020908102919091010152600101611e14565b509392505050565b606654600290600490811603611ec95760405163840a48d560e01b815260040160405180910390fd5b611ed161373d565b855f5b81811015611f6457611f5c898983818110611ef157611ef16154f6565b9050602002810190611f039190615741565b611f0c90615755565b888884818110611f1e57611f1e6154f6565b9050602002810190611f309190615528565b888886818110611f4257611f426154f6565b9050602002016020810190611f579190615760565b613796565b600101611ed4565b5050610fe1600160c955565b6060611f7b3361236c565b9050610d5a8484846124d2565b6001600160a01b038083165f90815260a260209081526040808320938516835292815282822083519182019093529154825290610d5a90613bd8565b60608082516001600160401b03811115611fe057611fe0614a7a565b604051908082528060200260200182016040528015612009578160200160208202803683370190505b50915082516001600160401b0381111561202557612025614a7a565b60405190808252806020026020018201604052801561204e578160200160208202803683370190505b506001600160a01b038086165f908152609a60205260408120549293509116906120798683876128a0565b90505f5b8551811015612246575f6120a987838151811061209c5761209c6154f6565b60200260200101516135ee565b9050806001600160a01b031663fe243a17898985815181106120cd576120cd6154f6565b60200260200101516040518363ffffffff1660e01b81526004016121079291906001600160a01b0392831681529116602082015260400190565b602060405180830381865afa158015612122573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612146919061572a565b858381518110612158576121586154f6565b6020026020010181815250505f60a25f8a6001600160a01b03166001600160a01b031681526020019081526020015f205f89858151811061219b5761219b6154f6565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020015f206040518060200160405290815f82015481525050905061221f8684815181106121ed576121ed6154f6565b6020026020010151858581518110612207576122076154f6565b6020026020010151836136749092919063ffffffff16565b878481518110612231576122316154f6565b6020908102919091010152505060010161207d565b5050505b9250929050565b5f54610100900460ff161580801561226f57505f54600160ff909116105b806122885750303b15801561228857505f5460ff166001145b6122f05760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b5f805460ff191660011790558015612311575f805461ff0019166101001790555b61231a82612edc565b612323836136ec565b8015611060575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a1505050565b606061237782610fea565b6123945760405163a5c7c44560e01b815260040160405180910390fd5b61239d82611c4f565b156123bb576040516311ca333560e31b815260040160405180910390fd5b336001600160a01b03831614612473576001600160a01b038083165f908152609a6020526040902054166123ee816132bc565b8061241457506001600160a01b038181165f908152609960205260409020600101541633145b61243157604051631e499a2360e11b815260040160405180910390fd5b806001600160a01b0316836001600160a01b03167ff0eddf07e6ea14f388b47e1e94a0f464ecbd9eed4171130e0fc0e99fb4030a8a60405160405180910390a3505b611c8182613bf7565b6066546002906004908116036124a55760405163840a48d560e01b815260040160405180910390fd5b6124ad61373d565b6124c16124b986615755565b858585613796565b6124cb600160c955565b5050505050565b6124db33610fea565b156124f957604051633bf2b50360e11b815260040160405180910390fd5b61250283611c4f565b61251f576040516325ec6c1f60e01b815260040160405180910390fd5b61252b33848484613e56565b6110603384612f99565b60605f83516001600160401b0381111561255157612551614a7a565b60405190808252806020026020018201604052801561258457816020015b606081526020019060019003908161256f5790505b5090505f5b8451811015611e98576125b58582815181106125a7576125a76154f6565b602002602001015185611dca565b8282815181106125c7576125c76154f6565b6020908102919091010152600101612589565b6125e2613692565b6001600160a01b0381166126475760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016122e7565b612650816136ec565b50565b5f7f000000000000000000000000000000000000000000000000000000000000000046146127135750604080518082018252600a81526922b4b3b2b72630bcb2b960b11b60209182015281517f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a866818301527f71b625cfad44bac63b13dba07f2e1d6084ee04b6f8752101ece6126d584ee6ea81840152466060820152306080808301919091528351808303909101815260a0909101909252815191012090565b507f000000000000000000000000000000000000000000000000000000000000000090565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612794573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906127b8919061577b565b6001600160a01b0316336001600160a01b0316146127e95760405163794821ff60e01b815260040160405180910390fd5b606654801982198116146128105760405163c61dca5d60e01b815260040160405180910390fd5b606682905560405182815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c906020015b60405180910390a25050565b6001600160a01b0381165f90815260a360205260409020606090611c8190613f1b565b5f61287b612653565b60405161190160f01b6020820152602281019190915260428101839052606201611126565b60605f82516001600160401b038111156128bc576128bc614a7a565b6040519080825280602002602001820160405280156128e5578160200160208202803683370190505b5090505f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663547afb8786866040518363ffffffff1660e01b8152600401612937929190615796565b5f60405180830381865afa158015612951573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261297891908101906157b9565b90505f5b8451811015610b21576129c28786838151811061299b5761299b6154f6565b60200260200101518484815181106129b5576129b56154f6565b602002602001015161309c565b8382815181106129d4576129d46154f6565b602090810291909101015260010161297c565b5f6001600160a01b038616612a0f576040516339b190bb60e11b815260040160405180910390fd5b83515f03612a305760405163796cc52560e01b815260040160405180910390fd5b5f84516001600160401b03811115612a4a57612a4a614a7a565b604051908082528060200260200182016040528015612a73578160200160208202803683370190505b5090505f85516001600160401b03811115612a9057612a90614a7a565b604051908082528060200260200182016040528015612ab9578160200160208202803683370190505b5090505f5b8651811015612d0f575f612add88838151811061209c5761209c6154f6565b90505f60a25f8c6001600160a01b03166001600160a01b031681526020019081526020015f205f8a8581518110612b1657612b166154f6565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020015f206040518060200160405290815f820154815250509050612b82888481518110612b6857612b686154f6565b6020026020010151888581518110612207576122076154f6565b848481518110612b9457612b946154f6565b602002602001018181525050612bcc888481518110612bb557612bb56154f6565b602002602001015182613f2790919063ffffffff16565b858481518110612bde57612bde6154f6565b60209081029190910101526001600160a01b038a1615612c7357612c358a8a8581518110612c0e57612c0e6154f6565b6020026020010151878681518110612c2857612c286154f6565b6020026020010151613f3b565b612c738a8c8b8681518110612c4c57612c4c6154f6565b6020026020010151878781518110612c6657612c666154f6565b6020026020010151613574565b816001600160a01b031663724af4238c8b8681518110612c9557612c956154f6565b60200260200101518b8781518110612caf57612caf6154f6565b60200260200101516040518463ffffffff1660e01b8152600401612cd593929190615848565b5f604051808303815f87803b158015612cec575f5ffd5b505af1158015612cfe573d5f5f3e3d5ffd5b505050505050806001019050612abe565b506001600160a01b0388165f908152609f60205260408120805491829190612d368361586c565b91905055505f6040518060e001604052808b6001600160a01b031681526020018a6001600160a01b031681526020018b6001600160a01b031681526020018381526020014363ffffffff1681526020018981526020018581525090505f612d9c82611114565b5f818152609e602090815260408083208054600160ff19909116811790915560a4835292819020865181546001600160a01b03199081166001600160a01b039283161783558885015195830180548216968316969096179095559187015160028201805490951692169190911790925560608501516003830155608085015160048301805463ffffffff191663ffffffff90921691909117905560a085015180519394508593612e52926005850192019061486c565b5060c08201518051612e6e9160068401916020909101906148cf565b5050506001600160a01b038b165f90815260a360205260409020612e929082613fc9565b507f26b2aae26516e8719ef50ea2f6831a2efbd4e37dccdf0f6936b27bc08e793e30818386604051612ec693929190615884565b60405180910390a19a9950505050505050505050565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a250565b5f611d2982612f31612f2a87613bd8565b8690613fd4565b90613fd4565b6001600160a01b038281165f8181526099602090815260409182902060010180546001600160a01b0319169486169485179055905192835290917f773b54c04d756fcc5e678111f7d730de3be98192000799eee3d63716055a87c69101612843565b6066545f90600190811603612fc15760405163840a48d560e01b815260040160405180910390fd5b6001600160a01b038381165f818152609a602052604080822080546001600160a01b0319169487169485179055517fc3ee9f2e5fda98e8066a1f745b2df9285f416fe98cf2559cd21484b3d87433049190a35f5f61301e8561194f565b915091505f61302e8686856128a0565b90505f5b8351811015610fe1576130948688868481518110613052576130526154f6565b60200260200101515f87868151811061306d5761306d6154f6565b6020026020010151878781518110613087576130876154f6565b602002602001015161317e565b600101613032565b5f73beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeabf196001600160a01b0384160161316e5760405163a3d75e0960e01b81526001600160a01b0385811660048301525f917f00000000000000000000000000000000000000000000000000000000000000009091169063a3d75e0990602401602060405180830381865afa15801561312a573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061314e91906155b6565b90506131666001600160401b03848116908316613660565b915050610d5a565b506001600160401b031692915050565b805f0361319e57604051630a33bc6960e21b815260040160405180910390fd5b6001600160a01b038086165f90815260a2602090815260408083209388168352929052206131ce81858585613fe8565b6040805160208101909152815481527f8be932bac54561f27260f95463d9b8ab37e06b2842e5ee2404157cc13df6eb8f908790879061320c90613bd8565b60405161321b93929190615848565b60405180910390a161322c86610fea565b15610fe1576001600160a01b038088165f90815260986020908152604080832093891683529290529081208054859290613267908490615601565b92505081905550866001600160a01b03167f1ec042c965e2edd7107b51188ee0f383e22e76179041ab3a9d18ff151405166c8787866040516132ab93929190615848565b60405180910390a250505050505050565b604051631beb2b9760e31b81526001600160a01b0382811660048301523360248301523060448301525f80356001600160e01b0319166064840152917f00000000000000000000000000000000000000000000000000000000000000009091169063df595cb8906084016020604051808303815f875af1158015613342573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611c81919061556d565b60605f83516001600160401b0381111561338257613382614a7a565b6040519080825280602002602001820160405280156133ab578160200160208202803683370190505b5090505f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166394d7d00c8787876040518463ffffffff1660e01b81526004016133ff939291906158ae565b5f60405180830381865afa158015613419573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261344091908101906157b9565b90505f5b8551811015613488576134638887838151811061299b5761299b6154f6565b838281518110613475576134756154f6565b6020908102919091010152600101613444565b50909695505050505050565b5f610d5a8383613660565b5f6134ad8483856001614057565b611d2990856158e7565b6001600160a01b038085165f90815260a560209081526040808320938716835292905290812081906134e8906140b2565b90505f61354e600161351a7f0000000000000000000000000000000000000000000000000000000000000000436158fa565b61352491906158fa565b6001600160a01b03808a165f90815260a560209081526040808320938c16835292905220906140cc565b90505f61355b82846158e7565b90506135688187876140e8565b98975050505050505050565b6001600160a01b038085165f908152609860209081526040808320938616835292905290812080548392906135aa9084906158e7565b92505081905550836001600160a01b03167f6909600037b75d7b4733aedd815442b5ec018a827751c832aaff64eba5d6d2dd848484604051610e9593929190615848565b5f6001600160a01b03821673beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac014613639577f0000000000000000000000000000000000000000000000000000000000000000611c81565b7f000000000000000000000000000000000000000000000000000000000000000092915050565b5f610d5a8383670de0b6b3a7640000614106565b5f611d298261368c61368587613bd8565b8690613660565b90613660565b6033546001600160a01b031633146111125760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016122e7565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b600260c9540361378f5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016122e7565b600260c955565b60a08401515182146137bb576040516343714afd60e01b815260040160405180910390fd5b83604001516001600160a01b0316336001600160a01b0316146137f1576040516316110d3560e21b815260040160405180910390fd5b5f6137fb85611114565b5f818152609e602052604090205490915060ff1661382c576040516387c9d21960e01b815260040160405180910390fd5b60605f7f0000000000000000000000000000000000000000000000000000000000000000876080015161385f91906155e5565b90508063ffffffff164363ffffffff161161388d576040516378f67ae160e11b815260040160405180910390fd5b6138a4875f015188602001518960a0015184613366565b87516001600160a01b03165f90815260a3602052604090209092506138ca9150836141eb565b505f82815260a46020526040812080546001600160a01b031990811682556001820180548216905560028201805490911690556003810182905560048101805463ffffffff19169055906139216005830182614908565b61392e600683015f614908565b50505f828152609e602052604090819020805460ff19169055517f1f40400889274ed07b24845e5054a87a0cab969eb1277aafe61ae352e7c32a00906139779084815260200190565b60405180910390a185516001600160a01b039081165f908152609a6020526040812054885160a08a015191909316926139b19184906128a0565b90505f5b8860a0015151811015613bcd575f6139dc8a60a00151838151811061209c5761209c6154f6565b90505f613a128b60c0015184815181106139f8576139f86154f6565b6020026020010151878581518110611632576116326154f6565b9050805f03613a22575050613bc5565b8715613af057816001600160a01b0316632eae418c8c5f01518d60a001518681518110613a5157613a516154f6565b60200260200101518d8d88818110613a6b57613a6b6154f6565b9050602002016020810190613a809190614da9565b60405160e085901b6001600160e01b03191681526001600160a01b03938416600482015291831660248301529091166044820152606481018490526084015f604051808303815f87803b158015613ad5575f5ffd5b505af1158015613ae7573d5f5f3e3d5ffd5b50505050613bc2565b5f5f836001600160a01b03166350ff72258e5f01518f60a001518881518110613b1b57613b1b6154f6565b6020026020010151866040518463ffffffff1660e01b8152600401613b4293929190615848565b60408051808303815f875af1158015613b5d573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613b819190615916565b91509150613bbf878e5f01518f60a001518881518110613ba357613ba36154f6565b602002602001015185858b8b81518110613087576130876154f6565b50505b50505b6001016139b5565b505050505050505050565b80515f9015613be8578151611c81565b670de0b6b3a764000092915050565b606654606090600190600290811603613c235760405163840a48d560e01b815260040160405180910390fd5b6001600160a01b038084165f818152609a602052604080822080546001600160a01b0319811690915590519316928392917ffee30966a256b71e14bc0ebfc94315e28ef4a97a7131a9e2b7a310a73af4467691a35f5f613c828661194f565b9150915081515f03613c9657505050613e50565b81516001600160401b03811115613caf57613caf614a7a565b604051908082528060200260200182016040528015613cd8578160200160208202803683370190505b5094505f613ce78785856128a0565b90505f5b8351811015613e4a576040805160018082528183019092525f916020808301908036833750506040805160018082528183019092529293505f9291506020808301908036833750506040805160018082528183019092529293505f92915060208083019080368337019050509050868481518110613d6b57613d6b6154f6565b6020026020010151835f81518110613d8557613d856154f6565b60200260200101906001600160a01b031690816001600160a01b031681525050858481518110613db757613db76154f6565b6020026020010151825f81518110613dd157613dd16154f6565b602002602001018181525050848481518110613def57613def6154f6565b6020026020010151815f81518110613e0957613e096154f6565b602002602001018181525050613e228b898585856129e7565b8a8581518110613e3457613e346154f6565b6020908102919091010152505050600101613ceb565b50505050505b50919050565b6001600160a01b038084165f908152609960205260409020600101541680613e7e5750613f15565b6001600160a01b0381165f908152609c6020908152604080832085845290915290205460ff1615613ec257604051630d4c4c9160e21b815260040160405180910390fd5b6001600160a01b0381165f908152609c602090815260408083208584528252909120805460ff191660011790558301516124cb908290613f0990889088908490889061081f565b855160208701516141f6565b50505050565b60605f610d5a83614248565b5f610d5a613f3484613bd8565b8390613660565b6001600160a01b03821673beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac014611060576001600160a01b038084165f90815260a5602090815260408083209386168352929052908120613f8e906140b2565b9050613f1543613f9e8484615601565b6001600160a01b038088165f90815260a560209081526040808320938a1683529290522091906142a1565b5f610d5a83836142ac565b5f610d5a83670de0b6b3a764000084614106565b825f0361400857614001670de0b6b3a764000082613fd4565b8455613f15565b6040805160208101909152845481525f90614024908584613674565b90505f6140318483615601565b90505f61404c84612f31614045888a615601565b8590613fd4565b875550505050505050565b5f5f614064868686614106565b9050600183600281111561407a5761407a615938565b14801561409657505f84806140915761409161594c565b868809115b156140a9576140a6600182615601565b90505b95945050505050565b5f6140bd82826142f8565b6001600160e01b031692915050565b5f6140d883838361433d565b6001600160e01b03169392505050565b5f611d296140f68385615960565b85906001600160401b0316613660565b5f80805f19858709858702925082811083820303915050805f0361413d578382816141335761413361594c565b0492505050610d5a565b8084116141845760405162461bcd60e51b81526020600482015260156024820152744d6174683a206d756c446976206f766572666c6f7760581b60448201526064016122e7565b5f8486880960026001871981018816978890046003810283188082028403028082028403028082028403028082028403028082028403029081029092039091025f889003889004909101858311909403939093029303949094049190911702949350505050565b5f610d5a8383614386565b4281101561421757604051630819bdcd60e01b815260040160405180910390fd5b61422b6001600160a01b0385168484614469565b613f1557604051638baa579f60e01b815260040160405180910390fd5b6060815f0180548060200260200160405190810160405280929190818152602001828054801561429557602002820191905f5260205f20905b815481526020019060010190808311614281575b50505050509050919050565b6110608383836144bd565b5f8181526001830160205260408120546142f157508154600181810184555f848152602080822090930184905584548482528286019093526040902091909155611c81565b505f611c81565b81545f9080156143355761431e846143116001846158e7565b5f91825260209091200190565b5464010000000090046001600160e01b0316611d29565b509092915050565b82545f908161434e868683856145c3565b9050801561437c57614365866143116001846158e7565b5464010000000090046001600160e01b031661089d565b5091949350505050565b5f8181526001830160205260408120548015614460575f6143a86001836158e7565b85549091505f906143bb906001906158e7565b905081811461441a575f865f0182815481106143d9576143d96154f6565b905f5260205f200154905080875f0184815481106143f9576143f96154f6565b5f918252602080832090910192909255918252600188019052604090208390555b855486908061442b5761442b61597f565b600190038181905f5260205f20015f90559055856001015f8681526020019081526020015f205f905560019350505050611c81565b5f915050611c81565b5f5f5f6144768585614616565b90925090505f81600481111561448e5761448e615938565b1480156144ac5750856001600160a01b0316826001600160a01b0316145b8061089d575061089d868686614655565b82548015614575575f6144d5856143116001856158e7565b60408051808201909152905463ffffffff8082168084526401000000009092046001600160e01b0316602084015291925090851610156145285760405163151b8e3f60e11b815260040160405180910390fd5b805163ffffffff8086169116036145735782614549866143116001866158e7565b80546001600160e01b03929092166401000000000263ffffffff9092169190911790555050505050565b505b506040805180820190915263ffffffff92831681526001600160e01b03918216602080830191825285546001810187555f968752952091519051909216640100000000029190921617910155565b5f5b81831015611e98575f6145d8848461473c565b5f8781526020902090915063ffffffff86169082015463ffffffff16111561460257809250614610565b61460d816001615601565b93505b506145c5565b5f5f825160410361464a576020830151604084015160608501515f1a61463e87828585614756565b9450945050505061224a565b505f9050600261224a565b5f5f5f856001600160a01b0316631626ba7e60e01b868660405160240161467d929190615993565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b03199094169390931790925290516146bb91906159cf565b5f60405180830381855afa9150503d805f81146146f3576040519150601f19603f3d011682016040523d82523d5f602084013e6146f8565b606091505b509150915081801561470c57506020815110155b801561089d57508051630b135d3f60e11b90614731908301602090810190840161572a565b149695505050505050565b5f61474a60028484186159e5565b610d5a90848416615601565b5f807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a083111561478b57505f9050600361480a565b604080515f8082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa1580156147dc573d5f5f3e3d5ffd5b5050604051601f1901519150506001600160a01b038116614804575f6001925092505061480a565b91505f90505b94509492505050565b6040518060e001604052805f6001600160a01b031681526020015f6001600160a01b031681526020015f6001600160a01b031681526020015f81526020015f63ffffffff16815260200160608152602001606081525090565b828054828255905f5260205f209081019282156148bf579160200282015b828111156148bf57825182546001600160a01b0319166001600160a01b0390911617825560209092019160019091019061488a565b506148cb92915061491f565b5090565b828054828255905f5260205f209081019282156148bf579160200282015b828111156148bf5782518255916020019190600101906148ed565b5080545f8255905f5260205f209081019061265091905b5b808211156148cb575f8155600101614920565b6001600160a01b0381168114612650575f5ffd5b803561495281614933565b919050565b5f5f5f5f5f60a0868803121561496b575f5ffd5b853561497681614933565b9450602086013561498681614933565b9350604086013561499681614933565b94979396509394606081013594506080013592915050565b5f5f83601f8401126149be575f5ffd5b5081356001600160401b038111156149d4575f5ffd5b6020830191508360208260051b850101111561224a575f5ffd5b5f5f602083850312156149ff575f5ffd5b82356001600160401b03811115614a14575f5ffd5b614a20858286016149ae565b90969095509350505050565b602080825282518282018190525f918401906040840190835b81811015610b21578351835260209384019390920191600101614a45565b5f60208284031215614a73575f5ffd5b5035919050565b634e487b7160e01b5f52604160045260245ffd5b60405160e081016001600160401b0381118282101715614ab057614ab0614a7a565b60405290565b604080519081016001600160401b0381118282101715614ab057614ab0614a7a565b604051601f8201601f191681016001600160401b0381118282101715614b0057614b00614a7a565b604052919050565b5f6001600160401b03821115614b2057614b20614a7a565b5060051b60200190565b5f82601f830112614b39575f5ffd5b8135614b4c614b4782614b08565b614ad8565b8082825260208201915060208360051b860101925085831115614b6d575f5ffd5b602085015b83811015614b93578035614b8581614933565b835260209283019201614b72565b5095945050505050565b5f82601f830112614bac575f5ffd5b8135614bba614b4782614b08565b8082825260208201915060208360051b860101925085831115614bdb575f5ffd5b602085015b83811015614b93578035835260209283019201614be0565b5f5f5f60608486031215614c0a575f5ffd5b8335614c1581614933565b925060208401356001600160401b03811115614c2f575f5ffd5b614c3b86828701614b2a565b92505060408401356001600160401b03811115614c56575f5ffd5b614c6286828701614b9d565b9150509250925092565b5f8151808452602084019350602083015f5b82811015614c9c578151865260209586019590910190600101614c7e565b5093949350505050565b602081525f610d5a6020830184614c6c565b803563ffffffff81168114614952575f5ffd5b5f5f83601f840112614cdb575f5ffd5b5081356001600160401b03811115614cf1575f5ffd5b60208301915083602082850101111561224a575f5ffd5b5f5f5f5f60608587031215614d1b575f5ffd5b8435614d2681614933565b9350614d3460208601614cb8565b925060408501356001600160401b03811115614d4e575f5ffd5b614d5a87828801614ccb565b95989497509550505050565b5f5f5f5f60808587031215614d79575f5ffd5b8435614d8481614933565b93506020850135614d9481614933565b93969395505050506040820135916060013590565b5f60208284031215614db9575f5ffd5b8135610d5a81614933565b5f5f60408385031215614dd5575f5ffd5b8235614de081614933565b91506020830135614df081614933565b809150509250929050565b5f60e08284031215614e0b575f5ffd5b614e13614a8e565b9050614e1e82614947565b8152614e2c60208301614947565b6020820152614e3d60408301614947565b604082015260608281013590820152614e5860808301614cb8565b608082015260a08201356001600160401b03811115614e75575f5ffd5b614e8184828501614b2a565b60a08301525060c08201356001600160401b03811115614e9f575f5ffd5b614eab84828501614b9d565b60c08301525092915050565b5f60208284031215614ec7575f5ffd5b81356001600160401b03811115614edc575f5ffd5b611d2984828501614dfb565b5f60208284031215614ef8575f5ffd5b813560ff81168114610d5a575f5ffd5b5f8151808452602084019350602083015f5b82811015614c9c5781516001600160a01b0316865260209586019590910190600101614f1a565b80516001600160a01b03908116835260208083015182169084015260408083015190911690830152606080820151908301526080808201515f91614f8c9085018263ffffffff169052565b5060a082015160e060a0850152614fa660e0850182614f08565b905060c083015184820360c08601526140a98282614c6c565b602081525f610d5a6020830184614f41565b5f82825180855260208501945060208160051b830101602085015f5b8381101561348857601f19858403018852615009838351614c6c565b6020988901989093509190910190600101614fed565b5f604082016040835280855180835260608501915060608160051b8601019250602087015f5b8281101561507657605f19878603018452615061858351614f41565b94506020938401939190910190600101615045565b5050505082810360208401526140a98185614fd1565b6001600160401b0381168114612650575f5ffd5b5f5f5f5f608085870312156150b3575f5ffd5b84356150be81614933565b935060208501356150ce81614933565b925060408501356150de8161508c565b915060608501356150ee8161508c565b939692955090935050565b5f5f5f6060848603121561510b575f5ffd5b833561511681614933565b925060208401359150604084013561512d8161508c565b809150509250925092565b604081525f61514a6040830185614f08565b82810360208401526140a98185614c6c565b5f5f5f6040848603121561516e575f5ffd5b833561517981614933565b925060208401356001600160401b03811115615193575f5ffd5b61519f86828701614ccb565b9497909650939450505050565b5f5f604083850312156151bd575f5ffd5b82356151c881614933565b915060208301356001600160401b038111156151e2575f5ffd5b6151ee85828601614b2a565b9150509250929050565b5f5f5f5f5f5f6060878903121561520d575f5ffd5b86356001600160401b03811115615222575f5ffd5b61522e89828a016149ae565b90975095505060208701356001600160401b0381111561524c575f5ffd5b61525889828a016149ae565b90955093505060408701356001600160401b03811115615276575f5ffd5b61528289828a016149ae565b979a9699509497509295939492505050565b5f5f5f606084860312156152a6575f5ffd5b83356152b181614933565b925060208401356001600160401b038111156152cb575f5ffd5b8401604081870312156152dc575f5ffd5b6152e4614ab6565b81356001600160401b038111156152f9575f5ffd5b8201601f81018813615309575f5ffd5b80356001600160401b0381111561532257615322614a7a565b615335601f8201601f1916602001614ad8565b818152896020838501011115615349575f5ffd5b816020840160208301375f60209282018301528352928301359282019290925293969395505050506040919091013590565b5f5f6040838503121561538c575f5ffd5b823561539781614933565b946020939093013593505050565b604081525f61514a6040830185614c6c565b8015158114612650575f5ffd5b5f5f5f5f606085870312156153d7575f5ffd5b84356001600160401b038111156153ec575f5ffd5b850160e081880312156153fd575f5ffd5b935060208501356001600160401b03811115615417575f5ffd5b615423878288016149ae565b90945092505060408501356150ee816153b7565b5f5f60408385031215615448575f5ffd5b82356001600160401b0381111561545d575f5ffd5b8301601f8101851361546d575f5ffd5b803561547b614b4782614b08565b8082825260208201915060208360051b85010192508783111561549c575f5ffd5b6020840193505b828410156154c75783356154b681614933565b8252602093840193909101906154a3565b945050505060208301356001600160401b038111156151e2575f5ffd5b602081525f610d5a6020830184614fd1565b634e487b7160e01b5f52603260045260245ffd5b5f8235605e1983360301811261551e575f5ffd5b9190910192915050565b5f5f8335601e1984360301811261553d575f5ffd5b8301803591506001600160401b03821115615556575f5ffd5b6020019150600581901b360382131561224a575f5ffd5b5f6020828403121561557d575f5ffd5b8151610d5a816153b7565b60208152816020820152818360408301375f818301604090810191909152601f909201601f19160101919050565b5f602082840312156155c6575f5ffd5b8151610d5a8161508c565b634e487b7160e01b5f52601160045260245ffd5b63ffffffff8181168382160190811115611c8157611c816155d1565b80820180821115611c8157611c816155d1565b5f82601f830112615623575f5ffd5b8151615631614b4782614b08565b8082825260208201915060208360051b860101925085831115615652575f5ffd5b602085015b83811015614b93578051835260209283019201615657565b5f5f60408385031215615680575f5ffd5b82516001600160401b03811115615695575f5ffd5b8301601f810185136156a5575f5ffd5b80516156b3614b4782614b08565b8082825260208201915060208360051b8501019250878311156156d4575f5ffd5b6020840193505b828410156156ff5783516156ee81614933565b8252602093840193909101906156db565b8095505050505060208301516001600160401b0381111561571e575f5ffd5b6151ee85828601615614565b5f6020828403121561573a575f5ffd5b5051919050565b5f823560de1983360301811261551e575f5ffd5b5f611c813683614dfb565b5f60208284031215615770575f5ffd5b8135610d5a816153b7565b5f6020828403121561578b575f5ffd5b8151610d5a81614933565b6001600160a01b03831681526040602082018190525f90611d2990830184614f08565b5f602082840312156157c9575f5ffd5b81516001600160401b038111156157de575f5ffd5b8201601f810184136157ee575f5ffd5b80516157fc614b4782614b08565b8082825260208201915060208360051b85010192508683111561581d575f5ffd5b6020840193505b8284101561089d5783516158378161508c565b825260209384019390910190615824565b6001600160a01b039384168152919092166020820152604081019190915260600190565b5f6001820161587d5761587d6155d1565b5060010190565b838152606060208201525f61589c6060830185614f41565b828103604084015261089d8185614c6c565b6001600160a01b03841681526060602082018190525f906158d190830185614f08565b905063ffffffff83166040830152949350505050565b81810381811115611c8157611c816155d1565b63ffffffff8281168282160390811115611c8157611c816155d1565b5f5f60408385031215615927575f5ffd5b505080516020909101519092909150565b634e487b7160e01b5f52602160045260245ffd5b634e487b7160e01b5f52601260045260245ffd5b6001600160401b038281168282160390811115611c8157611c816155d1565b634e487b7160e01b5f52603160045260245ffd5b828152604060208201525f82518060408401528060208501606085015e5f606082850101526060601f19601f8301168401019150509392505050565b5f82518060208501845e5f920191825250919050565b5f826159ff57634e487b7160e01b5f52601260045260245ffd5b50049056fea26469706673582212202261ba25ed7767199d66f80a21de0e199fca23c154ebe34ff0abfd170c42ae9264736f6c634300081b0033", } // DelegationManagerABI 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 093f64d84c..5662a0b235 100644 --- a/pkg/bindings/Eigen/binding.go +++ b/pkg/bindings/Eigen/binding.go @@ -38,7 +38,7 @@ type ERC20VotesUpgradeableCheckpoint struct { // EigenMetaData contains all meta data concerning the Eigen contract. var EigenMetaData = &bind.MetaData{ ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"_bEIGEN\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"CLOCK_MODE\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"DOMAIN_SEPARATOR\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"allowance\",\"inputs\":[{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"spender\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"allowedFrom\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"allowedTo\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"approve\",\"inputs\":[{\"name\":\"spender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"bEIGEN\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"balanceOf\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"checkpoints\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"pos\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structERC20VotesUpgradeable.Checkpoint\",\"components\":[{\"name\":\"fromBlock\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"votes\",\"type\":\"uint224\",\"internalType\":\"uint224\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"clock\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint48\",\"internalType\":\"uint48\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"decimals\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"decreaseAllowance\",\"inputs\":[{\"name\":\"spender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"subtractedValue\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"delegate\",\"inputs\":[{\"name\":\"delegatee\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"delegateBySig\",\"inputs\":[{\"name\":\"delegatee\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"nonce\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"v\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"r\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"s\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"delegates\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"disableTransferRestrictions\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"eip712Domain\",\"inputs\":[],\"outputs\":[{\"name\":\"fields\",\"type\":\"bytes1\",\"internalType\":\"bytes1\"},{\"name\":\"name\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"version\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"chainId\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"verifyingContract\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"extensions\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getPastTotalSupply\",\"inputs\":[{\"name\":\"timepoint\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getPastVotes\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"timepoint\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getVotes\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"increaseAllowance\",\"inputs\":[{\"name\":\"spender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"addedValue\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"initialOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"minters\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"mintingAllowances\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"},{\"name\":\"mintAllowedAfters\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"mint\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"mintAllowedAfter\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"mintingAllowance\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"multisend\",\"inputs\":[{\"name\":\"receivers\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"amounts\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"name\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"nonces\",\"inputs\":[{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"numCheckpoints\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"permit\",\"inputs\":[{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"spender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"deadline\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"v\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"r\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"s\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setAllowedFrom\",\"inputs\":[{\"name\":\"from\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"isAllowedFrom\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setAllowedTo\",\"inputs\":[{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"isAllowedTo\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"symbol\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"totalSupply\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"transfer\",\"inputs\":[{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"transferFrom\",\"inputs\":[{\"name\":\"from\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"transferRestrictionsDisabledAfter\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"unwrap\",\"inputs\":[{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"wrap\",\"inputs\":[{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"Approval\",\"inputs\":[{\"name\":\"owner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"spender\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegateChanged\",\"inputs\":[{\"name\":\"delegator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"fromDelegate\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"toDelegate\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegateVotesChanged\",\"inputs\":[{\"name\":\"delegate\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"previousBalance\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"newBalance\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"EIP712DomainChanged\",\"inputs\":[],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Mint\",\"inputs\":[{\"name\":\"minter\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"SetAllowedFrom\",\"inputs\":[{\"name\":\"from\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"isAllowedFrom\",\"type\":\"bool\",\"indexed\":false,\"internalType\":\"bool\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"SetAllowedTo\",\"inputs\":[{\"name\":\"to\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"isAllowedTo\",\"type\":\"bool\",\"indexed\":false,\"internalType\":\"bool\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Transfer\",\"inputs\":[{\"name\":\"from\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TransferRestrictionsDisabled\",\"inputs\":[],\"anonymous\":false}]", - Bin: "0x60a060405234801561000f575f5ffd5b5060405161352938038061352983398101604081905261002e91610105565b6001600160a01b038116608052610043610049565b50610132565b5f54610100900460ff16156100b45760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff90811614610103575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b5f60208284031215610115575f5ffd5b81516001600160a01b038116811461012b575f5ffd5b9392505050565b6080516133ca61015f5f395f81816103410152818161083e0152818161149e015261158a01526133ca5ff3fe608060405234801561000f575f5ffd5b5060043610610255575f3560e01c806381b9716111610140578063a9059cbb116100bf578063dd62ed3e11610084578063dd62ed3e146105b9578063de0e9a3e146105cc578063ea598cb0146105df578063eb415f45146105f2578063f1127ed8146105fa578063f2fde38b14610637575f5ffd5b8063a9059cbb1461055a578063aad41a411461056d578063b8c2559414610580578063c3cda52014610593578063d505accf146105a6575f5ffd5b806395d89b411161010557806395d89b411461050f5780639ab24eb0146105175780639aec4bae1461052a578063a457c2d714610534578063a7d1195d14610547575f5ffd5b806381b971611461049157806384b0196e146104b15780638da5cb5b146104cc5780638e539e8c146104dd57806391ddadf4146104f0575f5ffd5b80633a46b1a8116101d75780635c19a95c1161019c5780635c19a95c146103f05780636fcfff451461040357806370a082311461042b578063715018a61461045357806378aa33ba1461045b5780637ecebe001461047e575f5ffd5b80633a46b1a8146103295780633f4da4c61461033c5780634bf5d7e91461037b57806353957125146103a5578063587cde1e146103c5575f5ffd5b80631ffacdef1161021d5780631ffacdef146102d957806323b872dd146102ec578063313ce567146102ff5780633644e5151461030e5780633950935114610316575f5ffd5b80630455e6941461025957806306fdde0314610291578063095ea7b3146102a65780631249c58b146102b957806318160ddd146102c3575b5f5ffd5b61027c610267366004612c01565b6101336020525f908152604090205460ff1681565b60405190151581526020015b60405180910390f35b61029961064a565b6040516102889190612c48565b61027c6102b4366004612c5a565b6106da565b6102c16106f3565b005b6102cb61083b565b604051908152602001610288565b6102c16102e7366004612c8f565b6108c1565b61027c6102fa366004612cc4565b610929565b60405160128152602001610288565b6102cb61094c565b61027c610324366004612c5a565b610955565b6102cb610337366004612c5a565b610976565b6103637f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610288565b60408051808201909152600e81526d06d6f64653d74696d657374616d760941b6020820152610299565b6102cb6103b3366004612c01565b6101306020525f908152604090205481565b6103636103d3366004612c01565b6001600160a01b039081165f90815260fe60205260409020541690565b6102c16103fe366004612c01565b6109f9565b610416610411366004612c01565b610a06565b60405163ffffffff9091168152602001610288565b6102cb610439366004612c01565b6001600160a01b03165f9081526065602052604090205490565b6102c1610a27565b61027c610469366004612c01565b6101346020525f908152604090205460ff1681565b6102cb61048c366004612c01565b610a3a565b6102cb61049f366004612c01565b6101316020525f908152604090205481565b6104b9610a57565b6040516102889796959493929190612cfe565b6033546001600160a01b0316610363565b6102cb6104eb366004612d94565b610af0565b6104f8610b57565b60405165ffffffffffff9091168152602001610288565b610299610b61565b6102cb610525366004612c01565b610b70565b6102cb6101325481565b61027c610542366004612c5a565b610bed565b6102c1610555366004612e73565b610c67565b61027c610568366004612c5a565b61107b565b6102c161057b366004612fb8565b611088565b6102c161058e366004612c8f565b611158565b6102c16105a1366004613034565b6111b8565b6102c16105b4366004613088565b6112ed565b6102cb6105c73660046130ee565b61144e565b6102c16105da366004612d94565b611478565b6102c16105ed366004612d94565b611568565b6102c161165d565b61060d61060836600461311f565b611724565b60408051825163ffffffff1681526020928301516001600160e01b03169281019290925201610288565b6102c1610645366004612c01565b6117a5565b60606068805461065990613151565b80601f016020809104026020016040519081016040528092919081815260200182805461068590613151565b80156106d05780601f106106a7576101008083540402835291602001916106d0565b820191905f5260205f20905b8154815290600101906020018083116106b357829003601f168201915b5050505050905090565b5f336106e781858561181b565b60019150505b92915050565b335f908152610131602052604090205461076c5760405162461bcd60e51b815260206004820152602f60248201527f456967656e2e6d696e743a206d73672e73656e64657220686173206e6f206d6960448201526e6e74696e6720616c6c6f77616e636560881b60648201526084015b60405180910390fd5b335f908152610130602052604090205442116107e45760405162461bcd60e51b815260206004820152603160248201527f456967656e2e6d696e743a206d73672e73656e646572206973206e6f7420616c6044820152701b1bddd959081d1bc81b5a5b9d081e595d607a1b6064820152608401610763565b335f81815261013160205260408120805491905590610803908261193e565b60405181815233907f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d41213968859060200160405180910390a250565b5f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610898573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108bc9190613183565b905090565b6108c96119d4565b6001600160a01b0382165f8181526101336020908152604091829020805460ff191685151590811790915591519182527fcf20b1ecb604b0e8888d579c64e8a3b10e590d45c1c2dddb393bed284362227191015b60405180910390a25050565b5f33610936858285611a2e565b610941858585611aa0565b506001949350505050565b5f6108bc611c5a565b5f336106e7818585610967838361144e565b61097191906131ae565b61181b565b5f61097f610b57565b65ffffffffffff1682106109d15760405162461bcd60e51b815260206004820152601960248201527804552433230566f7465733a20667574757265206c6f6f6b757603c1b6044820152606401610763565b6001600160a01b0383165f90815260ff602052604090206109f29083611c63565b9392505050565b610a033382611d44565b50565b6001600160a01b0381165f90815260ff60205260408120546106ed90611dbd565b610a2f6119d4565b610a385f611e25565b565b6001600160a01b0381165f90815260cb60205260408120546106ed565b5f6060805f5f5f60606097545f5f1b148015610a735750609854155b610ab75760405162461bcd60e51b81526020600482015260156024820152741152540dcc4c8e88155b9a5b9a5d1a585b1a5e9959605a1b6044820152606401610763565b610abf611e76565b610ac7611e85565b604080515f80825260208201909252600f60f81b9b939a50919850469750309650945092509050565b5f610af9610b57565b65ffffffffffff168210610b4b5760405162461bcd60e51b815260206004820152601960248201527804552433230566f7465733a20667574757265206c6f6f6b757603c1b6044820152606401610763565b6106ed61010083611c63565b5f6108bc42611e94565b60606069805461065990613151565b6001600160a01b0381165f90815260ff60205260408120548015610bdb576001600160a01b0383165f90815260ff6020526040902080545f198301908110610bba57610bba6131c1565b5f9182526020909120015464010000000090046001600160e01b0316610bdd565b5f5b6001600160e01b03169392505050565b5f3381610bfa828661144e565b905083811015610c5a5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610763565b610941828686840361181b565b5f54610100900460ff1615808015610c8557505f54600160ff909116105b80610c9e5750303b158015610c9e57505f5460ff166001145b610d015760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610763565b5f805460ff191660011790558015610d22575f805461ff0019166101001790555b610d2a611efa565b610d6e6040518060400160405280600581526020016422b4b3b2b760d91b8152506040518060400160405280600581526020016422a4a3a2a760d91b815250611f28565b610d7785611e25565b610d9d6040518060400160405280600581526020016422a4a3a2a760d91b815250611f5c565b8251845114610e245760405162461bcd60e51b815260206004820152604760248201527f456967656e2e696e697469616c697a653a206d696e7465727320616e64206d6960448201527f6e74696e67416c6c6f77616e636573206d757374206265207468652073616d65606482015266040d8cadccee8d60cb1b608482015260a401610763565b8151845114610eab5760405162461bcd60e51b815260206004820152604760248201527f456967656e2e696e697469616c697a653a206d696e7465727320616e64206d6960448201527f6e74416c6c6f776564416674657273206d757374206265207468652073616d65606482015266040d8cadccee8d60cb1b608482015260a401610763565b5f5b845181101561102857838181518110610ec857610ec86131c1565b60200260200101516101315f878481518110610ee657610ee66131c1565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020015f2081905550828181518110610f2357610f236131c1565b60200260200101516101305f878481518110610f4157610f416131c1565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020015f208190555060016101335f878481518110610f8457610f846131c1565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020015f205f6101000a81548160ff021916908315150217905550848181518110610fd357610fd36131c1565b60200260200101516001600160a01b03167fcf20b1ecb604b0e8888d579c64e8a3b10e590d45c1c2dddb393bed28436222716001604051611018911515815260200190565b60405180910390a2600101610ead565b505f19610132558015611074575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050505050565b5f336106e7818585611aa0565b8281146110fd5760405162461bcd60e51b815260206004820152603e60248201527f456967656e2e6d756c746973656e643a2072656365697665727320616e64206160448201527f6d6f756e7473206d757374206265207468652073616d65206c656e67746800006064820152608401610763565b5f5b83811015611074576111503386868481811061111d5761111d6131c1565b90506020020160208101906111329190612c01565b858585818110611144576111446131c1565b90506020020135611aa0565b6001016110ff565b6111606119d4565b6001600160a01b0382165f8181526101346020908152604091829020805460ff191685151590811790915591519182527f72a561d1af7409467dae4f1e9fc52590a9335a1dda17727e2b6aa8c4db35109b910161091d565b834211156112085760405162461bcd60e51b815260206004820152601d60248201527f4552433230566f7465733a207369676e617475726520657870697265640000006044820152606401610763565b604080517fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf60208201526001600160a01b0388169181019190915260608101869052608081018590525f90611281906112799060a00160405160208183030381529060405280519060200120611fa5565b858585611fd1565b905061128c81611ff7565b86146112da5760405162461bcd60e51b815260206004820152601960248201527f4552433230566f7465733a20696e76616c6964206e6f6e6365000000000000006044820152606401610763565b6112e48188611d44565b50505050505050565b8342111561133d5760405162461bcd60e51b815260206004820152601d60248201527f45524332305065726d69743a206578706972656420646561646c696e650000006044820152606401610763565b5f7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c988888861136b8c611ff7565b6040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090505f6113c582611fa5565b90505f6113d482878787611fd1565b9050896001600160a01b0316816001600160a01b0316146114375760405162461bcd60e51b815260206004820152601e60248201527f45524332305065726d69743a20696e76616c6964207369676e617475726500006044820152606401610763565b6114428a8a8a61181b565b50505050505050505050565b6001600160a01b039182165f90815260666020908152604080832093909416825291909152205490565b611482338261201e565b60405163a9059cbb60e01b8152336004820152602481018290527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063a9059cbb906044016020604051808303815f875af11580156114ec573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061151091906131d5565b610a035760405162461bcd60e51b8152602060048201526024808201527f456967656e2e756e777261703a2062454947454e207472616e736665722066616044820152631a5b195960e21b6064820152608401610763565b6040516323b872dd60e01b8152336004820152306024820152604481018290527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906323b872dd906064016020604051808303815f875af11580156115d8573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115fc91906131d5565b6116535760405162461bcd60e51b815260206004820152602260248201527f456967656e2e777261703a2062454947454e207472616e73666572206661696c604482015261195960f21b6064820152608401610763565b610a03338261193e565b6116656119d4565b5f1961013254146116f45760405162461bcd60e51b815260206004820152604d60248201527f456967656e2e64697361626c655472616e736665725265737472696374696f6e60448201527f733a207472616e73666572207265737472696374696f6e732061726520616c7260648201526c1958591e48191a5cd8589b1959609a1b608482015260a401610763565b5f6101328190556040517f2b18986d3ba809db2f13a5d7bf17f60d357b37d9cbb55dd71cbbac8dc4060f649190a1565b604080518082019091525f80825260208201526001600160a01b0383165f90815260ff60205260409020805463ffffffff8416908110611766576117666131c1565b5f9182526020918290206040805180820190915291015463ffffffff8116825264010000000090046001600160e01b0316918101919091529392505050565b6117ad6119d4565b6001600160a01b0381166118125760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610763565b610a0381611e25565b6001600160a01b03831661187d5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610763565b6001600160a01b0382166118de5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610763565b6001600160a01b038381165f8181526066602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6119488282612037565b6001600160e01b0361195861083b565b11156119bf5760405162461bcd60e51b815260206004820152603060248201527f4552433230566f7465733a20746f74616c20737570706c79207269736b73206f60448201526f766572666c6f77696e6720766f74657360801b6064820152608401610763565b6119ce61010061210883612113565b50505050565b6033546001600160a01b03163314610a385760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610763565b5f611a39848461144e565b90505f1981146119ce5781811015611a935760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610763565b6119ce848484840361181b565b6001600160a01b038316611b045760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610763565b6001600160a01b038216611b665760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610763565b611b7183838361227f565b6001600160a01b0383165f9081526065602052604090205481811015611be85760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610763565b6001600160a01b038085165f8181526065602052604080822086860390559286168082529083902080548601905591517fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90611c479086815260200190565b60405180910390a36119ce848484612363565b5f6108bc612394565b81545f9081816005811115611cba575f611c7c84612407565b611c8690856131f0565b5f88815260209020909150869082015463ffffffff161115611caa57809150611cb8565b611cb58160016131ae565b92505b505b80821015611d05575f611ccd83836124eb565b5f88815260209020909150869082015463ffffffff161115611cf157809150611cff565b611cfc8160016131ae565b92505b50611cba565b8015611d2f575f8681526020902081015f19015464010000000090046001600160e01b0316611d31565b5f5b6001600160e01b03169695505050505050565b6001600160a01b038281165f81815260fe6020818152604080842080546065845282862054949093528787166001600160a01b03198416811790915590519190951694919391928592917f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f9190a46119ce828483612505565b5f63ffffffff821115611e215760405162461bcd60e51b815260206004820152602660248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203360448201526532206269747360d01b6064820152608401610763565b5090565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b60606099805461065990613151565b6060609a805461065990613151565b5f65ffffffffffff821115611e215760405162461bcd60e51b815260206004820152602660248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203460448201526538206269747360d01b6064820152608401610763565b5f54610100900460ff16611f205760405162461bcd60e51b815260040161076390613203565b610a3861263f565b5f54610100900460ff16611f4e5760405162461bcd60e51b815260040161076390613203565b611f58828261266e565b5050565b5f54610100900460ff16611f825760405162461bcd60e51b815260040161076390613203565b610a0381604051806040016040528060018152602001603160f81b8152506126ad565b5f6106ed611fb1611c5a565b8360405161190160f01b8152600281019290925260228201526042902090565b5f5f5f611fe0878787876126fa565b91509150611fed816127b7565b5095945050505050565b6001600160a01b0381165f90815260cb602052604090208054600181018255905b50919050565b6120288282612900565b6119ce610100612a4383612113565b6001600160a01b03821661208d5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610763565b6120985f838361227f565b8060675f8282546120a991906131ae565b90915550506001600160a01b0382165f818152606560209081526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3611f585f8383612363565b5f6109f282846131ae565b82545f90819081811561215d575f8781526020902082015f190160408051808201909152905463ffffffff8116825264010000000090046001600160e01b03166020820152612171565b604080518082019091525f80825260208201525b905080602001516001600160e01b0316935061219184868863ffffffff16565b92505f821180156121b957506121a5610b57565b65ffffffffffff16815f015163ffffffff16145b156121fc576121c783612a4e565b5f8881526020902083015f190180546001600160e01b03929092166401000000000263ffffffff909216919091179055612275565b866040518060400160405280612220612213610b57565b65ffffffffffff16611dbd565b63ffffffff16815260200161223486612a4e565b6001600160e01b0390811690915282546001810184555f938452602093849020835194909301519091166401000000000263ffffffff909316929092179101555b5050935093915050565b61013254421161235e576001600160a01b03831615806122a657506001600160a01b038216155b806122c957506001600160a01b0383165f908152610133602052604090205460ff165b806122ec57506001600160a01b0382165f908152610134602052604090205460ff165b61235e5760405162461bcd60e51b815260206004820152603a60248201527f456967656e2e5f6265666f7265546f6b656e5472616e736665723a2066726f6d60448201527f206f7220746f206d7573742062652077686974656c69737465640000000000006064820152608401610763565b505050565b6001600160a01b038381165f90815260fe602052604080822054858416835291205461235e92918216911683612505565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f6123be612ab6565b6123c6612b0e565b60408051602081019490945283019190915260608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b5f815f0361241657505f919050565b5f600161242284612b3e565b901c6001901b9050600181848161243b5761243b61324e565b048201901c905060018184816124535761245361324e565b048201901c9050600181848161246b5761246b61324e565b048201901c905060018184816124835761248361324e565b048201901c9050600181848161249b5761249b61324e565b048201901c905060018184816124b3576124b361324e565b048201901c905060018184816124cb576124cb61324e565b048201901c90506109f2818285816124e5576124e561324e565b04612bd1565b5f6124f96002848418613262565b6109f2908484166131ae565b816001600160a01b0316836001600160a01b03161415801561252657505f81115b1561235e576001600160a01b038316156125b3576001600160a01b0383165f90815260ff60205260408120819061256090612a4385612113565b91509150846001600160a01b03167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a72483836040516125a8929190918252602082015260400190565b60405180910390a250505b6001600160a01b0382161561235e576001600160a01b0382165f90815260ff6020526040812081906125e89061210885612113565b91509150836001600160a01b03167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a7248383604051612630929190918252602082015260400190565b60405180910390a25050505050565b5f54610100900460ff166126655760405162461bcd60e51b815260040161076390613203565b610a3833611e25565b5f54610100900460ff166126945760405162461bcd60e51b815260040161076390613203565b60686126a083826132c5565b50606961235e82826132c5565b5f54610100900460ff166126d35760405162461bcd60e51b815260040161076390613203565b60996126df83826132c5565b50609a6126ec82826132c5565b50505f609781905560985550565b5f807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a083111561272f57505f905060036127ae565b604080515f8082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015612780573d5f5f3e3d5ffd5b5050604051601f1901519150506001600160a01b0381166127a8575f600192509250506127ae565b91505f90505b94509492505050565b5f8160048111156127ca576127ca613380565b036127d25750565b60018160048111156127e6576127e6613380565b036128335760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610763565b600281600481111561284757612847613380565b036128945760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610763565b60038160048111156128a8576128a8613380565b03610a035760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401610763565b6001600160a01b0382166129605760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401610763565b61296b825f8361227f565b6001600160a01b0382165f90815260656020526040902054818110156129de5760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b6064820152608401610763565b6001600160a01b0383165f8181526065602090815260408083208686039055606780548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a361235e835f84612363565b5f6109f282846131f0565b5f6001600160e01b03821115611e215760405162461bcd60e51b815260206004820152602760248201527f53616665436173743a2076616c756520646f65736e27742066697420696e20326044820152663234206269747360c81b6064820152608401610763565b5f5f612ac0611e76565b805190915015612ad7578051602090910120919050565b6097548015612ae65792915050565b7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4709250505090565b5f5f612b18611e85565b805190915015612b2f578051602090910120919050565b6098548015612ae65792915050565b5f80608083901c15612b5257608092831c92015b604083901c15612b6457604092831c92015b602083901c15612b7657602092831c92015b601083901c15612b8857601092831c92015b600883901c15612b9a57600892831c92015b600483901c15612bac57600492831c92015b600283901c15612bbe57600292831c92015b600183901c156106ed5760010192915050565b5f818310612bdf57816109f2565b5090919050565b80356001600160a01b0381168114612bfc575f5ffd5b919050565b5f60208284031215612c11575f5ffd5b6109f282612be6565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f6109f26020830184612c1a565b5f5f60408385031215612c6b575f5ffd5b612c7483612be6565b946020939093013593505050565b8015158114610a03575f5ffd5b5f5f60408385031215612ca0575f5ffd5b612ca983612be6565b91506020830135612cb981612c82565b809150509250929050565b5f5f5f60608486031215612cd6575f5ffd5b612cdf84612be6565b9250612ced60208501612be6565b929592945050506040919091013590565b60ff60f81b8816815260e060208201525f612d1c60e0830189612c1a565b8281036040840152612d2e8189612c1a565b606084018890526001600160a01b038716608085015260a0840186905283810360c0850152845180825260208087019350909101905f5b81811015612d83578351835260209384019390920191600101612d65565b50909b9a5050505050505050505050565b5f60208284031215612da4575f5ffd5b5035919050565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f1916810167ffffffffffffffff81118282101715612de857612de8612dab565b604052919050565b5f67ffffffffffffffff821115612e0957612e09612dab565b5060051b60200190565b5f82601f830112612e22575f5ffd5b8135612e35612e3082612df0565b612dbf565b8082825260208201915060208360051b860101925085831115612e56575f5ffd5b602085015b83811015611fed578035835260209283019201612e5b565b5f5f5f5f60808587031215612e86575f5ffd5b612e8f85612be6565b9350602085013567ffffffffffffffff811115612eaa575f5ffd5b8501601f81018713612eba575f5ffd5b8035612ec8612e3082612df0565b8082825260208201915060208360051b850101925089831115612ee9575f5ffd5b6020840193505b82841015612f1257612f0184612be6565b825260209384019390910190612ef0565b9550505050604085013567ffffffffffffffff811115612f30575f5ffd5b612f3c87828801612e13565b925050606085013567ffffffffffffffff811115612f58575f5ffd5b612f6487828801612e13565b91505092959194509250565b5f5f83601f840112612f80575f5ffd5b50813567ffffffffffffffff811115612f97575f5ffd5b6020830191508360208260051b8501011115612fb1575f5ffd5b9250929050565b5f5f5f5f60408587031215612fcb575f5ffd5b843567ffffffffffffffff811115612fe1575f5ffd5b612fed87828801612f70565b909550935050602085013567ffffffffffffffff81111561300c575f5ffd5b61301887828801612f70565b95989497509550505050565b803560ff81168114612bfc575f5ffd5b5f5f5f5f5f5f60c08789031215613049575f5ffd5b61305287612be6565b9550602087013594506040870135935061306e60608801613024565b9598949750929560808101359460a0909101359350915050565b5f5f5f5f5f5f5f60e0888a03121561309e575f5ffd5b6130a788612be6565b96506130b560208901612be6565b955060408801359450606088013593506130d160808901613024565b9699959850939692959460a0840135945060c09093013592915050565b5f5f604083850312156130ff575f5ffd5b61310883612be6565b915061311660208401612be6565b90509250929050565b5f5f60408385031215613130575f5ffd5b61313983612be6565b9150602083013563ffffffff81168114612cb9575f5ffd5b600181811c9082168061316557607f821691505b60208210810361201857634e487b7160e01b5f52602260045260245ffd5b5f60208284031215613193575f5ffd5b5051919050565b634e487b7160e01b5f52601160045260245ffd5b808201808211156106ed576106ed61319a565b634e487b7160e01b5f52603260045260245ffd5b5f602082840312156131e5575f5ffd5b81516109f281612c82565b818103818111156106ed576106ed61319a565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b634e487b7160e01b5f52601260045260245ffd5b5f8261327c57634e487b7160e01b5f52601260045260245ffd5b500490565b601f82111561235e57805f5260205f20601f840160051c810160208510156132a65750805b601f840160051c820191505b81811015611074575f81556001016132b2565b815167ffffffffffffffff8111156132df576132df612dab565b6132f3816132ed8454613151565b84613281565b6020601f821160018114613325575f831561330e5750848201515b5f19600385901b1c1916600184901b178455611074565b5f84815260208120601f198516915b828110156133545787850151825560209485019460019092019101613334565b508482101561337157868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b634e487b7160e01b5f52602160045260245ffdfea2646970667358221220288064199d2be90b93729dff2dcc2497b661bd2af455c43da5f6db62c74e88c364736f6c634300081b0033", + Bin: "0x60a060405234801561000f575f5ffd5b5060405161352938038061352983398101604081905261002e91610105565b6001600160a01b038116608052610043610049565b50610132565b5f54610100900460ff16156100b45760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff90811614610103575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b5f60208284031215610115575f5ffd5b81516001600160a01b038116811461012b575f5ffd5b9392505050565b6080516133ca61015f5f395f81816103410152818161083e0152818161149e015261158a01526133ca5ff3fe608060405234801561000f575f5ffd5b5060043610610255575f3560e01c806381b9716111610140578063a9059cbb116100bf578063dd62ed3e11610084578063dd62ed3e146105b9578063de0e9a3e146105cc578063ea598cb0146105df578063eb415f45146105f2578063f1127ed8146105fa578063f2fde38b14610637575f5ffd5b8063a9059cbb1461055a578063aad41a411461056d578063b8c2559414610580578063c3cda52014610593578063d505accf146105a6575f5ffd5b806395d89b411161010557806395d89b411461050f5780639ab24eb0146105175780639aec4bae1461052a578063a457c2d714610534578063a7d1195d14610547575f5ffd5b806381b971611461049157806384b0196e146104b15780638da5cb5b146104cc5780638e539e8c146104dd57806391ddadf4146104f0575f5ffd5b80633a46b1a8116101d75780635c19a95c1161019c5780635c19a95c146103f05780636fcfff451461040357806370a082311461042b578063715018a61461045357806378aa33ba1461045b5780637ecebe001461047e575f5ffd5b80633a46b1a8146103295780633f4da4c61461033c5780634bf5d7e91461037b57806353957125146103a5578063587cde1e146103c5575f5ffd5b80631ffacdef1161021d5780631ffacdef146102d957806323b872dd146102ec578063313ce567146102ff5780633644e5151461030e5780633950935114610316575f5ffd5b80630455e6941461025957806306fdde0314610291578063095ea7b3146102a65780631249c58b146102b957806318160ddd146102c3575b5f5ffd5b61027c610267366004612c01565b6101336020525f908152604090205460ff1681565b60405190151581526020015b60405180910390f35b61029961064a565b6040516102889190612c48565b61027c6102b4366004612c5a565b6106da565b6102c16106f3565b005b6102cb61083b565b604051908152602001610288565b6102c16102e7366004612c8f565b6108c1565b61027c6102fa366004612cc4565b610929565b60405160128152602001610288565b6102cb61094c565b61027c610324366004612c5a565b610955565b6102cb610337366004612c5a565b610976565b6103637f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610288565b60408051808201909152600e81526d06d6f64653d74696d657374616d760941b6020820152610299565b6102cb6103b3366004612c01565b6101306020525f908152604090205481565b6103636103d3366004612c01565b6001600160a01b039081165f90815260fe60205260409020541690565b6102c16103fe366004612c01565b6109f9565b610416610411366004612c01565b610a06565b60405163ffffffff9091168152602001610288565b6102cb610439366004612c01565b6001600160a01b03165f9081526065602052604090205490565b6102c1610a27565b61027c610469366004612c01565b6101346020525f908152604090205460ff1681565b6102cb61048c366004612c01565b610a3a565b6102cb61049f366004612c01565b6101316020525f908152604090205481565b6104b9610a57565b6040516102889796959493929190612cfe565b6033546001600160a01b0316610363565b6102cb6104eb366004612d94565b610af0565b6104f8610b57565b60405165ffffffffffff9091168152602001610288565b610299610b61565b6102cb610525366004612c01565b610b70565b6102cb6101325481565b61027c610542366004612c5a565b610bed565b6102c1610555366004612e73565b610c67565b61027c610568366004612c5a565b61107b565b6102c161057b366004612fb8565b611088565b6102c161058e366004612c8f565b611158565b6102c16105a1366004613034565b6111b8565b6102c16105b4366004613088565b6112ed565b6102cb6105c73660046130ee565b61144e565b6102c16105da366004612d94565b611478565b6102c16105ed366004612d94565b611568565b6102c161165d565b61060d61060836600461311f565b611724565b60408051825163ffffffff1681526020928301516001600160e01b03169281019290925201610288565b6102c1610645366004612c01565b6117a5565b60606068805461065990613151565b80601f016020809104026020016040519081016040528092919081815260200182805461068590613151565b80156106d05780601f106106a7576101008083540402835291602001916106d0565b820191905f5260205f20905b8154815290600101906020018083116106b357829003601f168201915b5050505050905090565b5f336106e781858561181b565b60019150505b92915050565b335f908152610131602052604090205461076c5760405162461bcd60e51b815260206004820152602f60248201527f456967656e2e6d696e743a206d73672e73656e64657220686173206e6f206d6960448201526e6e74696e6720616c6c6f77616e636560881b60648201526084015b60405180910390fd5b335f908152610130602052604090205442116107e45760405162461bcd60e51b815260206004820152603160248201527f456967656e2e6d696e743a206d73672e73656e646572206973206e6f7420616c6044820152701b1bddd959081d1bc81b5a5b9d081e595d607a1b6064820152608401610763565b335f81815261013160205260408120805491905590610803908261193e565b60405181815233907f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d41213968859060200160405180910390a250565b5f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610898573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108bc9190613183565b905090565b6108c96119d4565b6001600160a01b0382165f8181526101336020908152604091829020805460ff191685151590811790915591519182527fcf20b1ecb604b0e8888d579c64e8a3b10e590d45c1c2dddb393bed284362227191015b60405180910390a25050565b5f33610936858285611a2e565b610941858585611aa0565b506001949350505050565b5f6108bc611c5a565b5f336106e7818585610967838361144e565b61097191906131ae565b61181b565b5f61097f610b57565b65ffffffffffff1682106109d15760405162461bcd60e51b815260206004820152601960248201527804552433230566f7465733a20667574757265206c6f6f6b757603c1b6044820152606401610763565b6001600160a01b0383165f90815260ff602052604090206109f29083611c63565b9392505050565b610a033382611d44565b50565b6001600160a01b0381165f90815260ff60205260408120546106ed90611dbd565b610a2f6119d4565b610a385f611e25565b565b6001600160a01b0381165f90815260cb60205260408120546106ed565b5f6060805f5f5f60606097545f5f1b148015610a735750609854155b610ab75760405162461bcd60e51b81526020600482015260156024820152741152540dcc4c8e88155b9a5b9a5d1a585b1a5e9959605a1b6044820152606401610763565b610abf611e76565b610ac7611e85565b604080515f80825260208201909252600f60f81b9b939a50919850469750309650945092509050565b5f610af9610b57565b65ffffffffffff168210610b4b5760405162461bcd60e51b815260206004820152601960248201527804552433230566f7465733a20667574757265206c6f6f6b757603c1b6044820152606401610763565b6106ed61010083611c63565b5f6108bc42611e94565b60606069805461065990613151565b6001600160a01b0381165f90815260ff60205260408120548015610bdb576001600160a01b0383165f90815260ff6020526040902080545f198301908110610bba57610bba6131c1565b5f9182526020909120015464010000000090046001600160e01b0316610bdd565b5f5b6001600160e01b03169392505050565b5f3381610bfa828661144e565b905083811015610c5a5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610763565b610941828686840361181b565b5f54610100900460ff1615808015610c8557505f54600160ff909116105b80610c9e5750303b158015610c9e57505f5460ff166001145b610d015760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610763565b5f805460ff191660011790558015610d22575f805461ff0019166101001790555b610d2a611efa565b610d6e6040518060400160405280600581526020016422b4b3b2b760d91b8152506040518060400160405280600581526020016422a4a3a2a760d91b815250611f28565b610d7785611e25565b610d9d6040518060400160405280600581526020016422a4a3a2a760d91b815250611f5c565b8251845114610e245760405162461bcd60e51b815260206004820152604760248201527f456967656e2e696e697469616c697a653a206d696e7465727320616e64206d6960448201527f6e74696e67416c6c6f77616e636573206d757374206265207468652073616d65606482015266040d8cadccee8d60cb1b608482015260a401610763565b8151845114610eab5760405162461bcd60e51b815260206004820152604760248201527f456967656e2e696e697469616c697a653a206d696e7465727320616e64206d6960448201527f6e74416c6c6f776564416674657273206d757374206265207468652073616d65606482015266040d8cadccee8d60cb1b608482015260a401610763565b5f5b845181101561102857838181518110610ec857610ec86131c1565b60200260200101516101315f878481518110610ee657610ee66131c1565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020015f2081905550828181518110610f2357610f236131c1565b60200260200101516101305f878481518110610f4157610f416131c1565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020015f208190555060016101335f878481518110610f8457610f846131c1565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020015f205f6101000a81548160ff021916908315150217905550848181518110610fd357610fd36131c1565b60200260200101516001600160a01b03167fcf20b1ecb604b0e8888d579c64e8a3b10e590d45c1c2dddb393bed28436222716001604051611018911515815260200190565b60405180910390a2600101610ead565b505f19610132558015611074575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050505050565b5f336106e7818585611aa0565b8281146110fd5760405162461bcd60e51b815260206004820152603e60248201527f456967656e2e6d756c746973656e643a2072656365697665727320616e64206160448201527f6d6f756e7473206d757374206265207468652073616d65206c656e67746800006064820152608401610763565b5f5b83811015611074576111503386868481811061111d5761111d6131c1565b90506020020160208101906111329190612c01565b858585818110611144576111446131c1565b90506020020135611aa0565b6001016110ff565b6111606119d4565b6001600160a01b0382165f8181526101346020908152604091829020805460ff191685151590811790915591519182527f72a561d1af7409467dae4f1e9fc52590a9335a1dda17727e2b6aa8c4db35109b910161091d565b834211156112085760405162461bcd60e51b815260206004820152601d60248201527f4552433230566f7465733a207369676e617475726520657870697265640000006044820152606401610763565b604080517fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf60208201526001600160a01b0388169181019190915260608101869052608081018590525f90611281906112799060a00160405160208183030381529060405280519060200120611fa5565b858585611fd1565b905061128c81611ff7565b86146112da5760405162461bcd60e51b815260206004820152601960248201527f4552433230566f7465733a20696e76616c6964206e6f6e6365000000000000006044820152606401610763565b6112e48188611d44565b50505050505050565b8342111561133d5760405162461bcd60e51b815260206004820152601d60248201527f45524332305065726d69743a206578706972656420646561646c696e650000006044820152606401610763565b5f7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c988888861136b8c611ff7565b6040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090505f6113c582611fa5565b90505f6113d482878787611fd1565b9050896001600160a01b0316816001600160a01b0316146114375760405162461bcd60e51b815260206004820152601e60248201527f45524332305065726d69743a20696e76616c6964207369676e617475726500006044820152606401610763565b6114428a8a8a61181b565b50505050505050505050565b6001600160a01b039182165f90815260666020908152604080832093909416825291909152205490565b611482338261201e565b60405163a9059cbb60e01b8152336004820152602481018290527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063a9059cbb906044016020604051808303815f875af11580156114ec573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061151091906131d5565b610a035760405162461bcd60e51b8152602060048201526024808201527f456967656e2e756e777261703a2062454947454e207472616e736665722066616044820152631a5b195960e21b6064820152608401610763565b6040516323b872dd60e01b8152336004820152306024820152604481018290527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906323b872dd906064016020604051808303815f875af11580156115d8573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115fc91906131d5565b6116535760405162461bcd60e51b815260206004820152602260248201527f456967656e2e777261703a2062454947454e207472616e73666572206661696c604482015261195960f21b6064820152608401610763565b610a03338261193e565b6116656119d4565b5f1961013254146116f45760405162461bcd60e51b815260206004820152604d60248201527f456967656e2e64697361626c655472616e736665725265737472696374696f6e60448201527f733a207472616e73666572207265737472696374696f6e732061726520616c7260648201526c1958591e48191a5cd8589b1959609a1b608482015260a401610763565b5f6101328190556040517f2b18986d3ba809db2f13a5d7bf17f60d357b37d9cbb55dd71cbbac8dc4060f649190a1565b604080518082019091525f80825260208201526001600160a01b0383165f90815260ff60205260409020805463ffffffff8416908110611766576117666131c1565b5f9182526020918290206040805180820190915291015463ffffffff8116825264010000000090046001600160e01b0316918101919091529392505050565b6117ad6119d4565b6001600160a01b0381166118125760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610763565b610a0381611e25565b6001600160a01b03831661187d5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610763565b6001600160a01b0382166118de5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610763565b6001600160a01b038381165f8181526066602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6119488282612037565b6001600160e01b0361195861083b565b11156119bf5760405162461bcd60e51b815260206004820152603060248201527f4552433230566f7465733a20746f74616c20737570706c79207269736b73206f60448201526f766572666c6f77696e6720766f74657360801b6064820152608401610763565b6119ce61010061210883612113565b50505050565b6033546001600160a01b03163314610a385760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610763565b5f611a39848461144e565b90505f1981146119ce5781811015611a935760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610763565b6119ce848484840361181b565b6001600160a01b038316611b045760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610763565b6001600160a01b038216611b665760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610763565b611b7183838361227f565b6001600160a01b0383165f9081526065602052604090205481811015611be85760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610763565b6001600160a01b038085165f8181526065602052604080822086860390559286168082529083902080548601905591517fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90611c479086815260200190565b60405180910390a36119ce848484612363565b5f6108bc612394565b81545f9081816005811115611cba575f611c7c84612407565b611c8690856131f0565b5f88815260209020909150869082015463ffffffff161115611caa57809150611cb8565b611cb58160016131ae565b92505b505b80821015611d05575f611ccd83836124eb565b5f88815260209020909150869082015463ffffffff161115611cf157809150611cff565b611cfc8160016131ae565b92505b50611cba565b8015611d2f575f8681526020902081015f19015464010000000090046001600160e01b0316611d31565b5f5b6001600160e01b03169695505050505050565b6001600160a01b038281165f81815260fe6020818152604080842080546065845282862054949093528787166001600160a01b03198416811790915590519190951694919391928592917f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f9190a46119ce828483612505565b5f63ffffffff821115611e215760405162461bcd60e51b815260206004820152602660248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203360448201526532206269747360d01b6064820152608401610763565b5090565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b60606099805461065990613151565b6060609a805461065990613151565b5f65ffffffffffff821115611e215760405162461bcd60e51b815260206004820152602660248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203460448201526538206269747360d01b6064820152608401610763565b5f54610100900460ff16611f205760405162461bcd60e51b815260040161076390613203565b610a3861263f565b5f54610100900460ff16611f4e5760405162461bcd60e51b815260040161076390613203565b611f58828261266e565b5050565b5f54610100900460ff16611f825760405162461bcd60e51b815260040161076390613203565b610a0381604051806040016040528060018152602001603160f81b8152506126ad565b5f6106ed611fb1611c5a565b8360405161190160f01b8152600281019290925260228201526042902090565b5f5f5f611fe0878787876126fa565b91509150611fed816127b7565b5095945050505050565b6001600160a01b0381165f90815260cb602052604090208054600181018255905b50919050565b6120288282612900565b6119ce610100612a4383612113565b6001600160a01b03821661208d5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610763565b6120985f838361227f565b8060675f8282546120a991906131ae565b90915550506001600160a01b0382165f818152606560209081526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3611f585f8383612363565b5f6109f282846131ae565b82545f90819081811561215d575f8781526020902082015f190160408051808201909152905463ffffffff8116825264010000000090046001600160e01b03166020820152612171565b604080518082019091525f80825260208201525b905080602001516001600160e01b0316935061219184868863ffffffff16565b92505f821180156121b957506121a5610b57565b65ffffffffffff16815f015163ffffffff16145b156121fc576121c783612a4e565b5f8881526020902083015f190180546001600160e01b03929092166401000000000263ffffffff909216919091179055612275565b866040518060400160405280612220612213610b57565b65ffffffffffff16611dbd565b63ffffffff16815260200161223486612a4e565b6001600160e01b0390811690915282546001810184555f938452602093849020835194909301519091166401000000000263ffffffff909316929092179101555b5050935093915050565b61013254421161235e576001600160a01b03831615806122a657506001600160a01b038216155b806122c957506001600160a01b0383165f908152610133602052604090205460ff165b806122ec57506001600160a01b0382165f908152610134602052604090205460ff165b61235e5760405162461bcd60e51b815260206004820152603a60248201527f456967656e2e5f6265666f7265546f6b656e5472616e736665723a2066726f6d60448201527f206f7220746f206d7573742062652077686974656c69737465640000000000006064820152608401610763565b505050565b6001600160a01b038381165f90815260fe602052604080822054858416835291205461235e92918216911683612505565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f6123be612ab6565b6123c6612b0e565b60408051602081019490945283019190915260608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b5f815f0361241657505f919050565b5f600161242284612b3e565b901c6001901b9050600181848161243b5761243b61324e565b048201901c905060018184816124535761245361324e565b048201901c9050600181848161246b5761246b61324e565b048201901c905060018184816124835761248361324e565b048201901c9050600181848161249b5761249b61324e565b048201901c905060018184816124b3576124b361324e565b048201901c905060018184816124cb576124cb61324e565b048201901c90506109f2818285816124e5576124e561324e565b04612bd1565b5f6124f96002848418613262565b6109f2908484166131ae565b816001600160a01b0316836001600160a01b03161415801561252657505f81115b1561235e576001600160a01b038316156125b3576001600160a01b0383165f90815260ff60205260408120819061256090612a4385612113565b91509150846001600160a01b03167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a72483836040516125a8929190918252602082015260400190565b60405180910390a250505b6001600160a01b0382161561235e576001600160a01b0382165f90815260ff6020526040812081906125e89061210885612113565b91509150836001600160a01b03167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a7248383604051612630929190918252602082015260400190565b60405180910390a25050505050565b5f54610100900460ff166126655760405162461bcd60e51b815260040161076390613203565b610a3833611e25565b5f54610100900460ff166126945760405162461bcd60e51b815260040161076390613203565b60686126a083826132c5565b50606961235e82826132c5565b5f54610100900460ff166126d35760405162461bcd60e51b815260040161076390613203565b60996126df83826132c5565b50609a6126ec82826132c5565b50505f609781905560985550565b5f807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a083111561272f57505f905060036127ae565b604080515f8082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015612780573d5f5f3e3d5ffd5b5050604051601f1901519150506001600160a01b0381166127a8575f600192509250506127ae565b91505f90505b94509492505050565b5f8160048111156127ca576127ca613380565b036127d25750565b60018160048111156127e6576127e6613380565b036128335760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610763565b600281600481111561284757612847613380565b036128945760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610763565b60038160048111156128a8576128a8613380565b03610a035760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401610763565b6001600160a01b0382166129605760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401610763565b61296b825f8361227f565b6001600160a01b0382165f90815260656020526040902054818110156129de5760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b6064820152608401610763565b6001600160a01b0383165f8181526065602090815260408083208686039055606780548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a361235e835f84612363565b5f6109f282846131f0565b5f6001600160e01b03821115611e215760405162461bcd60e51b815260206004820152602760248201527f53616665436173743a2076616c756520646f65736e27742066697420696e20326044820152663234206269747360c81b6064820152608401610763565b5f5f612ac0611e76565b805190915015612ad7578051602090910120919050565b6097548015612ae65792915050565b7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4709250505090565b5f5f612b18611e85565b805190915015612b2f578051602090910120919050565b6098548015612ae65792915050565b5f80608083901c15612b5257608092831c92015b604083901c15612b6457604092831c92015b602083901c15612b7657602092831c92015b601083901c15612b8857601092831c92015b600883901c15612b9a57600892831c92015b600483901c15612bac57600492831c92015b600283901c15612bbe57600292831c92015b600183901c156106ed5760010192915050565b5f818310612bdf57816109f2565b5090919050565b80356001600160a01b0381168114612bfc575f5ffd5b919050565b5f60208284031215612c11575f5ffd5b6109f282612be6565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f6109f26020830184612c1a565b5f5f60408385031215612c6b575f5ffd5b612c7483612be6565b946020939093013593505050565b8015158114610a03575f5ffd5b5f5f60408385031215612ca0575f5ffd5b612ca983612be6565b91506020830135612cb981612c82565b809150509250929050565b5f5f5f60608486031215612cd6575f5ffd5b612cdf84612be6565b9250612ced60208501612be6565b929592945050506040919091013590565b60ff60f81b8816815260e060208201525f612d1c60e0830189612c1a565b8281036040840152612d2e8189612c1a565b606084018890526001600160a01b038716608085015260a0840186905283810360c0850152845180825260208087019350909101905f5b81811015612d83578351835260209384019390920191600101612d65565b50909b9a5050505050505050505050565b5f60208284031215612da4575f5ffd5b5035919050565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f1916810167ffffffffffffffff81118282101715612de857612de8612dab565b604052919050565b5f67ffffffffffffffff821115612e0957612e09612dab565b5060051b60200190565b5f82601f830112612e22575f5ffd5b8135612e35612e3082612df0565b612dbf565b8082825260208201915060208360051b860101925085831115612e56575f5ffd5b602085015b83811015611fed578035835260209283019201612e5b565b5f5f5f5f60808587031215612e86575f5ffd5b612e8f85612be6565b9350602085013567ffffffffffffffff811115612eaa575f5ffd5b8501601f81018713612eba575f5ffd5b8035612ec8612e3082612df0565b8082825260208201915060208360051b850101925089831115612ee9575f5ffd5b6020840193505b82841015612f1257612f0184612be6565b825260209384019390910190612ef0565b9550505050604085013567ffffffffffffffff811115612f30575f5ffd5b612f3c87828801612e13565b925050606085013567ffffffffffffffff811115612f58575f5ffd5b612f6487828801612e13565b91505092959194509250565b5f5f83601f840112612f80575f5ffd5b50813567ffffffffffffffff811115612f97575f5ffd5b6020830191508360208260051b8501011115612fb1575f5ffd5b9250929050565b5f5f5f5f60408587031215612fcb575f5ffd5b843567ffffffffffffffff811115612fe1575f5ffd5b612fed87828801612f70565b909550935050602085013567ffffffffffffffff81111561300c575f5ffd5b61301887828801612f70565b95989497509550505050565b803560ff81168114612bfc575f5ffd5b5f5f5f5f5f5f60c08789031215613049575f5ffd5b61305287612be6565b9550602087013594506040870135935061306e60608801613024565b9598949750929560808101359460a0909101359350915050565b5f5f5f5f5f5f5f60e0888a03121561309e575f5ffd5b6130a788612be6565b96506130b560208901612be6565b955060408801359450606088013593506130d160808901613024565b9699959850939692959460a0840135945060c09093013592915050565b5f5f604083850312156130ff575f5ffd5b61310883612be6565b915061311660208401612be6565b90509250929050565b5f5f60408385031215613130575f5ffd5b61313983612be6565b9150602083013563ffffffff81168114612cb9575f5ffd5b600181811c9082168061316557607f821691505b60208210810361201857634e487b7160e01b5f52602260045260245ffd5b5f60208284031215613193575f5ffd5b5051919050565b634e487b7160e01b5f52601160045260245ffd5b808201808211156106ed576106ed61319a565b634e487b7160e01b5f52603260045260245ffd5b5f602082840312156131e5575f5ffd5b81516109f281612c82565b818103818111156106ed576106ed61319a565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b634e487b7160e01b5f52601260045260245ffd5b5f8261327c57634e487b7160e01b5f52601260045260245ffd5b500490565b601f82111561235e57805f5260205f20601f840160051c810160208510156132a65750805b601f840160051c820191505b81811015611074575f81556001016132b2565b815167ffffffffffffffff8111156132df576132df612dab565b6132f3816132ed8454613151565b84613281565b6020601f821160018114613325575f831561330e5750848201515b5f19600385901b1c1916600184901b178455611074565b5f84815260208120601f198516915b828110156133545787850151825560209485019460019092019101613334565b508482101561337157868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b634e487b7160e01b5f52602160045260245ffdfea264697066735822122087556507a13c767e1ac5fae7a99abc6e15a1498b1060ca1cde8c320d6d57627664736f6c634300081b0033", } // EigenABI is the input ABI used to generate the binding from. diff --git a/pkg/bindings/EigenPod/binding.go b/pkg/bindings/EigenPod/binding.go index a98fb0db1f..6c63ed7fb0 100644 --- a/pkg/bindings/EigenPod/binding.go +++ b/pkg/bindings/EigenPod/binding.go @@ -74,7 +74,7 @@ type IEigenPodTypesValidatorInfo struct { // EigenPodMetaData contains all meta data concerning the EigenPod contract. var EigenPodMetaData = &bind.MetaData{ ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"_ethPOS\",\"type\":\"address\",\"internalType\":\"contractIETHPOSDeposit\"},{\"name\":\"_eigenPodManager\",\"type\":\"address\",\"internalType\":\"contractIEigenPodManager\"},{\"name\":\"_GENESIS_TIME\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"receive\",\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"GENESIS_TIME\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidatorCount\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"checkpointBalanceExitedGwei\",\"inputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"currentCheckpoint\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIEigenPodTypes.Checkpoint\",\"components\":[{\"name\":\"beaconBlockRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"proofsRemaining\",\"type\":\"uint24\",\"internalType\":\"uint24\"},{\"name\":\"podBalanceGwei\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"balanceDeltasGwei\",\"type\":\"int64\",\"internalType\":\"int64\"},{\"name\":\"prevBeaconBalanceGwei\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"currentCheckpointTimestamp\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"eigenPodManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIEigenPodManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"ethPOS\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIETHPOSDeposit\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getParentBlockRoot\",\"inputs\":[{\"name\":\"timestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"_podOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"lastCheckpointTimestamp\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"podOwner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"proofSubmitter\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"recoverTokens\",\"inputs\":[{\"name\":\"tokenList\",\"type\":\"address[]\",\"internalType\":\"contractIERC20[]\"},{\"name\":\"amountsToWithdraw\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"},{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setProofSubmitter\",\"inputs\":[{\"name\":\"newProofSubmitter\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"stake\",\"inputs\":[{\"name\":\"pubkey\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"depositDataRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"startCheckpoint\",\"inputs\":[{\"name\":\"revertIfNoBalance\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"validatorPubkeyHashToInfo\",\"inputs\":[{\"name\":\"validatorPubkeyHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIEigenPodTypes.ValidatorInfo\",\"components\":[{\"name\":\"validatorIndex\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"restakedBalanceGwei\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"lastCheckpointedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumIEigenPodTypes.VALIDATOR_STATUS\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"validatorPubkeyToInfo\",\"inputs\":[{\"name\":\"validatorPubkey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIEigenPodTypes.ValidatorInfo\",\"components\":[{\"name\":\"validatorIndex\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"restakedBalanceGwei\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"lastCheckpointedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumIEigenPodTypes.VALIDATOR_STATUS\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"validatorStatus\",\"inputs\":[{\"name\":\"validatorPubkey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"enumIEigenPodTypes.VALIDATOR_STATUS\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"validatorStatus\",\"inputs\":[{\"name\":\"pubkeyHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"enumIEigenPodTypes.VALIDATOR_STATUS\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"verifyCheckpointProofs\",\"inputs\":[{\"name\":\"balanceContainerProof\",\"type\":\"tuple\",\"internalType\":\"structBeaconChainProofs.BalanceContainerProof\",\"components\":[{\"name\":\"balanceContainerRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"proof\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"proofs\",\"type\":\"tuple[]\",\"internalType\":\"structBeaconChainProofs.BalanceProof[]\",\"components\":[{\"name\":\"pubkeyHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"balanceRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"proof\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"verifyStaleBalance\",\"inputs\":[{\"name\":\"beaconTimestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"stateRootProof\",\"type\":\"tuple\",\"internalType\":\"structBeaconChainProofs.StateRootProof\",\"components\":[{\"name\":\"beaconStateRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"proof\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"proof\",\"type\":\"tuple\",\"internalType\":\"structBeaconChainProofs.ValidatorProof\",\"components\":[{\"name\":\"validatorFields\",\"type\":\"bytes32[]\",\"internalType\":\"bytes32[]\"},{\"name\":\"proof\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"verifyWithdrawalCredentials\",\"inputs\":[{\"name\":\"beaconTimestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"stateRootProof\",\"type\":\"tuple\",\"internalType\":\"structBeaconChainProofs.StateRootProof\",\"components\":[{\"name\":\"beaconStateRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"proof\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"validatorIndices\",\"type\":\"uint40[]\",\"internalType\":\"uint40[]\"},{\"name\":\"validatorFieldsProofs\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"},{\"name\":\"validatorFields\",\"type\":\"bytes32[][]\",\"internalType\":\"bytes32[][]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"withdrawRestakedBeaconChainETH\",\"inputs\":[{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amountWei\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"withdrawableRestakedExecutionLayerGwei\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"event\",\"name\":\"CheckpointCreated\",\"inputs\":[{\"name\":\"checkpointTimestamp\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"beaconBlockRoot\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"validatorCount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"CheckpointFinalized\",\"inputs\":[{\"name\":\"checkpointTimestamp\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"totalShareDeltaWei\",\"type\":\"int256\",\"indexed\":false,\"internalType\":\"int256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"EigenPodStaked\",\"inputs\":[{\"name\":\"pubkey\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"NonBeaconChainETHReceived\",\"inputs\":[{\"name\":\"amountReceived\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ProofSubmitterUpdated\",\"inputs\":[{\"name\":\"prevProofSubmitter\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"newProofSubmitter\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RestakedBeaconChainETHWithdrawn\",\"inputs\":[{\"name\":\"recipient\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorBalanceUpdated\",\"inputs\":[{\"name\":\"validatorIndex\",\"type\":\"uint40\",\"indexed\":false,\"internalType\":\"uint40\"},{\"name\":\"balanceTimestamp\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"newValidatorBalanceGwei\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorCheckpointed\",\"inputs\":[{\"name\":\"checkpointTimestamp\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorIndex\",\"type\":\"uint40\",\"indexed\":true,\"internalType\":\"uint40\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorRestaked\",\"inputs\":[{\"name\":\"validatorIndex\",\"type\":\"uint40\",\"indexed\":false,\"internalType\":\"uint40\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorWithdrawn\",\"inputs\":[{\"name\":\"checkpointTimestamp\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorIndex\",\"type\":\"uint40\",\"indexed\":true,\"internalType\":\"uint40\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"BeaconTimestampTooFarInPast\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"CannotCheckpointTwiceInSingleBlock\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"CheckpointAlreadyActive\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"CredentialsAlreadyVerified\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"CurrentlyPaused\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InputAddressZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InputArrayLengthMismatch\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InsufficientWithdrawableBalance\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidEIP4788Response\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidProof\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidProofLength\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidProofLength\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidPubKeyLength\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidValidatorFieldsLength\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"MsgValueNot32ETH\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NoActiveCheckpoint\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NoBalanceToCheckpoint\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyEigenPodManager\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyEigenPodOwner\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyEigenPodOwnerOrProofSubmitter\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"TimestampOutOfRange\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ValidatorInactiveOnBeaconChain\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ValidatorIsExitingBeaconChain\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ValidatorNotActiveInPod\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ValidatorNotSlashedOnBeaconChain\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"WithdrawalCredentialsNotForEigenPod\",\"inputs\":[]}]", - Bin: "0x60e060405234801561000f575f5ffd5b50604051613c7c380380613c7c83398101604081905261002e91610131565b6001600160a01b03808416608052821660a0526001600160401b03811660c05261005661005e565b505050610186565b5f54610100900460ff16156100c95760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff90811614610118575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b038116811461012e575f5ffd5b50565b5f5f5f60608486031215610143575f5ffd5b835161014e8161011a565b602085015190935061015f8161011a565b60408501519092506001600160401b038116811461017b575f5ffd5b809150509250925092565b60805160a05160c051613a7f6101fd5f395f61060401525f81816102a90152818161063f015281816106e7015281816109ab01528181610b7501528181610e4e01528181610ef50152818161112b01528181611479015281816115ad01526127bb01525f81816104c60152610f5e0152613a7f5ff3fe608060405260043610610164575f3560e01c80636fcd0e53116100cd578063c490744211610087578063dda3346c11610062578063dda3346c14610596578063ee94d67c146105b5578063f074ba62146105d4578063f2882461146105f3575f5ffd5b8063c490744214610539578063c4d66de814610558578063d06d558714610577575f5ffd5b80636fcd0e53146104545780637439841f1461048057806374cdd798146104b557806388676cad146104e85780639b4e463414610507578063b522538a1461051a575f5ffd5b80634665bcda1161011e5780634665bcda1461029857806347d28372146102cb57806352396a59146103b657806358753357146103ea57806358eaee79146104095780636c0d2d5a14610435575f5ffd5b8063039157d2146101a25780630b18ff66146101c35780632340e8d3146101ff5780633474aa16146102225780633f65cf191461025357806342ecff2a14610272575f5ffd5b3661019e576040513481527f6fdd3dbdb173299608c0aa9f368735857c8842b581f8389238bf05bd04b3bf499060200160405180910390a1005b5f5ffd5b3480156101ad575f5ffd5b506101c16101bc366004612ff3565b610626565b005b3480156101ce575f5ffd5b506033546101e2906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b34801561020a575f5ffd5b5061021460395481565b6040519081526020016101f6565b34801561022d575f5ffd5b506034546001600160401b03165b6040516001600160401b0390911681526020016101f6565b34801561025e575f5ffd5b506101c161026d3660046130ac565b610952565b34801561027d575f5ffd5b50603a5461023b90600160401b90046001600160401b031681565b3480156102a3575f5ffd5b506101e27f000000000000000000000000000000000000000000000000000000000000000081565b3480156102d6575f5ffd5b5061035b6040805160a0810182525f80825260208201819052918101829052606081018290526080810191909152506040805160a081018252603c548152603d5462ffffff811660208301526001600160401b0363010000008204811693830193909352600160581b810460070b6060830152600160981b9004909116608082015290565b6040516101f691905f60a0820190508251825262ffffff60208401511660208301526001600160401b036040840151166040830152606083015160070b60608301526001600160401b03608084015116608083015292915050565b3480156103c1575f5ffd5b5061023b6103d0366004613181565b603b6020525f90815260409020546001600160401b031681565b3480156103f5575f5ffd5b50603e546101e2906001600160a01b031681565b348015610414575f5ffd5b506104286104233660046131de565b610bda565b6040516101f69190613250565b348015610440575f5ffd5b5061021461044f366004613181565b610c3c565b34801561045f575f5ffd5b5061047361046e36600461325e565b610d4a565b6040516101f69190613275565b34801561048b575f5ffd5b5061042861049a36600461325e565b5f90815260366020526040902054600160c01b900460ff1690565b3480156104c0575f5ffd5b506101e27f000000000000000000000000000000000000000000000000000000000000000081565b3480156104f3575f5ffd5b506101c16105023660046132d8565b610df5565b6101c16105153660046132f3565b610eea565b348015610525575f5ffd5b506104736105343660046131de565b611031565b348015610544575f5ffd5b506101c1610553366004613383565b611120565b348015610563575f5ffd5b506101c16105723660046133ad565b611257565b348015610582575f5ffd5b506101c16105913660046133ad565b6113a1565b3480156105a1575f5ffd5b506101c16105b0366004613498565b611435565b3480156105c0575f5ffd5b50603a5461023b906001600160401b031681565b3480156105df575f5ffd5b506101c16105ee36600461356a565b611594565b3480156105fe575f5ffd5b5061023b7f000000000000000000000000000000000000000000000000000000000000000081565b604051635ac86ab760e01b8152600660048201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635ac86ab790602401602060405180830381865afa15801561068c573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106b091906135d1565b156106ce5760405163840a48d560e01b815260040160405180910390fd5b604051635ac86ab760e01b8152600860048201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635ac86ab790602401602060405180830381865afa158015610734573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061075891906135d1565b156107765760405163840a48d560e01b815260040160405180910390fd5b5f6107ba61078485806135ec565b808060200260200160405190810160405280939291908181526020018383602002808284375f9201919091525061199192505050565b5f818152603660209081526040808320815160808101835281546001600160401b038082168352600160401b8204811695830195909552600160801b8104909416928101929092529394509192906060830190600160c01b900460ff1660028111156108285761082861321c565b60028111156108395761083961321c565b81525050905080604001516001600160401b0316876001600160401b031611610875576040516337e07ffd60e01b815260040160405180910390fd5b60018160600151600281111561088d5761088d61321c565b146108ab5760405163d49e19a760e01b815260040160405180910390fd5b6108ee6108b886806135ec565b808060200260200160405190810160405280939291908181526020018383602002808284375f920191909152506119b392505050565b61090b5760405163161ce5ed60e31b815260040160405180910390fd5b61091d61091788610c3c565b876119db565b610940863561092c87806135ec565b61093960208a018a613631565b8651611a80565b6109495f611ba7565b50505050505050565b6033546001600160a01b03163314806109755750603e546001600160a01b031633145b6109925760405163427a777960e01b815260040160405180910390fd5b604051635ac86ab760e01b8152600260048201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635ac86ab790602401602060405180830381865afa1580156109f8573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a1c91906135d1565b15610a3a5760405163840a48d560e01b815260040160405180910390fd5b8584148015610a4857508382145b610a65576040516343714afd60e01b815260040160405180910390fd5b603a546001600160401b03600160401b9091048116908a1611610a9b576040516337e07ffd60e01b815260040160405180910390fd5b610aad610aa78a610c3c565b896119db565b5f805b87811015610b4557610b318a358a8a84818110610acf57610acf613673565b9050602002016020810190610ae49190613687565b898985818110610af657610af6613673565b9050602002810190610b089190613631565b898987818110610b1a57610b1a613673565b9050602002810190610b2c91906135ec565b611d27565b610b3b90836136bf565b9150600101610ab0565b5060335460405163a1ca780b60e01b81526001600160a01b0391821660048201525f6024820152604481018390527f00000000000000000000000000000000000000000000000000000000000000009091169063a1ca780b906064015f604051808303815f87803b158015610bb8575f5ffd5b505af1158015610bca573d5f5f3e3d5ffd5b5050505050505050505050505050565b5f5f610c1a84848080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152506121dc92505050565b5f90815260366020526040902054600160c01b900460ff169150505b92915050565b5f610c4a611fff600c6136d2565b610c5d6001600160401b038416426136e9565b10610c7b57604051637944e66d60e11b815260040160405180910390fd5b604080516001600160401b03841660208201525f918291720f3df6d732807ef1319fb7b8bb8522d0beac02910160408051601f1981840301815290829052610cc291613713565b5f60405180830381855afa9150503d805f8114610cfa576040519150601f19603f3d011682016040523d82523d5f602084013e610cff565b606091505b5091509150818015610d1157505f8151115b610d2e5760405163558ad0a360e01b815260040160405180910390fd5b80806020019051810190610d42919061371e565b949350505050565b610d71604080516080810182525f8082526020820181905291810182905290606082015290565b5f82815260366020908152604091829020825160808101845281546001600160401b038082168352600160401b8204811694830194909452600160801b810490931693810193909352906060830190600160c01b900460ff166002811115610ddb57610ddb61321c565b6002811115610dec57610dec61321c565b90525092915050565b6033546001600160a01b0316331480610e185750603e546001600160a01b031633145b610e355760405163427a777960e01b815260040160405180910390fd5b604051635ac86ab760e01b8152600660048201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635ac86ab790602401602060405180830381865afa158015610e9b573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ebf91906135d1565b15610edd5760405163840a48d560e01b815260040160405180910390fd5b610ee682611ba7565b5050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610f3357604051633213a66160e21b815260040160405180910390fd5b346801bc16d674ec80000014610f5c5760405163049696b360e31b815260040160405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663228951186801bc16d674ec8000008787610f9f61226d565b8888886040518863ffffffff1660e01b8152600401610fc39695949392919061378b565b5f604051808303818588803b158015610fda575f5ffd5b505af1158015610fec573d5f5f3e3d5ffd5b50505050507f606865b7934a25d4aed43f6cdb426403353fa4b3009c4d228407474581b01e2385856040516110229291906137d9565b60405180910390a15050505050565b611058604080516080810182525f8082526020820181905291810182905290606082015290565b60365f61109985858080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152506121dc92505050565b815260208082019290925260409081015f20815160808101835281546001600160401b038082168352600160401b8204811695830195909552600160801b81049094169281019290925290916060830190600160c01b900460ff1660028111156111055761110561321c565b60028111156111165761111661321c565b9052509392505050565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461116957604051633213a66160e21b815260040160405180910390fd5b5f611178633b9aca0083613800565b9050611191633b9aca006001600160401b0383166136d2565b6034549092506001600160401b0390811690821611156111c4576040516302c6f54760e21b815260040160405180910390fd5b603480548291905f906111e19084906001600160401b0316613813565b92506101000a8154816001600160401b0302191690836001600160401b03160217905550826001600160a01b03167f8947fd2ce07ef9cc302c4e8f0461015615d91ce851564839e91cc804c2f49d8e8360405161124091815260200190565b60405180910390a261125283836122b1565b505050565b5f54610100900460ff161580801561127557505f54600160ff909116105b8061128e5750303b15801561128e57505f5460ff166001145b6112f65760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b5f805460ff191660011790558015611317575f805461ff0019166101001790555b6001600160a01b03821661133e576040516339b190bb60e11b815260040160405180910390fd5b603380546001600160a01b0319166001600160a01b0384161790558015610ee6575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15050565b6033546001600160a01b031633146113cc5760405163719f370360e11b815260040160405180910390fd5b603e54604080516001600160a01b03928316815291831660208301527ffb8129080a19d34dceac04ba253fc50304dc86c729bd63cdca4a969ad19a5eac910160405180910390a1603e80546001600160a01b0319166001600160a01b0392909216919091179055565b6033546001600160a01b031633146114605760405163719f370360e11b815260040160405180910390fd5b604051635ac86ab760e01b8152600560048201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635ac86ab790602401602060405180830381865afa1580156114c6573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114ea91906135d1565b156115085760405163840a48d560e01b815260040160405180910390fd5b825184511461152a576040516343714afd60e01b815260040160405180910390fd5b5f5b845181101561158d576115858385838151811061154b5761154b613673565b602002602001015187848151811061156557611565613673565b60200260200101516001600160a01b03166123c69092919063ffffffff16565b60010161152c565b5050505050565b604051635ac86ab760e01b8152600760048201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635ac86ab790602401602060405180830381865afa1580156115fa573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061161e91906135d1565b1561163c5760405163840a48d560e01b815260040160405180910390fd5b603a54600160401b90046001600160401b03165f81900361167057604051631a544f4960e01b815260040160405180910390fd5b6040805160a081018252603c54808252603d5462ffffff811660208401526001600160401b0363010000008204811694840194909452600160581b810460070b6060840152600160981b90049092166080820152906116cf9087612418565b5f805b8581101561193857368787838181106116ed576116ed613673565b90506020028101906116ff9190613832565b80355f908152603660209081526040808320815160808101835281546001600160401b038082168352600160401b8204811695830195909552600160801b8104909416928101929092529394509192906060830190600160c01b900460ff16600281111561176f5761176f61321c565b60028111156117805761178061321c565b905250905060018160600151600281111561179d5761179d61321c565b146117a9575050611930565b856001600160401b031681604001516001600160401b0316106117cd575050611930565b5f80806117dd848a8f35886124c9565b60208b01805193965091945092506117f482613850565b62ffffff1690525060808801805184919061181090839061386d565b6001600160401b031690525060608801805183919061183090839061388c565b60070b905250611840818861386d565b85355f908152603660209081526040918290208751815492890151938901516001600160401b03908116600160801b0267ffffffffffffffff60801b19958216600160401b026001600160801b0319909516919092161792909217928316821781556060880151939a50879390929091839160ff60c01b1990911668ffffffffffffffffff60801b1990911617600160c01b8360028111156118e4576118e461321c565b021790555050845160405164ffffffffff90911691506001600160401b038b16907fa91c59033c3423e18b54d0acecebb4972f9ea95aedf5f4cae3b677b02eaf3a3f905f90a350505050505b6001016116d2565b506001600160401b038084165f908152603b60205260408120805484939192916119649185911661386d565b92506101000a8154816001600160401b0302191690836001600160401b03160217905550610949826125ec565b5f815f815181106119a4576119a4613673565b60200260200101519050919050565b5f816003815181106119c7576119c7613673565b60200260200101515f5f1b14159050919050565b6119e7600360206136d2565b6119f46020830183613631565b905014611a14576040516313717da960e21b815260040160405180910390fd5b611a63611a246020830183613631565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152508692505084359050600361281b565b610ee6576040516309bde33960e01b815260040160405180910390fd5b60088414611aa15760405163200591bd60e01b815260040160405180910390fd5b6005611aaf602860016136bf565b611ab991906136bf565b611ac49060206136d2565b8214611ae3576040516313717da960e21b815260040160405180910390fd5b5f611b1f8686808060200260200160405190810160405280939291908181526020018383602002808284375f9201919091525061283292505050565b90505f64ffffffffff8316611b36602860016136bf565b600b901b179050611b8085858080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152508c925086915085905061281b565b611b9d576040516309bde33960e01b815260040160405180910390fd5b5050505050505050565b603a54600160401b90046001600160401b031615611bd75760405162be9bc360e81b815260040160405180910390fd5b603a546001600160401b03428116911603611c05576040516367db5b8b60e01b815260040160405180910390fd5b6034545f906001600160401b0316611c21633b9aca0047613800565b611c2b9190613813565b9050818015611c4157506001600160401b038116155b15611c5f576040516332dea95960e21b815260040160405180910390fd5b5f6040518060a00160405280611c7442610c3c565b815260395462ffffff1660208201526001600160401b0380851660408301525f60608301819052608090920191909152603a805442909216600160401b026fffffffffffffffff0000000000000000199092169190911790559050611cd8816125ec565b805160208083015160405162ffffff90911681526001600160401b034216917f575796133bbed337e5b39aa49a30dc2556a91e0c6c2af4b7b886ae77ebef1076910160405180910390a3505050565b5f5f611d648484808060200260200160405190810160405280939291908181526020018383602002808284375f9201919091525061199192505050565b5f818152603660209081526040808320815160808101835281546001600160401b038082168352600160401b8204811695830195909552600160801b8104909416928101929092529394509192906060830190600160c01b900460ff166002811115611dd257611dd261321c565b6002811115611de357611de361321c565b90525090505f81606001516002811115611dff57611dff61321c565b14611e1d576040516335e09e9d60e01b815260040160405180910390fd5b6001600160401b038016611e628686808060200260200160405190810160405280939291908181526020018383602002808284375f92019190915250612ac292505050565b6001600160401b031603611e8957604051631958236d60e21b815260040160405180910390fd5b6001600160401b038016611ece8686808060200260200160405190810160405280939291908181526020018383602002808284375f92019190915250612ae692505050565b6001600160401b031614611ef557604051632eade63760e01b815260040160405180910390fd5b611efd61226d565b611f06906138bb565b611f418686808060200260200160405190810160405280939291908181526020018383602002808284375f92019190915250612afd92505050565b14611f5f57604051633772dd5360e11b815260040160405180910390fd5b5f611f9b8686808060200260200160405190810160405280939291908181526020018383602002808284375f92019190915250612b1192505050565b9050611fab8a87878b8b8e611a80565b60398054905f611fba836138de565b9091555050603a545f90600160401b90046001600160401b031615611ff157603a54600160401b90046001600160401b0316611ffe565b603a546001600160401b03165b6040805160808101825264ffffffffff8d1681526001600160401b03858116602083015283169181019190915290915060608101600190525f858152603660209081526040918290208351815492850151938501516001600160401b03908116600160801b0267ffffffffffffffff60801b19958216600160401b026001600160801b031990951691909216179290921792831682178155606084015190929091839160ff60c01b1990911668ffffffffffffffffff60801b1990911617600160c01b8360028111156120d3576120d361321c565b021790555050603d80548492506013906120fe908490600160981b90046001600160401b031661386d565b92506101000a8154816001600160401b0302191690836001600160401b031602179055507f2d0800bbc377ea54a08c5db6a87aafff5e3e9c8fead0eda110e40e0c104414498a60405161215e919064ffffffffff91909116815260200190565b60405180910390a16040805164ffffffffff8c1681526001600160401b03838116602083015284168183015290517f0e5fac175b83177cc047381e030d8fb3b42b37bd1c025e22c280facad62c32df9181900360600190a16121cd633b9aca006001600160401b0384166136d2565b9b9a5050505050505050505050565b5f81516030146121ff57604051634f88323960e11b815260040160405180910390fd5b6040516002906122159084905f906020016138f6565b60408051601f198184030181529082905261222f91613713565b602060405180830381855afa15801561224a573d5f5f3e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610c36919061371e565b60408051600160f81b60208201525f602182015230606090811b6bffffffffffffffffffffffff1916602c8301529101604051602081830303815290604052905090565b804710156123015760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e636500000060448201526064016112ed565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f811461234a576040519150601f19603f3d011682016040523d82523d5f602084013e61234f565b606091505b50509050806112525760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d6179206861766520726576657274656400000000000060648201526084016112ed565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052611252908490612b28565b612424600560036136bf565b61242f9060206136d2565b61243c6020830183613631565b90501461245c576040516313717da960e21b815260040160405180910390fd5b606c6124ac61246e6020840184613631565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525087925050853590508461281b565b611252576040516309bde33960e01b815260040160405180910390fd5b83516020850151905f908190816124e1878388612bfb565b9050846001600160401b0316816001600160401b03161461255b57612506858261391a565b6040805164ffffffffff851681526001600160401b038b8116602083015284168183015290519195507f0e5fac175b83177cc047381e030d8fb3b42b37bd1c025e22c280facad62c32df919081900360600190a15b6001600160401b0380821660208b0181905290891660408b01525f036125e05760398054905f61258a83613949565b9091555050600260608a015261259f8461395e565b92508164ffffffffff16886001600160401b03167f2a02361ffa66cf2c2da4682c2355a6adcaa9f6c227b6e6563e68480f9587626a60405160405180910390a35b50509450945094915050565b602081015162ffffff161561268c578051603c556020810151603d80546040840151606085015160809095015162ffffff9094166affffffffffffffffffffff199092169190911763010000006001600160401b0392831602176fffffffffffffffffffffffffffffffff60581b1916600160581b9482169490940267ffffffffffffffff60981b191693909317600160981b9390921692909202179055565b60808101516034545f916126a8916001600160401b031661386d565b90505f826060015183604001516126bf919061388c565b60408401516034805492935090915f906126e39084906001600160401b031661386d565b82546101009290920a6001600160401b03818102199093169183160217909155603a8054600160401b810483166001600160801b03199091161790555f915061273390633b9aca009085166136d2565b90505f612748633b9aca00600785900b613983565b603a546040518281529192506001600160401b0316907f525408c201bc1576eb44116f6478f1c2a54775b19a043bcfdc708364f74f8e449060200160405180910390a260335460405163a1ca780b60e01b81526001600160a01b03918216600482015260248101849052604481018390527f00000000000000000000000000000000000000000000000000000000000000009091169063a1ca780b906064015f604051808303815f87803b1580156127fe575f5ffd5b505af1158015612810573d5f5f3e3d5ffd5b505050505050505050565b5f83612828868585612cd9565b1495945050505050565b5f5f600283516128429190613800565b90505f816001600160401b0381111561285d5761285d6133c8565b604051908082528060200260200182016040528015612886578160200160208202803683370190505b5090505f5b82811015612980576002856128a083836136d2565b815181106128b0576128b0613673565b6020026020010151868360026128c691906136d2565b6128d19060016136bf565b815181106128e1576128e1613673565b6020026020010151604051602001612903929190918252602082015260400190565b60408051601f198184030181529082905261291d91613713565b602060405180830381855afa158015612938573d5f5f3e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061295b919061371e565b82828151811061296d5761296d613673565b602090810291909101015260010161288b565b5061298c600283613800565b91505b8115612a9f575f5b82811015612a8c576002826129ac83836136d2565b815181106129bc576129bc613673565b6020026020010151838360026129d291906136d2565b6129dd9060016136bf565b815181106129ed576129ed613673565b6020026020010151604051602001612a0f929190918252602082015260400190565b60408051601f1981840301815290829052612a2991613713565b602060405180830381855afa158015612a44573d5f5f3e3d5ffd5b5050506040513d601f19601f82011682018060405250810190612a67919061371e565b828281518110612a7957612a79613673565b6020908102919091010152600101612997565b50612a98600283613800565b915061298f565b805f81518110612ab157612ab1613673565b602002602001015192505050919050565b5f610c3682600581518110612ad957612ad9613673565b6020026020010151612dad565b5f610c3682600681518110612ad957612ad9613673565b5f816001815181106119a4576119a4613673565b5f610c3682600281518110612ad957612ad9613673565b5f612b7c826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316612e149092919063ffffffff16565b905080515f1480612b9c575080806020019051810190612b9c91906135d1565b6112525760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016112ed565b5f612c08602660016136bf565b612c139060206136d2565b612c206040840184613631565b905014612c40576040516313717da960e21b815260040160405180910390fd5b5f612c4c6004856139b2565b64ffffffffff169050612ca5612c656040850185613631565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250899250505060208601358461281b565b612cc2576040516309bde33960e01b815260040160405180910390fd5b612cd0836020013585612e22565b95945050505050565b5f83515f14158015612cf6575060208451612cf491906139db565b155b612d13576040516313717da960e21b815260040160405180910390fd5b604080516020808201909252848152905b85518111612da357612d376002856139db565b5f03612d695781515f528086015160205260208260405f60026107d05a03fa612d5e575f5ffd5b600284049350612d91565b808601515f52815160205260208260405f60026107d05a03fa612d8a575f5ffd5b6002840493505b612d9c6020826136bf565b9050612d24565b5051949350505050565b60f881901c60e882901c61ff00161760d882901c62ff0000161760c882901c63ff000000161764ff0000000060b883901c161765ff000000000060a883901c161766ff000000000000609883901c161767ff0000000000000060889290921c919091161790565b6060610d4284845f85612e4e565b5f80612e2f6004846139ee565b612e3a906040613a17565b64ffffffffff169050610d4284821b612dad565b606082471015612eaf5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b60648201526084016112ed565b5f5f866001600160a01b03168587604051612eca9190613713565b5f6040518083038185875af1925050503d805f8114612f04576040519150601f19603f3d011682016040523d82523d5f602084013e612f09565b606091505b5091509150612f1a87838387612f25565b979650505050505050565b60608315612f935782515f03612f8c576001600160a01b0385163b612f8c5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016112ed565b5081610d42565b610d428383815115612fa85781518083602001fd5b8060405162461bcd60e51b81526004016112ed9190613a37565b80356001600160401b0381168114612fd8575f5ffd5b919050565b5f60408284031215612fed575f5ffd5b50919050565b5f5f5f60608486031215613005575f5ffd5b61300e84612fc2565b925060208401356001600160401b03811115613028575f5ffd5b61303486828701612fdd565b92505060408401356001600160401b0381111561304f575f5ffd5b61305b86828701612fdd565b9150509250925092565b5f5f83601f840112613075575f5ffd5b5081356001600160401b0381111561308b575f5ffd5b6020830191508360208260051b85010111156130a5575f5ffd5b9250929050565b5f5f5f5f5f5f5f5f60a0898b0312156130c3575f5ffd5b6130cc89612fc2565b975060208901356001600160401b038111156130e6575f5ffd5b6130f28b828c01612fdd565b97505060408901356001600160401b0381111561310d575f5ffd5b6131198b828c01613065565b90975095505060608901356001600160401b03811115613137575f5ffd5b6131438b828c01613065565b90955093505060808901356001600160401b03811115613161575f5ffd5b61316d8b828c01613065565b999c989b5096995094979396929594505050565b5f60208284031215613191575f5ffd5b61319a82612fc2565b9392505050565b5f5f83601f8401126131b1575f5ffd5b5081356001600160401b038111156131c7575f5ffd5b6020830191508360208285010111156130a5575f5ffd5b5f5f602083850312156131ef575f5ffd5b82356001600160401b03811115613204575f5ffd5b613210858286016131a1565b90969095509350505050565b634e487b7160e01b5f52602160045260245ffd5b6003811061324c57634e487b7160e01b5f52602160045260245ffd5b9052565b60208101610c368284613230565b5f6020828403121561326e575f5ffd5b5035919050565b5f6080820190506001600160401b0383511682526001600160401b0360208401511660208301526001600160401b03604084015116604083015260608301516132c16060840182613230565b5092915050565b80151581146132d5575f5ffd5b50565b5f602082840312156132e8575f5ffd5b813561319a816132c8565b5f5f5f5f5f60608688031215613307575f5ffd5b85356001600160401b0381111561331c575f5ffd5b613328888289016131a1565b90965094505060208601356001600160401b03811115613346575f5ffd5b613352888289016131a1565b96999598509660400135949350505050565b6001600160a01b03811681146132d5575f5ffd5b8035612fd881613364565b5f5f60408385031215613394575f5ffd5b823561339f81613364565b946020939093013593505050565b5f602082840312156133bd575f5ffd5b813561319a81613364565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f191681016001600160401b0381118282101715613404576134046133c8565b604052919050565b5f6001600160401b03821115613424576134246133c8565b5060051b60200190565b5f82601f83011261343d575f5ffd5b813561345061344b8261340c565b6133dc565b8082825260208201915060208360051b860101925085831115613471575f5ffd5b602085015b8381101561348e578035835260209283019201613476565b5095945050505050565b5f5f5f606084860312156134aa575f5ffd5b83356001600160401b038111156134bf575f5ffd5b8401601f810186136134cf575f5ffd5b80356134dd61344b8261340c565b8082825260208201915060208360051b8501019250888311156134fe575f5ffd5b6020840193505b8284101561352957833561351881613364565b825260209384019390910190613505565b955050505060208401356001600160401b03811115613546575f5ffd5b6135528682870161342e565b92505061356160408501613378565b90509250925092565b5f5f5f6040848603121561357c575f5ffd5b83356001600160401b03811115613591575f5ffd5b61359d86828701612fdd565b93505060208401356001600160401b038111156135b8575f5ffd5b6135c486828701613065565b9497909650939450505050565b5f602082840312156135e1575f5ffd5b815161319a816132c8565b5f5f8335601e19843603018112613601575f5ffd5b8301803591506001600160401b0382111561361a575f5ffd5b6020019150600581901b36038213156130a5575f5ffd5b5f5f8335601e19843603018112613646575f5ffd5b8301803591506001600160401b0382111561365f575f5ffd5b6020019150368190038213156130a5575f5ffd5b634e487b7160e01b5f52603260045260245ffd5b5f60208284031215613697575f5ffd5b813564ffffffffff8116811461319a575f5ffd5b634e487b7160e01b5f52601160045260245ffd5b80820180821115610c3657610c366136ab565b8082028115828204841417610c3657610c366136ab565b81810381811115610c3657610c366136ab565b5f81518060208401855e5f93019283525090919050565b5f61319a82846136fc565b5f6020828403121561372e575f5ffd5b5051919050565b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b608081525f61379e60808301888a613735565b82810360208401526137b0818861375d565b905082810360408401526137c5818688613735565b915050826060830152979650505050505050565b602081525f610d42602083018486613735565b634e487b7160e01b5f52601260045260245ffd5b5f8261380e5761380e6137ec565b500490565b6001600160401b038281168282160390811115610c3657610c366136ab565b5f8235605e19833603018112613846575f5ffd5b9190910192915050565b5f62ffffff821680613864576138646136ab565b5f190192915050565b6001600160401b038181168382160190811115610c3657610c366136ab565b600781810b9083900b01677fffffffffffffff8113677fffffffffffffff1982121715610c3657610c366136ab565b80516020808301519190811015612fed575f1960209190910360031b1b16919050565b5f600182016138ef576138ef6136ab565b5060010190565b5f61390182856136fc565b6001600160801b03199390931683525050601001919050565b600782810b9082900b03677fffffffffffffff198112677fffffffffffffff82131715610c3657610c366136ab565b5f81613957576139576136ab565b505f190190565b5f8160070b677fffffffffffffff19810361397b5761397b6136ab565b5f0392915050565b8082025f8212600160ff1b8414161561399e5761399e6136ab565b8181058314821517610c3657610c366136ab565b5f64ffffffffff8316806139c8576139c86137ec565b8064ffffffffff84160491505092915050565b5f826139e9576139e96137ec565b500690565b5f64ffffffffff831680613a0457613a046137ec565b8064ffffffffff84160691505092915050565b64ffffffffff81811683821602908116908181146132c1576132c16136ab565b602081525f61319a602083018461375d56fea2646970667358221220e271b1a0e920c82094eef2e8edb78373537361f720005af1fd915a4e6ce349d164736f6c634300081b0033", + Bin: "0x60e060405234801561000f575f5ffd5b50604051613c7c380380613c7c83398101604081905261002e91610131565b6001600160a01b03808416608052821660a0526001600160401b03811660c05261005661005e565b505050610186565b5f54610100900460ff16156100c95760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff90811614610118575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b038116811461012e575f5ffd5b50565b5f5f5f60608486031215610143575f5ffd5b835161014e8161011a565b602085015190935061015f8161011a565b60408501519092506001600160401b038116811461017b575f5ffd5b809150509250925092565b60805160a05160c051613a7f6101fd5f395f61060401525f81816102a90152818161063f015281816106e7015281816109ab01528181610b7501528181610e4e01528181610ef50152818161112b01528181611479015281816115ad01526127bb01525f81816104c60152610f5e0152613a7f5ff3fe608060405260043610610164575f3560e01c80636fcd0e53116100cd578063c490744211610087578063dda3346c11610062578063dda3346c14610596578063ee94d67c146105b5578063f074ba62146105d4578063f2882461146105f3575f5ffd5b8063c490744214610539578063c4d66de814610558578063d06d558714610577575f5ffd5b80636fcd0e53146104545780637439841f1461048057806374cdd798146104b557806388676cad146104e85780639b4e463414610507578063b522538a1461051a575f5ffd5b80634665bcda1161011e5780634665bcda1461029857806347d28372146102cb57806352396a59146103b657806358753357146103ea57806358eaee79146104095780636c0d2d5a14610435575f5ffd5b8063039157d2146101a25780630b18ff66146101c35780632340e8d3146101ff5780633474aa16146102225780633f65cf191461025357806342ecff2a14610272575f5ffd5b3661019e576040513481527f6fdd3dbdb173299608c0aa9f368735857c8842b581f8389238bf05bd04b3bf499060200160405180910390a1005b5f5ffd5b3480156101ad575f5ffd5b506101c16101bc366004612ff3565b610626565b005b3480156101ce575f5ffd5b506033546101e2906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b34801561020a575f5ffd5b5061021460395481565b6040519081526020016101f6565b34801561022d575f5ffd5b506034546001600160401b03165b6040516001600160401b0390911681526020016101f6565b34801561025e575f5ffd5b506101c161026d3660046130ac565b610952565b34801561027d575f5ffd5b50603a5461023b90600160401b90046001600160401b031681565b3480156102a3575f5ffd5b506101e27f000000000000000000000000000000000000000000000000000000000000000081565b3480156102d6575f5ffd5b5061035b6040805160a0810182525f80825260208201819052918101829052606081018290526080810191909152506040805160a081018252603c548152603d5462ffffff811660208301526001600160401b0363010000008204811693830193909352600160581b810460070b6060830152600160981b9004909116608082015290565b6040516101f691905f60a0820190508251825262ffffff60208401511660208301526001600160401b036040840151166040830152606083015160070b60608301526001600160401b03608084015116608083015292915050565b3480156103c1575f5ffd5b5061023b6103d0366004613181565b603b6020525f90815260409020546001600160401b031681565b3480156103f5575f5ffd5b50603e546101e2906001600160a01b031681565b348015610414575f5ffd5b506104286104233660046131de565b610bda565b6040516101f69190613250565b348015610440575f5ffd5b5061021461044f366004613181565b610c3c565b34801561045f575f5ffd5b5061047361046e36600461325e565b610d4a565b6040516101f69190613275565b34801561048b575f5ffd5b5061042861049a36600461325e565b5f90815260366020526040902054600160c01b900460ff1690565b3480156104c0575f5ffd5b506101e27f000000000000000000000000000000000000000000000000000000000000000081565b3480156104f3575f5ffd5b506101c16105023660046132d8565b610df5565b6101c16105153660046132f3565b610eea565b348015610525575f5ffd5b506104736105343660046131de565b611031565b348015610544575f5ffd5b506101c1610553366004613383565b611120565b348015610563575f5ffd5b506101c16105723660046133ad565b611257565b348015610582575f5ffd5b506101c16105913660046133ad565b6113a1565b3480156105a1575f5ffd5b506101c16105b0366004613498565b611435565b3480156105c0575f5ffd5b50603a5461023b906001600160401b031681565b3480156105df575f5ffd5b506101c16105ee36600461356a565b611594565b3480156105fe575f5ffd5b5061023b7f000000000000000000000000000000000000000000000000000000000000000081565b604051635ac86ab760e01b8152600660048201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635ac86ab790602401602060405180830381865afa15801561068c573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106b091906135d1565b156106ce5760405163840a48d560e01b815260040160405180910390fd5b604051635ac86ab760e01b8152600860048201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635ac86ab790602401602060405180830381865afa158015610734573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061075891906135d1565b156107765760405163840a48d560e01b815260040160405180910390fd5b5f6107ba61078485806135ec565b808060200260200160405190810160405280939291908181526020018383602002808284375f9201919091525061199192505050565b5f818152603660209081526040808320815160808101835281546001600160401b038082168352600160401b8204811695830195909552600160801b8104909416928101929092529394509192906060830190600160c01b900460ff1660028111156108285761082861321c565b60028111156108395761083961321c565b81525050905080604001516001600160401b0316876001600160401b031611610875576040516337e07ffd60e01b815260040160405180910390fd5b60018160600151600281111561088d5761088d61321c565b146108ab5760405163d49e19a760e01b815260040160405180910390fd5b6108ee6108b886806135ec565b808060200260200160405190810160405280939291908181526020018383602002808284375f920191909152506119b392505050565b61090b5760405163161ce5ed60e31b815260040160405180910390fd5b61091d61091788610c3c565b876119db565b610940863561092c87806135ec565b61093960208a018a613631565b8651611a80565b6109495f611ba7565b50505050505050565b6033546001600160a01b03163314806109755750603e546001600160a01b031633145b6109925760405163427a777960e01b815260040160405180910390fd5b604051635ac86ab760e01b8152600260048201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635ac86ab790602401602060405180830381865afa1580156109f8573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a1c91906135d1565b15610a3a5760405163840a48d560e01b815260040160405180910390fd5b8584148015610a4857508382145b610a65576040516343714afd60e01b815260040160405180910390fd5b603a546001600160401b03600160401b9091048116908a1611610a9b576040516337e07ffd60e01b815260040160405180910390fd5b610aad610aa78a610c3c565b896119db565b5f805b87811015610b4557610b318a358a8a84818110610acf57610acf613673565b9050602002016020810190610ae49190613687565b898985818110610af657610af6613673565b9050602002810190610b089190613631565b898987818110610b1a57610b1a613673565b9050602002810190610b2c91906135ec565b611d27565b610b3b90836136bf565b9150600101610ab0565b5060335460405163a1ca780b60e01b81526001600160a01b0391821660048201525f6024820152604481018390527f00000000000000000000000000000000000000000000000000000000000000009091169063a1ca780b906064015f604051808303815f87803b158015610bb8575f5ffd5b505af1158015610bca573d5f5f3e3d5ffd5b5050505050505050505050505050565b5f5f610c1a84848080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152506121dc92505050565b5f90815260366020526040902054600160c01b900460ff169150505b92915050565b5f610c4a611fff600c6136d2565b610c5d6001600160401b038416426136e9565b10610c7b57604051637944e66d60e11b815260040160405180910390fd5b604080516001600160401b03841660208201525f918291720f3df6d732807ef1319fb7b8bb8522d0beac02910160408051601f1981840301815290829052610cc291613713565b5f60405180830381855afa9150503d805f8114610cfa576040519150601f19603f3d011682016040523d82523d5f602084013e610cff565b606091505b5091509150818015610d1157505f8151115b610d2e5760405163558ad0a360e01b815260040160405180910390fd5b80806020019051810190610d42919061371e565b949350505050565b610d71604080516080810182525f8082526020820181905291810182905290606082015290565b5f82815260366020908152604091829020825160808101845281546001600160401b038082168352600160401b8204811694830194909452600160801b810490931693810193909352906060830190600160c01b900460ff166002811115610ddb57610ddb61321c565b6002811115610dec57610dec61321c565b90525092915050565b6033546001600160a01b0316331480610e185750603e546001600160a01b031633145b610e355760405163427a777960e01b815260040160405180910390fd5b604051635ac86ab760e01b8152600660048201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635ac86ab790602401602060405180830381865afa158015610e9b573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ebf91906135d1565b15610edd5760405163840a48d560e01b815260040160405180910390fd5b610ee682611ba7565b5050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610f3357604051633213a66160e21b815260040160405180910390fd5b346801bc16d674ec80000014610f5c5760405163049696b360e31b815260040160405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663228951186801bc16d674ec8000008787610f9f61226d565b8888886040518863ffffffff1660e01b8152600401610fc39695949392919061378b565b5f604051808303818588803b158015610fda575f5ffd5b505af1158015610fec573d5f5f3e3d5ffd5b50505050507f606865b7934a25d4aed43f6cdb426403353fa4b3009c4d228407474581b01e2385856040516110229291906137d9565b60405180910390a15050505050565b611058604080516080810182525f8082526020820181905291810182905290606082015290565b60365f61109985858080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152506121dc92505050565b815260208082019290925260409081015f20815160808101835281546001600160401b038082168352600160401b8204811695830195909552600160801b81049094169281019290925290916060830190600160c01b900460ff1660028111156111055761110561321c565b60028111156111165761111661321c565b9052509392505050565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461116957604051633213a66160e21b815260040160405180910390fd5b5f611178633b9aca0083613800565b9050611191633b9aca006001600160401b0383166136d2565b6034549092506001600160401b0390811690821611156111c4576040516302c6f54760e21b815260040160405180910390fd5b603480548291905f906111e19084906001600160401b0316613813565b92506101000a8154816001600160401b0302191690836001600160401b03160217905550826001600160a01b03167f8947fd2ce07ef9cc302c4e8f0461015615d91ce851564839e91cc804c2f49d8e8360405161124091815260200190565b60405180910390a261125283836122b1565b505050565b5f54610100900460ff161580801561127557505f54600160ff909116105b8061128e5750303b15801561128e57505f5460ff166001145b6112f65760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b5f805460ff191660011790558015611317575f805461ff0019166101001790555b6001600160a01b03821661133e576040516339b190bb60e11b815260040160405180910390fd5b603380546001600160a01b0319166001600160a01b0384161790558015610ee6575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15050565b6033546001600160a01b031633146113cc5760405163719f370360e11b815260040160405180910390fd5b603e54604080516001600160a01b03928316815291831660208301527ffb8129080a19d34dceac04ba253fc50304dc86c729bd63cdca4a969ad19a5eac910160405180910390a1603e80546001600160a01b0319166001600160a01b0392909216919091179055565b6033546001600160a01b031633146114605760405163719f370360e11b815260040160405180910390fd5b604051635ac86ab760e01b8152600560048201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635ac86ab790602401602060405180830381865afa1580156114c6573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114ea91906135d1565b156115085760405163840a48d560e01b815260040160405180910390fd5b825184511461152a576040516343714afd60e01b815260040160405180910390fd5b5f5b845181101561158d576115858385838151811061154b5761154b613673565b602002602001015187848151811061156557611565613673565b60200260200101516001600160a01b03166123c69092919063ffffffff16565b60010161152c565b5050505050565b604051635ac86ab760e01b8152600760048201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635ac86ab790602401602060405180830381865afa1580156115fa573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061161e91906135d1565b1561163c5760405163840a48d560e01b815260040160405180910390fd5b603a54600160401b90046001600160401b03165f81900361167057604051631a544f4960e01b815260040160405180910390fd5b6040805160a081018252603c54808252603d5462ffffff811660208401526001600160401b0363010000008204811694840194909452600160581b810460070b6060840152600160981b90049092166080820152906116cf9087612418565b5f805b8581101561193857368787838181106116ed576116ed613673565b90506020028101906116ff9190613832565b80355f908152603660209081526040808320815160808101835281546001600160401b038082168352600160401b8204811695830195909552600160801b8104909416928101929092529394509192906060830190600160c01b900460ff16600281111561176f5761176f61321c565b60028111156117805761178061321c565b905250905060018160600151600281111561179d5761179d61321c565b146117a9575050611930565b856001600160401b031681604001516001600160401b0316106117cd575050611930565b5f80806117dd848a8f35886124c9565b60208b01805193965091945092506117f482613850565b62ffffff1690525060808801805184919061181090839061386d565b6001600160401b031690525060608801805183919061183090839061388c565b60070b905250611840818861386d565b85355f908152603660209081526040918290208751815492890151938901516001600160401b03908116600160801b0267ffffffffffffffff60801b19958216600160401b026001600160801b0319909516919092161792909217928316821781556060880151939a50879390929091839160ff60c01b1990911668ffffffffffffffffff60801b1990911617600160c01b8360028111156118e4576118e461321c565b021790555050845160405164ffffffffff90911691506001600160401b038b16907fa91c59033c3423e18b54d0acecebb4972f9ea95aedf5f4cae3b677b02eaf3a3f905f90a350505050505b6001016116d2565b506001600160401b038084165f908152603b60205260408120805484939192916119649185911661386d565b92506101000a8154816001600160401b0302191690836001600160401b03160217905550610949826125ec565b5f815f815181106119a4576119a4613673565b60200260200101519050919050565b5f816003815181106119c7576119c7613673565b60200260200101515f5f1b14159050919050565b6119e7600360206136d2565b6119f46020830183613631565b905014611a14576040516313717da960e21b815260040160405180910390fd5b611a63611a246020830183613631565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152508692505084359050600361281b565b610ee6576040516309bde33960e01b815260040160405180910390fd5b60088414611aa15760405163200591bd60e01b815260040160405180910390fd5b6005611aaf602860016136bf565b611ab991906136bf565b611ac49060206136d2565b8214611ae3576040516313717da960e21b815260040160405180910390fd5b5f611b1f8686808060200260200160405190810160405280939291908181526020018383602002808284375f9201919091525061283292505050565b90505f64ffffffffff8316611b36602860016136bf565b600b901b179050611b8085858080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152508c925086915085905061281b565b611b9d576040516309bde33960e01b815260040160405180910390fd5b5050505050505050565b603a54600160401b90046001600160401b031615611bd75760405162be9bc360e81b815260040160405180910390fd5b603a546001600160401b03428116911603611c05576040516367db5b8b60e01b815260040160405180910390fd5b6034545f906001600160401b0316611c21633b9aca0047613800565b611c2b9190613813565b9050818015611c4157506001600160401b038116155b15611c5f576040516332dea95960e21b815260040160405180910390fd5b5f6040518060a00160405280611c7442610c3c565b815260395462ffffff1660208201526001600160401b0380851660408301525f60608301819052608090920191909152603a805442909216600160401b026fffffffffffffffff0000000000000000199092169190911790559050611cd8816125ec565b805160208083015160405162ffffff90911681526001600160401b034216917f575796133bbed337e5b39aa49a30dc2556a91e0c6c2af4b7b886ae77ebef1076910160405180910390a3505050565b5f5f611d648484808060200260200160405190810160405280939291908181526020018383602002808284375f9201919091525061199192505050565b5f818152603660209081526040808320815160808101835281546001600160401b038082168352600160401b8204811695830195909552600160801b8104909416928101929092529394509192906060830190600160c01b900460ff166002811115611dd257611dd261321c565b6002811115611de357611de361321c565b90525090505f81606001516002811115611dff57611dff61321c565b14611e1d576040516335e09e9d60e01b815260040160405180910390fd5b6001600160401b038016611e628686808060200260200160405190810160405280939291908181526020018383602002808284375f92019190915250612ac292505050565b6001600160401b031603611e8957604051631958236d60e21b815260040160405180910390fd5b6001600160401b038016611ece8686808060200260200160405190810160405280939291908181526020018383602002808284375f92019190915250612ae692505050565b6001600160401b031614611ef557604051632eade63760e01b815260040160405180910390fd5b611efd61226d565b611f06906138bb565b611f418686808060200260200160405190810160405280939291908181526020018383602002808284375f92019190915250612afd92505050565b14611f5f57604051633772dd5360e11b815260040160405180910390fd5b5f611f9b8686808060200260200160405190810160405280939291908181526020018383602002808284375f92019190915250612b1192505050565b9050611fab8a87878b8b8e611a80565b60398054905f611fba836138de565b9091555050603a545f90600160401b90046001600160401b031615611ff157603a54600160401b90046001600160401b0316611ffe565b603a546001600160401b03165b6040805160808101825264ffffffffff8d1681526001600160401b03858116602083015283169181019190915290915060608101600190525f858152603660209081526040918290208351815492850151938501516001600160401b03908116600160801b0267ffffffffffffffff60801b19958216600160401b026001600160801b031990951691909216179290921792831682178155606084015190929091839160ff60c01b1990911668ffffffffffffffffff60801b1990911617600160c01b8360028111156120d3576120d361321c565b021790555050603d80548492506013906120fe908490600160981b90046001600160401b031661386d565b92506101000a8154816001600160401b0302191690836001600160401b031602179055507f2d0800bbc377ea54a08c5db6a87aafff5e3e9c8fead0eda110e40e0c104414498a60405161215e919064ffffffffff91909116815260200190565b60405180910390a16040805164ffffffffff8c1681526001600160401b03838116602083015284168183015290517f0e5fac175b83177cc047381e030d8fb3b42b37bd1c025e22c280facad62c32df9181900360600190a16121cd633b9aca006001600160401b0384166136d2565b9b9a5050505050505050505050565b5f81516030146121ff57604051634f88323960e11b815260040160405180910390fd5b6040516002906122159084905f906020016138f6565b60408051601f198184030181529082905261222f91613713565b602060405180830381855afa15801561224a573d5f5f3e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610c36919061371e565b60408051600160f81b60208201525f602182015230606090811b6bffffffffffffffffffffffff1916602c8301529101604051602081830303815290604052905090565b804710156123015760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e636500000060448201526064016112ed565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f811461234a576040519150601f19603f3d011682016040523d82523d5f602084013e61234f565b606091505b50509050806112525760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d6179206861766520726576657274656400000000000060648201526084016112ed565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052611252908490612b28565b612424600560036136bf565b61242f9060206136d2565b61243c6020830183613631565b90501461245c576040516313717da960e21b815260040160405180910390fd5b606c6124ac61246e6020840184613631565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525087925050853590508461281b565b611252576040516309bde33960e01b815260040160405180910390fd5b83516020850151905f908190816124e1878388612bfb565b9050846001600160401b0316816001600160401b03161461255b57612506858261391a565b6040805164ffffffffff851681526001600160401b038b8116602083015284168183015290519195507f0e5fac175b83177cc047381e030d8fb3b42b37bd1c025e22c280facad62c32df919081900360600190a15b6001600160401b0380821660208b0181905290891660408b01525f036125e05760398054905f61258a83613949565b9091555050600260608a015261259f8461395e565b92508164ffffffffff16886001600160401b03167f2a02361ffa66cf2c2da4682c2355a6adcaa9f6c227b6e6563e68480f9587626a60405160405180910390a35b50509450945094915050565b602081015162ffffff161561268c578051603c556020810151603d80546040840151606085015160809095015162ffffff9094166affffffffffffffffffffff199092169190911763010000006001600160401b0392831602176fffffffffffffffffffffffffffffffff60581b1916600160581b9482169490940267ffffffffffffffff60981b191693909317600160981b9390921692909202179055565b60808101516034545f916126a8916001600160401b031661386d565b90505f826060015183604001516126bf919061388c565b60408401516034805492935090915f906126e39084906001600160401b031661386d565b82546101009290920a6001600160401b03818102199093169183160217909155603a8054600160401b810483166001600160801b03199091161790555f915061273390633b9aca009085166136d2565b90505f612748633b9aca00600785900b613983565b603a546040518281529192506001600160401b0316907f525408c201bc1576eb44116f6478f1c2a54775b19a043bcfdc708364f74f8e449060200160405180910390a260335460405163a1ca780b60e01b81526001600160a01b03918216600482015260248101849052604481018390527f00000000000000000000000000000000000000000000000000000000000000009091169063a1ca780b906064015f604051808303815f87803b1580156127fe575f5ffd5b505af1158015612810573d5f5f3e3d5ffd5b505050505050505050565b5f83612828868585612cd9565b1495945050505050565b5f5f600283516128429190613800565b90505f816001600160401b0381111561285d5761285d6133c8565b604051908082528060200260200182016040528015612886578160200160208202803683370190505b5090505f5b82811015612980576002856128a083836136d2565b815181106128b0576128b0613673565b6020026020010151868360026128c691906136d2565b6128d19060016136bf565b815181106128e1576128e1613673565b6020026020010151604051602001612903929190918252602082015260400190565b60408051601f198184030181529082905261291d91613713565b602060405180830381855afa158015612938573d5f5f3e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061295b919061371e565b82828151811061296d5761296d613673565b602090810291909101015260010161288b565b5061298c600283613800565b91505b8115612a9f575f5b82811015612a8c576002826129ac83836136d2565b815181106129bc576129bc613673565b6020026020010151838360026129d291906136d2565b6129dd9060016136bf565b815181106129ed576129ed613673565b6020026020010151604051602001612a0f929190918252602082015260400190565b60408051601f1981840301815290829052612a2991613713565b602060405180830381855afa158015612a44573d5f5f3e3d5ffd5b5050506040513d601f19601f82011682018060405250810190612a67919061371e565b828281518110612a7957612a79613673565b6020908102919091010152600101612997565b50612a98600283613800565b915061298f565b805f81518110612ab157612ab1613673565b602002602001015192505050919050565b5f610c3682600581518110612ad957612ad9613673565b6020026020010151612dad565b5f610c3682600681518110612ad957612ad9613673565b5f816001815181106119a4576119a4613673565b5f610c3682600281518110612ad957612ad9613673565b5f612b7c826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316612e149092919063ffffffff16565b905080515f1480612b9c575080806020019051810190612b9c91906135d1565b6112525760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016112ed565b5f612c08602660016136bf565b612c139060206136d2565b612c206040840184613631565b905014612c40576040516313717da960e21b815260040160405180910390fd5b5f612c4c6004856139b2565b64ffffffffff169050612ca5612c656040850185613631565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250899250505060208601358461281b565b612cc2576040516309bde33960e01b815260040160405180910390fd5b612cd0836020013585612e22565b95945050505050565b5f83515f14158015612cf6575060208451612cf491906139db565b155b612d13576040516313717da960e21b815260040160405180910390fd5b604080516020808201909252848152905b85518111612da357612d376002856139db565b5f03612d695781515f528086015160205260208260405f60026107d05a03fa612d5e575f5ffd5b600284049350612d91565b808601515f52815160205260208260405f60026107d05a03fa612d8a575f5ffd5b6002840493505b612d9c6020826136bf565b9050612d24565b5051949350505050565b60f881901c60e882901c61ff00161760d882901c62ff0000161760c882901c63ff000000161764ff0000000060b883901c161765ff000000000060a883901c161766ff000000000000609883901c161767ff0000000000000060889290921c919091161790565b6060610d4284845f85612e4e565b5f80612e2f6004846139ee565b612e3a906040613a17565b64ffffffffff169050610d4284821b612dad565b606082471015612eaf5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b60648201526084016112ed565b5f5f866001600160a01b03168587604051612eca9190613713565b5f6040518083038185875af1925050503d805f8114612f04576040519150601f19603f3d011682016040523d82523d5f602084013e612f09565b606091505b5091509150612f1a87838387612f25565b979650505050505050565b60608315612f935782515f03612f8c576001600160a01b0385163b612f8c5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016112ed565b5081610d42565b610d428383815115612fa85781518083602001fd5b8060405162461bcd60e51b81526004016112ed9190613a37565b80356001600160401b0381168114612fd8575f5ffd5b919050565b5f60408284031215612fed575f5ffd5b50919050565b5f5f5f60608486031215613005575f5ffd5b61300e84612fc2565b925060208401356001600160401b03811115613028575f5ffd5b61303486828701612fdd565b92505060408401356001600160401b0381111561304f575f5ffd5b61305b86828701612fdd565b9150509250925092565b5f5f83601f840112613075575f5ffd5b5081356001600160401b0381111561308b575f5ffd5b6020830191508360208260051b85010111156130a5575f5ffd5b9250929050565b5f5f5f5f5f5f5f5f60a0898b0312156130c3575f5ffd5b6130cc89612fc2565b975060208901356001600160401b038111156130e6575f5ffd5b6130f28b828c01612fdd565b97505060408901356001600160401b0381111561310d575f5ffd5b6131198b828c01613065565b90975095505060608901356001600160401b03811115613137575f5ffd5b6131438b828c01613065565b90955093505060808901356001600160401b03811115613161575f5ffd5b61316d8b828c01613065565b999c989b5096995094979396929594505050565b5f60208284031215613191575f5ffd5b61319a82612fc2565b9392505050565b5f5f83601f8401126131b1575f5ffd5b5081356001600160401b038111156131c7575f5ffd5b6020830191508360208285010111156130a5575f5ffd5b5f5f602083850312156131ef575f5ffd5b82356001600160401b03811115613204575f5ffd5b613210858286016131a1565b90969095509350505050565b634e487b7160e01b5f52602160045260245ffd5b6003811061324c57634e487b7160e01b5f52602160045260245ffd5b9052565b60208101610c368284613230565b5f6020828403121561326e575f5ffd5b5035919050565b5f6080820190506001600160401b0383511682526001600160401b0360208401511660208301526001600160401b03604084015116604083015260608301516132c16060840182613230565b5092915050565b80151581146132d5575f5ffd5b50565b5f602082840312156132e8575f5ffd5b813561319a816132c8565b5f5f5f5f5f60608688031215613307575f5ffd5b85356001600160401b0381111561331c575f5ffd5b613328888289016131a1565b90965094505060208601356001600160401b03811115613346575f5ffd5b613352888289016131a1565b96999598509660400135949350505050565b6001600160a01b03811681146132d5575f5ffd5b8035612fd881613364565b5f5f60408385031215613394575f5ffd5b823561339f81613364565b946020939093013593505050565b5f602082840312156133bd575f5ffd5b813561319a81613364565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f191681016001600160401b0381118282101715613404576134046133c8565b604052919050565b5f6001600160401b03821115613424576134246133c8565b5060051b60200190565b5f82601f83011261343d575f5ffd5b813561345061344b8261340c565b6133dc565b8082825260208201915060208360051b860101925085831115613471575f5ffd5b602085015b8381101561348e578035835260209283019201613476565b5095945050505050565b5f5f5f606084860312156134aa575f5ffd5b83356001600160401b038111156134bf575f5ffd5b8401601f810186136134cf575f5ffd5b80356134dd61344b8261340c565b8082825260208201915060208360051b8501019250888311156134fe575f5ffd5b6020840193505b8284101561352957833561351881613364565b825260209384019390910190613505565b955050505060208401356001600160401b03811115613546575f5ffd5b6135528682870161342e565b92505061356160408501613378565b90509250925092565b5f5f5f6040848603121561357c575f5ffd5b83356001600160401b03811115613591575f5ffd5b61359d86828701612fdd565b93505060208401356001600160401b038111156135b8575f5ffd5b6135c486828701613065565b9497909650939450505050565b5f602082840312156135e1575f5ffd5b815161319a816132c8565b5f5f8335601e19843603018112613601575f5ffd5b8301803591506001600160401b0382111561361a575f5ffd5b6020019150600581901b36038213156130a5575f5ffd5b5f5f8335601e19843603018112613646575f5ffd5b8301803591506001600160401b0382111561365f575f5ffd5b6020019150368190038213156130a5575f5ffd5b634e487b7160e01b5f52603260045260245ffd5b5f60208284031215613697575f5ffd5b813564ffffffffff8116811461319a575f5ffd5b634e487b7160e01b5f52601160045260245ffd5b80820180821115610c3657610c366136ab565b8082028115828204841417610c3657610c366136ab565b81810381811115610c3657610c366136ab565b5f81518060208401855e5f93019283525090919050565b5f61319a82846136fc565b5f6020828403121561372e575f5ffd5b5051919050565b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b608081525f61379e60808301888a613735565b82810360208401526137b0818861375d565b905082810360408401526137c5818688613735565b915050826060830152979650505050505050565b602081525f610d42602083018486613735565b634e487b7160e01b5f52601260045260245ffd5b5f8261380e5761380e6137ec565b500490565b6001600160401b038281168282160390811115610c3657610c366136ab565b5f8235605e19833603018112613846575f5ffd5b9190910192915050565b5f62ffffff821680613864576138646136ab565b5f190192915050565b6001600160401b038181168382160190811115610c3657610c366136ab565b600781810b9083900b01677fffffffffffffff8113677fffffffffffffff1982121715610c3657610c366136ab565b80516020808301519190811015612fed575f1960209190910360031b1b16919050565b5f600182016138ef576138ef6136ab565b5060010190565b5f61390182856136fc565b6001600160801b03199390931683525050601001919050565b600782810b9082900b03677fffffffffffffff198112677fffffffffffffff82131715610c3657610c366136ab565b5f81613957576139576136ab565b505f190190565b5f8160070b677fffffffffffffff19810361397b5761397b6136ab565b5f0392915050565b8082025f8212600160ff1b8414161561399e5761399e6136ab565b8181058314821517610c3657610c366136ab565b5f64ffffffffff8316806139c8576139c86137ec565b8064ffffffffff84160491505092915050565b5f826139e9576139e96137ec565b500690565b5f64ffffffffff831680613a0457613a046137ec565b8064ffffffffff84160691505092915050565b64ffffffffff81811683821602908116908181146132c1576132c16136ab565b602081525f61319a602083018461375d56fea2646970667358221220bc08464078b4dc2757c605598b1714abf94d9ed2c9749983c6342fd09cc5b87364736f6c634300081b0033", } // 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 cce5cf5884..7f33610521 100644 --- a/pkg/bindings/EigenPodManager/binding.go +++ b/pkg/bindings/EigenPodManager/binding.go @@ -31,8 +31,8 @@ var ( // EigenPodManagerMetaData contains all meta data concerning the EigenPodManager contract. var EigenPodManagerMetaData = &bind.MetaData{ - ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"_ethPOS\",\"type\":\"address\",\"internalType\":\"contractIETHPOSDeposit\"},{\"name\":\"_eigenPodBeacon\",\"type\":\"address\",\"internalType\":\"contractIBeacon\"},{\"name\":\"_delegationManager\",\"type\":\"address\",\"internalType\":\"contractIDelegationManager\"},{\"name\":\"_pauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"addShares\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"shares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"beaconChainETHStrategy\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"beaconChainSlashingFactor\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"burnableETHShares\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"createPod\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"delegationManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIDelegationManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"eigenPodBeacon\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIBeacon\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"ethPOS\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIETHPOSDeposit\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getPod\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIEigenPod\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"hasPod\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"increaseBurnableShares\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"addedSharesToBurn\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"initialOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_initPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"numPods\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"ownerToPod\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIEigenPod\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"pauseAll\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[{\"name\":\"index\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pauserRegistry\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"podOwnerDepositShares\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"shares\",\"type\":\"int256\",\"internalType\":\"int256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"recordBeaconChainETHBalanceUpdate\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"prevRestakedBalanceWei\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"balanceDeltaWei\",\"type\":\"int256\",\"internalType\":\"int256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"removeDepositShares\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"depositSharesToRemove\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"stake\",\"inputs\":[{\"name\":\"pubkey\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"depositDataRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"stakerDepositShares\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"depositShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"withdrawSharesAsTokens\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"shares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"BeaconChainETHDeposited\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BeaconChainETHWithdrawalCompleted\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"shares\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"nonce\",\"type\":\"uint96\",\"indexed\":false,\"internalType\":\"uint96\"},{\"name\":\"delegatedAddress\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"withdrawer\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"withdrawalRoot\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BeaconChainSlashingFactorDecreased\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"prevBeaconChainSlashingFactor\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"newBeaconChainSlashingFactor\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BurnableETHSharesIncreased\",\"inputs\":[{\"name\":\"shares\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"NewTotalShares\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newTotalShares\",\"type\":\"int256\",\"indexed\":false,\"internalType\":\"int256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"PodDeployed\",\"inputs\":[{\"name\":\"eigenPod\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"podOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"PodSharesUpdated\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"sharesDelta\",\"type\":\"int256\",\"indexed\":false,\"internalType\":\"int256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"CurrentlyPaused\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"EigenPodAlreadyExists\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InputAddressZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidNewPausedStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidStrategy\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"LegacyWithdrawalsNotCompleted\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyDelegationManager\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyEigenPod\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyPauser\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyUnpauser\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SharesNegative\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SharesNotMultipleOfGwei\",\"inputs\":[]}]", - Bin: "0x610100604052348015610010575f5ffd5b50604051612a81380380612a8183398101604081905261002f9161015c565b838383836001600160a01b03811661005a576040516339b190bb60e11b815260040160405180910390fd5b6001600160a01b0390811660805292831660a05290821660c0521660e052610080610089565b505050506101b8565b5f54610100900460ff16156100f45760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff90811614610143575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b0381168114610159575f5ffd5b50565b5f5f5f5f6080858703121561016f575f5ffd5b845161017a81610145565b602086015190945061018b81610145565b604086015190935061019c81610145565b60608601519092506101ad81610145565b939692955090935050565b60805160a05160c05160e0516128496102385f395f8181610530015281816106dd015281816109e301528181610d5a01528181610e0701528181610fb4015261116d01525f81816101f001528181610ecd015261153401525f61030301525f818161034a015281816106120152818161092d015261127301526128495ff3fe6080604052600436106101ba575f3560e01c80639ba06275116100f2578063d48e889411610092578063f5d4fed311610062578063f5d4fed314610571578063f6848d2414610586578063fabc1cbc146105bf578063fe243a17146105de575f5ffd5b8063d48e8894146104d5578063debe1eab14610500578063ea4d3c9b1461051f578063f2fde38b14610552575f5ffd5b8063a3d75e09116100cd578063a3d75e0914610435578063a6a509be1461046d578063c4623ea114610482578063cd6dc687146104b6575f5ffd5b80639ba06275146103c3578063a1ca780b146103f7578063a38406a314610416575f5ffd5b8063724af4231161015d578063886f119511610138578063886f1195146103395780638da5cb5b1461036c5780639104c319146103895780639b4e4634146103b0575f5ffd5b8063724af423146102d357806374cdd798146102f257806384d8106214610325575f5ffd5b8063595c6a6711610198578063595c6a671461024e5780635ac86ab7146102625780635c975abb146102a1578063715018a6146102bf575f5ffd5b8063136439dd146101be578063292b7b2b146101df5780632eae418c1461022f575b5f5ffd5b3480156101c9575f5ffd5b506101dd6101d8366004611af5565b6105fd565b005b3480156101ea575f5ffd5b506102127f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020015b60405180910390f35b34801561023a575f5ffd5b506101dd610249366004611b20565b6106d2565b348015610259575f5ffd5b506101dd610918565b34801561026d575f5ffd5b5061029161027c366004611b6e565b606654600160ff9092169190911b9081161490565b6040519015158152602001610226565b3480156102ac575f5ffd5b506066545b604051908152602001610226565b3480156102ca575f5ffd5b506101dd6109c7565b3480156102de575f5ffd5b506101dd6102ed366004611b8e565b6109d8565b3480156102fd575f5ffd5b506102127f000000000000000000000000000000000000000000000000000000000000000081565b348015610330575f5ffd5b50610212610afe565b348015610344575f5ffd5b506102127f000000000000000000000000000000000000000000000000000000000000000081565b348015610377575f5ffd5b506033546001600160a01b0316610212565b348015610394575f5ffd5b5061021273beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac081565b6101dd6103be366004611c0a565b610b6e565b3480156103ce575f5ffd5b506102126103dd366004611c7d565b60986020525f90815260409020546001600160a01b031681565b348015610402575f5ffd5b506101dd610411366004611c98565b610c2b565b348015610421575f5ffd5b50610212610430366004611c7d565b610e73565b348015610440575f5ffd5b5061045461044f366004611c7d565b610f44565b60405167ffffffffffffffff9091168152602001610226565b348015610478575f5ffd5b506102b160995481565b34801561048d575f5ffd5b506104a161049c366004611b20565b610fa7565b60408051928352602083019190915201610226565b3480156104c1575f5ffd5b506101dd6104d0366004611cca565b611046565b3480156104e0575f5ffd5b506102b16104ef366004611c7d565b609b6020525f908152604090205481565b34801561050b575f5ffd5b506101dd61051a366004611cca565b611162565b34801561052a575f5ffd5b506102127f000000000000000000000000000000000000000000000000000000000000000081565b34801561055d575f5ffd5b506101dd61056c366004611c7d565b6111f8565b34801561057c575f5ffd5b506102b1609e5481565b348015610591575f5ffd5b506102916105a0366004611c7d565b6001600160a01b039081165f9081526098602052604090205416151590565b3480156105ca575f5ffd5b506101dd6105d9366004611af5565b611271565b3480156105e9575f5ffd5b506102b16105f8366004611cf4565b611387565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa15801561065f573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106839190611d2b565b6106a057604051631d77d47760e21b815260040160405180910390fd5b60665481811681146106c55760405163c61dca5d60e01b815260040160405180910390fd5b6106ce82611407565b5050565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461071b5760405163f739589b60e01b815260040160405180910390fd5b6001600160a01b03831673beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac01461075857604051632711b74d60e11b815260040160405180910390fd5b6001600160a01b03841661077f576040516339b190bb60e11b815260040160405180910390fd5b5f811361079f5760405163ef147de160e01b815260040160405180910390fd5b6001600160a01b0384165f908152609b6020526040812054908290821215610899575f6107cb83611d5e565b90505f818511156107e95750806107e28186611d78565b92506107ef565b505f9150835b5f6107fa8286611d8b565b6001600160a01b038a165f818152609b60205260409081902083905551919250907f4e2b791dedccd9fb30141b088cabf5c14a8912b52f59375c95c010700b8c61939061084a9085815260200190565b60405180910390a2886001600160a01b03167fd4def76d6d2bed6f14d5cd9af73cc2913d618d00edde42432e81c09bfe0770988260405161088d91815260200190565b60405180910390a25050505b8015610910576001600160a01b038681165f81815260986020526040908190205490516362483a2160e11b81526004810192909252602482018490529091169063c4907442906044015f604051808303815f87803b1580156108f9575f5ffd5b505af115801561090b573d5f5f3e3d5ffd5b505050505b505050505050565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa15801561097a573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061099e9190611d2b565b6109bb57604051631d77d47760e21b815260040160405180910390fd5b6109c55f19611407565b565b6109cf611444565b6109c55f61149e565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610a215760405163f739589b60e01b815260040160405180910390fd5b6001600160a01b03821673beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac014610a5e57604051632711b74d60e11b815260040160405180910390fd5b6001600160a01b0383165f908152609b6020526040812054610a81908390611db2565b90505f811215610aa45760405163ef147de160e01b815260040160405180910390fd5b6001600160a01b0384165f818152609b602052604090819020839055517fd4def76d6d2bed6f14d5cd9af73cc2913d618d00edde42432e81c09bfe07709890610af09084815260200190565b60405180910390a250505050565b6066545f908190600190811603610b285760405163840a48d560e01b815260040160405180910390fd5b335f908152609860205260409020546001600160a01b031615610b5e5760405163031a852160e21b815260040160405180910390fd5b5f610b676114ef565b9250505090565b6066545f90600190811603610b965760405163840a48d560e01b815260040160405180910390fd5b335f908152609860205260409020546001600160a01b031680610bbe57610bbb6114ef565b90505b6040516326d3918d60e21b81526001600160a01b03821690639b4e4634903490610bf4908b908b908b908b908b90600401611e00565b5f604051808303818588803b158015610c0b575f5ffd5b505af1158015610c1d573d5f5f3e3d5ffd5b505050505050505050505050565b6001600160a01b038084165f908152609860205260409020548491163314610c66576040516312e16d7160e11b815260040160405180910390fd5b610c6e61164a565b6001600160a01b038416610c95576040516339b190bb60e11b815260040160405180910390fd5b610ca3633b9aca0083611e4d565b15610cc1576040516347d072bb60e11b815260040160405180910390fd5b6001600160a01b0384165f908152609b602052604081205490811215610cfa57604051634b692bcf60e01b815260040160405180910390fd5b5f8312610dba575f5f610d0d87866116a3565b604051631e328e7960e11b81526001600160a01b038a8116600483015273beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac0602483015260448201849052606482018390529294509092507f000000000000000000000000000000000000000000000000000000000000000090911690633c651cf2906084015f604051808303815f87803b158015610d9d575f5ffd5b505af1158015610daf573d5f5f3e3d5ffd5b505050505050610e62565b5f610dce8686610dc987611d5e565b6117e0565b60405163305068e760e11b81526001600160a01b0388811660048301526024820185905267ffffffffffffffff831660448301529192507f0000000000000000000000000000000000000000000000000000000000000000909116906360a0d1ce906064015f604051808303815f87803b158015610e4a575f5ffd5b505af1158015610e5c573d5f5f3e3d5ffd5b50505050505b50610e6d600160c955565b50505050565b6001600160a01b038082165f9081526098602052604081205490911680610f3e57610f3b836001600160a01b03165f1b60405180610940016040528061090e8152602001611f0661090e9139604080516001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000166020820152808201919091525f606082015260800160408051601f1981840301815290829052610f209291602001611e83565b604051602081830303815290604052805190602001206118d9565b90505b92915050565b6001600160a01b0381165f908152609d6020908152604080832081518083019092525460ff8116151580835261010090910467ffffffffffffffff169282019290925290610f9a57670de0b6b3a7640000610fa0565b80602001515b9392505050565b5f80336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610ff25760405163f739589b60e01b815260040160405180910390fd5b6001600160a01b03851673beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac01461102f57604051632711b74d60e11b815260040160405180910390fd5b61103986846116a3565b9150915094509492505050565b5f54610100900460ff161580801561106457505f54600160ff909116105b8061107d5750303b15801561107d57505f5460ff166001145b6110e55760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b5f805460ff191660011790558015611106575f805461ff0019166101001790555b61110f8361149e565b61111882611407565b801561115d575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146111ab5760405163f739589b60e01b815260040160405180910390fd5b80609e5f8282546111bc9190611e9f565b90915550506040518181527f1ed04b7fd262c0d9e50fa02957f32a81a151f03baaa367faeedc7521b001c4a49060200160405180910390a15050565b611200611444565b6001600160a01b0381166112655760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016110dc565b61126e8161149e565b50565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156112cd573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906112f19190611eb2565b6001600160a01b0316336001600160a01b0316146113225760405163794821ff60e01b815260040160405180910390fd5b606654801982198116146113495760405163c61dca5d60e01b815260040160405180910390fd5b606682905560405182815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c9060200160405180910390a25050565b5f6001600160a01b03821673beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac0146113c557604051632711b74d60e11b815260040160405180910390fd5b6001600160a01b0383165f908152609b6020526040812054126113ff576001600160a01b0383165f908152609b6020526040902054610f3b565b505f92915050565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a250565b6033546001600160a01b031633146109c55760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016110dc565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b5f60995f81546114fe90611ecd565b9091555060408051610940810190915261090e8082525f9161159b9183913391611f066020830139604080516001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000166020820152808201919091525f606082015260800160408051601f19818403018152908290526115879291602001611e83565b6040516020818303038152906040526118e5565b60405163189acdbd60e31b81523360048201529091506001600160a01b0382169063c4d66de8906024015f604051808303815f87803b1580156115dc575f5ffd5b505af11580156115ee573d5f5f3e3d5ffd5b5050335f8181526098602052604080822080546001600160a01b0319166001600160a01b038816908117909155905192945092507f21c99d0db02213c32fff5b05cf0a718ab5f858802b91498f80d82270289d856a91a3919050565b600260c9540361169c5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016110dc565b600260c955565b5f806001600160a01b0384166116cc576040516339b190bb60e11b815260040160405180910390fd5b5f8312156116ed5760405163ef147de160e01b815260040160405180910390fd5b6001600160a01b0384165f908152609b602052604081205484916117118383611d8b565b6001600160a01b0388165f818152609b60205260409081902083905551919250907f4e2b791dedccd9fb30141b088cabf5c14a8912b52f59375c95c010700b8c6193906117619086815260200190565b60405180910390a2866001600160a01b03167fd4def76d6d2bed6f14d5cd9af73cc2913d618d00edde42432e81c09bfe077098826040516117a491815260200190565b60405180910390a25f81136117c1575f5f945094505050506117d9565b5f82126117ce57816117d0565b5f5b86945094505050505b9250929050565b5f806117ec8385611d78565b90505f6117f886610f44565b90505f61181067ffffffffffffffff831684886119e7565b90505f61181d8284611ee5565b6040805180820182526001815267ffffffffffffffff85811660208084018281526001600160a01b038f165f818152609d845287902095518654925168ffffffffffffffffff1990931690151568ffffffffffffffff001916176101009286169290920291909117909455845193845291881691830191909152918101919091529091507fb160ab8589bf47dc04ea11b50d46678d21590cea2ed3e454e7bd3e41510f98cf9060600160405180910390a1979650505050505050565b5f610f3b838330611acc565b5f834710156119365760405162461bcd60e51b815260206004820152601d60248201527f437265617465323a20696e73756666696369656e742062616c616e636500000060448201526064016110dc565b81515f036119865760405162461bcd60e51b815260206004820181905260248201527f437265617465323a2062797465636f6465206c656e677468206973207a65726f60448201526064016110dc565b8282516020840186f590506001600160a01b038116610fa05760405162461bcd60e51b815260206004820152601960248201527f437265617465323a204661696c6564206f6e206465706c6f790000000000000060448201526064016110dc565b5f80805f19858709858702925082811083820303915050805f03611a1e57838281611a1457611a14611e39565b0492505050610fa0565b808411611a655760405162461bcd60e51b81526020600482015260156024820152744d6174683a206d756c446976206f766572666c6f7760581b60448201526064016110dc565b5f8486880960026001871981018816978890046003810283188082028403028082028403028082028403028082028403028082028403029081029092039091025f889003889004909101858311909403939093029303949094049190911702949350505050565b5f604051836040820152846020820152828152600b8101905060ff815360559020949350505050565b5f60208284031215611b05575f5ffd5b5035919050565b6001600160a01b038116811461126e575f5ffd5b5f5f5f5f60808587031215611b33575f5ffd5b8435611b3e81611b0c565b93506020850135611b4e81611b0c565b92506040850135611b5e81611b0c565b9396929550929360600135925050565b5f60208284031215611b7e575f5ffd5b813560ff81168114610fa0575f5ffd5b5f5f5f60608486031215611ba0575f5ffd5b8335611bab81611b0c565b92506020840135611bbb81611b0c565b929592945050506040919091013590565b5f5f83601f840112611bdc575f5ffd5b50813567ffffffffffffffff811115611bf3575f5ffd5b6020830191508360208285010111156117d9575f5ffd5b5f5f5f5f5f60608688031215611c1e575f5ffd5b853567ffffffffffffffff811115611c34575f5ffd5b611c4088828901611bcc565b909650945050602086013567ffffffffffffffff811115611c5f575f5ffd5b611c6b88828901611bcc565b96999598509660400135949350505050565b5f60208284031215611c8d575f5ffd5b8135610fa081611b0c565b5f5f5f60608486031215611caa575f5ffd5b8335611cb581611b0c565b95602085013595506040909401359392505050565b5f5f60408385031215611cdb575f5ffd5b8235611ce681611b0c565b946020939093013593505050565b5f5f60408385031215611d05575f5ffd5b8235611d1081611b0c565b91506020830135611d2081611b0c565b809150509250929050565b5f60208284031215611d3b575f5ffd5b81518015158114610fa0575f5ffd5b634e487b7160e01b5f52601160045260245ffd5b5f600160ff1b8201611d7257611d72611d4a565b505f0390565b81810381811115610f3e57610f3e611d4a565b8082018281125f831280158216821582161715611daa57611daa611d4a565b505092915050565b8181035f831280158383131683831282161715611dd157611dd1611d4a565b5092915050565b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b606081525f611e13606083018789611dd8565b8281036020840152611e26818688611dd8565b9150508260408301529695505050505050565b634e487b7160e01b5f52601260045260245ffd5b5f82611e6757634e487b7160e01b5f52601260045260245ffd5b500790565b5f81518060208401855e5f93019283525090919050565b5f611e97611e918386611e6c565b84611e6c565b949350505050565b80820180821115610f3e57610f3e611d4a565b5f60208284031215611ec2575f5ffd5b8151610fa081611b0c565b5f60018201611ede57611ede611d4a565b5060010190565b67ffffffffffffffff8281168282160390811115610f3e57610f3e611d4a56fe608060405260405161090e38038061090e83398101604081905261002291610460565b61002e82826000610035565b505061058a565b61003e83610100565b6040516001600160a01b038416907f1cf3b03a6cf19fa2baba4df148e9dcabedea7f8a5c07840e207e5c089be95d3e90600090a260008251118061007f5750805b156100fb576100f9836001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156100c5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906100e99190610520565b836102a360201b6100291760201c565b505b505050565b610113816102cf60201b6100551760201c565b6101725760405162461bcd60e51b815260206004820152602560248201527f455243313936373a206e657720626561636f6e206973206e6f74206120636f6e6044820152641d1c9858dd60da1b60648201526084015b60405180910390fd5b6101e6816001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156101b3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101d79190610520565b6102cf60201b6100551760201c565b61024b5760405162461bcd60e51b815260206004820152603060248201527f455243313936373a20626561636f6e20696d706c656d656e746174696f6e206960448201526f1cc81b9bdd08184818dbdb9d1c9858dd60821b6064820152608401610169565b806102827fa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d5060001b6102de60201b6100641760201c565b80546001600160a01b0319166001600160a01b039290921691909117905550565b60606102c883836040518060600160405280602781526020016108e7602791396102e1565b9392505050565b6001600160a01b03163b151590565b90565b6060600080856001600160a01b0316856040516102fe919061053b565b600060405180830381855af49150503d8060008114610339576040519150601f19603f3d011682016040523d82523d6000602084013e61033e565b606091505b5090925090506103508683838761035a565b9695505050505050565b606083156103c65782516103bf576001600160a01b0385163b6103bf5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610169565b50816103d0565b6103d083836103d8565b949350505050565b8151156103e85781518083602001fd5b8060405162461bcd60e51b81526004016101699190610557565b80516001600160a01b038116811461041957600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b60005b8381101561044f578181015183820152602001610437565b838111156100f95750506000910152565b6000806040838503121561047357600080fd5b61047c83610402565b60208401519092506001600160401b038082111561049957600080fd5b818501915085601f8301126104ad57600080fd5b8151818111156104bf576104bf61041e565b604051601f8201601f19908116603f011681019083821181831017156104e7576104e761041e565b8160405282815288602084870101111561050057600080fd5b610511836020830160208801610434565b80955050505050509250929050565b60006020828403121561053257600080fd5b6102c882610402565b6000825161054d818460208701610434565b9190910192915050565b6020815260008251806020840152610576816040850160208701610434565b601f01601f19169190910160400192915050565b61034e806105996000396000f3fe60806040523661001357610011610017565b005b6100115b610027610022610067565b610100565b565b606061004e83836040518060600160405280602781526020016102f260279139610124565b9392505050565b6001600160a01b03163b151590565b90565b600061009a7fa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50546001600160a01b031690565b6001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156100d7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906100fb9190610249565b905090565b3660008037600080366000845af43d6000803e80801561011f573d6000f35b3d6000fd5b6060600080856001600160a01b03168560405161014191906102a2565b600060405180830381855af49150503d806000811461017c576040519150601f19603f3d011682016040523d82523d6000602084013e610181565b606091505b50915091506101928683838761019c565b9695505050505050565b6060831561020d578251610206576001600160a01b0385163b6102065760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064015b60405180910390fd5b5081610217565b610217838361021f565b949350505050565b81511561022f5781518083602001fd5b8060405162461bcd60e51b81526004016101fd91906102be565b60006020828403121561025b57600080fd5b81516001600160a01b038116811461004e57600080fd5b60005b8381101561028d578181015183820152602001610275565b8381111561029c576000848401525b50505050565b600082516102b4818460208701610272565b9190910192915050565b60208152600082518060208401526102dd816040850160208701610272565b601f01601f1916919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220d51e81d3bc5ed20a26aeb05dce7e825c503b2061aa78628027300c8d65b9d89a64736f6c634300080c0033416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a26469706673582212201402c8076f8df6145cb1637f9c11b36af8aabf01044261cf9f93dcfaf9c3c9b564736f6c634300081b0033", + ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"_ethPOS\",\"type\":\"address\",\"internalType\":\"contractIETHPOSDeposit\"},{\"name\":\"_eigenPodBeacon\",\"type\":\"address\",\"internalType\":\"contractIBeacon\"},{\"name\":\"_delegationManager\",\"type\":\"address\",\"internalType\":\"contractIDelegationManager\"},{\"name\":\"_pauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"addShares\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"shares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"beaconChainETHStrategy\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"beaconChainSlashingFactor\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"burnableETHShares\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"createPod\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"delegationManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIDelegationManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"eigenPodBeacon\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIBeacon\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"ethPOS\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIETHPOSDeposit\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getPod\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIEigenPod\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"hasPod\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"increaseBurnableShares\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"addedSharesToBurn\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"initialOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_initPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"numPods\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"ownerToPod\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIEigenPod\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"pauseAll\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[{\"name\":\"index\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pauserRegistry\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"podOwnerDepositShares\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"shares\",\"type\":\"int256\",\"internalType\":\"int256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"recordBeaconChainETHBalanceUpdate\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"prevRestakedBalanceWei\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"balanceDeltaWei\",\"type\":\"int256\",\"internalType\":\"int256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"removeDepositShares\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"depositSharesToRemove\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"stake\",\"inputs\":[{\"name\":\"pubkey\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"depositDataRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"stakerDepositShares\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"depositShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"withdrawSharesAsTokens\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"shares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"BeaconChainETHDeposited\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BeaconChainETHWithdrawalCompleted\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"shares\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"nonce\",\"type\":\"uint96\",\"indexed\":false,\"internalType\":\"uint96\"},{\"name\":\"delegatedAddress\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"withdrawer\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"withdrawalRoot\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BeaconChainSlashingFactorDecreased\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"prevBeaconChainSlashingFactor\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"newBeaconChainSlashingFactor\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BurnableETHSharesIncreased\",\"inputs\":[{\"name\":\"shares\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"NewTotalShares\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newTotalShares\",\"type\":\"int256\",\"indexed\":false,\"internalType\":\"int256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"PodDeployed\",\"inputs\":[{\"name\":\"eigenPod\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"podOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"PodSharesUpdated\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"sharesDelta\",\"type\":\"int256\",\"indexed\":false,\"internalType\":\"int256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"CurrentlyPaused\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"EigenPodAlreadyExists\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InputAddressZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidNewPausedStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidStrategy\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"LegacyWithdrawalsNotCompleted\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyDelegationManager\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyEigenPod\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyPauser\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyUnpauser\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SharesNegative\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SharesNotMultipleOfGwei\",\"inputs\":[]}]", + Bin: "0x610100604052348015610010575f5ffd5b50604051612a80380380612a8083398101604081905261002f9161015c565b838383836001600160a01b03811661005a576040516339b190bb60e11b815260040160405180910390fd5b6001600160a01b0390811660805292831660a05290821660c0521660e052610080610089565b505050506101b8565b5f54610100900460ff16156100f45760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff90811614610143575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b0381168114610159575f5ffd5b50565b5f5f5f5f6080858703121561016f575f5ffd5b845161017a81610145565b602086015190945061018b81610145565b604086015190935061019c81610145565b60608601519092506101ad81610145565b939692955090935050565b60805160a05160c05160e0516128486102385f395f8181610530015281816106dd0152818161092501528181610a8101528181610df801528181610ea5015261116c01525f81816101f001528181610f6b015261167001525f61033701525f818161037e01528181610612015281816109cb015261127201526128485ff3fe6080604052600436106101ba575f3560e01c80639b4e4634116100f2578063d48e889411610092578063f5d4fed311610062578063f5d4fed314610571578063f6848d2414610586578063fabc1cbc146105bf578063fe243a17146105de575f5ffd5b8063d48e8894146104d5578063debe1eab14610500578063ea4d3c9b1461051f578063f2fde38b14610552575f5ffd5b8063a38406a3116100cd578063a38406a31461044a578063a3d75e0914610469578063a6a509be146104a1578063cd6dc687146104b6575f5ffd5b80639b4e4634146103e45780639ba06275146103f7578063a1ca780b1461042b575f5ffd5b8063715018a61161015d57806384d810621161013857806384d8106214610359578063886f11951461036d5780638da5cb5b146103a05780639104c319146103bd575f5ffd5b8063715018a6146102f3578063724af4231461030757806374cdd79814610326575f5ffd5b806350ff72251161019857806350ff72251461024e578063595c6a67146102825780635ac86ab7146102965780635c975abb146102d5575f5ffd5b8063136439dd146101be578063292b7b2b146101df5780632eae418c1461022f575b5f5ffd5b3480156101c9575f5ffd5b506101dd6101d8366004611af4565b6105fd565b005b3480156101ea575f5ffd5b506102127f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020015b60405180910390f35b34801561023a575f5ffd5b506101dd610249366004611b1f565b6106d2565b348015610259575f5ffd5b5061026d610268366004611b6d565b610918565b60408051928352602083019190915201610226565b34801561028d575f5ffd5b506101dd6109b6565b3480156102a1575f5ffd5b506102c56102b0366004611bab565b606654600160ff9092169190911b9081161490565b6040519015158152602001610226565b3480156102e0575f5ffd5b506066545b604051908152602001610226565b3480156102fe575f5ffd5b506101dd610a65565b348015610312575f5ffd5b506101dd610321366004611b6d565b610a76565b348015610331575f5ffd5b506102127f000000000000000000000000000000000000000000000000000000000000000081565b348015610364575f5ffd5b50610212610b9c565b348015610378575f5ffd5b506102127f000000000000000000000000000000000000000000000000000000000000000081565b3480156103ab575f5ffd5b506033546001600160a01b0316610212565b3480156103c8575f5ffd5b5061021273beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac081565b6101dd6103f2366004611c09565b610c0c565b348015610402575f5ffd5b50610212610411366004611c7c565b60986020525f90815260409020546001600160a01b031681565b348015610436575f5ffd5b506101dd610445366004611c97565b610cc9565b348015610455575f5ffd5b50610212610464366004611c7c565b610f11565b348015610474575f5ffd5b50610488610483366004611c7c565b610fe2565b60405167ffffffffffffffff9091168152602001610226565b3480156104ac575f5ffd5b506102e560995481565b3480156104c1575f5ffd5b506101dd6104d0366004611cc9565b611045565b3480156104e0575f5ffd5b506102e56104ef366004611c7c565b609b6020525f908152604090205481565b34801561050b575f5ffd5b506101dd61051a366004611cc9565b611161565b34801561052a575f5ffd5b506102127f000000000000000000000000000000000000000000000000000000000000000081565b34801561055d575f5ffd5b506101dd61056c366004611c7c565b6111f7565b34801561057c575f5ffd5b506102e5609e5481565b348015610591575f5ffd5b506102c56105a0366004611c7c565b6001600160a01b039081165f9081526098602052604090205416151590565b3480156105ca575f5ffd5b506101dd6105d9366004611af4565b611270565b3480156105e9575f5ffd5b506102e56105f8366004611cf3565b611386565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa15801561065f573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106839190611d2a565b6106a057604051631d77d47760e21b815260040160405180910390fd5b60665481811681146106c55760405163c61dca5d60e01b815260040160405180910390fd5b6106ce82611406565b5050565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461071b5760405163f739589b60e01b815260040160405180910390fd5b6001600160a01b03831673beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac01461075857604051632711b74d60e11b815260040160405180910390fd5b6001600160a01b03841661077f576040516339b190bb60e11b815260040160405180910390fd5b5f811361079f5760405163ef147de160e01b815260040160405180910390fd5b6001600160a01b0384165f908152609b6020526040812054908290821215610899575f6107cb83611d5d565b90505f818511156107e95750806107e28186611d77565b92506107ef565b505f9150835b5f6107fa8286611d8a565b6001600160a01b038a165f818152609b60205260409081902083905551919250907f4e2b791dedccd9fb30141b088cabf5c14a8912b52f59375c95c010700b8c61939061084a9085815260200190565b60405180910390a2886001600160a01b03167fd4def76d6d2bed6f14d5cd9af73cc2913d618d00edde42432e81c09bfe0770988260405161088d91815260200190565b60405180910390a25050505b8015610910576001600160a01b038681165f81815260986020526040908190205490516362483a2160e11b81526004810192909252602482018490529091169063c4907442906044015f604051808303815f87803b1580156108f9575f5ffd5b505af115801561090b573d5f5f3e3d5ffd5b505050505b505050505050565b5f80336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146109635760405163f739589b60e01b815260040160405180910390fd5b6001600160a01b03841673beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac0146109a057604051632711b74d60e11b815260040160405180910390fd5b6109aa8584611443565b91509150935093915050565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa158015610a18573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a3c9190611d2a565b610a5957604051631d77d47760e21b815260040160405180910390fd5b610a635f19611406565b565b610a6d611580565b610a635f6115da565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610abf5760405163f739589b60e01b815260040160405180910390fd5b6001600160a01b03821673beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac014610afc57604051632711b74d60e11b815260040160405180910390fd5b6001600160a01b0383165f908152609b6020526040812054610b1f908390611db1565b90505f811215610b425760405163ef147de160e01b815260040160405180910390fd5b6001600160a01b0384165f818152609b602052604090819020839055517fd4def76d6d2bed6f14d5cd9af73cc2913d618d00edde42432e81c09bfe07709890610b8e9084815260200190565b60405180910390a250505050565b6066545f908190600190811603610bc65760405163840a48d560e01b815260040160405180910390fd5b335f908152609860205260409020546001600160a01b031615610bfc5760405163031a852160e21b815260040160405180910390fd5b5f610c0561162b565b9250505090565b6066545f90600190811603610c345760405163840a48d560e01b815260040160405180910390fd5b335f908152609860205260409020546001600160a01b031680610c5c57610c5961162b565b90505b6040516326d3918d60e21b81526001600160a01b03821690639b4e4634903490610c92908b908b908b908b908b90600401611dff565b5f604051808303818588803b158015610ca9575f5ffd5b505af1158015610cbb573d5f5f3e3d5ffd5b505050505050505050505050565b6001600160a01b038084165f908152609860205260409020548491163314610d04576040516312e16d7160e11b815260040160405180910390fd5b610d0c611786565b6001600160a01b038416610d33576040516339b190bb60e11b815260040160405180910390fd5b610d41633b9aca0083611e4c565b15610d5f576040516347d072bb60e11b815260040160405180910390fd5b6001600160a01b0384165f908152609b602052604081205490811215610d9857604051634b692bcf60e01b815260040160405180910390fd5b5f8312610e58575f5f610dab8786611443565b604051631e328e7960e11b81526001600160a01b038a8116600483015273beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac0602483015260448201849052606482018390529294509092507f000000000000000000000000000000000000000000000000000000000000000090911690633c651cf2906084015f604051808303815f87803b158015610e3b575f5ffd5b505af1158015610e4d573d5f5f3e3d5ffd5b505050505050610f00565b5f610e6c8686610e6787611d5d565b6117df565b60405163305068e760e11b81526001600160a01b0388811660048301526024820185905267ffffffffffffffff831660448301529192507f0000000000000000000000000000000000000000000000000000000000000000909116906360a0d1ce906064015f604051808303815f87803b158015610ee8575f5ffd5b505af1158015610efa573d5f5f3e3d5ffd5b50505050505b50610f0b600160c955565b50505050565b6001600160a01b038082165f9081526098602052604081205490911680610fdc57610fd9836001600160a01b03165f1b60405180610940016040528061090e8152602001611f0561090e9139604080516001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000166020820152808201919091525f606082015260800160408051601f1981840301815290829052610fbe9291602001611e82565b604051602081830303815290604052805190602001206118d8565b90505b92915050565b6001600160a01b0381165f908152609d6020908152604080832081518083019092525460ff8116151580835261010090910467ffffffffffffffff16928201929092529061103857670de0b6b3a764000061103e565b80602001515b9392505050565b5f54610100900460ff161580801561106357505f54600160ff909116105b8061107c5750303b15801561107c57505f5460ff166001145b6110e45760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b5f805460ff191660011790558015611105575f805461ff0019166101001790555b61110e836115da565b61111782611406565b801561115c575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146111aa5760405163f739589b60e01b815260040160405180910390fd5b80609e5f8282546111bb9190611e9e565b90915550506040518181527f1ed04b7fd262c0d9e50fa02957f32a81a151f03baaa367faeedc7521b001c4a49060200160405180910390a15050565b6111ff611580565b6001600160a01b0381166112645760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016110db565b61126d816115da565b50565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156112cc573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906112f09190611eb1565b6001600160a01b0316336001600160a01b0316146113215760405163794821ff60e01b815260040160405180910390fd5b606654801982198116146113485760405163c61dca5d60e01b815260040160405180910390fd5b606682905560405182815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c9060200160405180910390a25050565b5f6001600160a01b03821673beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac0146113c457604051632711b74d60e11b815260040160405180910390fd5b6001600160a01b0383165f908152609b6020526040812054126113fe576001600160a01b0383165f908152609b6020526040902054610fd9565b505f92915050565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a250565b5f806001600160a01b03841661146c576040516339b190bb60e11b815260040160405180910390fd5b5f83121561148d5760405163ef147de160e01b815260040160405180910390fd5b6001600160a01b0384165f908152609b602052604081205484916114b18383611d8a565b6001600160a01b0388165f818152609b60205260409081902083905551919250907f4e2b791dedccd9fb30141b088cabf5c14a8912b52f59375c95c010700b8c6193906115019086815260200190565b60405180910390a2866001600160a01b03167fd4def76d6d2bed6f14d5cd9af73cc2913d618d00edde42432e81c09bfe0770988260405161154491815260200190565b60405180910390a25f8113611561575f5f94509450505050611579565b5f821261156e5781611570565b5f5b86945094505050505b9250929050565b6033546001600160a01b03163314610a635760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016110db565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b5f60995f815461163a90611ecc565b9091555060408051610940810190915261090e8082525f916116d79183913391611f056020830139604080516001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000166020820152808201919091525f606082015260800160408051601f19818403018152908290526116c39291602001611e82565b6040516020818303038152906040526118e4565b60405163189acdbd60e31b81523360048201529091506001600160a01b0382169063c4d66de8906024015f604051808303815f87803b158015611718575f5ffd5b505af115801561172a573d5f5f3e3d5ffd5b5050335f8181526098602052604080822080546001600160a01b0319166001600160a01b038816908117909155905192945092507f21c99d0db02213c32fff5b05cf0a718ab5f858802b91498f80d82270289d856a91a3919050565b600260c954036117d85760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016110db565b600260c955565b5f806117eb8385611d77565b90505f6117f786610fe2565b90505f61180f67ffffffffffffffff831684886119e6565b90505f61181c8284611ee4565b6040805180820182526001815267ffffffffffffffff85811660208084018281526001600160a01b038f165f818152609d845287902095518654925168ffffffffffffffffff1990931690151568ffffffffffffffff001916176101009286169290920291909117909455845193845291881691830191909152918101919091529091507fb160ab8589bf47dc04ea11b50d46678d21590cea2ed3e454e7bd3e41510f98cf9060600160405180910390a1979650505050505050565b5f610fd9838330611acb565b5f834710156119355760405162461bcd60e51b815260206004820152601d60248201527f437265617465323a20696e73756666696369656e742062616c616e636500000060448201526064016110db565b81515f036119855760405162461bcd60e51b815260206004820181905260248201527f437265617465323a2062797465636f6465206c656e677468206973207a65726f60448201526064016110db565b8282516020840186f590506001600160a01b03811661103e5760405162461bcd60e51b815260206004820152601960248201527f437265617465323a204661696c6564206f6e206465706c6f790000000000000060448201526064016110db565b5f80805f19858709858702925082811083820303915050805f03611a1d57838281611a1357611a13611e38565b049250505061103e565b808411611a645760405162461bcd60e51b81526020600482015260156024820152744d6174683a206d756c446976206f766572666c6f7760581b60448201526064016110db565b5f8486880960026001871981018816978890046003810283188082028403028082028403028082028403028082028403028082028403029081029092039091025f889003889004909101858311909403939093029303949094049190911702949350505050565b5f604051836040820152846020820152828152600b8101905060ff815360559020949350505050565b5f60208284031215611b04575f5ffd5b5035919050565b6001600160a01b038116811461126d575f5ffd5b5f5f5f5f60808587031215611b32575f5ffd5b8435611b3d81611b0b565b93506020850135611b4d81611b0b565b92506040850135611b5d81611b0b565b9396929550929360600135925050565b5f5f5f60608486031215611b7f575f5ffd5b8335611b8a81611b0b565b92506020840135611b9a81611b0b565b929592945050506040919091013590565b5f60208284031215611bbb575f5ffd5b813560ff8116811461103e575f5ffd5b5f5f83601f840112611bdb575f5ffd5b50813567ffffffffffffffff811115611bf2575f5ffd5b602083019150836020828501011115611579575f5ffd5b5f5f5f5f5f60608688031215611c1d575f5ffd5b853567ffffffffffffffff811115611c33575f5ffd5b611c3f88828901611bcb565b909650945050602086013567ffffffffffffffff811115611c5e575f5ffd5b611c6a88828901611bcb565b96999598509660400135949350505050565b5f60208284031215611c8c575f5ffd5b813561103e81611b0b565b5f5f5f60608486031215611ca9575f5ffd5b8335611cb481611b0b565b95602085013595506040909401359392505050565b5f5f60408385031215611cda575f5ffd5b8235611ce581611b0b565b946020939093013593505050565b5f5f60408385031215611d04575f5ffd5b8235611d0f81611b0b565b91506020830135611d1f81611b0b565b809150509250929050565b5f60208284031215611d3a575f5ffd5b8151801515811461103e575f5ffd5b634e487b7160e01b5f52601160045260245ffd5b5f600160ff1b8201611d7157611d71611d49565b505f0390565b81810381811115610fdc57610fdc611d49565b8082018281125f831280158216821582161715611da957611da9611d49565b505092915050565b8181035f831280158383131683831282161715611dd057611dd0611d49565b5092915050565b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b606081525f611e12606083018789611dd7565b8281036020840152611e25818688611dd7565b9150508260408301529695505050505050565b634e487b7160e01b5f52601260045260245ffd5b5f82611e6657634e487b7160e01b5f52601260045260245ffd5b500790565b5f81518060208401855e5f93019283525090919050565b5f611e96611e908386611e6b565b84611e6b565b949350505050565b80820180821115610fdc57610fdc611d49565b5f60208284031215611ec1575f5ffd5b815161103e81611b0b565b5f60018201611edd57611edd611d49565b5060010190565b67ffffffffffffffff8281168282160390811115610fdc57610fdc611d4956fe608060405260405161090e38038061090e83398101604081905261002291610460565b61002e82826000610035565b505061058a565b61003e83610100565b6040516001600160a01b038416907f1cf3b03a6cf19fa2baba4df148e9dcabedea7f8a5c07840e207e5c089be95d3e90600090a260008251118061007f5750805b156100fb576100f9836001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156100c5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906100e99190610520565b836102a360201b6100291760201c565b505b505050565b610113816102cf60201b6100551760201c565b6101725760405162461bcd60e51b815260206004820152602560248201527f455243313936373a206e657720626561636f6e206973206e6f74206120636f6e6044820152641d1c9858dd60da1b60648201526084015b60405180910390fd5b6101e6816001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156101b3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101d79190610520565b6102cf60201b6100551760201c565b61024b5760405162461bcd60e51b815260206004820152603060248201527f455243313936373a20626561636f6e20696d706c656d656e746174696f6e206960448201526f1cc81b9bdd08184818dbdb9d1c9858dd60821b6064820152608401610169565b806102827fa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d5060001b6102de60201b6100641760201c565b80546001600160a01b0319166001600160a01b039290921691909117905550565b60606102c883836040518060600160405280602781526020016108e7602791396102e1565b9392505050565b6001600160a01b03163b151590565b90565b6060600080856001600160a01b0316856040516102fe919061053b565b600060405180830381855af49150503d8060008114610339576040519150601f19603f3d011682016040523d82523d6000602084013e61033e565b606091505b5090925090506103508683838761035a565b9695505050505050565b606083156103c65782516103bf576001600160a01b0385163b6103bf5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610169565b50816103d0565b6103d083836103d8565b949350505050565b8151156103e85781518083602001fd5b8060405162461bcd60e51b81526004016101699190610557565b80516001600160a01b038116811461041957600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b60005b8381101561044f578181015183820152602001610437565b838111156100f95750506000910152565b6000806040838503121561047357600080fd5b61047c83610402565b60208401519092506001600160401b038082111561049957600080fd5b818501915085601f8301126104ad57600080fd5b8151818111156104bf576104bf61041e565b604051601f8201601f19908116603f011681019083821181831017156104e7576104e761041e565b8160405282815288602084870101111561050057600080fd5b610511836020830160208801610434565b80955050505050509250929050565b60006020828403121561053257600080fd5b6102c882610402565b6000825161054d818460208701610434565b9190910192915050565b6020815260008251806020840152610576816040850160208701610434565b601f01601f19169190910160400192915050565b61034e806105996000396000f3fe60806040523661001357610011610017565b005b6100115b610027610022610067565b610100565b565b606061004e83836040518060600160405280602781526020016102f260279139610124565b9392505050565b6001600160a01b03163b151590565b90565b600061009a7fa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50546001600160a01b031690565b6001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156100d7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906100fb9190610249565b905090565b3660008037600080366000845af43d6000803e80801561011f573d6000f35b3d6000fd5b6060600080856001600160a01b03168560405161014191906102a2565b600060405180830381855af49150503d806000811461017c576040519150601f19603f3d011682016040523d82523d6000602084013e610181565b606091505b50915091506101928683838761019c565b9695505050505050565b6060831561020d578251610206576001600160a01b0385163b6102065760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064015b60405180910390fd5b5081610217565b610217838361021f565b949350505050565b81511561022f5781518083602001fd5b8060405162461bcd60e51b81526004016101fd91906102be565b60006020828403121561025b57600080fd5b81516001600160a01b038116811461004e57600080fd5b60005b8381101561028d578181015183820152602001610275565b8381111561029c576000848401525b50505050565b600082516102b4818460208701610272565b9190910192915050565b60208152600082518060208401526102dd816040850160208701610272565b601f01601f1916919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220d51e81d3bc5ed20a26aeb05dce7e825c503b2061aa78628027300c8d65b9d89a64736f6c634300080c0033416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a26469706673582212207ccf2a4e7a06c56699b867e6865f6ae21b22c97125b77c5385239c53c6b4be7c64736f6c634300081b0033", } // EigenPodManagerABI is the input ABI used to generate the binding from. @@ -698,25 +698,25 @@ func (_EigenPodManager *EigenPodManagerCallerSession) StakerDepositShares(user c return _EigenPodManager.Contract.StakerDepositShares(&_EigenPodManager.CallOpts, user, strategy) } -// AddShares is a paid mutator transaction binding the contract method 0xc4623ea1. +// AddShares is a paid mutator transaction binding the contract method 0x50ff7225. // -// Solidity: function addShares(address staker, address strategy, address , uint256 shares) returns(uint256, uint256) -func (_EigenPodManager *EigenPodManagerTransactor) AddShares(opts *bind.TransactOpts, staker common.Address, strategy common.Address, arg2 common.Address, shares *big.Int) (*types.Transaction, error) { - return _EigenPodManager.contract.Transact(opts, "addShares", staker, strategy, arg2, shares) +// Solidity: function addShares(address staker, address strategy, uint256 shares) returns(uint256, uint256) +func (_EigenPodManager *EigenPodManagerTransactor) AddShares(opts *bind.TransactOpts, staker common.Address, strategy common.Address, shares *big.Int) (*types.Transaction, error) { + return _EigenPodManager.contract.Transact(opts, "addShares", staker, strategy, shares) } -// AddShares is a paid mutator transaction binding the contract method 0xc4623ea1. +// AddShares is a paid mutator transaction binding the contract method 0x50ff7225. // -// Solidity: function addShares(address staker, address strategy, address , uint256 shares) returns(uint256, uint256) -func (_EigenPodManager *EigenPodManagerSession) AddShares(staker common.Address, strategy common.Address, arg2 common.Address, shares *big.Int) (*types.Transaction, error) { - return _EigenPodManager.Contract.AddShares(&_EigenPodManager.TransactOpts, staker, strategy, arg2, shares) +// Solidity: function addShares(address staker, address strategy, uint256 shares) returns(uint256, uint256) +func (_EigenPodManager *EigenPodManagerSession) AddShares(staker common.Address, strategy common.Address, shares *big.Int) (*types.Transaction, error) { + return _EigenPodManager.Contract.AddShares(&_EigenPodManager.TransactOpts, staker, strategy, shares) } -// AddShares is a paid mutator transaction binding the contract method 0xc4623ea1. +// AddShares is a paid mutator transaction binding the contract method 0x50ff7225. // -// Solidity: function addShares(address staker, address strategy, address , uint256 shares) returns(uint256, uint256) -func (_EigenPodManager *EigenPodManagerTransactorSession) AddShares(staker common.Address, strategy common.Address, arg2 common.Address, shares *big.Int) (*types.Transaction, error) { - return _EigenPodManager.Contract.AddShares(&_EigenPodManager.TransactOpts, staker, strategy, arg2, shares) +// Solidity: function addShares(address staker, address strategy, uint256 shares) returns(uint256, uint256) +func (_EigenPodManager *EigenPodManagerTransactorSession) AddShares(staker common.Address, strategy common.Address, shares *big.Int) (*types.Transaction, error) { + return _EigenPodManager.Contract.AddShares(&_EigenPodManager.TransactOpts, staker, strategy, shares) } // CreatePod is a paid mutator transaction binding the contract method 0x84d81062. diff --git a/pkg/bindings/EigenPodManagerStorage/binding.go b/pkg/bindings/EigenPodManagerStorage/binding.go index dc79af2e92..d72f1145d2 100644 --- a/pkg/bindings/EigenPodManagerStorage/binding.go +++ b/pkg/bindings/EigenPodManagerStorage/binding.go @@ -31,7 +31,7 @@ var ( // EigenPodManagerStorageMetaData contains all meta data concerning the EigenPodManagerStorage contract. var EigenPodManagerStorageMetaData = &bind.MetaData{ - ABI: "[{\"type\":\"function\",\"name\":\"addShares\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"shares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"beaconChainETHStrategy\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"beaconChainSlashingFactor\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"burnableETHShares\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"createPod\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"delegationManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIDelegationManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"eigenPodBeacon\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIBeacon\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"ethPOS\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIETHPOSDeposit\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getPod\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIEigenPod\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"hasPod\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"increaseBurnableShares\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"addedSharesToBurn\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"numPods\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"ownerToPod\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIEigenPod\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"pauseAll\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[{\"name\":\"index\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pauserRegistry\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"podOwnerDepositShares\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"shares\",\"type\":\"int256\",\"internalType\":\"int256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"recordBeaconChainETHBalanceUpdate\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"prevRestakedBalanceWei\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"balanceDeltaWei\",\"type\":\"int256\",\"internalType\":\"int256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"removeDepositShares\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"depositSharesToRemove\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"stake\",\"inputs\":[{\"name\":\"pubkey\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"depositDataRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"stakerDepositShares\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"depositShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"withdrawSharesAsTokens\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"shares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"BeaconChainETHDeposited\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BeaconChainETHWithdrawalCompleted\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"shares\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"nonce\",\"type\":\"uint96\",\"indexed\":false,\"internalType\":\"uint96\"},{\"name\":\"delegatedAddress\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"withdrawer\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"withdrawalRoot\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BeaconChainSlashingFactorDecreased\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"prevBeaconChainSlashingFactor\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"newBeaconChainSlashingFactor\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BurnableETHSharesIncreased\",\"inputs\":[{\"name\":\"shares\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"NewTotalShares\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newTotalShares\",\"type\":\"int256\",\"indexed\":false,\"internalType\":\"int256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"PodDeployed\",\"inputs\":[{\"name\":\"eigenPod\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"podOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"PodSharesUpdated\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"sharesDelta\",\"type\":\"int256\",\"indexed\":false,\"internalType\":\"int256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"CurrentlyPaused\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"EigenPodAlreadyExists\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InputAddressZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidNewPausedStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidStrategy\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"LegacyWithdrawalsNotCompleted\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyDelegationManager\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyEigenPod\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyPauser\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyUnpauser\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SharesNegative\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SharesNotMultipleOfGwei\",\"inputs\":[]}]", + ABI: "[{\"type\":\"function\",\"name\":\"addShares\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"shares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"beaconChainETHStrategy\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"beaconChainSlashingFactor\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"burnableETHShares\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"createPod\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"delegationManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIDelegationManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"eigenPodBeacon\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIBeacon\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"ethPOS\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIETHPOSDeposit\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getPod\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIEigenPod\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"hasPod\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"increaseBurnableShares\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"addedSharesToBurn\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"numPods\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"ownerToPod\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIEigenPod\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"pauseAll\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[{\"name\":\"index\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pauserRegistry\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"podOwnerDepositShares\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"shares\",\"type\":\"int256\",\"internalType\":\"int256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"recordBeaconChainETHBalanceUpdate\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"prevRestakedBalanceWei\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"balanceDeltaWei\",\"type\":\"int256\",\"internalType\":\"int256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"removeDepositShares\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"depositSharesToRemove\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"stake\",\"inputs\":[{\"name\":\"pubkey\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"depositDataRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"stakerDepositShares\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"depositShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"withdrawSharesAsTokens\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"shares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"BeaconChainETHDeposited\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BeaconChainETHWithdrawalCompleted\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"shares\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"nonce\",\"type\":\"uint96\",\"indexed\":false,\"internalType\":\"uint96\"},{\"name\":\"delegatedAddress\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"withdrawer\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"withdrawalRoot\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BeaconChainSlashingFactorDecreased\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"prevBeaconChainSlashingFactor\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"newBeaconChainSlashingFactor\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BurnableETHSharesIncreased\",\"inputs\":[{\"name\":\"shares\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"NewTotalShares\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newTotalShares\",\"type\":\"int256\",\"indexed\":false,\"internalType\":\"int256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"PodDeployed\",\"inputs\":[{\"name\":\"eigenPod\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"podOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"PodSharesUpdated\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"sharesDelta\",\"type\":\"int256\",\"indexed\":false,\"internalType\":\"int256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"CurrentlyPaused\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"EigenPodAlreadyExists\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InputAddressZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidNewPausedStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidStrategy\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"LegacyWithdrawalsNotCompleted\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyDelegationManager\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyEigenPod\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyPauser\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyUnpauser\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SharesNegative\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SharesNotMultipleOfGwei\",\"inputs\":[]}]", } // EigenPodManagerStorageABI is the input ABI used to generate the binding from. @@ -645,25 +645,25 @@ func (_EigenPodManagerStorage *EigenPodManagerStorageCallerSession) StakerDeposi return _EigenPodManagerStorage.Contract.StakerDepositShares(&_EigenPodManagerStorage.CallOpts, user, strategy) } -// AddShares is a paid mutator transaction binding the contract method 0xc4623ea1. +// AddShares is a paid mutator transaction binding the contract method 0x50ff7225. // -// Solidity: function addShares(address staker, address strategy, address token, uint256 shares) returns(uint256, uint256) -func (_EigenPodManagerStorage *EigenPodManagerStorageTransactor) AddShares(opts *bind.TransactOpts, staker common.Address, strategy common.Address, token common.Address, shares *big.Int) (*types.Transaction, error) { - return _EigenPodManagerStorage.contract.Transact(opts, "addShares", staker, strategy, token, shares) +// Solidity: function addShares(address staker, address strategy, uint256 shares) returns(uint256, uint256) +func (_EigenPodManagerStorage *EigenPodManagerStorageTransactor) AddShares(opts *bind.TransactOpts, staker common.Address, strategy common.Address, shares *big.Int) (*types.Transaction, error) { + return _EigenPodManagerStorage.contract.Transact(opts, "addShares", staker, strategy, shares) } -// AddShares is a paid mutator transaction binding the contract method 0xc4623ea1. +// AddShares is a paid mutator transaction binding the contract method 0x50ff7225. // -// Solidity: function addShares(address staker, address strategy, address token, uint256 shares) returns(uint256, uint256) -func (_EigenPodManagerStorage *EigenPodManagerStorageSession) AddShares(staker common.Address, strategy common.Address, token common.Address, shares *big.Int) (*types.Transaction, error) { - return _EigenPodManagerStorage.Contract.AddShares(&_EigenPodManagerStorage.TransactOpts, staker, strategy, token, shares) +// Solidity: function addShares(address staker, address strategy, uint256 shares) returns(uint256, uint256) +func (_EigenPodManagerStorage *EigenPodManagerStorageSession) AddShares(staker common.Address, strategy common.Address, shares *big.Int) (*types.Transaction, error) { + return _EigenPodManagerStorage.Contract.AddShares(&_EigenPodManagerStorage.TransactOpts, staker, strategy, shares) } -// AddShares is a paid mutator transaction binding the contract method 0xc4623ea1. +// AddShares is a paid mutator transaction binding the contract method 0x50ff7225. // -// Solidity: function addShares(address staker, address strategy, address token, uint256 shares) returns(uint256, uint256) -func (_EigenPodManagerStorage *EigenPodManagerStorageTransactorSession) AddShares(staker common.Address, strategy common.Address, token common.Address, shares *big.Int) (*types.Transaction, error) { - return _EigenPodManagerStorage.Contract.AddShares(&_EigenPodManagerStorage.TransactOpts, staker, strategy, token, shares) +// Solidity: function addShares(address staker, address strategy, uint256 shares) returns(uint256, uint256) +func (_EigenPodManagerStorage *EigenPodManagerStorageTransactorSession) AddShares(staker common.Address, strategy common.Address, shares *big.Int) (*types.Transaction, error) { + return _EigenPodManagerStorage.Contract.AddShares(&_EigenPodManagerStorage.TransactOpts, staker, strategy, shares) } // CreatePod is a paid mutator transaction binding the contract method 0x84d81062. diff --git a/pkg/bindings/EigenStrategy/binding.go b/pkg/bindings/EigenStrategy/binding.go index 51b49b921f..7fc19a2748 100644 --- a/pkg/bindings/EigenStrategy/binding.go +++ b/pkg/bindings/EigenStrategy/binding.go @@ -32,7 +32,7 @@ var ( // EigenStrategyMetaData contains all meta data concerning the EigenStrategy contract. var EigenStrategyMetaData = &bind.MetaData{ ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"_strategyManager\",\"type\":\"address\",\"internalType\":\"contractIStrategyManager\"},{\"name\":\"_pauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"EIGEN\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIEigen\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"deposit\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"newShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"explanation\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"_EIGEN\",\"type\":\"address\",\"internalType\":\"contractIEigen\"},{\"name\":\"_bEIGEN\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"_underlyingToken\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"pauseAll\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[{\"name\":\"index\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pauserRegistry\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"shares\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"sharesToUnderlying\",\"inputs\":[{\"name\":\"amountShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"sharesToUnderlyingView\",\"inputs\":[{\"name\":\"amountShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"strategyManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategyManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"totalShares\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"underlyingToShares\",\"inputs\":[{\"name\":\"amountUnderlying\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"underlyingToSharesView\",\"inputs\":[{\"name\":\"amountUnderlying\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"underlyingToken\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"userUnderlying\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"userUnderlyingView\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"withdraw\",\"inputs\":[{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amountShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"ExchangeRateEmitted\",\"inputs\":[{\"name\":\"rate\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StrategyTokenSet\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIERC20\"},{\"name\":\"decimals\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"BalanceExceedsMaxTotalDeposits\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"CurrentlyPaused\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InputAddressZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidNewPausedStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"MaxPerDepositExceedsMax\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NewSharesZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyPauser\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyStrategyManager\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyUnderlyingToken\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyUnpauser\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"TotalSharesExceedsMax\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"WithdrawalAmountExceedsTotalDeposits\",\"inputs\":[]}]", - Bin: "0x60c060405234801561000f575f5ffd5b5060405161168d38038061168d83398101604081905261002e9161014f565b8181806001600160a01b038116610058576040516339b190bb60e11b815260040160405180910390fd5b6001600160a01b03908116608052821660a05261007361007c565b50505050610187565b5f54610100900460ff16156100e75760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff90811614610136575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b038116811461014c575f5ffd5b50565b5f5f60408385031215610160575f5ffd5b825161016b81610138565b602084015190925061017c81610138565b809150509250929050565b60805160a0516114bb6101d25f395f818161018b0152818161043e01528181610871015261090e01525f81816102540152818161034b0152818161066a0152610a3c01526114bb5ff3fe608060405234801561000f575f5ffd5b506004361061013d575f3560e01c8063886f1195116100b4578063ce7c2ac211610079578063ce7c2ac2146102c4578063d9caed12146102d7578063e3dae51c146102ea578063f3e73875146102fd578063fabc1cbc14610310578063fdc371ce14610323575f5ffd5b8063886f11951461024f5780638c871019146102765780638f6a624014610289578063ab5921e11461029c578063c4d66de8146102b1575f5ffd5b8063485cc95511610105578063485cc955146101d7578063553ca5f8146101ea578063595c6a67146101fd5780635ac86ab7146102055780635c975abb146102345780637a8b26371461023c575f5ffd5b8063136439dd146101415780632495a5991461015657806339b70e38146101865780633a98ef39146101ad57806347e7ef24146101c4575b5f5ffd5b61015461014f3660046111ab565b610336565b005b603254610169906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b6101697f000000000000000000000000000000000000000000000000000000000000000081565b6101b660335481565b60405190815260200161017d565b6101b66101d23660046111d9565b61040b565b6101546101e5366004611203565b610557565b6101b66101f836600461123a565b610642565b610154610655565b61022461021336600461126a565b6001805460ff9092161b9081161490565b604051901515815260200161017d565b6001546101b6565b6101b661024a3660046111ab565b610704565b6101697f000000000000000000000000000000000000000000000000000000000000000081565b6101b66102843660046111ab565b61074d565b6101b661029736600461123a565b610757565b6102a4610764565b60405161017d9190611285565b6101546102bf36600461123a565b610784565b6101b66102d236600461123a565b61084a565b6101546102e53660046112ba565b6108dc565b6101b66102f83660046111ab565b6109f9565b6101b661030b3660046111ab565b610a30565b61015461031e3660046111ab565b610a3a565b606454610169906001600160a01b031681565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa158015610398573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103bc91906112f8565b6103d957604051631d77d47760e21b815260040160405180910390fd5b60015481811681146103fe5760405163c61dca5d60e01b815260040160405180910390fd5b61040782610b50565b5050565b600180545f9182918116036104335760405163840a48d560e01b815260040160405180910390fd5b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461047c576040516348da714f60e01b815260040160405180910390fd5b6104868484610b8d565b6033545f6104966103e88361132b565b90505f6103e86104a4610c46565b6104ae919061132b565b90505f6104bb878361133e565b9050806104c88489611351565b6104d29190611368565b9550855f036104f457604051630c392ed360e11b815260040160405180910390fd5b6104fe868561132b565b60338190556f4b3b4ca85a86c47a098a223fffffffff101561053357604051632f14e8a360e11b815260040160405180910390fd5b61054c826103e8603354610547919061132b565b610cb5565b505050505092915050565b5f54610100900460ff161580801561057557505f54600160ff909116105b8061058e5750303b15801561058e57505f5460ff166001145b6105b35760405162461bcd60e51b81526004016105aa90611387565b60405180910390fd5b5f805460ff1916600117905580156105d4575f805461ff0019166101001790555b606480546001600160a01b0319166001600160a01b0385161790556105f882610d01565b801561063d575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050565b5f61064f61024a8361084a565b92915050565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa1580156106b7573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106db91906112f8565b6106f857604051631d77d47760e21b815260040160405180910390fd5b6107025f19610b50565b565b5f5f6103e8603354610716919061132b565b90505f6103e8610724610c46565b61072e919061132b565b90508161073b8583611351565b6107459190611368565b949350505050565b5f61064f826109f9565b5f61064f61030b8361084a565b60606040518060800160405280604d8152602001611439604d9139905090565b5f54610100900460ff16158080156107a257505f54600160ff909116105b806107bb5750303b1580156107bb57505f5460ff166001145b6107d75760405162461bcd60e51b81526004016105aa90611387565b5f805460ff1916600117905580156107f8575f805461ff0019166101001790555b61080182610d01565b8015610407575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498906020015b60405180910390a15050565b60405163fe243a1760e01b81526001600160a01b0382811660048301523060248301525f917f00000000000000000000000000000000000000000000000000000000000000009091169063fe243a1790604401602060405180830381865afa1580156108b8573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061064f91906113d5565b600180546002908116036109035760405163840a48d560e01b815260040160405180910390fd5b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461094c576040516348da714f60e01b815260040160405180910390fd5b610957848484610e4c565b6033548083111561097b57604051630b469df360e41b815260040160405180910390fd5b5f6109886103e88361132b565b90505f6103e8610996610c46565b6109a0919061132b565b90505f826109ae8784611351565b6109b89190611368565b90506109c4868561133e565b6033556109e46109d4828461133e565b6103e8603354610547919061132b565b6109ef888883610e92565b5050505050505050565b5f5f6103e8603354610a0b919061132b565b90505f6103e8610a19610c46565b610a23919061132b565b90508061073b8386611351565b5f61064f82610704565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610a96573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610aba91906113ec565b6001600160a01b0316336001600160a01b031614610aeb5760405163794821ff60e01b815260040160405180910390fd5b60015480198219811614610b125760405163c61dca5d60e01b815260040160405180910390fd5b600182905560405182815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c9060200160405180910390a25050565b600181905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a250565b6032546001600160a01b0383811691161480610bb657506064546001600160a01b038381169116145b610bd357604051630312abdd60e61b815260040160405180910390fd5b6064546001600160a01b039081169083160361040757606454604051636f074d1f60e11b8152600481018390526001600160a01b039091169063de0e9a3e906024015f604051808303815f87803b158015610c2c575f5ffd5b505af1158015610c3e573d5f5f3e3d5ffd5b505050505050565b6032546040516370a0823160e01b81523060048201525f916001600160a01b0316906370a0823190602401602060405180830381865afa158015610c8c573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610cb091906113d5565b905090565b7fd2494f3479e5da49d386657c292c610b5b01df313d07c62eb0cfa49924a31be881610ce984670de0b6b3a7640000611351565b610cf39190611368565b60405190815260200161083e565b5f54610100900460ff16610d6b5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b60648201526084016105aa565b603280546001600160a01b0319166001600160a01b038316179055610d8f5f610b50565b7f1c540707b00eb5427b6b774fc799d756516a54aee108b64b327acc55af55750760325f9054906101000a90046001600160a01b0316826001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e01573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e259190611407565b604080516001600160a01b03909316835260ff90911660208301520160405180910390a150565b6032546001600160a01b0383811691161480610e7557506064546001600160a01b038381169116145b61063d57604051630312abdd60e61b815260040160405180910390fd5b6064546001600160a01b0390811690831603610f775760325460405163095ea7b360e01b81526001600160a01b038481166004830152602482018490529091169063095ea7b3906044016020604051808303815f875af1158015610ef8573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f1c91906112f8565b50606454604051630ea598cb60e41b8152600481018390526001600160a01b039091169063ea598cb0906024015f604051808303815f87803b158015610f60575f5ffd5b505af1158015610f72573d5f5f3e3d5ffd5b505050505b604080516001600160a01b03858116602483015260448083018590528351808403909101815260649092018352602080830180516001600160e01b031663a9059cbb60e01b17905283518085019094528084527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65649084015261063d92908516918691859185918591905f9061100f908490849061108e565b905080515f148061102f57508080602001905181019061102f91906112f8565b61063d5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016105aa565b606061074584845f85855f5f866001600160a01b031685876040516110b39190611422565b5f6040518083038185875af1925050503d805f81146110ed576040519150601f19603f3d011682016040523d82523d5f602084013e6110f2565b606091505b50915091506111038783838761110e565b979650505050505050565b6060831561117c5782515f03611175576001600160a01b0385163b6111755760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016105aa565b5081610745565b61074583838151156111915781518083602001fd5b8060405162461bcd60e51b81526004016105aa9190611285565b5f602082840312156111bb575f5ffd5b5035919050565b6001600160a01b03811681146111d6575f5ffd5b50565b5f5f604083850312156111ea575f5ffd5b82356111f5816111c2565b946020939093013593505050565b5f5f60408385031215611214575f5ffd5b823561121f816111c2565b9150602083013561122f816111c2565b809150509250929050565b5f6020828403121561124a575f5ffd5b8135611255816111c2565b9392505050565b60ff811681146111d6575f5ffd5b5f6020828403121561127a575f5ffd5b81356112558161125c565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b5f5f5f606084860312156112cc575f5ffd5b83356112d7816111c2565b925060208401356112e7816111c2565b929592945050506040919091013590565b5f60208284031215611308575f5ffd5b81518015158114611255575f5ffd5b634e487b7160e01b5f52601160045260245ffd5b8082018082111561064f5761064f611317565b8181038181111561064f5761064f611317565b808202811582820484141761064f5761064f611317565b5f8261138257634e487b7160e01b5f52601260045260245ffd5b500490565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b5f602082840312156113e5575f5ffd5b5051919050565b5f602082840312156113fc575f5ffd5b8151611255816111c2565b5f60208284031215611417575f5ffd5b81516112558161125c565b5f82518060208501845e5f92019182525091905056fe4261736520537472617465677920696d706c656d656e746174696f6e20746f20696e68657269742066726f6d20666f72206d6f726520636f6d706c657820696d706c656d656e746174696f6e73a264697066735822122052943963226976a63c5a1414ed2810072da5b101d7f5ff32cd8d607d79b9edda64736f6c634300081b0033", + Bin: "0x60c060405234801561000f575f5ffd5b5060405161168d38038061168d83398101604081905261002e9161014f565b8181806001600160a01b038116610058576040516339b190bb60e11b815260040160405180910390fd5b6001600160a01b03908116608052821660a05261007361007c565b50505050610187565b5f54610100900460ff16156100e75760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff90811614610136575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b038116811461014c575f5ffd5b50565b5f5f60408385031215610160575f5ffd5b825161016b81610138565b602084015190925061017c81610138565b809150509250929050565b60805160a0516114bb6101d25f395f818161018b0152818161043e01528181610871015261090e01525f81816102540152818161034b0152818161066a0152610a3c01526114bb5ff3fe608060405234801561000f575f5ffd5b506004361061013d575f3560e01c8063886f1195116100b4578063ce7c2ac211610079578063ce7c2ac2146102c4578063d9caed12146102d7578063e3dae51c146102ea578063f3e73875146102fd578063fabc1cbc14610310578063fdc371ce14610323575f5ffd5b8063886f11951461024f5780638c871019146102765780638f6a624014610289578063ab5921e11461029c578063c4d66de8146102b1575f5ffd5b8063485cc95511610105578063485cc955146101d7578063553ca5f8146101ea578063595c6a67146101fd5780635ac86ab7146102055780635c975abb146102345780637a8b26371461023c575f5ffd5b8063136439dd146101415780632495a5991461015657806339b70e38146101865780633a98ef39146101ad57806347e7ef24146101c4575b5f5ffd5b61015461014f3660046111ab565b610336565b005b603254610169906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b6101697f000000000000000000000000000000000000000000000000000000000000000081565b6101b660335481565b60405190815260200161017d565b6101b66101d23660046111d9565b61040b565b6101546101e5366004611203565b610557565b6101b66101f836600461123a565b610642565b610154610655565b61022461021336600461126a565b6001805460ff9092161b9081161490565b604051901515815260200161017d565b6001546101b6565b6101b661024a3660046111ab565b610704565b6101697f000000000000000000000000000000000000000000000000000000000000000081565b6101b66102843660046111ab565b61074d565b6101b661029736600461123a565b610757565b6102a4610764565b60405161017d9190611285565b6101546102bf36600461123a565b610784565b6101b66102d236600461123a565b61084a565b6101546102e53660046112ba565b6108dc565b6101b66102f83660046111ab565b6109f9565b6101b661030b3660046111ab565b610a30565b61015461031e3660046111ab565b610a3a565b606454610169906001600160a01b031681565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa158015610398573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103bc91906112f8565b6103d957604051631d77d47760e21b815260040160405180910390fd5b60015481811681146103fe5760405163c61dca5d60e01b815260040160405180910390fd5b61040782610b50565b5050565b600180545f9182918116036104335760405163840a48d560e01b815260040160405180910390fd5b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461047c576040516348da714f60e01b815260040160405180910390fd5b6104868484610b8d565b6033545f6104966103e88361132b565b90505f6103e86104a4610c46565b6104ae919061132b565b90505f6104bb878361133e565b9050806104c88489611351565b6104d29190611368565b9550855f036104f457604051630c392ed360e11b815260040160405180910390fd5b6104fe868561132b565b60338190556f4b3b4ca85a86c47a098a223fffffffff101561053357604051632f14e8a360e11b815260040160405180910390fd5b61054c826103e8603354610547919061132b565b610cb5565b505050505092915050565b5f54610100900460ff161580801561057557505f54600160ff909116105b8061058e5750303b15801561058e57505f5460ff166001145b6105b35760405162461bcd60e51b81526004016105aa90611387565b60405180910390fd5b5f805460ff1916600117905580156105d4575f805461ff0019166101001790555b606480546001600160a01b0319166001600160a01b0385161790556105f882610d01565b801561063d575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050565b5f61064f61024a8361084a565b92915050565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa1580156106b7573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106db91906112f8565b6106f857604051631d77d47760e21b815260040160405180910390fd5b6107025f19610b50565b565b5f5f6103e8603354610716919061132b565b90505f6103e8610724610c46565b61072e919061132b565b90508161073b8583611351565b6107459190611368565b949350505050565b5f61064f826109f9565b5f61064f61030b8361084a565b60606040518060800160405280604d8152602001611439604d9139905090565b5f54610100900460ff16158080156107a257505f54600160ff909116105b806107bb5750303b1580156107bb57505f5460ff166001145b6107d75760405162461bcd60e51b81526004016105aa90611387565b5f805460ff1916600117905580156107f8575f805461ff0019166101001790555b61080182610d01565b8015610407575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498906020015b60405180910390a15050565b60405163fe243a1760e01b81526001600160a01b0382811660048301523060248301525f917f00000000000000000000000000000000000000000000000000000000000000009091169063fe243a1790604401602060405180830381865afa1580156108b8573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061064f91906113d5565b600180546002908116036109035760405163840a48d560e01b815260040160405180910390fd5b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461094c576040516348da714f60e01b815260040160405180910390fd5b610957848484610e4c565b6033548083111561097b57604051630b469df360e41b815260040160405180910390fd5b5f6109886103e88361132b565b90505f6103e8610996610c46565b6109a0919061132b565b90505f826109ae8784611351565b6109b89190611368565b90506109c4868561133e565b6033556109e46109d4828461133e565b6103e8603354610547919061132b565b6109ef888883610e92565b5050505050505050565b5f5f6103e8603354610a0b919061132b565b90505f6103e8610a19610c46565b610a23919061132b565b90508061073b8386611351565b5f61064f82610704565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610a96573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610aba91906113ec565b6001600160a01b0316336001600160a01b031614610aeb5760405163794821ff60e01b815260040160405180910390fd5b60015480198219811614610b125760405163c61dca5d60e01b815260040160405180910390fd5b600182905560405182815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c9060200160405180910390a25050565b600181905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a250565b6032546001600160a01b0383811691161480610bb657506064546001600160a01b038381169116145b610bd357604051630312abdd60e61b815260040160405180910390fd5b6064546001600160a01b039081169083160361040757606454604051636f074d1f60e11b8152600481018390526001600160a01b039091169063de0e9a3e906024015f604051808303815f87803b158015610c2c575f5ffd5b505af1158015610c3e573d5f5f3e3d5ffd5b505050505050565b6032546040516370a0823160e01b81523060048201525f916001600160a01b0316906370a0823190602401602060405180830381865afa158015610c8c573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610cb091906113d5565b905090565b7fd2494f3479e5da49d386657c292c610b5b01df313d07c62eb0cfa49924a31be881610ce984670de0b6b3a7640000611351565b610cf39190611368565b60405190815260200161083e565b5f54610100900460ff16610d6b5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b60648201526084016105aa565b603280546001600160a01b0319166001600160a01b038316179055610d8f5f610b50565b7f1c540707b00eb5427b6b774fc799d756516a54aee108b64b327acc55af55750760325f9054906101000a90046001600160a01b0316826001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e01573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e259190611407565b604080516001600160a01b03909316835260ff90911660208301520160405180910390a150565b6032546001600160a01b0383811691161480610e7557506064546001600160a01b038381169116145b61063d57604051630312abdd60e61b815260040160405180910390fd5b6064546001600160a01b0390811690831603610f775760325460405163095ea7b360e01b81526001600160a01b038481166004830152602482018490529091169063095ea7b3906044016020604051808303815f875af1158015610ef8573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f1c91906112f8565b50606454604051630ea598cb60e41b8152600481018390526001600160a01b039091169063ea598cb0906024015f604051808303815f87803b158015610f60575f5ffd5b505af1158015610f72573d5f5f3e3d5ffd5b505050505b604080516001600160a01b03858116602483015260448083018590528351808403909101815260649092018352602080830180516001600160e01b031663a9059cbb60e01b17905283518085019094528084527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65649084015261063d92908516918691859185918591905f9061100f908490849061108e565b905080515f148061102f57508080602001905181019061102f91906112f8565b61063d5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016105aa565b606061074584845f85855f5f866001600160a01b031685876040516110b39190611422565b5f6040518083038185875af1925050503d805f81146110ed576040519150601f19603f3d011682016040523d82523d5f602084013e6110f2565b606091505b50915091506111038783838761110e565b979650505050505050565b6060831561117c5782515f03611175576001600160a01b0385163b6111755760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016105aa565b5081610745565b61074583838151156111915781518083602001fd5b8060405162461bcd60e51b81526004016105aa9190611285565b5f602082840312156111bb575f5ffd5b5035919050565b6001600160a01b03811681146111d6575f5ffd5b50565b5f5f604083850312156111ea575f5ffd5b82356111f5816111c2565b946020939093013593505050565b5f5f60408385031215611214575f5ffd5b823561121f816111c2565b9150602083013561122f816111c2565b809150509250929050565b5f6020828403121561124a575f5ffd5b8135611255816111c2565b9392505050565b60ff811681146111d6575f5ffd5b5f6020828403121561127a575f5ffd5b81356112558161125c565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b5f5f5f606084860312156112cc575f5ffd5b83356112d7816111c2565b925060208401356112e7816111c2565b929592945050506040919091013590565b5f60208284031215611308575f5ffd5b81518015158114611255575f5ffd5b634e487b7160e01b5f52601160045260245ffd5b8082018082111561064f5761064f611317565b8181038181111561064f5761064f611317565b808202811582820484141761064f5761064f611317565b5f8261138257634e487b7160e01b5f52601260045260245ffd5b500490565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b5f602082840312156113e5575f5ffd5b5051919050565b5f602082840312156113fc575f5ffd5b8151611255816111c2565b5f60208284031215611417575f5ffd5b81516112558161125c565b5f82518060208501845e5f92019182525091905056fe4261736520537472617465677920696d706c656d656e746174696f6e20746f20696e68657269742066726f6d20666f72206d6f726520636f6d706c657820696d706c656d656e746174696f6e73a264697066735822122000790fa222dbfedc984b61c80aaac572fd4b3300a33b9d925158b9d571ec4ddd64736f6c634300081b0033", } // 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 b2a1f90fff..e2995571cc 100644 --- a/pkg/bindings/Endian/binding.go +++ b/pkg/bindings/Endian/binding.go @@ -32,7 +32,7 @@ var ( // EndianMetaData contains all meta data concerning the Endian contract. var EndianMetaData = &bind.MetaData{ ABI: "[]", - Bin: "0x60556032600b8282823980515f1a607314602657634e487b7160e01b5f525f60045260245ffd5b305f52607381538281f3fe730000000000000000000000000000000000000000301460806040525f5ffdfea2646970667358221220d31d5c2b691cbd0a659ac6a2d7575448cb9db5c1e8b20efb6f6fe9e398049e6b64736f6c634300081b0033", + Bin: "0x60556032600b8282823980515f1a607314602657634e487b7160e01b5f525f60045260245ffd5b305f52607381538281f3fe730000000000000000000000000000000000000000301460806040525f5ffdfea264697066735822122065de58e62fc0153ec81e59074101ab95f4a50a4dc9b195d91698d58ec6e19dcb64736f6c634300081b0033", } // EndianABI is the input ABI used to generate the binding from. diff --git a/pkg/bindings/IAllocationManager/binding.go b/pkg/bindings/IAllocationManager/binding.go index 5d5530e4fc..e869a7223e 100644 --- a/pkg/bindings/IAllocationManager/binding.go +++ b/pkg/bindings/IAllocationManager/binding.go @@ -80,7 +80,7 @@ type OperatorSet struct { // IAllocationManagerMetaData contains all meta data concerning the IAllocationManager contract. var IAllocationManagerMetaData = &bind.MetaData{ - ABI: "[{\"type\":\"function\",\"name\":\"addStrategiesToOperatorSet\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetId\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"clearDeallocationQueue\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"numToClear\",\"type\":\"uint16[]\",\"internalType\":\"uint16[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"createOperatorSets\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"params\",\"type\":\"tuple[]\",\"internalType\":\"structIAllocationManagerTypes.CreateSetParams[]\",\"components\":[{\"name\":\"operatorSetId\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"deregisterFromOperatorSets\",\"inputs\":[{\"name\":\"params\",\"type\":\"tuple\",\"internalType\":\"structIAllocationManagerTypes.DeregisterParams\",\"components\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetIds\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"getAVSRegistrar\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIAVSRegistrar\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAllocatableMagnitude\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAllocatedSets\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple[]\",\"internalType\":\"structOperatorSet[]\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAllocatedStrategies\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAllocation\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIAllocationManagerTypes.Allocation\",\"components\":[{\"name\":\"currentMagnitude\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"pendingDiff\",\"type\":\"int128\",\"internalType\":\"int128\"},{\"name\":\"effectBlock\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAllocationDelay\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"isSet\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"delay\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAllocations\",\"inputs\":[{\"name\":\"operators\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple[]\",\"internalType\":\"structIAllocationManagerTypes.Allocation[]\",\"components\":[{\"name\":\"currentMagnitude\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"pendingDiff\",\"type\":\"int128\",\"internalType\":\"int128\"},{\"name\":\"effectBlock\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getMaxMagnitude\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getMaxMagnitudes\",\"inputs\":[{\"name\":\"operators\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64[]\",\"internalType\":\"uint64[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getMaxMagnitudes\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64[]\",\"internalType\":\"uint64[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getMaxMagnitudesAtBlock\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"blockNumber\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64[]\",\"internalType\":\"uint64[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getMemberCount\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getMembers\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[{\"name\":\"operators\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getMinimumSlashableStake\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"operators\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"futureBlock\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[{\"name\":\"slashableStake\",\"type\":\"uint256[][]\",\"internalType\":\"uint256[][]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getOperatorSetCount\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getRegisteredSets\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"operatorSets\",\"type\":\"tuple[]\",\"internalType\":\"structOperatorSet[]\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getStrategiesInOperatorSet\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getStrategyAllocations\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple[]\",\"internalType\":\"structOperatorSet[]\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"\",\"type\":\"tuple[]\",\"internalType\":\"structIAllocationManagerTypes.Allocation[]\",\"components\":[{\"name\":\"currentMagnitude\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"pendingDiff\",\"type\":\"int128\",\"internalType\":\"int128\"},{\"name\":\"effectBlock\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"initialOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"initialPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"isMemberOfOperatorSet\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isOperatorSet\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"modifyAllocations\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"params\",\"type\":\"tuple[]\",\"internalType\":\"structIAllocationManagerTypes.AllocateParams[]\",\"components\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"newMagnitudes\",\"type\":\"uint64[]\",\"internalType\":\"uint64[]\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"registerForOperatorSets\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"params\",\"type\":\"tuple\",\"internalType\":\"structIAllocationManagerTypes.RegisterParams\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetIds\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"removeStrategiesFromOperatorSet\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetId\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setAVSRegistrar\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"registrar\",\"type\":\"address\",\"internalType\":\"contractIAVSRegistrar\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setAllocationDelay\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"delay\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"slashOperator\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"params\",\"type\":\"tuple\",\"internalType\":\"structIAllocationManagerTypes.SlashingParams\",\"components\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetId\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"wadsToSlash\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"},{\"name\":\"description\",\"type\":\"string\",\"internalType\":\"string\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"updateAVSMetadataURI\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"metadataURI\",\"type\":\"string\",\"internalType\":\"string\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"AVSMetadataURIUpdated\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"metadataURI\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"AVSRegistrarSet\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"registrar\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIAVSRegistrar\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"AllocationDelaySet\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"delay\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"},{\"name\":\"effectBlock\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"AllocationUpdated\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"magnitude\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"effectBlock\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"EncumberedMagnitudeUpdated\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"encumberedMagnitude\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"MaxMagnitudeUpdated\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"maxMagnitude\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorAddedToOperatorSet\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorRemovedFromOperatorSet\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorSetCreated\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorSlashed\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"strategies\",\"type\":\"address[]\",\"indexed\":false,\"internalType\":\"contractIStrategy[]\"},{\"name\":\"wadSlashed\",\"type\":\"uint256[]\",\"indexed\":false,\"internalType\":\"uint256[]\"},{\"name\":\"description\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StrategyAddedToOperatorSet\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StrategyRemovedFromOperatorSet\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"AlreadyMemberOfSet\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InputArrayLengthMismatch\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InsufficientMagnitude\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidAVSRegistrar\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidCaller\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidOperator\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidOperatorSet\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidWadToSlash\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ModificationAlreadyPending\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotMemberOfSet\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OperatorNotSlashable\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SameMagnitude\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StrategiesMustBeInAscendingOrder\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StrategyAlreadyInOperatorSet\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StrategyNotInOperatorSet\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"UninitializedAllocationDelay\",\"inputs\":[]}]", + ABI: "[{\"type\":\"function\",\"name\":\"addStrategiesToOperatorSet\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetId\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"clearDeallocationQueue\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"numToClear\",\"type\":\"uint16[]\",\"internalType\":\"uint16[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"createOperatorSets\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"params\",\"type\":\"tuple[]\",\"internalType\":\"structIAllocationManagerTypes.CreateSetParams[]\",\"components\":[{\"name\":\"operatorSetId\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"deregisterFromOperatorSets\",\"inputs\":[{\"name\":\"params\",\"type\":\"tuple\",\"internalType\":\"structIAllocationManagerTypes.DeregisterParams\",\"components\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetIds\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"getAVSRegistrar\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIAVSRegistrar\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAllocatableMagnitude\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAllocatedSets\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple[]\",\"internalType\":\"structOperatorSet[]\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAllocatedStrategies\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAllocation\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIAllocationManagerTypes.Allocation\",\"components\":[{\"name\":\"currentMagnitude\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"pendingDiff\",\"type\":\"int128\",\"internalType\":\"int128\"},{\"name\":\"effectBlock\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAllocationDelay\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"isSet\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"delay\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAllocations\",\"inputs\":[{\"name\":\"operators\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple[]\",\"internalType\":\"structIAllocationManagerTypes.Allocation[]\",\"components\":[{\"name\":\"currentMagnitude\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"pendingDiff\",\"type\":\"int128\",\"internalType\":\"int128\"},{\"name\":\"effectBlock\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getEncumberedMagnitude\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getMaxMagnitude\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getMaxMagnitudes\",\"inputs\":[{\"name\":\"operators\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64[]\",\"internalType\":\"uint64[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getMaxMagnitudes\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64[]\",\"internalType\":\"uint64[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getMaxMagnitudesAtBlock\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"blockNumber\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64[]\",\"internalType\":\"uint64[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getMemberCount\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getMembers\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[{\"name\":\"operators\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getMinimumSlashableStake\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"operators\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"futureBlock\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[{\"name\":\"slashableStake\",\"type\":\"uint256[][]\",\"internalType\":\"uint256[][]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getOperatorSetCount\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getRegisteredSets\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"operatorSets\",\"type\":\"tuple[]\",\"internalType\":\"structOperatorSet[]\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getStrategiesInOperatorSet\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getStrategyAllocations\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple[]\",\"internalType\":\"structOperatorSet[]\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"\",\"type\":\"tuple[]\",\"internalType\":\"structIAllocationManagerTypes.Allocation[]\",\"components\":[{\"name\":\"currentMagnitude\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"pendingDiff\",\"type\":\"int128\",\"internalType\":\"int128\"},{\"name\":\"effectBlock\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"initialOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"initialPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"isMemberOfOperatorSet\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isOperatorSet\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"modifyAllocations\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"params\",\"type\":\"tuple[]\",\"internalType\":\"structIAllocationManagerTypes.AllocateParams[]\",\"components\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"newMagnitudes\",\"type\":\"uint64[]\",\"internalType\":\"uint64[]\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"registerForOperatorSets\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"params\",\"type\":\"tuple\",\"internalType\":\"structIAllocationManagerTypes.RegisterParams\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetIds\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"removeStrategiesFromOperatorSet\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetId\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setAVSRegistrar\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"registrar\",\"type\":\"address\",\"internalType\":\"contractIAVSRegistrar\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setAllocationDelay\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"delay\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"slashOperator\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"params\",\"type\":\"tuple\",\"internalType\":\"structIAllocationManagerTypes.SlashingParams\",\"components\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetId\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"wadsToSlash\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"},{\"name\":\"description\",\"type\":\"string\",\"internalType\":\"string\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"updateAVSMetadataURI\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"metadataURI\",\"type\":\"string\",\"internalType\":\"string\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"AVSMetadataURIUpdated\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"metadataURI\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"AVSRegistrarSet\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"registrar\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIAVSRegistrar\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"AllocationDelaySet\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"delay\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"},{\"name\":\"effectBlock\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"AllocationUpdated\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"magnitude\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"effectBlock\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"EncumberedMagnitudeUpdated\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"encumberedMagnitude\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"MaxMagnitudeUpdated\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"maxMagnitude\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorAddedToOperatorSet\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorRemovedFromOperatorSet\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorSetCreated\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorSlashed\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"strategies\",\"type\":\"address[]\",\"indexed\":false,\"internalType\":\"contractIStrategy[]\"},{\"name\":\"wadSlashed\",\"type\":\"uint256[]\",\"indexed\":false,\"internalType\":\"uint256[]\"},{\"name\":\"description\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StrategyAddedToOperatorSet\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StrategyRemovedFromOperatorSet\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"AlreadyMemberOfSet\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InputArrayLengthMismatch\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InsufficientMagnitude\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidCaller\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidOperator\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidOperatorSet\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidWadToSlash\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ModificationAlreadyPending\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotMemberOfSet\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OperatorNotSlashable\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SameMagnitude\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StrategiesMustBeInAscendingOrder\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StrategyAlreadyInOperatorSet\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StrategyNotInOperatorSet\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"UninitializedAllocationDelay\",\"inputs\":[]}]", } // IAllocationManagerABI is the input ABI used to generate the binding from. @@ -460,6 +460,37 @@ func (_IAllocationManager *IAllocationManagerCallerSession) GetAllocations(opera return _IAllocationManager.Contract.GetAllocations(&_IAllocationManager.CallOpts, operators, operatorSet, strategy) } +// GetEncumberedMagnitude is a free data retrieval call binding the contract method 0xf605ce08. +// +// Solidity: function getEncumberedMagnitude(address operator, address strategy) view returns(uint64) +func (_IAllocationManager *IAllocationManagerCaller) GetEncumberedMagnitude(opts *bind.CallOpts, operator common.Address, strategy common.Address) (uint64, error) { + var out []interface{} + err := _IAllocationManager.contract.Call(opts, &out, "getEncumberedMagnitude", operator, strategy) + + if err != nil { + return *new(uint64), err + } + + out0 := *abi.ConvertType(out[0], new(uint64)).(*uint64) + + return out0, err + +} + +// GetEncumberedMagnitude is a free data retrieval call binding the contract method 0xf605ce08. +// +// Solidity: function getEncumberedMagnitude(address operator, address strategy) view returns(uint64) +func (_IAllocationManager *IAllocationManagerSession) GetEncumberedMagnitude(operator common.Address, strategy common.Address) (uint64, error) { + return _IAllocationManager.Contract.GetEncumberedMagnitude(&_IAllocationManager.CallOpts, operator, strategy) +} + +// GetEncumberedMagnitude is a free data retrieval call binding the contract method 0xf605ce08. +// +// Solidity: function getEncumberedMagnitude(address operator, address strategy) view returns(uint64) +func (_IAllocationManager *IAllocationManagerCallerSession) GetEncumberedMagnitude(operator common.Address, strategy common.Address) (uint64, error) { + return _IAllocationManager.Contract.GetEncumberedMagnitude(&_IAllocationManager.CallOpts, operator, strategy) +} + // GetMaxMagnitude is a free data retrieval call binding the contract method 0xa9333ec8. // // Solidity: function getMaxMagnitude(address operator, address strategy) view returns(uint64) diff --git a/pkg/bindings/IEigenPodManager/binding.go b/pkg/bindings/IEigenPodManager/binding.go index 458df46764..f29e9a0705 100644 --- a/pkg/bindings/IEigenPodManager/binding.go +++ b/pkg/bindings/IEigenPodManager/binding.go @@ -31,7 +31,7 @@ var ( // IEigenPodManagerMetaData contains all meta data concerning the IEigenPodManager contract. var IEigenPodManagerMetaData = &bind.MetaData{ - ABI: "[{\"type\":\"function\",\"name\":\"addShares\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"shares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"beaconChainETHStrategy\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"beaconChainSlashingFactor\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"burnableETHShares\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"createPod\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"eigenPodBeacon\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIBeacon\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"ethPOS\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIETHPOSDeposit\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getPod\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIEigenPod\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"hasPod\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"increaseBurnableShares\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"addedSharesToBurn\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"numPods\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"ownerToPod\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIEigenPod\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"pauseAll\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[{\"name\":\"index\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pauserRegistry\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"podOwnerDepositShares\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"int256\",\"internalType\":\"int256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"recordBeaconChainETHBalanceUpdate\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"prevRestakedBalanceWei\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"balanceDeltaWei\",\"type\":\"int256\",\"internalType\":\"int256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"removeDepositShares\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"depositSharesToRemove\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"stake\",\"inputs\":[{\"name\":\"pubkey\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"depositDataRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"stakerDepositShares\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"depositShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"withdrawSharesAsTokens\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"shares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"BeaconChainETHDeposited\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BeaconChainETHWithdrawalCompleted\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"shares\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"nonce\",\"type\":\"uint96\",\"indexed\":false,\"internalType\":\"uint96\"},{\"name\":\"delegatedAddress\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"withdrawer\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"withdrawalRoot\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BeaconChainSlashingFactorDecreased\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"prevBeaconChainSlashingFactor\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"newBeaconChainSlashingFactor\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BurnableETHSharesIncreased\",\"inputs\":[{\"name\":\"shares\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"NewTotalShares\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newTotalShares\",\"type\":\"int256\",\"indexed\":false,\"internalType\":\"int256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"PodDeployed\",\"inputs\":[{\"name\":\"eigenPod\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"podOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"PodSharesUpdated\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"sharesDelta\",\"type\":\"int256\",\"indexed\":false,\"internalType\":\"int256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"CurrentlyPaused\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"EigenPodAlreadyExists\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InputAddressZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidNewPausedStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidStrategy\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"LegacyWithdrawalsNotCompleted\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyDelegationManager\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyEigenPod\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyPauser\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyUnpauser\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SharesNegative\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SharesNotMultipleOfGwei\",\"inputs\":[]}]", + ABI: "[{\"type\":\"function\",\"name\":\"addShares\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"shares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"beaconChainETHStrategy\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"beaconChainSlashingFactor\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"burnableETHShares\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"createPod\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"eigenPodBeacon\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIBeacon\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"ethPOS\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIETHPOSDeposit\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getPod\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIEigenPod\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"hasPod\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"increaseBurnableShares\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"addedSharesToBurn\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"numPods\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"ownerToPod\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIEigenPod\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"pauseAll\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[{\"name\":\"index\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pauserRegistry\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"podOwnerDepositShares\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"int256\",\"internalType\":\"int256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"recordBeaconChainETHBalanceUpdate\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"prevRestakedBalanceWei\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"balanceDeltaWei\",\"type\":\"int256\",\"internalType\":\"int256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"removeDepositShares\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"depositSharesToRemove\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"stake\",\"inputs\":[{\"name\":\"pubkey\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"depositDataRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"stakerDepositShares\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"depositShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"withdrawSharesAsTokens\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"shares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"BeaconChainETHDeposited\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BeaconChainETHWithdrawalCompleted\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"shares\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"nonce\",\"type\":\"uint96\",\"indexed\":false,\"internalType\":\"uint96\"},{\"name\":\"delegatedAddress\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"withdrawer\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"withdrawalRoot\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BeaconChainSlashingFactorDecreased\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"prevBeaconChainSlashingFactor\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"newBeaconChainSlashingFactor\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BurnableETHSharesIncreased\",\"inputs\":[{\"name\":\"shares\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"NewTotalShares\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newTotalShares\",\"type\":\"int256\",\"indexed\":false,\"internalType\":\"int256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"PodDeployed\",\"inputs\":[{\"name\":\"eigenPod\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"podOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"PodSharesUpdated\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"sharesDelta\",\"type\":\"int256\",\"indexed\":false,\"internalType\":\"int256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"CurrentlyPaused\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"EigenPodAlreadyExists\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InputAddressZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidNewPausedStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidStrategy\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"LegacyWithdrawalsNotCompleted\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyDelegationManager\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyEigenPod\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyPauser\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyUnpauser\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SharesNegative\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SharesNotMultipleOfGwei\",\"inputs\":[]}]", } // IEigenPodManagerABI is the input ABI used to generate the binding from. @@ -614,25 +614,25 @@ func (_IEigenPodManager *IEigenPodManagerCallerSession) StakerDepositShares(user return _IEigenPodManager.Contract.StakerDepositShares(&_IEigenPodManager.CallOpts, user, strategy) } -// AddShares is a paid mutator transaction binding the contract method 0xc4623ea1. +// AddShares is a paid mutator transaction binding the contract method 0x50ff7225. // -// Solidity: function addShares(address staker, address strategy, address token, uint256 shares) returns(uint256, uint256) -func (_IEigenPodManager *IEigenPodManagerTransactor) AddShares(opts *bind.TransactOpts, staker common.Address, strategy common.Address, token common.Address, shares *big.Int) (*types.Transaction, error) { - return _IEigenPodManager.contract.Transact(opts, "addShares", staker, strategy, token, shares) +// Solidity: function addShares(address staker, address strategy, uint256 shares) returns(uint256, uint256) +func (_IEigenPodManager *IEigenPodManagerTransactor) AddShares(opts *bind.TransactOpts, staker common.Address, strategy common.Address, shares *big.Int) (*types.Transaction, error) { + return _IEigenPodManager.contract.Transact(opts, "addShares", staker, strategy, shares) } -// AddShares is a paid mutator transaction binding the contract method 0xc4623ea1. +// AddShares is a paid mutator transaction binding the contract method 0x50ff7225. // -// Solidity: function addShares(address staker, address strategy, address token, uint256 shares) returns(uint256, uint256) -func (_IEigenPodManager *IEigenPodManagerSession) AddShares(staker common.Address, strategy common.Address, token common.Address, shares *big.Int) (*types.Transaction, error) { - return _IEigenPodManager.Contract.AddShares(&_IEigenPodManager.TransactOpts, staker, strategy, token, shares) +// Solidity: function addShares(address staker, address strategy, uint256 shares) returns(uint256, uint256) +func (_IEigenPodManager *IEigenPodManagerSession) AddShares(staker common.Address, strategy common.Address, shares *big.Int) (*types.Transaction, error) { + return _IEigenPodManager.Contract.AddShares(&_IEigenPodManager.TransactOpts, staker, strategy, shares) } -// AddShares is a paid mutator transaction binding the contract method 0xc4623ea1. +// AddShares is a paid mutator transaction binding the contract method 0x50ff7225. // -// Solidity: function addShares(address staker, address strategy, address token, uint256 shares) returns(uint256, uint256) -func (_IEigenPodManager *IEigenPodManagerTransactorSession) AddShares(staker common.Address, strategy common.Address, token common.Address, shares *big.Int) (*types.Transaction, error) { - return _IEigenPodManager.Contract.AddShares(&_IEigenPodManager.TransactOpts, staker, strategy, token, shares) +// Solidity: function addShares(address staker, address strategy, uint256 shares) returns(uint256, uint256) +func (_IEigenPodManager *IEigenPodManagerTransactorSession) AddShares(staker common.Address, strategy common.Address, shares *big.Int) (*types.Transaction, error) { + return _IEigenPodManager.Contract.AddShares(&_IEigenPodManager.TransactOpts, staker, strategy, shares) } // CreatePod is a paid mutator transaction binding the contract method 0x84d81062. diff --git a/pkg/bindings/IShareManager/binding.go b/pkg/bindings/IShareManager/binding.go index ac1580febd..11404066ab 100644 --- a/pkg/bindings/IShareManager/binding.go +++ b/pkg/bindings/IShareManager/binding.go @@ -31,7 +31,7 @@ var ( // IShareManagerMetaData contains all meta data concerning the IShareManager contract. var IShareManagerMetaData = &bind.MetaData{ - ABI: "[{\"type\":\"function\",\"name\":\"addShares\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"shares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"increaseBurnableShares\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"addedSharesToBurn\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"removeDepositShares\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"depositSharesToRemove\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"stakerDepositShares\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"depositShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"withdrawSharesAsTokens\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"shares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"}]", + ABI: "[{\"type\":\"function\",\"name\":\"addShares\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"shares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"increaseBurnableShares\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"addedSharesToBurn\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"removeDepositShares\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"depositSharesToRemove\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"stakerDepositShares\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"depositShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"withdrawSharesAsTokens\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"shares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"}]", } // IShareManagerABI is the input ABI used to generate the binding from. @@ -211,25 +211,25 @@ func (_IShareManager *IShareManagerCallerSession) StakerDepositShares(user commo return _IShareManager.Contract.StakerDepositShares(&_IShareManager.CallOpts, user, strategy) } -// AddShares is a paid mutator transaction binding the contract method 0xc4623ea1. +// AddShares is a paid mutator transaction binding the contract method 0x50ff7225. // -// Solidity: function addShares(address staker, address strategy, address token, uint256 shares) returns(uint256, uint256) -func (_IShareManager *IShareManagerTransactor) AddShares(opts *bind.TransactOpts, staker common.Address, strategy common.Address, token common.Address, shares *big.Int) (*types.Transaction, error) { - return _IShareManager.contract.Transact(opts, "addShares", staker, strategy, token, shares) +// Solidity: function addShares(address staker, address strategy, uint256 shares) returns(uint256, uint256) +func (_IShareManager *IShareManagerTransactor) AddShares(opts *bind.TransactOpts, staker common.Address, strategy common.Address, shares *big.Int) (*types.Transaction, error) { + return _IShareManager.contract.Transact(opts, "addShares", staker, strategy, shares) } -// AddShares is a paid mutator transaction binding the contract method 0xc4623ea1. +// AddShares is a paid mutator transaction binding the contract method 0x50ff7225. // -// Solidity: function addShares(address staker, address strategy, address token, uint256 shares) returns(uint256, uint256) -func (_IShareManager *IShareManagerSession) AddShares(staker common.Address, strategy common.Address, token common.Address, shares *big.Int) (*types.Transaction, error) { - return _IShareManager.Contract.AddShares(&_IShareManager.TransactOpts, staker, strategy, token, shares) +// Solidity: function addShares(address staker, address strategy, uint256 shares) returns(uint256, uint256) +func (_IShareManager *IShareManagerSession) AddShares(staker common.Address, strategy common.Address, shares *big.Int) (*types.Transaction, error) { + return _IShareManager.Contract.AddShares(&_IShareManager.TransactOpts, staker, strategy, shares) } -// AddShares is a paid mutator transaction binding the contract method 0xc4623ea1. +// AddShares is a paid mutator transaction binding the contract method 0x50ff7225. // -// Solidity: function addShares(address staker, address strategy, address token, uint256 shares) returns(uint256, uint256) -func (_IShareManager *IShareManagerTransactorSession) AddShares(staker common.Address, strategy common.Address, token common.Address, shares *big.Int) (*types.Transaction, error) { - return _IShareManager.Contract.AddShares(&_IShareManager.TransactOpts, staker, strategy, token, shares) +// Solidity: function addShares(address staker, address strategy, uint256 shares) returns(uint256, uint256) +func (_IShareManager *IShareManagerTransactorSession) AddShares(staker common.Address, strategy common.Address, shares *big.Int) (*types.Transaction, error) { + return _IShareManager.Contract.AddShares(&_IShareManager.TransactOpts, staker, strategy, shares) } // IncreaseBurnableShares is a paid mutator transaction binding the contract method 0xdebe1eab. diff --git a/pkg/bindings/IStrategyManager/binding.go b/pkg/bindings/IStrategyManager/binding.go index 506df5d2fb..670d9dfcf5 100644 --- a/pkg/bindings/IStrategyManager/binding.go +++ b/pkg/bindings/IStrategyManager/binding.go @@ -31,7 +31,7 @@ var ( // IStrategyManagerMetaData contains all meta data concerning the IStrategyManager contract. var IStrategyManagerMetaData = &bind.MetaData{ - ABI: "[{\"type\":\"function\",\"name\":\"addShares\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"shares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"addStrategiesToDepositWhitelist\",\"inputs\":[{\"name\":\"strategiesToWhitelist\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"burnShares\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"calculateStrategyDepositDigestHash\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"nonce\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"delegation\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIDelegationManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"depositIntoStrategy\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"depositShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"depositIntoStrategyWithSignature\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"depositShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"getDeposits\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getStakerStrategyList\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"increaseBurnableShares\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"addedSharesToBurn\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"initialOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"initialStrategyWhitelister\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"initialPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"removeDepositShares\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"depositSharesToRemove\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"removeStrategiesFromDepositWhitelist\",\"inputs\":[{\"name\":\"strategiesToRemoveFromWhitelist\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setStrategyWhitelister\",\"inputs\":[{\"name\":\"newStrategyWhitelister\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"stakerDepositShares\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"shares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"stakerStrategyListLength\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"strategyIsWhitelistedForDeposit\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"strategyWhitelister\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"withdrawSharesAsTokens\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"shares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"BurnableSharesDecreased\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"shares\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BurnableSharesIncreased\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"shares\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Deposit\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"token\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIERC20\"},{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"shares\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StrategyAddedToDepositWhitelist\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StrategyRemovedFromDepositWhitelist\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StrategyWhitelisterChanged\",\"inputs\":[{\"name\":\"previousAddress\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"newAddress\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"MaxStrategiesExceeded\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyDelegationManager\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyStrategyWhitelister\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SharesAmountTooHigh\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SharesAmountZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StakerAddressZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StrategyNotFound\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StrategyNotWhitelisted\",\"inputs\":[]}]", + ABI: "[{\"type\":\"function\",\"name\":\"addShares\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"shares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"addStrategiesToDepositWhitelist\",\"inputs\":[{\"name\":\"strategiesToWhitelist\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"burnShares\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"calculateStrategyDepositDigestHash\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"nonce\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"delegation\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIDelegationManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"depositIntoStrategy\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"depositShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"depositIntoStrategyWithSignature\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"depositShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"getDeposits\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getStakerStrategyList\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"increaseBurnableShares\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"addedSharesToBurn\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"initialOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"initialStrategyWhitelister\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"initialPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"removeDepositShares\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"depositSharesToRemove\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"removeStrategiesFromDepositWhitelist\",\"inputs\":[{\"name\":\"strategiesToRemoveFromWhitelist\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setStrategyWhitelister\",\"inputs\":[{\"name\":\"newStrategyWhitelister\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"stakerDepositShares\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"shares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"stakerStrategyListLength\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"strategyIsWhitelistedForDeposit\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"strategyWhitelister\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"withdrawSharesAsTokens\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"shares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"BurnableSharesDecreased\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"shares\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BurnableSharesIncreased\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"shares\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Deposit\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"shares\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StrategyAddedToDepositWhitelist\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StrategyRemovedFromDepositWhitelist\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StrategyWhitelisterChanged\",\"inputs\":[{\"name\":\"previousAddress\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"newAddress\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"MaxStrategiesExceeded\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyDelegationManager\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyStrategyWhitelister\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SharesAmountTooHigh\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SharesAmountZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StakerAddressZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StrategyNotFound\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StrategyNotWhitelisted\",\"inputs\":[]}]", } // IStrategyManagerABI is the input ABI used to generate the binding from. @@ -429,25 +429,25 @@ func (_IStrategyManager *IStrategyManagerCallerSession) StrategyWhitelister() (c return _IStrategyManager.Contract.StrategyWhitelister(&_IStrategyManager.CallOpts) } -// AddShares is a paid mutator transaction binding the contract method 0xc4623ea1. +// AddShares is a paid mutator transaction binding the contract method 0x50ff7225. // -// Solidity: function addShares(address staker, address strategy, address token, uint256 shares) returns(uint256, uint256) -func (_IStrategyManager *IStrategyManagerTransactor) AddShares(opts *bind.TransactOpts, staker common.Address, strategy common.Address, token common.Address, shares *big.Int) (*types.Transaction, error) { - return _IStrategyManager.contract.Transact(opts, "addShares", staker, strategy, token, shares) +// Solidity: function addShares(address staker, address strategy, uint256 shares) returns(uint256, uint256) +func (_IStrategyManager *IStrategyManagerTransactor) AddShares(opts *bind.TransactOpts, staker common.Address, strategy common.Address, shares *big.Int) (*types.Transaction, error) { + return _IStrategyManager.contract.Transact(opts, "addShares", staker, strategy, shares) } -// AddShares is a paid mutator transaction binding the contract method 0xc4623ea1. +// AddShares is a paid mutator transaction binding the contract method 0x50ff7225. // -// Solidity: function addShares(address staker, address strategy, address token, uint256 shares) returns(uint256, uint256) -func (_IStrategyManager *IStrategyManagerSession) AddShares(staker common.Address, strategy common.Address, token common.Address, shares *big.Int) (*types.Transaction, error) { - return _IStrategyManager.Contract.AddShares(&_IStrategyManager.TransactOpts, staker, strategy, token, shares) +// Solidity: function addShares(address staker, address strategy, uint256 shares) returns(uint256, uint256) +func (_IStrategyManager *IStrategyManagerSession) AddShares(staker common.Address, strategy common.Address, shares *big.Int) (*types.Transaction, error) { + return _IStrategyManager.Contract.AddShares(&_IStrategyManager.TransactOpts, staker, strategy, shares) } -// AddShares is a paid mutator transaction binding the contract method 0xc4623ea1. +// AddShares is a paid mutator transaction binding the contract method 0x50ff7225. // -// Solidity: function addShares(address staker, address strategy, address token, uint256 shares) returns(uint256, uint256) -func (_IStrategyManager *IStrategyManagerTransactorSession) AddShares(staker common.Address, strategy common.Address, token common.Address, shares *big.Int) (*types.Transaction, error) { - return _IStrategyManager.Contract.AddShares(&_IStrategyManager.TransactOpts, staker, strategy, token, shares) +// Solidity: function addShares(address staker, address strategy, uint256 shares) returns(uint256, uint256) +func (_IStrategyManager *IStrategyManagerTransactorSession) AddShares(staker common.Address, strategy common.Address, shares *big.Int) (*types.Transaction, error) { + return _IStrategyManager.Contract.AddShares(&_IStrategyManager.TransactOpts, staker, strategy, shares) } // AddStrategiesToDepositWhitelist is a paid mutator transaction binding the contract method 0x5de08ff2. @@ -1000,15 +1000,14 @@ func (it *IStrategyManagerDepositIterator) Close() error { // IStrategyManagerDeposit represents a Deposit event raised by the IStrategyManager contract. type IStrategyManagerDeposit struct { Staker common.Address - Token common.Address Strategy common.Address Shares *big.Int Raw types.Log // Blockchain specific contextual infos } -// FilterDeposit is a free log retrieval operation binding the contract event 0x7cfff908a4b583f36430b25d75964c458d8ede8a99bd61be750e97ee1b2f3a96. +// FilterDeposit is a free log retrieval operation binding the contract event 0x5548c837ab068cf56a2c2479df0882a4922fd203edb7517321831d95078c5f62. // -// Solidity: event Deposit(address staker, address token, address strategy, uint256 shares) +// Solidity: event Deposit(address staker, address strategy, uint256 shares) func (_IStrategyManager *IStrategyManagerFilterer) FilterDeposit(opts *bind.FilterOpts) (*IStrategyManagerDepositIterator, error) { logs, sub, err := _IStrategyManager.contract.FilterLogs(opts, "Deposit") @@ -1018,9 +1017,9 @@ func (_IStrategyManager *IStrategyManagerFilterer) FilterDeposit(opts *bind.Filt return &IStrategyManagerDepositIterator{contract: _IStrategyManager.contract, event: "Deposit", logs: logs, sub: sub}, nil } -// WatchDeposit is a free log subscription operation binding the contract event 0x7cfff908a4b583f36430b25d75964c458d8ede8a99bd61be750e97ee1b2f3a96. +// WatchDeposit is a free log subscription operation binding the contract event 0x5548c837ab068cf56a2c2479df0882a4922fd203edb7517321831d95078c5f62. // -// Solidity: event Deposit(address staker, address token, address strategy, uint256 shares) +// Solidity: event Deposit(address staker, address strategy, uint256 shares) func (_IStrategyManager *IStrategyManagerFilterer) WatchDeposit(opts *bind.WatchOpts, sink chan<- *IStrategyManagerDeposit) (event.Subscription, error) { logs, sub, err := _IStrategyManager.contract.WatchLogs(opts, "Deposit") @@ -1055,9 +1054,9 @@ func (_IStrategyManager *IStrategyManagerFilterer) WatchDeposit(opts *bind.Watch }), nil } -// ParseDeposit is a log parse operation binding the contract event 0x7cfff908a4b583f36430b25d75964c458d8ede8a99bd61be750e97ee1b2f3a96. +// ParseDeposit is a log parse operation binding the contract event 0x5548c837ab068cf56a2c2479df0882a4922fd203edb7517321831d95078c5f62. // -// Solidity: event Deposit(address staker, address token, address strategy, uint256 shares) +// Solidity: event Deposit(address staker, address strategy, uint256 shares) func (_IStrategyManager *IStrategyManagerFilterer) ParseDeposit(log types.Log) (*IStrategyManagerDeposit, error) { event := new(IStrategyManagerDeposit) if err := _IStrategyManager.contract.UnpackLog(event, "Deposit", log); err != nil { diff --git a/pkg/bindings/Merkle/binding.go b/pkg/bindings/Merkle/binding.go index 0dc9f1d9c9..d1795f6605 100644 --- a/pkg/bindings/Merkle/binding.go +++ b/pkg/bindings/Merkle/binding.go @@ -32,7 +32,7 @@ var ( // MerkleMetaData contains all meta data concerning the Merkle contract. var MerkleMetaData = &bind.MetaData{ ABI: "[{\"type\":\"error\",\"name\":\"InvalidProofLength\",\"inputs\":[]}]", - Bin: "0x60556032600b8282823980515f1a607314602657634e487b7160e01b5f525f60045260245ffd5b305f52607381538281f3fe730000000000000000000000000000000000000000301460806040525f5ffdfea264697066735822122085b24342099ee34c979b25a8181cab47b19a7b5bb98497e7c396cfeef68fc84564736f6c634300081b0033", + Bin: "0x60556032600b8282823980515f1a607314602657634e487b7160e01b5f525f60045260245ffd5b305f52607381538281f3fe730000000000000000000000000000000000000000301460806040525f5ffdfea26469706673582212208de82ea7f1a22cc126cdf4c3791b57f420fcc4ed980bdbddf119e15f4a112e8964736f6c634300081b0033", } // MerkleABI is the input ABI used to generate the binding from. diff --git a/pkg/bindings/OperatorSetLib/binding.go b/pkg/bindings/OperatorSetLib/binding.go index 6053888ada..a48c2cefdd 100644 --- a/pkg/bindings/OperatorSetLib/binding.go +++ b/pkg/bindings/OperatorSetLib/binding.go @@ -32,7 +32,7 @@ var ( // OperatorSetLibMetaData contains all meta data concerning the OperatorSetLib contract. var OperatorSetLibMetaData = &bind.MetaData{ ABI: "[]", - Bin: "0x60556032600b8282823980515f1a607314602657634e487b7160e01b5f525f60045260245ffd5b305f52607381538281f3fe730000000000000000000000000000000000000000301460806040525f5ffdfea26469706673582212208e75671188dda11a78514701822a433b1e7210d9141d5e2911f793e717037afc64736f6c634300081b0033", + Bin: "0x60556032600b8282823980515f1a607314602657634e487b7160e01b5f525f60045260245ffd5b305f52607381538281f3fe730000000000000000000000000000000000000000301460806040525f5ffdfea264697066735822122023e8e6cb91eee2d3c43ff6cfc219a624b12892e20fd5158ca2b4e1484806bb9c64736f6c634300081b0033", } // OperatorSetLibABI is the input ABI used to generate the binding from. diff --git a/pkg/bindings/PauserRegistry/binding.go b/pkg/bindings/PauserRegistry/binding.go index 1e8885e369..a77ccb9e9d 100644 --- a/pkg/bindings/PauserRegistry/binding.go +++ b/pkg/bindings/PauserRegistry/binding.go @@ -32,7 +32,7 @@ var ( // PauserRegistryMetaData contains all meta data concerning the PauserRegistry contract. var PauserRegistryMetaData = &bind.MetaData{ ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"_pausers\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"_unpauser\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"isPauser\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"setIsPauser\",\"inputs\":[{\"name\":\"newPauser\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"canPause\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setUnpauser\",\"inputs\":[{\"name\":\"newUnpauser\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unpauser\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"event\",\"name\":\"PauserStatusChanged\",\"inputs\":[{\"name\":\"pauser\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"canPause\",\"type\":\"bool\",\"indexed\":false,\"internalType\":\"bool\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"UnpauserChanged\",\"inputs\":[{\"name\":\"previousUnpauser\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"newUnpauser\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"InputAddressZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyUnpauser\",\"inputs\":[]}]", - Bin: "0x608060405234801561000f575f5ffd5b506040516105c83803806105c883398101604081905261002e916101c2565b5f5b825181101561006b5761006383828151811061004e5761004e61029e565b6020026020010151600161007c60201b60201c565b600101610030565b5061007581610103565b50506102b2565b6001600160a01b0382166100a3576040516339b190bb60e11b815260040160405180910390fd5b6001600160a01b0382165f8181526020818152604091829020805460ff19168515159081179091558251938452908301527f65d3a1fd4c13f05cba164f80d03ce90fb4b5e21946bfc3ab7dbd434c2d0b9152910160405180910390a15050565b6001600160a01b03811661012a576040516339b190bb60e11b815260040160405180910390fd5b600154604080516001600160a01b03928316815291831660208301527f06b4167a2528887a1e97a366eefe8549bfbf1ea3e6ac81cb2564a934d20e8892910160405180910390a1600180546001600160a01b0319166001600160a01b0392909216919091179055565b634e487b7160e01b5f52604160045260245ffd5b80516001600160a01b03811681146101bd575f5ffd5b919050565b5f5f604083850312156101d3575f5ffd5b82516001600160401b038111156101e8575f5ffd5b8301601f810185136101f8575f5ffd5b80516001600160401b0381111561021157610211610193565b604051600582901b90603f8201601f191681016001600160401b038111828210171561023f5761023f610193565b60405291825260208184018101929081018884111561025c575f5ffd5b6020850194505b8385101561028257610274856101a7565b815260209485019401610263565b50945061029592505050602084016101a7565b90509250929050565b634e487b7160e01b5f52603260045260245ffd5b610309806102bf5f395ff3fe608060405234801561000f575f5ffd5b506004361061004a575f3560e01c806346fbf68e1461004e5780638568520614610085578063ce5484281461009a578063eab66d7a146100ad575b5f5ffd5b61007061005c36600461027a565b5f6020819052908152604090205460ff1681565b60405190151581526020015b60405180910390f35b61009861009336600461029a565b6100d8565b005b6100986100a836600461027a565b610111565b6001546100c0906001600160a01b031681565b6040516001600160a01b03909116815260200161007c565b6001546001600160a01b031633146101035760405163794821ff60e01b815260040160405180910390fd5b61010d8282610148565b5050565b6001546001600160a01b0316331461013c5760405163794821ff60e01b815260040160405180910390fd5b610145816101cf565b50565b6001600160a01b03821661016f576040516339b190bb60e11b815260040160405180910390fd5b6001600160a01b0382165f8181526020818152604091829020805460ff19168515159081179091558251938452908301527f65d3a1fd4c13f05cba164f80d03ce90fb4b5e21946bfc3ab7dbd434c2d0b9152910160405180910390a15050565b6001600160a01b0381166101f6576040516339b190bb60e11b815260040160405180910390fd5b600154604080516001600160a01b03928316815291831660208301527f06b4167a2528887a1e97a366eefe8549bfbf1ea3e6ac81cb2564a934d20e8892910160405180910390a1600180546001600160a01b0319166001600160a01b0392909216919091179055565b80356001600160a01b0381168114610275575f5ffd5b919050565b5f6020828403121561028a575f5ffd5b6102938261025f565b9392505050565b5f5f604083850312156102ab575f5ffd5b6102b48361025f565b9150602083013580151581146102c8575f5ffd5b80915050925092905056fea2646970667358221220db74dd8a1c2636fc45fee53a0fefff90f86f0498901cb732dc4c0ce26247557164736f6c634300081b0033", + Bin: "0x608060405234801561000f575f5ffd5b506040516105c83803806105c883398101604081905261002e916101c2565b5f5b825181101561006b5761006383828151811061004e5761004e61029e565b6020026020010151600161007c60201b60201c565b600101610030565b5061007581610103565b50506102b2565b6001600160a01b0382166100a3576040516339b190bb60e11b815260040160405180910390fd5b6001600160a01b0382165f8181526020818152604091829020805460ff19168515159081179091558251938452908301527f65d3a1fd4c13f05cba164f80d03ce90fb4b5e21946bfc3ab7dbd434c2d0b9152910160405180910390a15050565b6001600160a01b03811661012a576040516339b190bb60e11b815260040160405180910390fd5b600154604080516001600160a01b03928316815291831660208301527f06b4167a2528887a1e97a366eefe8549bfbf1ea3e6ac81cb2564a934d20e8892910160405180910390a1600180546001600160a01b0319166001600160a01b0392909216919091179055565b634e487b7160e01b5f52604160045260245ffd5b80516001600160a01b03811681146101bd575f5ffd5b919050565b5f5f604083850312156101d3575f5ffd5b82516001600160401b038111156101e8575f5ffd5b8301601f810185136101f8575f5ffd5b80516001600160401b0381111561021157610211610193565b604051600582901b90603f8201601f191681016001600160401b038111828210171561023f5761023f610193565b60405291825260208184018101929081018884111561025c575f5ffd5b6020850194505b8385101561028257610274856101a7565b815260209485019401610263565b50945061029592505050602084016101a7565b90509250929050565b634e487b7160e01b5f52603260045260245ffd5b610309806102bf5f395ff3fe608060405234801561000f575f5ffd5b506004361061004a575f3560e01c806346fbf68e1461004e5780638568520614610085578063ce5484281461009a578063eab66d7a146100ad575b5f5ffd5b61007061005c36600461027a565b5f6020819052908152604090205460ff1681565b60405190151581526020015b60405180910390f35b61009861009336600461029a565b6100d8565b005b6100986100a836600461027a565b610111565b6001546100c0906001600160a01b031681565b6040516001600160a01b03909116815260200161007c565b6001546001600160a01b031633146101035760405163794821ff60e01b815260040160405180910390fd5b61010d8282610148565b5050565b6001546001600160a01b0316331461013c5760405163794821ff60e01b815260040160405180910390fd5b610145816101cf565b50565b6001600160a01b03821661016f576040516339b190bb60e11b815260040160405180910390fd5b6001600160a01b0382165f8181526020818152604091829020805460ff19168515159081179091558251938452908301527f65d3a1fd4c13f05cba164f80d03ce90fb4b5e21946bfc3ab7dbd434c2d0b9152910160405180910390a15050565b6001600160a01b0381166101f6576040516339b190bb60e11b815260040160405180910390fd5b600154604080516001600160a01b03928316815291831660208301527f06b4167a2528887a1e97a366eefe8549bfbf1ea3e6ac81cb2564a934d20e8892910160405180910390a1600180546001600160a01b0319166001600160a01b0392909216919091179055565b80356001600160a01b0381168114610275575f5ffd5b919050565b5f6020828403121561028a575f5ffd5b6102938261025f565b9392505050565b5f5f604083850312156102ab575f5ffd5b6102b48361025f565b9150602083013580151581146102c8575f5ffd5b80915050925092905056fea264697066735822122009d8ba5b235f31c96a07127caff39f4f0438590d75b714b9d6de67448091f19864736f6c634300081b0033", } // PauserRegistryABI is the input ABI used to generate the binding from. diff --git a/pkg/bindings/PermissionController/binding.go b/pkg/bindings/PermissionController/binding.go index 42053b7097..21f037d593 100644 --- a/pkg/bindings/PermissionController/binding.go +++ b/pkg/bindings/PermissionController/binding.go @@ -32,7 +32,7 @@ var ( // PermissionControllerMetaData contains all meta data concerning the PermissionController contract. var PermissionControllerMetaData = &bind.MetaData{ ABI: "[{\"type\":\"constructor\",\"inputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"acceptAdmin\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"addPendingAdmin\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"admin\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"canCall\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"caller\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"target\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"selector\",\"type\":\"bytes4\",\"internalType\":\"bytes4\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAdmins\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAppointeePermissions\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"appointee\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"\",\"type\":\"bytes4[]\",\"internalType\":\"bytes4[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAppointees\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"target\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"selector\",\"type\":\"bytes4\",\"internalType\":\"bytes4\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getPendingAdmins\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isAdmin\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"caller\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isPendingAdmin\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"pendingAdmin\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"removeAdmin\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"admin\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"removeAppointee\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"appointee\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"target\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"selector\",\"type\":\"bytes4\",\"internalType\":\"bytes4\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"removePendingAdmin\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"admin\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setAppointee\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"appointee\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"target\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"selector\",\"type\":\"bytes4\",\"internalType\":\"bytes4\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"AdminRemoved\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"admin\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"AdminSet\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"admin\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"AppointeeRemoved\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"appointee\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"target\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"selector\",\"type\":\"bytes4\",\"indexed\":false,\"internalType\":\"bytes4\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"AppointeeSet\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"appointee\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"target\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"selector\",\"type\":\"bytes4\",\"indexed\":false,\"internalType\":\"bytes4\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"PendingAdminAdded\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"admin\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"PendingAdminRemoved\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"admin\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"AdminAlreadyPending\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"AdminAlreadySet\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"AdminNotPending\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"AdminNotSet\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"AppointeeAlreadySet\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"AppointeeNotSet\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"CannotHaveZeroAdmins\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotAdmin\",\"inputs\":[]}]", - Bin: "0x6080604052348015600e575f5ffd5b5060156019565b60d3565b5f54610100900460ff161560835760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff9081161460d1575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b610f40806100e05f395ff3fe608060405234801561000f575f5ffd5b50600436106100cb575f3560e01c80639100674511610088578063ad8aca7711610063578063ad8aca77146101b0578063df595cb8146101c3578063eb5a4e87146101d6578063fddbdefd146101e9575f5ffd5b80639100674514610167578063950d806e1461018a578063ad5f22101461019d575f5ffd5b806306641201146100cf578063268959e5146100e45780634f906cf9146100f7578063628806ef1461010a5780636bddfa1f1461011d578063882a3b3814610146575b5f5ffd5b6100e26100dd366004610cfa565b6101fc565b005b6100e26100f2366004610d4b565b61031d565b6100e2610105366004610d4b565b6103f8565b6100e2610118366004610d7c565b61049b565b61013061012b366004610d7c565b610529565b60405161013d9190610dd8565b60405180910390f35b610159610154366004610d4b565b610552565b60405161013d929190610dea565b61017a610175366004610d4b565b6106b3565b604051901515815260200161013d565b6100e2610198366004610cfa565b610723565b6101306101ab366004610d7c565b610834565b61017a6101be366004610d4b565b6108da565b61017a6101d1366004610cfa565b6108fb565b6100e26101e4366004610d4b565b610950565b6101306101f7366004610e4c565b610a1e565b8361020781336106b3565b61022457604051637bfa4b9f60e01b815260040160405180910390fd5b6001600160a01b0385165f908152600160205260408120906102468585610a5c565b6001600160a01b0387165f908152600484016020526040902090915061026c9082610a89565b6102895760405163262118cd60e01b815260040160405180910390fd5b6001600160a01b0386165f90815260048301602052604090206102ac9082610aa0565b505f81815260058301602052604090206102c69087610aab565b50856001600160a01b0316876001600160a01b03167f18242326b6b862126970679759169f01f646bd55ec5bfcab85ba9f337a74e0c6878760405161030c929190610e8c565b60405180910390a350505050505050565b8161032881336106b3565b61034557604051637bfa4b9f60e01b815260040160405180910390fd5b6001600160a01b0383165f9081526001602081905260409091206002019061036c82610abf565b1161038a576040516310ce892b60e31b815260040160405180910390fd5b6103948184610aab565b6103b157604051630716d81b60e51b815260040160405180910390fd5b6040516001600160a01b0384811682528516907fdb9d5d31320daf5bc7181d565b6da4d12e30f0f4d5aa324a992426c14a1d19ce906020015b60405180910390a250505050565b8161040381336106b3565b61042057604051637bfa4b9f60e01b815260040160405180910390fd5b6001600160a01b0383165f9081526001602052604090206104418184610aab565b61045e5760405163bed8295f60e01b815260040160405180910390fd5b6040516001600160a01b0384811682528516907fd706ed7ae044d795b49e54c9f519f663053951011985f663a862cd9ee72a9ac7906020016103ea565b6001600160a01b0381165f9081526001602052604090206104bc8133610aab565b6104d95760405163bed8295f60e01b815260040160405180910390fd5b6104e66002820133610ac8565b506040513381526001600160a01b038316907fbf265e8326285a2747e33e54d5945f7111f2b5edb826eb8c08d4677779b3ff979060200160405180910390a25050565b6001600160a01b0381165f90815260016020526040902060609061054c90610adc565b92915050565b6001600160a01b038083165f90815260016020908152604080832093851683526004909301905290812060609182919061058b82610abf565b90505f8167ffffffffffffffff8111156105a7576105a7610eaf565b6040519080825280602002602001820160405280156105d0578160200160208202803683370190505b5090505f8267ffffffffffffffff8111156105ed576105ed610eaf565b604051908082528060200260200182016040528015610616578160200160208202803683370190505b5090505f5b838110156106a5576106496106308683610ae8565b606081901c9160a09190911b6001600160e01b03191690565b84838151811061065b5761065b610ec3565b6020026020010184848151811061067457610674610ec3565b6001600160e01b0319909316602093840291909101909201919091526001600160a01b03909116905260010161061b565b509097909650945050505050565b6001600160a01b0382165f9081526001602052604081206106d690600201610abf565b5f036106f857816001600160a01b0316836001600160a01b031614905061054c565b6001600160a01b0383165f90815260016020526040902061071c9060020183610af3565b9392505050565b8361072e81336106b3565b61074b57604051637bfa4b9f60e01b815260040160405180910390fd5b6001600160a01b0385165f9081526001602052604081209061076d8585610a5c565b6001600160a01b0387165f90815260048401602052604090209091506107939082610a89565b156107b15760405163ad8efeb760e01b815260040160405180910390fd5b6001600160a01b0386165f90815260048301602052604090206107d49082610b14565b505f81815260058301602052604090206107ee9087610ac8565b50856001600160a01b0316876001600160a01b03167f037f03a2ad6b967df4a01779b6d2b4c85950df83925d9e31362b519422fc0169878760405161030c929190610e8c565b6001600160a01b0381165f90815260016020526040902060609061085a90600201610abf565b5f036108b2576040805160018082528183019092525f916020808301908036833701905050905082815f8151811061089457610894610ec3565b6001600160a01b039092166020928302919091019091015292915050565b6001600160a01b0382165f90815260016020526040902061054c90600201610adc565b919050565b6001600160a01b0382165f90815260016020526040812061071c9083610af3565b5f61090685856106b3565b8061094757506109476109198484610a5c565b6001600160a01b038088165f908152600160209081526040808320938a168352600490930190522090610a89565b95945050505050565b8161095b81336106b3565b61097857604051637bfa4b9f60e01b815260040160405180910390fd5b6001600160a01b0383165f90815260016020526040902061099c6002820184610af3565b156109ba5760405163130160e560e31b815260040160405180910390fd5b6109c48184610ac8565b6109e1576040516319abede360e11b815260040160405180910390fd5b6040516001600160a01b0384811682528516907fb14b9a3d448c5b04f0e5b087b6f5193390db7955482a6ffb841e7b3ba61a460c906020016103ea565b60605f610a2b8484610a5c565b6001600160a01b0386165f908152600160209081526040808320848452600501909152902090915061094790610adc565b60609190911b6bffffffffffffffffffffffff191660a09190911c6bffffffff0000000000000000161790565b5f818152600183016020526040812054151561071c565b5f61071c8383610b1f565b5f61071c836001600160a01b038416610b1f565b5f61054c825490565b5f61071c836001600160a01b038416610c02565b60605f61071c83610c4e565b5f61071c8383610ca7565b6001600160a01b0381165f908152600183016020526040812054151561071c565b5f61071c8383610c02565b5f8181526001830160205260408120548015610bf9575f610b41600183610ed7565b85549091505f90610b5490600190610ed7565b9050818114610bb3575f865f018281548110610b7257610b72610ec3565b905f5260205f200154905080875f018481548110610b9257610b92610ec3565b5f918252602080832090910192909255918252600188019052604090208390555b8554869080610bc457610bc4610ef6565b600190038181905f5260205f20015f90559055856001015f8681526020019081526020015f205f90556001935050505061054c565b5f91505061054c565b5f818152600183016020526040812054610c4757508154600181810184555f84815260208082209093018490558454848252828601909352604090209190915561054c565b505f61054c565b6060815f01805480602002602001604051908101604052809291908181526020018280548015610c9b57602002820191905f5260205f20905b815481526020019060010190808311610c87575b50505050509050919050565b5f825f018281548110610cbc57610cbc610ec3565b905f5260205f200154905092915050565b80356001600160a01b03811681146108d5575f5ffd5b80356001600160e01b0319811681146108d5575f5ffd5b5f5f5f5f60808587031215610d0d575f5ffd5b610d1685610ccd565b9350610d2460208601610ccd565b9250610d3260408601610ccd565b9150610d4060608601610ce3565b905092959194509250565b5f5f60408385031215610d5c575f5ffd5b610d6583610ccd565b9150610d7360208401610ccd565b90509250929050565b5f60208284031215610d8c575f5ffd5b61071c82610ccd565b5f8151808452602084019350602083015f5b82811015610dce5781516001600160a01b0316865260209586019590910190600101610da7565b5093949350505050565b602081525f61071c6020830184610d95565b604081525f610dfc6040830185610d95565b82810360208401528084518083526020830191506020860192505f5b81811015610e405783516001600160e01b031916835260209384019390920191600101610e18565b50909695505050505050565b5f5f5f60608486031215610e5e575f5ffd5b610e6784610ccd565b9250610e7560208501610ccd565b9150610e8360408501610ce3565b90509250925092565b6001600160a01b039290921682526001600160e01b031916602082015260400190565b634e487b7160e01b5f52604160045260245ffd5b634e487b7160e01b5f52603260045260245ffd5b8181038181111561054c57634e487b7160e01b5f52601160045260245ffd5b634e487b7160e01b5f52603160045260245ffdfea2646970667358221220d51174d6b3c524ff4f2a28349f859cd925e5fb8f0c1cd6c178158e9059cdc26c64736f6c634300081b0033", + Bin: "0x6080604052348015600e575f5ffd5b5060156019565b60d3565b5f54610100900460ff161560835760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff9081161460d1575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b610f40806100e05f395ff3fe608060405234801561000f575f5ffd5b50600436106100cb575f3560e01c80639100674511610088578063ad8aca7711610063578063ad8aca77146101b0578063df595cb8146101c3578063eb5a4e87146101d6578063fddbdefd146101e9575f5ffd5b80639100674514610167578063950d806e1461018a578063ad5f22101461019d575f5ffd5b806306641201146100cf578063268959e5146100e45780634f906cf9146100f7578063628806ef1461010a5780636bddfa1f1461011d578063882a3b3814610146575b5f5ffd5b6100e26100dd366004610cfa565b6101fc565b005b6100e26100f2366004610d4b565b61031d565b6100e2610105366004610d4b565b6103f8565b6100e2610118366004610d7c565b61049b565b61013061012b366004610d7c565b610529565b60405161013d9190610dd8565b60405180910390f35b610159610154366004610d4b565b610552565b60405161013d929190610dea565b61017a610175366004610d4b565b6106b3565b604051901515815260200161013d565b6100e2610198366004610cfa565b610723565b6101306101ab366004610d7c565b610834565b61017a6101be366004610d4b565b6108da565b61017a6101d1366004610cfa565b6108fb565b6100e26101e4366004610d4b565b610950565b6101306101f7366004610e4c565b610a1e565b8361020781336106b3565b61022457604051637bfa4b9f60e01b815260040160405180910390fd5b6001600160a01b0385165f908152600160205260408120906102468585610a5c565b6001600160a01b0387165f908152600484016020526040902090915061026c9082610a89565b6102895760405163262118cd60e01b815260040160405180910390fd5b6001600160a01b0386165f90815260048301602052604090206102ac9082610aa0565b505f81815260058301602052604090206102c69087610aab565b50856001600160a01b0316876001600160a01b03167f18242326b6b862126970679759169f01f646bd55ec5bfcab85ba9f337a74e0c6878760405161030c929190610e8c565b60405180910390a350505050505050565b8161032881336106b3565b61034557604051637bfa4b9f60e01b815260040160405180910390fd5b6001600160a01b0383165f9081526001602081905260409091206002019061036c82610abf565b1161038a576040516310ce892b60e31b815260040160405180910390fd5b6103948184610aab565b6103b157604051630716d81b60e51b815260040160405180910390fd5b6040516001600160a01b0384811682528516907fdb9d5d31320daf5bc7181d565b6da4d12e30f0f4d5aa324a992426c14a1d19ce906020015b60405180910390a250505050565b8161040381336106b3565b61042057604051637bfa4b9f60e01b815260040160405180910390fd5b6001600160a01b0383165f9081526001602052604090206104418184610aab565b61045e5760405163bed8295f60e01b815260040160405180910390fd5b6040516001600160a01b0384811682528516907fd706ed7ae044d795b49e54c9f519f663053951011985f663a862cd9ee72a9ac7906020016103ea565b6001600160a01b0381165f9081526001602052604090206104bc8133610aab565b6104d95760405163bed8295f60e01b815260040160405180910390fd5b6104e66002820133610ac8565b506040513381526001600160a01b038316907fbf265e8326285a2747e33e54d5945f7111f2b5edb826eb8c08d4677779b3ff979060200160405180910390a25050565b6001600160a01b0381165f90815260016020526040902060609061054c90610adc565b92915050565b6001600160a01b038083165f90815260016020908152604080832093851683526004909301905290812060609182919061058b82610abf565b90505f8167ffffffffffffffff8111156105a7576105a7610eaf565b6040519080825280602002602001820160405280156105d0578160200160208202803683370190505b5090505f8267ffffffffffffffff8111156105ed576105ed610eaf565b604051908082528060200260200182016040528015610616578160200160208202803683370190505b5090505f5b838110156106a5576106496106308683610ae8565b606081901c9160a09190911b6001600160e01b03191690565b84838151811061065b5761065b610ec3565b6020026020010184848151811061067457610674610ec3565b6001600160e01b0319909316602093840291909101909201919091526001600160a01b03909116905260010161061b565b509097909650945050505050565b6001600160a01b0382165f9081526001602052604081206106d690600201610abf565b5f036106f857816001600160a01b0316836001600160a01b031614905061054c565b6001600160a01b0383165f90815260016020526040902061071c9060020183610af3565b9392505050565b8361072e81336106b3565b61074b57604051637bfa4b9f60e01b815260040160405180910390fd5b6001600160a01b0385165f9081526001602052604081209061076d8585610a5c565b6001600160a01b0387165f90815260048401602052604090209091506107939082610a89565b156107b15760405163ad8efeb760e01b815260040160405180910390fd5b6001600160a01b0386165f90815260048301602052604090206107d49082610b14565b505f81815260058301602052604090206107ee9087610ac8565b50856001600160a01b0316876001600160a01b03167f037f03a2ad6b967df4a01779b6d2b4c85950df83925d9e31362b519422fc0169878760405161030c929190610e8c565b6001600160a01b0381165f90815260016020526040902060609061085a90600201610abf565b5f036108b2576040805160018082528183019092525f916020808301908036833701905050905082815f8151811061089457610894610ec3565b6001600160a01b039092166020928302919091019091015292915050565b6001600160a01b0382165f90815260016020526040902061054c90600201610adc565b919050565b6001600160a01b0382165f90815260016020526040812061071c9083610af3565b5f61090685856106b3565b8061094757506109476109198484610a5c565b6001600160a01b038088165f908152600160209081526040808320938a168352600490930190522090610a89565b95945050505050565b8161095b81336106b3565b61097857604051637bfa4b9f60e01b815260040160405180910390fd5b6001600160a01b0383165f90815260016020526040902061099c6002820184610af3565b156109ba5760405163130160e560e31b815260040160405180910390fd5b6109c48184610ac8565b6109e1576040516319abede360e11b815260040160405180910390fd5b6040516001600160a01b0384811682528516907fb14b9a3d448c5b04f0e5b087b6f5193390db7955482a6ffb841e7b3ba61a460c906020016103ea565b60605f610a2b8484610a5c565b6001600160a01b0386165f908152600160209081526040808320848452600501909152902090915061094790610adc565b60609190911b6bffffffffffffffffffffffff191660a09190911c6bffffffff0000000000000000161790565b5f818152600183016020526040812054151561071c565b5f61071c8383610b1f565b5f61071c836001600160a01b038416610b1f565b5f61054c825490565b5f61071c836001600160a01b038416610c02565b60605f61071c83610c4e565b5f61071c8383610ca7565b6001600160a01b0381165f908152600183016020526040812054151561071c565b5f61071c8383610c02565b5f8181526001830160205260408120548015610bf9575f610b41600183610ed7565b85549091505f90610b5490600190610ed7565b9050818114610bb3575f865f018281548110610b7257610b72610ec3565b905f5260205f200154905080875f018481548110610b9257610b92610ec3565b5f918252602080832090910192909255918252600188019052604090208390555b8554869080610bc457610bc4610ef6565b600190038181905f5260205f20015f90559055856001015f8681526020019081526020015f205f90556001935050505061054c565b5f91505061054c565b5f818152600183016020526040812054610c4757508154600181810184555f84815260208082209093018490558454848252828601909352604090209190915561054c565b505f61054c565b6060815f01805480602002602001604051908101604052809291908181526020018280548015610c9b57602002820191905f5260205f20905b815481526020019060010190808311610c87575b50505050509050919050565b5f825f018281548110610cbc57610cbc610ec3565b905f5260205f200154905092915050565b80356001600160a01b03811681146108d5575f5ffd5b80356001600160e01b0319811681146108d5575f5ffd5b5f5f5f5f60808587031215610d0d575f5ffd5b610d1685610ccd565b9350610d2460208601610ccd565b9250610d3260408601610ccd565b9150610d4060608601610ce3565b905092959194509250565b5f5f60408385031215610d5c575f5ffd5b610d6583610ccd565b9150610d7360208401610ccd565b90509250929050565b5f60208284031215610d8c575f5ffd5b61071c82610ccd565b5f8151808452602084019350602083015f5b82811015610dce5781516001600160a01b0316865260209586019590910190600101610da7565b5093949350505050565b602081525f61071c6020830184610d95565b604081525f610dfc6040830185610d95565b82810360208401528084518083526020830191506020860192505f5b81811015610e405783516001600160e01b031916835260209384019390920191600101610e18565b50909695505050505050565b5f5f5f60608486031215610e5e575f5ffd5b610e6784610ccd565b9250610e7560208501610ccd565b9150610e8360408501610ce3565b90509250925092565b6001600160a01b039290921682526001600160e01b031916602082015260400190565b634e487b7160e01b5f52604160045260245ffd5b634e487b7160e01b5f52603260045260245ffd5b8181038181111561054c57634e487b7160e01b5f52601160045260245ffd5b634e487b7160e01b5f52603160045260245ffdfea2646970667358221220b63ce7fd361f505a43fbbc1e192d669b57efb369c86636afa2dd2f0c28075a1264736f6c634300081b0033", } // PermissionControllerABI 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 4a8f27e6f1..5d9b1ef6a6 100644 --- a/pkg/bindings/RewardsCoordinator/binding.go +++ b/pkg/bindings/RewardsCoordinator/binding.go @@ -99,8 +99,13 @@ type OperatorSet struct { // RewardsCoordinatorMetaData contains all meta data concerning the RewardsCoordinator contract. var RewardsCoordinatorMetaData = &bind.MetaData{ +<<<<<<< HEAD ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"_delegationManager\",\"type\":\"address\",\"internalType\":\"contractIDelegationManager\"},{\"name\":\"_strategyManager\",\"type\":\"address\",\"internalType\":\"contractIStrategyManager\"},{\"name\":\"_allocationManager\",\"type\":\"address\",\"internalType\":\"contractIAllocationManager\"},{\"name\":\"_pauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"},{\"name\":\"_permissionController\",\"type\":\"address\",\"internalType\":\"contractIPermissionController\"},{\"name\":\"_CALCULATION_INTERVAL_SECONDS\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"_MAX_REWARDS_DURATION\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"_MAX_RETROACTIVE_LENGTH\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"_MAX_FUTURE_LENGTH\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"_GENESIS_REWARDS_TIMESTAMP\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"CALCULATION_INTERVAL_SECONDS\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"GENESIS_REWARDS_TIMESTAMP\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAX_FUTURE_LENGTH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAX_RETROACTIVE_LENGTH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAX_REWARDS_DURATION\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activationDelay\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"allocationManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIAllocationManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"beaconChainETHStrategy\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"calculateEarnerLeafHash\",\"inputs\":[{\"name\":\"leaf\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinatorTypes.EarnerTreeMerkleLeaf\",\"components\":[{\"name\":\"earner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"earnerTokenRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"calculateTokenLeafHash\",\"inputs\":[{\"name\":\"leaf\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinatorTypes.TokenTreeMerkleLeaf\",\"components\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"cumulativeEarnings\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"checkClaim\",\"inputs\":[{\"name\":\"claim\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinatorTypes.RewardsMerkleClaim\",\"components\":[{\"name\":\"rootIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"earnerIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"earnerTreeProof\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"earnerLeaf\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinatorTypes.EarnerTreeMerkleLeaf\",\"components\":[{\"name\":\"earner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"earnerTokenRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"tokenIndices\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"},{\"name\":\"tokenTreeProofs\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"},{\"name\":\"tokenLeaves\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.TokenTreeMerkleLeaf[]\",\"components\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"cumulativeEarnings\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"claimerFor\",\"inputs\":[{\"name\":\"earner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"claimer\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"createAVSRewardsSubmission\",\"inputs\":[{\"name\":\"rewardsSubmissions\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.RewardsSubmission[]\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.StrategyAndMultiplier[]\",\"components\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"multiplier\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"duration\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"createOperatorDirectedAVSRewardsSubmission\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorDirectedRewardsSubmissions\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.OperatorDirectedRewardsSubmission[]\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.StrategyAndMultiplier[]\",\"components\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"multiplier\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"operatorRewards\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.OperatorReward[]\",\"components\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"startTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"duration\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"description\",\"type\":\"string\",\"internalType\":\"string\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"createOperatorDirectedOperatorSetRewardsSubmission\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"operatorDirectedRewardsSubmissions\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.OperatorDirectedRewardsSubmission[]\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.StrategyAndMultiplier[]\",\"components\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"multiplier\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"operatorRewards\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.OperatorReward[]\",\"components\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"startTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"duration\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"description\",\"type\":\"string\",\"internalType\":\"string\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"createRewardsForAllEarners\",\"inputs\":[{\"name\":\"rewardsSubmissions\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.RewardsSubmission[]\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.StrategyAndMultiplier[]\",\"components\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"multiplier\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"duration\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"createRewardsForAllSubmission\",\"inputs\":[{\"name\":\"rewardsSubmissions\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.RewardsSubmission[]\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.StrategyAndMultiplier[]\",\"components\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"multiplier\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"duration\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"cumulativeClaimed\",\"inputs\":[{\"name\":\"earner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"outputs\":[{\"name\":\"totalClaimed\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"currRewardsCalculationEndTimestamp\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"defaultOperatorSplitBips\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"delegationManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIDelegationManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"disableRoot\",\"inputs\":[{\"name\":\"rootIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"getCurrentClaimableDistributionRoot\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinatorTypes.DistributionRoot\",\"components\":[{\"name\":\"root\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"rewardsCalculationEndTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"activatedAt\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"disabled\",\"type\":\"bool\",\"internalType\":\"bool\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getCurrentDistributionRoot\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinatorTypes.DistributionRoot\",\"components\":[{\"name\":\"root\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"rewardsCalculationEndTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"activatedAt\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"disabled\",\"type\":\"bool\",\"internalType\":\"bool\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getDistributionRootAtIndex\",\"inputs\":[{\"name\":\"index\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinatorTypes.DistributionRoot\",\"components\":[{\"name\":\"root\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"rewardsCalculationEndTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"activatedAt\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"disabled\",\"type\":\"bool\",\"internalType\":\"bool\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getDistributionRootsLength\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getOperatorAVSSplit\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getOperatorPISplit\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getOperatorSetSplit\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getRootIndexFromHash\",\"inputs\":[{\"name\":\"rootHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"initialOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"initialPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_rewardsUpdater\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_activationDelay\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"_defaultSplitBips\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"isAVSRewardsSubmissionHash\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"hash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"valid\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isOperatorDirectedAVSRewardsSubmissionHash\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"hash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"valid\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isOperatorDirectedOperatorSetRewardsSubmissionHash\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"hash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"valid\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isRewardsForAllSubmitter\",\"inputs\":[{\"name\":\"submitter\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"valid\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isRewardsSubmissionForAllEarnersHash\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"hash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"valid\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isRewardsSubmissionForAllHash\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"hash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"valid\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"pauseAll\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[{\"name\":\"index\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pauserRegistry\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"permissionController\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIPermissionController\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"processClaim\",\"inputs\":[{\"name\":\"claim\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinatorTypes.RewardsMerkleClaim\",\"components\":[{\"name\":\"rootIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"earnerIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"earnerTreeProof\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"earnerLeaf\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinatorTypes.EarnerTreeMerkleLeaf\",\"components\":[{\"name\":\"earner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"earnerTokenRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"tokenIndices\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"},{\"name\":\"tokenTreeProofs\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"},{\"name\":\"tokenLeaves\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.TokenTreeMerkleLeaf[]\",\"components\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"cumulativeEarnings\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}]},{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"processClaims\",\"inputs\":[{\"name\":\"claims\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.RewardsMerkleClaim[]\",\"components\":[{\"name\":\"rootIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"earnerIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"earnerTreeProof\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"earnerLeaf\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinatorTypes.EarnerTreeMerkleLeaf\",\"components\":[{\"name\":\"earner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"earnerTokenRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"tokenIndices\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"},{\"name\":\"tokenTreeProofs\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"},{\"name\":\"tokenLeaves\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.TokenTreeMerkleLeaf[]\",\"components\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"cumulativeEarnings\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}]},{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"rewardsUpdater\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"setActivationDelay\",\"inputs\":[{\"name\":\"_activationDelay\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setClaimerFor\",\"inputs\":[{\"name\":\"claimer\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setClaimerFor\",\"inputs\":[{\"name\":\"earner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"claimer\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setDefaultOperatorSplit\",\"inputs\":[{\"name\":\"split\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setOperatorAVSSplit\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"split\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setOperatorPISplit\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"split\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setOperatorSetSplit\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"split\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setRewardsForAllSubmitter\",\"inputs\":[{\"name\":\"_submitter\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_newValue\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setRewardsUpdater\",\"inputs\":[{\"name\":\"_rewardsUpdater\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"strategyManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategyManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"submissionNonce\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"nonce\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"submitRoot\",\"inputs\":[{\"name\":\"root\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"rewardsCalculationEndTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"AVSRewardsSubmissionCreated\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"submissionNonce\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"rewardsSubmissionHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"rewardsSubmission\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIRewardsCoordinatorTypes.RewardsSubmission\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.StrategyAndMultiplier[]\",\"components\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"multiplier\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"duration\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ActivationDelaySet\",\"inputs\":[{\"name\":\"oldActivationDelay\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"},{\"name\":\"newActivationDelay\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ClaimerForSet\",\"inputs\":[{\"name\":\"earner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"oldClaimer\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"claimer\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DefaultOperatorSplitBipsSet\",\"inputs\":[{\"name\":\"oldDefaultOperatorSplitBips\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"},{\"name\":\"newDefaultOperatorSplitBips\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DistributionRootDisabled\",\"inputs\":[{\"name\":\"rootIndex\",\"type\":\"uint32\",\"indexed\":true,\"internalType\":\"uint32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DistributionRootSubmitted\",\"inputs\":[{\"name\":\"rootIndex\",\"type\":\"uint32\",\"indexed\":true,\"internalType\":\"uint32\"},{\"name\":\"root\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"rewardsCalculationEndTimestamp\",\"type\":\"uint32\",\"indexed\":true,\"internalType\":\"uint32\"},{\"name\":\"activatedAt\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorAVSSplitBipsSet\",\"inputs\":[{\"name\":\"caller\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"avs\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"activatedAt\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"},{\"name\":\"oldOperatorAVSSplitBips\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"},{\"name\":\"newOperatorAVSSplitBips\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorDirectedAVSRewardsSubmissionCreated\",\"inputs\":[{\"name\":\"caller\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"avs\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"operatorDirectedRewardsSubmissionHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"submissionNonce\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"operatorDirectedRewardsSubmission\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIRewardsCoordinatorTypes.OperatorDirectedRewardsSubmission\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.StrategyAndMultiplier[]\",\"components\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"multiplier\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"operatorRewards\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.OperatorReward[]\",\"components\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"startTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"duration\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"description\",\"type\":\"string\",\"internalType\":\"string\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorDirectedOperatorSetRewardsSubmissionCreated\",\"inputs\":[{\"name\":\"caller\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"operatorDirectedRewardsSubmissionHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"submissionNonce\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"operatorDirectedRewardsSubmission\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIRewardsCoordinatorTypes.OperatorDirectedRewardsSubmission\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.StrategyAndMultiplier[]\",\"components\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"multiplier\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"operatorRewards\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.OperatorReward[]\",\"components\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"startTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"duration\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"description\",\"type\":\"string\",\"internalType\":\"string\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorPISplitBipsSet\",\"inputs\":[{\"name\":\"caller\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"activatedAt\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"},{\"name\":\"oldOperatorPISplitBips\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"},{\"name\":\"newOperatorPISplitBips\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorSetSplitBipsSet\",\"inputs\":[{\"name\":\"caller\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"activatedAt\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"},{\"name\":\"oldOperatorSetSplitBips\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"},{\"name\":\"newOperatorSetSplitBips\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RewardsClaimed\",\"inputs\":[{\"name\":\"root\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"},{\"name\":\"earner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"claimer\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"recipient\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"token\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIERC20\"},{\"name\":\"claimedAmount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RewardsForAllSubmitterSet\",\"inputs\":[{\"name\":\"rewardsForAllSubmitter\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"oldValue\",\"type\":\"bool\",\"indexed\":true,\"internalType\":\"bool\"},{\"name\":\"newValue\",\"type\":\"bool\",\"indexed\":true,\"internalType\":\"bool\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RewardsSubmissionForAllCreated\",\"inputs\":[{\"name\":\"submitter\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"submissionNonce\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"rewardsSubmissionHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"rewardsSubmission\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIRewardsCoordinatorTypes.RewardsSubmission\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.StrategyAndMultiplier[]\",\"components\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"multiplier\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"duration\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RewardsSubmissionForAllEarnersCreated\",\"inputs\":[{\"name\":\"tokenHopper\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"submissionNonce\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"rewardsSubmissionHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"rewardsSubmission\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIRewardsCoordinatorTypes.RewardsSubmission\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.StrategyAndMultiplier[]\",\"components\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"multiplier\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"duration\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RewardsUpdaterSet\",\"inputs\":[{\"name\":\"oldRewardsUpdater\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newRewardsUpdater\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"AmountExceedsMax\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"AmountIsZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"CurrentlyPaused\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"DurationExceedsMax\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"EarningsNotGreaterThanClaimed\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InputAddressZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InputArrayLengthMismatch\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InputArrayLengthZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidAddressZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidCalculationIntervalSecondsRemainder\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidClaimProof\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidDurationRemainder\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidEarner\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidEarnerLeafIndex\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidGenesisRewardsTimestampRemainder\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidNewPausedStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidOperatorSet\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidPermissions\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidProofLength\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidRoot\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidRootIndex\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidStartTimestampRemainder\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidTokenLeafIndex\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NewRootMustBeForNewCalculatedPeriod\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyPauser\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyUnpauser\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OperatorsNotInAscendingOrder\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"PreviousSplitPending\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RewardsEndTimestampNotElapsed\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RootAlreadyActivated\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RootDisabled\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RootNotActivated\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SplitExceedsMax\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StartTimestampTooFarInFuture\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StartTimestampTooFarInPast\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StrategiesNotInAscendingOrder\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StrategyNotWhitelisted\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SubmissionNotRetroactive\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"UnauthorizedCaller\",\"inputs\":[]}]", Bin: "0x6101c0604052348015610010575f5ffd5b50604051614a90380380614a9083398101604081905261002f91610211565b858a8a8a88888888888f6001600160a01b038116610060576040516339b190bb60e11b815260040160405180910390fd5b6001600160a01b031660805261007685826102d3565b63ffffffff161561009a57604051630e06bd3160e01b815260040160405180910390fd5b6100a762015180866102d3565b63ffffffff16156100cb5760405163223c7b3960e11b815260040160405180910390fd5b6001600160a01b0397881660a05295871660c05293861660e05263ffffffff9283166101005290821661012052811661014052908116610160521661018052166101a052610117610126565b50505050505050505050610306565b5f54610100900460ff16156101915760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff908116146101e0575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b03811681146101f6575f5ffd5b50565b805163ffffffff8116811461020c575f5ffd5b919050565b5f5f5f5f5f5f5f5f5f5f6101408b8d03121561022b575f5ffd5b8a51610236816101e2565b60208c0151909a50610247816101e2565b60408c0151909950610258816101e2565b60608c0151909850610269816101e2565b60808c015190975061027a816101e2565b955061028860a08c016101f9565b945061029660c08c016101f9565b93506102a460e08c016101f9565b92506102b36101008c016101f9565b91506102c26101208c016101f9565b90509295989b9194979a5092959850565b5f63ffffffff8316806102f457634e487b7160e01b5f52601260045260245ffd5b8063ffffffff84160691505092915050565b60805160a05160c05160e05161010051610120516101405161016051610180516101a0516146b26103de5f395f81816105e5015261278101525f8181610499015261352801525f81816103e80152612bc301525f818161054701526134e601525f818161085e01526133f601525f818161079f01528181613446015261349401525f81816108b201528181610adb01528181611dd6015261208201525f818161056e01526135c301525f81816109250152611d4601525f818161073101528181610eb9015281816114bb015261236101526146b25ff3fe608060405234801561000f575f5ffd5b50600436106103a8575f3560e01c80638da5cb5b116101ea578063de02e50311610114578063f6efbb59116100a9578063fabc1cbc11610079578063fabc1cbc14610a13578063fbf1e2c114610a26578063fce36c7d14610a39578063ff9f6cce14610a4c575f5ffd5b8063f6efbb59146109c7578063f74e8eac146109da578063f8cd8448146109ed578063f96abf2e14610a00575f5ffd5b8063ed71e6a2116100e4578063ed71e6a214610947578063f22cef8514610974578063f2f07ab414610987578063f2fde38b146109b4575f5ffd5b8063de02e503146108e7578063e063f81f146108fa578063e810ce211461090d578063ea4d3c9b14610920575f5ffd5b8063a50a1d9c1161018a578063bf21a8aa1161015a578063bf21a8aa14610859578063c46db60614610880578063ca8aa7c7146108ad578063dcbb03b3146108d4575f5ffd5b8063a50a1d9c146107e7578063aebd8bae146107fa578063b3dbb0e014610827578063bb7e451f1461083a575f5ffd5b80639cb9a5fa116101c55780639cb9a5fa146107875780639d45c2811461079a5780639de4b35f146107c1578063a0169ddd146107d4575f5ffd5b80638da5cb5b146107535780639104c319146107645780639be3d4e41461077f575f5ffd5b80634596021c116102d65780635e9d83481161026b5780637b8f8b051161023b5780637b8f8b05146106e7578063863cb9a9146106ef578063865c695314610702578063886f11951461072c575f5ffd5b80635e9d83481461068a57806363f6a7981461069d5780636d21117e146106b2578063715018a6146106df575f5ffd5b806358baaa3e116102a657806358baaa3e14610644578063595c6a67146106575780635ac86ab71461065f5780635c975abb14610682575f5ffd5b80634596021c146105cd5780634657e26a146105e05780634b943960146106075780634d18cc351461062d575f5ffd5b8063149bc8721161034c57806339b70e381161031c57806339b70e38146105695780633a8c0786146105905780633ccc861d146105a75780633efe1db6146105ba575f5ffd5b8063149bc872146104ce5780632b9f64a4146104ef57806336af41fa1461052f57806337838ed014610542575f5ffd5b80630e9a53cf116103875780630e9a53cf146104345780630eb3834514610481578063131433b414610494578063136439dd146104bb575f5ffd5b806218572c146103ac57806304a0c502146103e35780630ca298991461041f575b5f5ffd5b6103ce6103ba366004613adf565b60d16020525f908152604090205460ff1681565b60405190151581526020015b60405180910390f35b61040a7f000000000000000000000000000000000000000000000000000000000000000081565b60405163ffffffff90911681526020016103da565b61043261042d366004613b57565b610a5f565b005b61043c610d24565b6040516103da91905f6080820190508251825263ffffffff602084015116602083015263ffffffff604084015116604083015260608301511515606083015292915050565b61043261048f366004613bb3565b610e24565b61040a7f000000000000000000000000000000000000000000000000000000000000000081565b6104326104c9366004613bea565b610ea4565b6104e16104dc366004613c01565b610f79565b6040519081526020016103da565b6105176104fd366004613adf565b60cc6020525f90815260409020546001600160a01b031681565b6040516001600160a01b0390911681526020016103da565b61043261053d366004613c1b565b610fee565b61040a7f000000000000000000000000000000000000000000000000000000000000000081565b6105177f000000000000000000000000000000000000000000000000000000000000000081565b60cb5461040a90600160a01b900463ffffffff1681565b6104326105b5366004613c6a565b61117d565b6104326105c8366004613cc0565b6111c2565b6104326105db366004613cea565b6113b6565b6105177f000000000000000000000000000000000000000000000000000000000000000081565b61061a610615366004613adf565b611437565b60405161ffff90911681526020016103da565b60cb5461040a90600160c01b900463ffffffff1681565b610432610652366004613d3c565b611492565b6104326114a6565b6103ce61066d366004613d55565b606654600160ff9092169190911b9081161490565b6066546104e1565b6103ce610698366004613d75565b611555565b60cb5461061a90600160e01b900461ffff1681565b6103ce6106c0366004613da6565b60cf60209081525f928352604080842090915290825290205460ff1681565b6104326115e0565b60ca546104e1565b6104326106fd366004613adf565b6115f1565b6104e1610710366004613dd0565b60cd60209081525f928352604080842090915290825290205481565b6105177f000000000000000000000000000000000000000000000000000000000000000081565b6033546001600160a01b0316610517565b61051773beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac081565b61043c611602565b610432610795366004613dfc565b61169e565b61040a7f000000000000000000000000000000000000000000000000000000000000000081565b61061a6107cf366004613e33565b611837565b6104326107e2366004613adf565b6118ba565b6104326107f5366004613e6f565b6118c5565b6103ce610808366004613da6565b60d260209081525f928352604080842090915290825290205460ff1681565b610432610835366004613e88565b6118d6565b6104e1610848366004613adf565b60ce6020525f908152604090205481565b61040a7f000000000000000000000000000000000000000000000000000000000000000081565b6103ce61088e366004613da6565b60d060209081525f928352604080842090915290825290205460ff1681565b6105177f000000000000000000000000000000000000000000000000000000000000000081565b6104326108e2366004613eb2565b611a1f565b61043c6108f5366004613bea565b611b8a565b61061a610908366004613dd0565b611c1a565b61040a61091b366004613bea565b611c7f565b6105177f000000000000000000000000000000000000000000000000000000000000000081565b6103ce610955366004613da6565b60d360209081525f928352604080842090915290825290205460ff1681565b610432610982366004613dd0565b611d00565b6103ce610995366004613da6565b60d760209081525f928352604080842090915290825290205460ff1681565b6104326109c2366004613adf565b611e6a565b6104326109d5366004613ef6565b611ee5565b6104326109e8366004613f54565b61201a565b6104e16109fb366004613c01565b612200565b610432610a0e366004613d3c565b612210565b610432610a21366004613bea565b61235f565b60cb54610517906001600160a01b031681565b610432610a47366004613c1b565b612475565b610432610a5a366004613c1b565b6125c4565b60665460099061020090811603610a895760405163840a48d560e01b815260040160405180910390fd5b610a966020850185613adf565b610a9f81612743565b610abc5760405163932d94f760e01b815260040160405180910390fd5b610ac46127ed565b6040516304c1b8eb60e31b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063260dc75890610b10908890600401613fbf565b602060405180830381865afa158015610b2b573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b4f9190613fcd565b610b6c57604051631fb1705560e21b815260040160405180910390fd5b5f5b83811015610d125736858583818110610b8957610b89613fe8565b9050602002810190610b9b9190613ffc565b90505f60ce81610bae60208b018b613adf565b6001600160a01b031681526020808201929092526040015f90812054925090610bd9908a018a613adf565b8284604051602001610bed93929190614224565b6040516020818303038152906040528051906020012090505f610c0f84612846565b9050600160d75f610c2360208e018e613adf565b6001600160a01b0316815260208082019290925260409081015f9081208682529092529020805460ff1916911515919091179055610c62836001614267565b60ce5f610c7260208e018e613adf565b6001600160a01b03166001600160a01b031681526020019081526020015f208190555081336001600160a01b03167ffff0759ccb371dfb5691798724e70b4fa61cb3bfe730a33ac19fb86a48efc7568c8688604051610cd39392919061427a565b60405180910390a3610d02333083610cf16040890160208a01613adf565b6001600160a01b0316929190612a31565b505060019092019150610b6e9050565b50610d1d6001609755565b5050505050565b604080516080810182525f80825260208201819052918101829052606081019190915260ca545b8015610dfc575f60ca610d5f60018461429f565b81548110610d6f57610d6f613fe8565b5f91825260209182902060408051608081018252600293909302909101805483526001015463ffffffff80821694840194909452600160201b810490931690820152600160401b90910460ff161580156060830181905291925090610dde5750806040015163ffffffff164210155b15610de95792915050565b5080610df4816142b2565b915050610d4b565b5050604080516080810182525f80825260208201819052918101829052606081019190915290565b610e2c612a9c565b6001600160a01b0382165f81815260d1602052604080822054905160ff9091169284151592841515927f4de6293e668df1398422e1def12118052c1539a03cbfedc145895d48d7685f1c9190a4506001600160a01b03919091165f90815260d160205260409020805460ff1916911515919091179055565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa158015610f06573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f2a9190613fcd565b610f4757604051631d77d47760e21b815260040160405180910390fd5b6066548181168114610f6c5760405163c61dca5d60e01b815260040160405180910390fd5b610f7582612af6565b5050565b5f80610f886020840184613adf565b8360200135604051602001610fd19392919060f89390931b6001600160f81b031916835260609190911b6bffffffffffffffffffffffff19166001830152601582015260350190565b604051602081830303815290604052805190602001209050919050565b6066546001906002908116036110175760405163840a48d560e01b815260040160405180910390fd5b335f90815260d1602052604090205460ff1661104657604051635c427cd960e01b815260040160405180910390fd5b61104e6127ed565b5f5b8281101561116d573684848381811061106b5761106b613fe8565b905060200281019061107d91906142c7565b335f81815260ce602090815260408083205490519495509391926110a79290918591879101614359565b6040516020818303038152906040528051906020012090506110c883612b33565b335f90815260d0602090815260408083208484529091529020805460ff191660019081179091556110fa908390614267565b335f81815260ce602052604090819020929092559051829184917f51088b8c89628df3a8174002c2a034d0152fce6af8415d651b2a4734bf2704829061114190889061437f565b60405180910390a4611162333060408601803590610cf19060208901613adf565b505050600101611050565b506111786001609755565b505050565b6066546002906004908116036111a65760405163840a48d560e01b815260040160405180910390fd5b6111ae6127ed565b6111b88383612c1e565b6111786001609755565b6066546003906008908116036111eb5760405163840a48d560e01b815260040160405180910390fd5b60cb546001600160a01b0316331461121657604051635c427cd960e01b815260040160405180910390fd5b60cb5463ffffffff600160c01b90910481169083161161124957604051631ca7e50b60e21b815260040160405180910390fd5b428263ffffffff161061126f576040516306957c9160e11b815260040160405180910390fd5b60ca5460cb545f9061128e90600160a01b900463ffffffff1642614391565b6040805160808101825287815263ffffffff87811660208084018281528684168587018181525f6060880181815260ca8054600181018255925297517f42d72674974f694b5f5159593243114d38a5c39c89d6b62fee061ff523240ee160029092029182015592517f42d72674974f694b5f5159593243114d38a5c39c89d6b62fee061ff523240ee290930180549151975193871667ffffffffffffffff1990921691909117600160201b978716979097029690961760ff60401b1916600160401b921515929092029190911790945560cb805463ffffffff60c01b1916600160c01b840217905593519283529394508892908616917fecd866c3c158fa00bf34d803d5f6023000b57080bcb48af004c2b4b46b3afd08910160405180910390a45050505050565b6066546002906004908116036113df5760405163840a48d560e01b815260040160405180910390fd5b6113e76127ed565b5f5b838110156114265761141e85858381811061140657611406613fe8565b905060200281019061141891906143ad565b84612c1e565b6001016113e9565b506114316001609755565b50505050565b6001600160a01b0381165f90815260d5602090815260408083208151606081018352905461ffff80821683526201000082041693820193909352600160201b90920463ffffffff169082015261148c90612ea6565b92915050565b61149a612a9c565b6114a381612f16565b50565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa158015611508573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061152c9190613fcd565b61154957604051631d77d47760e21b815260040160405180910390fd5b6115535f19612af6565b565b5f6115d88260ca6115696020830183613d3c565b63ffffffff168154811061157f5761157f613fe8565b5f91825260209182902060408051608081018252600293909302909101805483526001015463ffffffff80821694840194909452600160201b810490931690820152600160401b90910460ff1615156060820152612f87565b506001919050565b6115e8612a9c565b6115535f61312a565b6115f9612a9c565b6114a38161317b565b604080516080810182525f80825260208201819052918101829052606081019190915260ca80546116359060019061429f565b8154811061164557611645613fe8565b5f91825260209182902060408051608081018252600293909302909101805483526001015463ffffffff80821694840194909452600160201b810490931690820152600160401b90910460ff1615156060820152919050565b6066546005906020908116036116c75760405163840a48d560e01b815260040160405180910390fd5b836116d181612743565b6116ee5760405163932d94f760e01b815260040160405180910390fd5b6116f66127ed565b5f5b83811015610d12573685858381811061171357611713613fe8565b90506020028101906117259190613ffc565b6001600160a01b0388165f90815260ce6020908152604080832054905193945092611756918b918591879101614224565b6040516020818303038152906040528051906020012090505f61177884612846565b6001600160a01b038b165f90815260d3602090815260408083208684529091529020805460ff191660019081179091559091506117b6908490614267565b6001600160a01b038b165f81815260ce60205260409081902092909255905183919033907ffc8888bffd711da60bc5092b33f677d81896fe80ecc677b84cfab8184462b6e0906118099088908a906143c1565b60405180910390a4611827333083610cf16040890160208a01613adf565b5050600190920191506116f89050565b6001600160a01b0382165f90815260d6602052604081206118b3908261186a611865368790038701876143d9565b6131d6565b815260208082019290925260409081015f208151606081018352905461ffff80821683526201000082041693820193909352600160201b90920463ffffffff1690820152612ea6565b9392505050565b33610f758183613239565b6118cd612a9c565b6114a38161329c565b6066546007906080908116036118ff5760405163840a48d560e01b815260040160405180910390fd5b8261190981612743565b6119265760405163932d94f760e01b815260040160405180910390fd5b60cb545f9061194290600160a01b900463ffffffff1642614391565b6001600160a01b0386165f90815260d5602090815260408083208151606081018352905461ffff80821683526201000082041693820193909352600160201b90920463ffffffff16908201529192509061199b90612ea6565b6001600160a01b0387165f90815260d5602052604090209091506119c0908684613307565b6040805163ffffffff8416815261ffff838116602083015287168183015290516001600160a01b0388169133917fd1e028bd664486a46ad26040e999cd2d22e1e9a094ee6afe19fcf64678f16f749181900360600190a3505050505050565b606654600690604090811603611a485760405163840a48d560e01b815260040160405180910390fd5b83611a5281612743565b611a6f5760405163932d94f760e01b815260040160405180910390fd5b60cb545f90611a8b90600160a01b900463ffffffff1642614391565b6001600160a01b038781165f90815260d460209081526040808320938a1683529281528282208351606081018552905461ffff80821683526201000082041692820192909252600160201b90910463ffffffff1692810192909252919250611af290612ea6565b6001600160a01b038089165f90815260d460209081526040808320938b16835292905220909150611b24908684613307565b6040805163ffffffff8416815261ffff838116602083015287168183015290516001600160a01b0388811692908a169133917f48e198b6ae357e529204ee53a8e514c470ff77d9cc8e4f7207f8b5d490ae6934919081900360600190a450505050505050565b604080516080810182525f80825260208201819052918101829052606081019190915260ca8281548110611bc057611bc0613fe8565b5f91825260209182902060408051608081018252600293909302909101805483526001015463ffffffff80821694840194909452600160201b810490931690820152600160401b90910460ff161515606082015292915050565b6001600160a01b038281165f90815260d46020908152604080832093851683529281528282208351606081018552905461ffff80821683526201000082041692820192909252600160201b90910463ffffffff1692810192909252906118b390612ea6565b60ca545f905b63ffffffff811615611ce6578260ca611c9f600184614441565b63ffffffff1681548110611cb557611cb5613fe8565b905f5260205f2090600202015f015403611cd4576118b3600182614441565b80611cde8161445d565b915050611c85565b5060405163504570e360e01b815260040160405180910390fd5b81611d0a81612743565b611d275760405163932d94f760e01b815260040160405180910390fd5b6040516336b87bd760e11b81526001600160a01b0384811660048301527f00000000000000000000000000000000000000000000000000000000000000001690636d70f7ae90602401602060405180830381865afa158015611d8b573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611daf9190613fcd565b80611e43575060405163ba1a84e560e01b81526001600160a01b0384811660048301525f917f00000000000000000000000000000000000000000000000000000000000000009091169063ba1a84e590602401602060405180830381865afa158015611e1d573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611e41919061447b565b115b611e605760405163fb494ea160e01b815260040160405180910390fd5b6111788383613239565b611e72612a9c565b6001600160a01b038116611edc5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084015b60405180910390fd5b6114a38161312a565b5f54610100900460ff1615808015611f0357505f54600160ff909116105b80611f1c5750303b158015611f1c57505f5460ff166001145b611f7f5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401611ed3565b5f805460ff191660011790558015611fa0575f805461ff0019166101001790555b611fa985612af6565b611fb28661312a565b611fbb8461317b565b611fc483612f16565b611fcd8261329c565b8015612012575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050505050565b606654600890610100908116036120445760405163840a48d560e01b815260040160405180910390fd5b8361204e81612743565b61206b5760405163932d94f760e01b815260040160405180910390fd5b6040516304c1b8eb60e31b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063260dc758906120b7908790600401613fbf565b602060405180830381865afa1580156120d2573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906120f69190613fcd565b61211357604051631fb1705560e21b815260040160405180910390fd5b60cb545f9061212f90600160a01b900463ffffffff1642614391565b6001600160a01b0387165f90815260d66020526040812091925090612161908261186a611865368b90038b018b6143d9565b6001600160a01b0388165f90815260d6602052604081209192506121a69190612192611865368b90038b018b6143d9565b81526020019081526020015f208684613307565b866001600160a01b0316336001600160a01b03167f14918b3834ab6752eb2e1b489b6663a67810efb5f56f3944a97ede8ecf1fd9f18885858a6040516121ef9493929190614492565b60405180910390a350505050505050565b5f6001610f886020840184613adf565b6066546003906008908116036122395760405163840a48d560e01b815260040160405180910390fd5b60cb546001600160a01b0316331461226457604051635c427cd960e01b815260040160405180910390fd5b60ca5463ffffffff83161061228c576040516394a8d38960e01b815260040160405180910390fd5b5f60ca8363ffffffff16815481106122a6576122a6613fe8565b905f5260205f20906002020190508060010160089054906101000a900460ff16156122e457604051631b14174b60e01b815260040160405180910390fd5b6001810154600160201b900463ffffffff16421061231557604051630c36f66560e21b815260040160405180910390fd5b60018101805460ff60401b1916600160401b17905560405163ffffffff8416907fd850e6e5dfa497b72661fa73df2923464eaed9dc2ff1d3cb82bccbfeabe5c41e905f90a2505050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156123bb573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906123df91906144c6565b6001600160a01b0316336001600160a01b0316146124105760405163794821ff60e01b815260040160405180910390fd5b606654801982198116146124375760405163c61dca5d60e01b815260040160405180910390fd5b606682905560405182815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c9060200160405180910390a25050565b6066545f9060019081160361249d5760405163840a48d560e01b815260040160405180910390fd5b6124a56127ed565b5f5b8281101561116d57368484838181106124c2576124c2613fe8565b90506020028101906124d491906142c7565b335f81815260ce602090815260408083205490519495509391926124fe9290918591879101614359565b60405160208183030381529060405280519060200120905061251f83612b33565b335f90815260cf602090815260408083208484529091529020805460ff19166001908117909155612551908390614267565b335f81815260ce602052604090819020929092559051829184917f450a367a380c4e339e5ae7340c8464ef27af7781ad9945cfe8abd828f89e62819061259890889061437f565b60405180910390a46125b9333060408601803590610cf19060208901613adf565b5050506001016124a7565b6066546004906010908116036125ed5760405163840a48d560e01b815260040160405180910390fd5b335f90815260d1602052604090205460ff1661261c57604051635c427cd960e01b815260040160405180910390fd5b6126246127ed565b5f5b8281101561116d573684848381811061264157612641613fe8565b905060200281019061265391906142c7565b335f81815260ce6020908152604080832054905194955093919261267d9290918591879101614359565b60405160208183030381529060405280519060200120905061269e83612b33565b335f90815260d2602090815260408083208484529091529020805460ff191660019081179091556126d0908390614267565b335f81815260ce602052604090819020929092559051829184917f5251b6fdefcb5d81144e735f69ea4c695fd43b0289ca53dc075033f5fc80068b9061271790889061437f565b60405180910390a4612738333060408601803590610cf19060208901613adf565b505050600101612626565b604051631beb2b9760e31b81526001600160a01b0382811660048301523360248301523060448301525f80356001600160e01b0319166064840152917f00000000000000000000000000000000000000000000000000000000000000009091169063df595cb8906084016020604051808303815f875af11580156127c9573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061148c9190613fcd565b60026097540361283f5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401611ed3565b6002609755565b5f61287961285483806144e1565b6128646080860160608701613d3c565b61287460a0870160808801613d3c565b6133d6565b5f61288760408401846144e1565b9050116128a75760405163796cc52560e01b815260040160405180910390fd5b426128b860a0840160808501613d3c565b6128c86080850160608601613d3c565b6128d29190614391565b63ffffffff16106128f65760405163150358a160e21b815260040160405180910390fd5b5f80805b61290760408601866144e1565b90508110156129f8573661291e60408701876144e1565b8381811061292e5761292e613fe8565b6040029190910191505f90506129476020830183613adf565b6001600160a01b03160361296e57604051630863a45360e11b815260040160405180910390fd5b61297b6020820182613adf565b6001600160a01b0316836001600160a01b0316106129ac576040516310fb47f160e31b815260040160405180910390fd5b5f8160200135116129d0576040516310eb483f60e21b815260040160405180910390fd5b6129dd6020820182613adf565b92506129ed602082013585614267565b9350506001016128fa565b506f4b3b4ca85a86c47a098a223fffffffff821115612a2a5760405163070b5a6f60e21b815260040160405180910390fd5b5092915050565b6040516001600160a01b03808516602483015283166044820152606481018290526114319085906323b872dd60e01b906084015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b0319909316929092179091526136ae565b6033546001600160a01b031633146115535760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401611ed3565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a250565b612b60612b4082806144e1565b612b506080850160608601613d3c565b61287460a0860160808701613d3c565b5f816040013511612b84576040516310eb483f60e21b815260040160405180910390fd5b6f4b3b4ca85a86c47a098a223fffffffff81604001351115612bb95760405163070b5a6f60e21b815260040160405180910390fd5b612be963ffffffff7f00000000000000000000000000000000000000000000000000000000000000001642614267565b612bf96080830160608401613d3c565b63ffffffff1611156114a357604051637ee2b44360e01b815260040160405180910390fd5b5f60ca612c2e6020850185613d3c565b63ffffffff1681548110612c4457612c44613fe8565b5f91825260209182902060408051608081018252600293909302909101805483526001015463ffffffff80821694840194909452600160201b810490931690820152600160401b90910460ff16151560608201529050612ca48382612f87565b5f612cb56080850160608601613adf565b6001600160a01b038082165f90815260cc60205260409020549192501680612cda5750805b336001600160a01b03821614612d0357604051635c427cd960e01b815260040160405180910390fd5b5f5b612d1260a0870187614526565b90508110156120125736612d2960e08801886144e1565b83818110612d3957612d39613fe8565b6001600160a01b0387165f90815260cd602090815260408083209302949094019450929091508290612d6d90850185613adf565b6001600160a01b03166001600160a01b031681526020019081526020015f2054905080826020013511612db35760405163aa385e8160e01b815260040160405180910390fd5b5f612dc282602085013561429f565b6001600160a01b0387165f90815260cd60209081526040822092935085018035929190612def9087613adf565b6001600160a01b031681526020808201929092526040015f2091909155612e309089908390612e2090870187613adf565b6001600160a01b03169190613781565b86516001600160a01b03808a1691878216918916907f9543dbd55580842586a951f0386e24d68a5df99ae29e3b216588b45fd684ce3190612e746020890189613adf565b604080519283526001600160a01b039091166020830152810186905260600160405180910390a4505050600101612d05565b5f816040015163ffffffff165f1480612ed85750815161ffff908116148015612ed85750816040015163ffffffff1642105b15612ef057505060cb54600160e01b900461ffff1690565b816040015163ffffffff16421015612f0957815161148c565b506020015190565b919050565b60cb546040805163ffffffff600160a01b9093048316815291831660208301527faf557c6c02c208794817a705609cfa935f827312a1adfdd26494b6b95dd2b4b3910160405180910390a160cb805463ffffffff909216600160a01b0263ffffffff60a01b19909216919091179055565b806060015115612faa57604051631b14174b60e01b815260040160405180910390fd5b806040015163ffffffff16421015612fd557604051631437a2bb60e31b815260040160405180910390fd5b612fe260c0830183614526565b9050612ff160a0840184614526565b905014613011576040516343714afd60e01b815260040160405180910390fd5b61301e60e08301836144e1565b905061302d60c0840184614526565b90501461304d576040516343714afd60e01b815260040160405180910390fd5b8051613079906130636040850160208601613d3c565b613070604086018661456b565b866060016137b1565b5f5b61308860a0840184614526565b90508110156111785761312260808401356130a660a0860186614526565b848181106130b6576130b6613fe8565b90506020020160208101906130cb9190613d3c565b6130d860c0870187614526565b858181106130e8576130e8613fe8565b90506020028101906130fa919061456b565b61310760e08901896144e1565b8781811061311757613117613fe8565b905060400201613855565b60010161307b565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b60cb546040516001600160a01b038084169216907f237b82f438d75fc568ebab484b75b01d9287b9e98b490b7c23221623b6705dbb905f90a360cb80546001600160a01b0319166001600160a01b0392909216919091179055565b5f815f0151826020015163ffffffff1660405160200161322192919060609290921b6bffffffffffffffffffffffff1916825260a01b6001600160a01b031916601482015260200190565b60405160208183030381529060405261148c906145ad565b6001600160a01b038083165f81815260cc602052604080822080548686166001600160a01b0319821681179092559151919094169392849290917fbab947934d42e0ad206f25c9cab18b5bb6ae144acfb00f40b4e3aa59590ca3129190a4505050565b60cb546040805161ffff600160e01b9093048316815291831660208301527fe6cd4edfdcc1f6d130ab35f73d72378f3a642944fb4ee5bd84b7807a81ea1c4e910160405180910390a160cb805461ffff909216600160e01b0261ffff60e01b19909216919091179055565b61271061ffff8316111561332e5760405163891c63df60e01b815260040160405180910390fd5b8254600160201b900463ffffffff16421161335c57604051637b1e25c560e01b815260040160405180910390fd5b8254600160201b900463ffffffff165f0361338357825461ffff191661ffff17835561339a565b825462010000810461ffff1661ffff199091161783555b825463ffffffff909116600160201b0267ffffffff000000001961ffff90931662010000029290921667ffffffffffff00001990911617179055565b826133f45760405163796cc52560e01b815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000063ffffffff168163ffffffff16111561344157604051630dd0b9f560e21b815260040160405180910390fd5b61346b7f0000000000000000000000000000000000000000000000000000000000000000826145e4565b63ffffffff161561348f5760405163ee66470560e01b815260040160405180910390fd5b6134b97f0000000000000000000000000000000000000000000000000000000000000000836145e4565b63ffffffff16156134dd57604051633c1a94f160e21b815260040160405180910390fd5b8163ffffffff167f000000000000000000000000000000000000000000000000000000000000000063ffffffff1642613516919061429f565b1115801561355057508163ffffffff167f000000000000000000000000000000000000000000000000000000000000000063ffffffff1611155b61356d5760405163041aa75760e11b815260040160405180910390fd5b5f805b84811015612012575f86868381811061358b5761358b613fe8565b6135a19260206040909202019081019150613adf565b60405163198f077960e21b81526001600160a01b0380831660048301529192507f00000000000000000000000000000000000000000000000000000000000000009091169063663c1de490602401602060405180830381865afa15801561360a573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061362e9190613fcd565b8061365557506001600160a01b03811673beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac0145b61367257604051632efd965160e11b815260040160405180910390fd5b806001600160a01b0316836001600160a01b0316106136a45760405163dfad9ca160e01b815260040160405180910390fd5b9150600101613570565b5f613702826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166138939092919063ffffffff16565b905080515f14806137225750808060200190518101906137229190613fcd565b6111785760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401611ed3565b6040516001600160a01b03831660248201526044810182905261117890849063a9059cbb60e01b90606401612a65565b6137bc60208361460b565b6001901b8463ffffffff16106137e45760405162c6c39d60e71b815260040160405180910390fd5b5f6137ee82610f79565b905061383884848080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152508a92508591505063ffffffff89166138a9565b612012576040516369ca16c960e01b815260040160405180910390fd5b61386060208361460b565b6001901b8463ffffffff16106138895760405163054ff4df60e51b815260040160405180910390fd5b5f6137ee82612200565b60606138a184845f856138c0565b949350505050565b5f836138b6868585613997565b1495945050505050565b6060824710156139215760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401611ed3565b5f5f866001600160a01b0316858760405161393c919061461e565b5f6040518083038185875af1925050503d805f8114613976576040519150601f19603f3d011682016040523d82523d5f602084013e61397b565b606091505b509150915061398c87838387613a2e565b979650505050505050565b5f602084516139a69190614634565b156139c4576040516313717da960e21b815260040160405180910390fd5b8260205b85518111613a25576139db600285614634565b5f036139fc57815f528086015160205260405f209150600284049350613a13565b808601515f528160205260405f2091506002840493505b613a1e602082614267565b90506139c8565b50949350505050565b60608315613a9c5782515f03613a95576001600160a01b0385163b613a955760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401611ed3565b50816138a1565b6138a18383815115613ab15781518083602001fd5b8060405162461bcd60e51b8152600401611ed39190614647565b6001600160a01b03811681146114a3575f5ffd5b5f60208284031215613aef575f5ffd5b81356118b381613acb565b5f60408284031215613b0a575f5ffd5b50919050565b5f5f83601f840112613b20575f5ffd5b5081356001600160401b03811115613b36575f5ffd5b6020830191508360208260051b8501011115613b50575f5ffd5b9250929050565b5f5f5f60608486031215613b69575f5ffd5b613b738585613afa565b925060408401356001600160401b03811115613b8d575f5ffd5b613b9986828701613b10565b9497909650939450505050565b80151581146114a3575f5ffd5b5f5f60408385031215613bc4575f5ffd5b8235613bcf81613acb565b91506020830135613bdf81613ba6565b809150509250929050565b5f60208284031215613bfa575f5ffd5b5035919050565b5f60408284031215613c11575f5ffd5b6118b38383613afa565b5f5f60208385031215613c2c575f5ffd5b82356001600160401b03811115613c41575f5ffd5b613c4d85828601613b10565b90969095509350505050565b5f6101008284031215613b0a575f5ffd5b5f5f60408385031215613c7b575f5ffd5b82356001600160401b03811115613c90575f5ffd5b613c9c85828601613c59565b9250506020830135613bdf81613acb565b803563ffffffff81168114612f11575f5ffd5b5f5f60408385031215613cd1575f5ffd5b82359150613ce160208401613cad565b90509250929050565b5f5f5f60408486031215613cfc575f5ffd5b83356001600160401b03811115613d11575f5ffd5b613d1d86828701613b10565b9094509250506020840135613d3181613acb565b809150509250925092565b5f60208284031215613d4c575f5ffd5b6118b382613cad565b5f60208284031215613d65575f5ffd5b813560ff811681146118b3575f5ffd5b5f60208284031215613d85575f5ffd5b81356001600160401b03811115613d9a575f5ffd5b6138a184828501613c59565b5f5f60408385031215613db7575f5ffd5b8235613dc281613acb565b946020939093013593505050565b5f5f60408385031215613de1575f5ffd5b8235613dec81613acb565b91506020830135613bdf81613acb565b5f5f5f60408486031215613e0e575f5ffd5b8335613e1981613acb565b925060208401356001600160401b03811115613b8d575f5ffd5b5f5f60608385031215613e44575f5ffd5b8235613e4f81613acb565b9150613ce18460208501613afa565b803561ffff81168114612f11575f5ffd5b5f60208284031215613e7f575f5ffd5b6118b382613e5e565b5f5f60408385031215613e99575f5ffd5b8235613ea481613acb565b9150613ce160208401613e5e565b5f5f5f60608486031215613ec4575f5ffd5b8335613ecf81613acb565b92506020840135613edf81613acb565b9150613eed60408501613e5e565b90509250925092565b5f5f5f5f5f60a08688031215613f0a575f5ffd5b8535613f1581613acb565b9450602086013593506040860135613f2c81613acb565b9250613f3a60608701613cad565b9150613f4860808701613e5e565b90509295509295909350565b5f5f5f60808486031215613f66575f5ffd5b8335613f7181613acb565b9250613f808560208601613afa565b9150613eed60608501613e5e565b8035613f9981613acb565b6001600160a01b0316825263ffffffff613fb560208301613cad565b1660208301525050565b6040810161148c8284613f8e565b5f60208284031215613fdd575f5ffd5b81516118b381613ba6565b634e487b7160e01b5f52603260045260245ffd5b5f823560be19833603018112614010575f5ffd5b9190910192915050565b5f5f8335601e1984360301811261402f575f5ffd5b83016020810192503590506001600160401b0381111561404d575f5ffd5b8060061b3603821315613b50575f5ffd5b8183526020830192505f815f5b848110156140c157813561407e81613acb565b6001600160a01b0316865260208201356bffffffffffffffffffffffff81168082146140a8575f5ffd5b602088015250604095860195919091019060010161406b565b5093949350505050565b5f5f8335601e198436030181126140e0575f5ffd5b83016020810192503590506001600160401b038111156140fe575f5ffd5b803603821315613b50575f5ffd5b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b5f61413f828361401a565b60c0855261415160c08601828461405e565b915050602083013561416281613acb565b6001600160a01b0316602085015261417d604084018461401a565b858303604087015280835290915f91906020015b818310156141cc5783356141a481613acb565b6001600160a01b03168152602084810135908201526040938401936001939093019201614191565b6141d860608701613cad565b63ffffffff8116606089015293506141f260808701613cad565b63ffffffff81166080890152935061420d60a08701876140cb565b9450925086810360a088015261398c81858561410c565b60018060a01b0384168152826020820152606060408201525f61424a6060830184614134565b95945050505050565b634e487b7160e01b5f52601160045260245ffd5b8082018082111561148c5761148c614253565b6142848185613f8e565b826040820152608060608201525f61424a6080830184614134565b8181038181111561148c5761148c614253565b5f816142c0576142c0614253565b505f190190565b5f8235609e19833603018112614010575f5ffd5b5f6142e6828361401a565b60a085526142f860a08601828461405e565b915050602083013561430981613acb565b6001600160a01b031660208501526040838101359085015263ffffffff61433260608501613cad565b16606085015263ffffffff61434960808501613cad565b1660808501528091505092915050565b60018060a01b0384168152826020820152606060408201525f61424a60608301846142db565b602081525f6118b360208301846142db565b63ffffffff818116838216019081111561148c5761148c614253565b5f823560fe19833603018112614010575f5ffd5b828152604060208201525f6138a16040830184614134565b5f60408284031280156143ea575f5ffd5b50604080519081016001600160401b038111828210171561441957634e487b7160e01b5f52604160045260245ffd5b604052823561442781613acb565b815261443560208401613cad565b60208201529392505050565b63ffffffff828116828216039081111561148c5761148c614253565b5f63ffffffff82168061447257614472614253565b5f190192915050565b5f6020828403121561448b575f5ffd5b5051919050565b60a081016144a08287613f8e565b63ffffffff94909416604082015261ffff92831660608201529116608090910152919050565b5f602082840312156144d6575f5ffd5b81516118b381613acb565b5f5f8335601e198436030181126144f6575f5ffd5b8301803591506001600160401b0382111561450f575f5ffd5b6020019150600681901b3603821315613b50575f5ffd5b5f5f8335601e1984360301811261453b575f5ffd5b8301803591506001600160401b03821115614554575f5ffd5b6020019150600581901b3603821315613b50575f5ffd5b5f5f8335601e19843603018112614580575f5ffd5b8301803591506001600160401b03821115614599575f5ffd5b602001915036819003821315613b50575f5ffd5b80516020808301519190811015613b0a575f1960209190910360031b1b16919050565b634e487b7160e01b5f52601260045260245ffd5b5f63ffffffff8316806145f9576145f96145d0565b8063ffffffff84160691505092915050565b5f82614619576146196145d0565b500490565b5f82518060208501845e5f920191825250919050565b5f82614642576146426145d0565b500690565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f8301168401019150509291505056fea26469706673582212207c67616836c6a7c795552d9e8dfc776d40881dc1498dda9812cc4c094c4ad5f464736f6c634300081b0033", +======= + ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"_delegationManager\",\"type\":\"address\",\"internalType\":\"contractIDelegationManager\"},{\"name\":\"_strategyManager\",\"type\":\"address\",\"internalType\":\"contractIStrategyManager\"},{\"name\":\"_allocationManager\",\"type\":\"address\",\"internalType\":\"contractIAllocationManager\"},{\"name\":\"_pauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"},{\"name\":\"_permissionController\",\"type\":\"address\",\"internalType\":\"contractIPermissionController\"},{\"name\":\"_CALCULATION_INTERVAL_SECONDS\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"_MAX_REWARDS_DURATION\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"_MAX_RETROACTIVE_LENGTH\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"_MAX_FUTURE_LENGTH\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"_GENESIS_REWARDS_TIMESTAMP\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"CALCULATION_INTERVAL_SECONDS\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"GENESIS_REWARDS_TIMESTAMP\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAX_FUTURE_LENGTH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAX_RETROACTIVE_LENGTH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAX_REWARDS_DURATION\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activationDelay\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"allocationManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIAllocationManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"beaconChainETHStrategy\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"calculateEarnerLeafHash\",\"inputs\":[{\"name\":\"leaf\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinatorTypes.EarnerTreeMerkleLeaf\",\"components\":[{\"name\":\"earner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"earnerTokenRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"calculateTokenLeafHash\",\"inputs\":[{\"name\":\"leaf\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinatorTypes.TokenTreeMerkleLeaf\",\"components\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"cumulativeEarnings\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"checkClaim\",\"inputs\":[{\"name\":\"claim\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinatorTypes.RewardsMerkleClaim\",\"components\":[{\"name\":\"rootIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"earnerIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"earnerTreeProof\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"earnerLeaf\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinatorTypes.EarnerTreeMerkleLeaf\",\"components\":[{\"name\":\"earner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"earnerTokenRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"tokenIndices\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"},{\"name\":\"tokenTreeProofs\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"},{\"name\":\"tokenLeaves\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.TokenTreeMerkleLeaf[]\",\"components\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"cumulativeEarnings\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"claimerFor\",\"inputs\":[{\"name\":\"earner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"claimer\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"createAVSRewardsSubmission\",\"inputs\":[{\"name\":\"rewardsSubmissions\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.RewardsSubmission[]\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.StrategyAndMultiplier[]\",\"components\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"multiplier\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"duration\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"createOperatorDirectedAVSRewardsSubmission\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorDirectedRewardsSubmissions\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.OperatorDirectedRewardsSubmission[]\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.StrategyAndMultiplier[]\",\"components\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"multiplier\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"operatorRewards\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.OperatorReward[]\",\"components\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"startTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"duration\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"description\",\"type\":\"string\",\"internalType\":\"string\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"createRewardsForAllEarners\",\"inputs\":[{\"name\":\"rewardsSubmissions\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.RewardsSubmission[]\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.StrategyAndMultiplier[]\",\"components\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"multiplier\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"duration\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"createRewardsForAllSubmission\",\"inputs\":[{\"name\":\"rewardsSubmissions\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.RewardsSubmission[]\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.StrategyAndMultiplier[]\",\"components\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"multiplier\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"duration\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"cumulativeClaimed\",\"inputs\":[{\"name\":\"earner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"outputs\":[{\"name\":\"totalClaimed\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"currRewardsCalculationEndTimestamp\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"defaultOperatorSplitBips\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"delegationManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIDelegationManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"disableRoot\",\"inputs\":[{\"name\":\"rootIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"getCurrentClaimableDistributionRoot\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinatorTypes.DistributionRoot\",\"components\":[{\"name\":\"root\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"rewardsCalculationEndTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"activatedAt\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"disabled\",\"type\":\"bool\",\"internalType\":\"bool\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getCurrentDistributionRoot\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinatorTypes.DistributionRoot\",\"components\":[{\"name\":\"root\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"rewardsCalculationEndTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"activatedAt\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"disabled\",\"type\":\"bool\",\"internalType\":\"bool\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getDistributionRootAtIndex\",\"inputs\":[{\"name\":\"index\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinatorTypes.DistributionRoot\",\"components\":[{\"name\":\"root\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"rewardsCalculationEndTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"activatedAt\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"disabled\",\"type\":\"bool\",\"internalType\":\"bool\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getDistributionRootsLength\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getOperatorAVSSplit\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getOperatorPISplit\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getRootIndexFromHash\",\"inputs\":[{\"name\":\"rootHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"initialOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"initialPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_rewardsUpdater\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_activationDelay\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"_defaultSplitBips\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"isAVSRewardsSubmissionHash\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"hash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"valid\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isOperatorDirectedAVSRewardsSubmissionHash\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isRewardsForAllSubmitter\",\"inputs\":[{\"name\":\"submitter\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"valid\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isRewardsSubmissionForAllEarnersHash\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"hash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"valid\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isRewardsSubmissionForAllHash\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"hash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"valid\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"pauseAll\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[{\"name\":\"index\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pauserRegistry\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"permissionController\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIPermissionController\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"processClaim\",\"inputs\":[{\"name\":\"claim\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinatorTypes.RewardsMerkleClaim\",\"components\":[{\"name\":\"rootIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"earnerIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"earnerTreeProof\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"earnerLeaf\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinatorTypes.EarnerTreeMerkleLeaf\",\"components\":[{\"name\":\"earner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"earnerTokenRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"tokenIndices\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"},{\"name\":\"tokenTreeProofs\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"},{\"name\":\"tokenLeaves\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.TokenTreeMerkleLeaf[]\",\"components\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"cumulativeEarnings\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}]},{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"processClaims\",\"inputs\":[{\"name\":\"claims\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.RewardsMerkleClaim[]\",\"components\":[{\"name\":\"rootIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"earnerIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"earnerTreeProof\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"earnerLeaf\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinatorTypes.EarnerTreeMerkleLeaf\",\"components\":[{\"name\":\"earner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"earnerTokenRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"tokenIndices\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"},{\"name\":\"tokenTreeProofs\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"},{\"name\":\"tokenLeaves\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.TokenTreeMerkleLeaf[]\",\"components\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"cumulativeEarnings\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}]},{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"rewardsUpdater\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"setActivationDelay\",\"inputs\":[{\"name\":\"_activationDelay\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setClaimerFor\",\"inputs\":[{\"name\":\"claimer\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setClaimerFor\",\"inputs\":[{\"name\":\"earner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"claimer\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setDefaultOperatorSplit\",\"inputs\":[{\"name\":\"split\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setOperatorAVSSplit\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"split\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setOperatorPISplit\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"split\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setRewardsForAllSubmitter\",\"inputs\":[{\"name\":\"_submitter\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_newValue\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setRewardsUpdater\",\"inputs\":[{\"name\":\"_rewardsUpdater\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"strategyManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategyManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"submissionNonce\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"nonce\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"submitRoot\",\"inputs\":[{\"name\":\"root\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"rewardsCalculationEndTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"AVSRewardsSubmissionCreated\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"submissionNonce\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"rewardsSubmissionHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"rewardsSubmission\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIRewardsCoordinatorTypes.RewardsSubmission\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.StrategyAndMultiplier[]\",\"components\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"multiplier\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"duration\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ActivationDelaySet\",\"inputs\":[{\"name\":\"oldActivationDelay\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"},{\"name\":\"newActivationDelay\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ClaimerForSet\",\"inputs\":[{\"name\":\"earner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"oldClaimer\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"claimer\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DefaultOperatorSplitBipsSet\",\"inputs\":[{\"name\":\"oldDefaultOperatorSplitBips\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"},{\"name\":\"newDefaultOperatorSplitBips\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DistributionRootDisabled\",\"inputs\":[{\"name\":\"rootIndex\",\"type\":\"uint32\",\"indexed\":true,\"internalType\":\"uint32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DistributionRootSubmitted\",\"inputs\":[{\"name\":\"rootIndex\",\"type\":\"uint32\",\"indexed\":true,\"internalType\":\"uint32\"},{\"name\":\"root\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"rewardsCalculationEndTimestamp\",\"type\":\"uint32\",\"indexed\":true,\"internalType\":\"uint32\"},{\"name\":\"activatedAt\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorAVSSplitBipsSet\",\"inputs\":[{\"name\":\"caller\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"avs\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"activatedAt\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"},{\"name\":\"oldOperatorAVSSplitBips\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"},{\"name\":\"newOperatorAVSSplitBips\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorDirectedAVSRewardsSubmissionCreated\",\"inputs\":[{\"name\":\"caller\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"avs\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"operatorDirectedRewardsSubmissionHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"submissionNonce\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"operatorDirectedRewardsSubmission\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIRewardsCoordinatorTypes.OperatorDirectedRewardsSubmission\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.StrategyAndMultiplier[]\",\"components\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"multiplier\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"operatorRewards\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.OperatorReward[]\",\"components\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"startTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"duration\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"description\",\"type\":\"string\",\"internalType\":\"string\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorPISplitBipsSet\",\"inputs\":[{\"name\":\"caller\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"activatedAt\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"},{\"name\":\"oldOperatorPISplitBips\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"},{\"name\":\"newOperatorPISplitBips\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RewardsClaimed\",\"inputs\":[{\"name\":\"root\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"},{\"name\":\"earner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"claimer\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"recipient\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"token\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIERC20\"},{\"name\":\"claimedAmount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RewardsForAllSubmitterSet\",\"inputs\":[{\"name\":\"rewardsForAllSubmitter\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"oldValue\",\"type\":\"bool\",\"indexed\":true,\"internalType\":\"bool\"},{\"name\":\"newValue\",\"type\":\"bool\",\"indexed\":true,\"internalType\":\"bool\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RewardsSubmissionForAllCreated\",\"inputs\":[{\"name\":\"submitter\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"submissionNonce\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"rewardsSubmissionHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"rewardsSubmission\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIRewardsCoordinatorTypes.RewardsSubmission\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.StrategyAndMultiplier[]\",\"components\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"multiplier\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"duration\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RewardsSubmissionForAllEarnersCreated\",\"inputs\":[{\"name\":\"tokenHopper\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"submissionNonce\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"rewardsSubmissionHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"rewardsSubmission\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIRewardsCoordinatorTypes.RewardsSubmission\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.StrategyAndMultiplier[]\",\"components\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"multiplier\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"duration\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RewardsUpdaterSet\",\"inputs\":[{\"name\":\"oldRewardsUpdater\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newRewardsUpdater\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"AmountExceedsMax\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"AmountIsZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"CurrentlyPaused\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"DurationExceedsMax\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"EarningsNotGreaterThanClaimed\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InputAddressZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InputArrayLengthMismatch\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InputArrayLengthZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidAddressZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidCalculationIntervalSecondsRemainder\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidClaimProof\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidDurationRemainder\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidEarner\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidEarnerLeafIndex\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidGenesisRewardsTimestampRemainder\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidNewPausedStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidPermissions\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidProofLength\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidRoot\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidRootIndex\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidStartTimestampRemainder\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidTokenLeafIndex\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NewRootMustBeForNewCalculatedPeriod\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyPauser\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyUnpauser\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OperatorsNotInAscendingOrder\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"PreviousSplitPending\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RewardsEndTimestampNotElapsed\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RootAlreadyActivated\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RootDisabled\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RootNotActivated\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SplitExceedsMax\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StartTimestampTooFarInFuture\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StartTimestampTooFarInPast\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StrategiesNotInAscendingOrder\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StrategyNotWhitelisted\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SubmissionNotRetroactive\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"UnauthorizedCaller\",\"inputs\":[]}]", + Bin: "0x6101c0604052348015610010575f5ffd5b506040516142d63803806142d683398101604081905261002f91610211565b858a8a8a88888888888f6001600160a01b038116610060576040516339b190bb60e11b815260040160405180910390fd5b6001600160a01b031660805261007685826102d3565b63ffffffff161561009a57604051630e06bd3160e01b815260040160405180910390fd5b6100a762015180866102d3565b63ffffffff16156100cb5760405163223c7b3960e11b815260040160405180910390fd5b6001600160a01b0397881660a05295871660c05293861660e05263ffffffff9283166101005290821661012052811661014052908116610160521661018052166101a052610117610126565b50505050505050505050610306565b5f54610100900460ff16156101915760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff908116146101e0575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b03811681146101f6575f5ffd5b50565b805163ffffffff8116811461020c575f5ffd5b919050565b5f5f5f5f5f5f5f5f5f5f6101408b8d03121561022b575f5ffd5b8a51610236816101e2565b60208c0151909a50610247816101e2565b60408c0151909950610258816101e2565b60608c0151909850610269816101e2565b60808c015190975061027a816101e2565b955061028860a08c016101f9565b945061029660c08c016101f9565b93506102a460e08c016101f9565b92506102b36101008c016101f9565b91506102c26101208c016101f9565b90509295989b9194979a5092959850565b5f63ffffffff8316806102f457634e487b7160e01b5f52601260045260245ffd5b8063ffffffff84160691505092915050565b60805160a05160c05160e05161010051610120516101405161016051610180516101a051613f066103d05f395f81816105a601526129ee01525f818161045a0152612f2f01525f81816103bc015261233201525f81816105080152612eed01525f818161080c0152612dfd01525f818161076001528181612e4d0152612e9b01525f81816108600152611a2601525f818161052f0152612fca01525f81816108d3015261199601525f81816106f201528181610b62015281816111750152611dcb0152613f065ff3fe608060405234801561000f575f5ffd5b506004361061037c575f3560e01c8063886f1195116101d4578063dcbb03b311610109578063f2fde38b116100a9578063fabc1cbc11610079578063fabc1cbc14610981578063fbf1e2c114610994578063fce36c7d146109a7578063ff9f6cce146109ba575f5ffd5b8063f2fde38b14610935578063f6efbb5914610948578063f8cd84481461095b578063f96abf2e1461096e575f5ffd5b8063e810ce21116100e4578063e810ce21146108bb578063ea4d3c9b146108ce578063ed71e6a2146108f5578063f22cef8514610922575f5ffd5b8063dcbb03b314610882578063de02e50314610895578063e063f81f146108a8575f5ffd5b8063a50a1d9c11610174578063bb7e451f1161014f578063bb7e451f146107e8578063bf21a8aa14610807578063c46db6061461082e578063ca8aa7c71461085b575f5ffd5b8063a50a1d9c14610795578063aebd8bae146107a8578063b3dbb0e0146107d5575f5ffd5b80639be3d4e4116101af5780639be3d4e4146107405780639cb9a5fa146107485780639d45c2811461075b578063a0169ddd14610782575f5ffd5b8063886f1195146106ed5780638da5cb5b146107145780639104c31914610725575f5ffd5b80634596021c116102b55780635c975abb11610255578063715018a611610225578063715018a6146106a05780637b8f8b05146106a8578063863cb9a9146106b0578063865c6953146106c3575f5ffd5b80635c975abb146106435780635e9d83481461064b57806363f6a7981461065e5780636d21117e14610673575f5ffd5b80634d18cc35116102905780634d18cc35146105ee57806358baaa3e14610605578063595c6a67146106185780635ac86ab714610620575f5ffd5b80634596021c1461058e5780634657e26a146105a15780634b943960146105c8575f5ffd5b80632b9f64a41161032057806339b70e38116102fb57806339b70e381461052a5780633a8c0786146105515780633ccc861d146105685780633efe1db61461057b575f5ffd5b80632b9f64a4146104b057806336af41fa146104f057806337838ed014610503575f5ffd5b80630eb383451161035b5780630eb3834514610440578063131433b414610455578063136439dd1461047c578063149bc8721461048f575f5ffd5b806218572c1461038057806304a0c502146103b75780630e9a53cf146103f3575b5f5ffd5b6103a261038e3660046134e6565b60d16020525f908152604090205460ff1681565b60405190151581526020015b60405180910390f35b6103de7f000000000000000000000000000000000000000000000000000000000000000081565b60405163ffffffff90911681526020016103ae565b6103fb6109cd565b6040516103ae91905f6080820190508251825263ffffffff602084015116602083015263ffffffff604084015116604083015260608301511515606083015292915050565b61045361044e36600461350e565b610acd565b005b6103de7f000000000000000000000000000000000000000000000000000000000000000081565b61045361048a366004613545565b610b4d565b6104a261049d366004613572565b610c22565b6040519081526020016103ae565b6104d86104be3660046134e6565b60cc6020525f90815260409020546001600160a01b031681565b6040516001600160a01b0390911681526020016103ae565b6104536104fe3660046135d4565b610c97565b6103de7f000000000000000000000000000000000000000000000000000000000000000081565b6104d87f000000000000000000000000000000000000000000000000000000000000000081565b60cb546103de90600160a01b900463ffffffff1681565b610453610576366004613624565b610e37565b61045361058936600461367b565b610e7c565b61045361059c3660046136a5565b611070565b6104d87f000000000000000000000000000000000000000000000000000000000000000081565b6105db6105d63660046134e6565b6110f1565b60405161ffff90911681526020016103ae565b60cb546103de90600160c01b900463ffffffff1681565b6104536106133660046136f8565b61114c565b610453611160565b6103a261062e366004613711565b606654600160ff9092169190911b9081161490565b6066546104a2565b6103a2610659366004613731565b61120f565b60cb546105db90600160e01b900461ffff1681565b6103a2610681366004613763565b60cf60209081525f928352604080842090915290825290205460ff1681565b61045361129a565b60ca546104a2565b6104536106be3660046134e6565b6112ab565b6104a26106d136600461378d565b60cd60209081525f928352604080842090915290825290205481565b6104d87f000000000000000000000000000000000000000000000000000000000000000081565b6033546001600160a01b03166104d8565b6104d873beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac081565b6103fb6112bc565b6104536107563660046137b9565b611358565b6103de7f000000000000000000000000000000000000000000000000000000000000000081565b6104536107903660046134e6565b611503565b6104536107a336600461381b565b61150e565b6103a26107b6366004613763565b60d260209081525f928352604080842090915290825290205460ff1681565b6104536107e3366004613834565b61151f565b6104a26107f63660046134e6565b60ce6020525f908152604090205481565b6103de7f000000000000000000000000000000000000000000000000000000000000000081565b6103a261083c366004613763565b60d060209081525f928352604080842090915290825290205460ff1681565b6104d87f000000000000000000000000000000000000000000000000000000000000000081565b61045361089036600461385e565b611668565b6103fb6108a3366004613545565b6117d3565b6105db6108b636600461378d565b611863565b6103de6108c9366004613545565b6118cf565b6104d87f000000000000000000000000000000000000000000000000000000000000000081565b6103a2610903366004613763565b60d360209081525f928352604080842090915290825290205460ff1681565b61045361093036600461378d565b611950565b6104536109433660046134e6565b611aba565b6104536109563660046138a2565b611b35565b6104a2610969366004613572565b611c6a565b61045361097c3660046136f8565b611c7a565b61045361098f366004613545565b611dc9565b60cb546104d8906001600160a01b031681565b6104536109b53660046135d4565b611edf565b6104536109c83660046135d4565b61202e565b604080516080810182525f80825260208201819052918101829052606081019190915260ca545b8015610aa5575f60ca610a08600184613914565b81548110610a1857610a18613927565b5f91825260209182902060408051608081018252600293909302909101805483526001015463ffffffff80821694840194909452600160201b810490931690820152600160401b90910460ff161580156060830181905291925090610a875750806040015163ffffffff164210155b15610a925792915050565b5080610a9d8161393b565b9150506109f4565b5050604080516080810182525f80825260208201819052918101829052606081019190915290565b610ad56121ad565b6001600160a01b0382165f81815260d1602052604080822054905160ff9091169284151592841515927f4de6293e668df1398422e1def12118052c1539a03cbfedc145895d48d7685f1c9190a4506001600160a01b03919091165f90815260d160205260409020805460ff1916911515919091179055565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa158015610baf573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610bd39190613950565b610bf057604051631d77d47760e21b815260040160405180910390fd5b6066548181168114610c155760405163c61dca5d60e01b815260040160405180910390fd5b610c1e82612207565b5050565b5f80610c3160208401846134e6565b8360200135604051602001610c7a9392919060f89390931b6001600160f81b031916835260609190911b6bffffffffffffffffffffffff19166001830152601582015260350190565b604051602081830303815290604052805190602001209050919050565b606654600190600290811603610cc05760405163840a48d560e01b815260040160405180910390fd5b335f90815260d1602052604090205460ff16610cef57604051635c427cd960e01b815260040160405180910390fd5b610cf7612244565b5f5b82811015610e275736848483818110610d1457610d14613927565b9050602002810190610d26919061396b565b335f81815260ce60209081526040808320549051949550939192610d509290918591879101613ab9565b604051602081830303815290604052805190602001209050610d718361229d565b335f90815260d0602090815260408083208484529091529020805460ff19166001908117909155610da3908390613ae8565b335f81815260ce602052604090819020929092559051829184917f51088b8c89628df3a8174002c2a034d0152fce6af8415d651b2a4734bf27048290610dea908890613afb565b60405180910390a4610e1c333060408601803590610e0b90602089016134e6565b6001600160a01b031692919061238d565b505050600101610cf9565b50610e326001609755565b505050565b606654600290600490811603610e605760405163840a48d560e01b815260040160405180910390fd5b610e68612244565b610e7283836123f8565b610e326001609755565b606654600390600890811603610ea55760405163840a48d560e01b815260040160405180910390fd5b60cb546001600160a01b03163314610ed057604051635c427cd960e01b815260040160405180910390fd5b60cb5463ffffffff600160c01b909104811690831611610f0357604051631ca7e50b60e21b815260040160405180910390fd5b428263ffffffff1610610f29576040516306957c9160e11b815260040160405180910390fd5b60ca5460cb545f90610f4890600160a01b900463ffffffff1642613b0d565b6040805160808101825287815263ffffffff87811660208084018281528684168587018181525f6060880181815260ca8054600181018255925297517f42d72674974f694b5f5159593243114d38a5c39c89d6b62fee061ff523240ee160029092029182015592517f42d72674974f694b5f5159593243114d38a5c39c89d6b62fee061ff523240ee290930180549151975193871667ffffffffffffffff1990921691909117600160201b978716979097029690961760ff60401b1916600160401b921515929092029190911790945560cb805463ffffffff60c01b1916600160c01b840217905593519283529394508892908616917fecd866c3c158fa00bf34d803d5f6023000b57080bcb48af004c2b4b46b3afd08910160405180910390a45050505050565b6066546002906004908116036110995760405163840a48d560e01b815260040160405180910390fd5b6110a1612244565b5f5b838110156110e0576110d88585838181106110c0576110c0613927565b90506020028101906110d29190613b29565b846123f8565b6001016110a3565b506110eb6001609755565b50505050565b6001600160a01b0381165f90815260d5602090815260408083208151606081018352905461ffff80821683526201000082041693820193909352600160201b90920463ffffffff169082015261114690612680565b92915050565b6111546121ad565b61115d816126f0565b50565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa1580156111c2573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111e69190613950565b61120357604051631d77d47760e21b815260040160405180910390fd5b61120d5f19612207565b565b5f6112928260ca61122360208301836136f8565b63ffffffff168154811061123957611239613927565b5f91825260209182902060408051608081018252600293909302909101805483526001015463ffffffff80821694840194909452600160201b810490931690820152600160401b90910460ff1615156060820152612761565b506001919050565b6112a26121ad565b61120d5f612904565b6112b36121ad565b61115d81612955565b604080516080810182525f80825260208201819052918101829052606081019190915260ca80546112ef90600190613914565b815481106112ff576112ff613927565b5f91825260209182902060408051608081018252600293909302909101805483526001015463ffffffff80821694840194909452600160201b810490931690820152600160401b90910460ff1615156060820152919050565b6066546005906020908116036113815760405163840a48d560e01b815260040160405180910390fd5b8361138b816129b0565b6113a85760405163932d94f760e01b815260040160405180910390fd5b6113b0612244565b5f5b838110156114f157368585838181106113cd576113cd613927565b90506020028101906113df9190613b3d565b6001600160a01b0388165f90815260ce6020908152604080832054905193945092611410918b918591879101613cab565b6040516020818303038152906040528051906020012090505f61143284612a5a565b6001600160a01b038b165f90815260d3602090815260408083208684529091529020805460ff19166001908117909155909150611470908490613ae8565b6001600160a01b038b165f81815260ce60205260409081902092909255905183919033907ffc8888bffd711da60bc5092b33f677d81896fe80ecc677b84cfab8184462b6e0906114c39088908a90613cd1565b60405180910390a46114e1333083610e0b6040890160208a016134e6565b5050600190920191506113b29050565b506114fc6001609755565b5050505050565b33610c1e8183612c40565b6115166121ad565b61115d81612ca3565b6066546007906080908116036115485760405163840a48d560e01b815260040160405180910390fd5b82611552816129b0565b61156f5760405163932d94f760e01b815260040160405180910390fd5b60cb545f9061158b90600160a01b900463ffffffff1642613b0d565b6001600160a01b0386165f90815260d5602090815260408083208151606081018352905461ffff80821683526201000082041693820193909352600160201b90920463ffffffff1690820152919250906115e490612680565b6001600160a01b0387165f90815260d560205260409020909150611609908684612d0e565b6040805163ffffffff8416815261ffff838116602083015287168183015290516001600160a01b0388169133917fd1e028bd664486a46ad26040e999cd2d22e1e9a094ee6afe19fcf64678f16f749181900360600190a3505050505050565b6066546006906040908116036116915760405163840a48d560e01b815260040160405180910390fd5b8361169b816129b0565b6116b85760405163932d94f760e01b815260040160405180910390fd5b60cb545f906116d490600160a01b900463ffffffff1642613b0d565b6001600160a01b038781165f90815260d460209081526040808320938a1683529281528282208351606081018552905461ffff80821683526201000082041692820192909252600160201b90910463ffffffff169281019290925291925061173b90612680565b6001600160a01b038089165f90815260d460209081526040808320938b1683529290522090915061176d908684612d0e565b6040805163ffffffff8416815261ffff838116602083015287168183015290516001600160a01b0388811692908a169133917f48e198b6ae357e529204ee53a8e514c470ff77d9cc8e4f7207f8b5d490ae6934919081900360600190a450505050505050565b604080516080810182525f80825260208201819052918101829052606081019190915260ca828154811061180957611809613927565b5f91825260209182902060408051608081018252600293909302909101805483526001015463ffffffff80821694840194909452600160201b810490931690820152600160401b90910460ff161515606082015292915050565b6001600160a01b038281165f90815260d46020908152604080832093851683529281528282208351606081018552905461ffff80821683526201000082041692820192909252600160201b90910463ffffffff1692810192909252906118c890612680565b9392505050565b60ca545f905b63ffffffff811615611936578260ca6118ef600184613ce9565b63ffffffff168154811061190557611905613927565b905f5260205f2090600202015f015403611924576118c8600182613ce9565b8061192e81613d05565b9150506118d5565b5060405163504570e360e01b815260040160405180910390fd5b8161195a816129b0565b6119775760405163932d94f760e01b815260040160405180910390fd5b6040516336b87bd760e11b81526001600160a01b0384811660048301527f00000000000000000000000000000000000000000000000000000000000000001690636d70f7ae90602401602060405180830381865afa1580156119db573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906119ff9190613950565b80611a93575060405163ba1a84e560e01b81526001600160a01b0384811660048301525f917f00000000000000000000000000000000000000000000000000000000000000009091169063ba1a84e590602401602060405180830381865afa158015611a6d573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a919190613d23565b115b611ab05760405163fb494ea160e01b815260040160405180910390fd5b610e328383612c40565b611ac26121ad565b6001600160a01b038116611b2c5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084015b60405180910390fd5b61115d81612904565b5f54610100900460ff1615808015611b5357505f54600160ff909116105b80611b6c5750303b158015611b6c57505f5460ff166001145b611bcf5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401611b23565b5f805460ff191660011790558015611bf0575f805461ff0019166101001790555b611bf985612207565b611c0286612904565b611c0b84612955565b611c14836126f0565b611c1d82612ca3565b8015611c62575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050505050565b5f6001610c3160208401846134e6565b606654600390600890811603611ca35760405163840a48d560e01b815260040160405180910390fd5b60cb546001600160a01b03163314611cce57604051635c427cd960e01b815260040160405180910390fd5b60ca5463ffffffff831610611cf6576040516394a8d38960e01b815260040160405180910390fd5b5f60ca8363ffffffff1681548110611d1057611d10613927565b905f5260205f20906002020190508060010160089054906101000a900460ff1615611d4e57604051631b14174b60e01b815260040160405180910390fd5b6001810154600160201b900463ffffffff164210611d7f57604051630c36f66560e21b815260040160405180910390fd5b60018101805460ff60401b1916600160401b17905560405163ffffffff8416907fd850e6e5dfa497b72661fa73df2923464eaed9dc2ff1d3cb82bccbfeabe5c41e905f90a2505050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611e25573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611e499190613d3a565b6001600160a01b0316336001600160a01b031614611e7a5760405163794821ff60e01b815260040160405180910390fd5b60665480198219811614611ea15760405163c61dca5d60e01b815260040160405180910390fd5b606682905560405182815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c9060200160405180910390a25050565b6066545f90600190811603611f075760405163840a48d560e01b815260040160405180910390fd5b611f0f612244565b5f5b82811015610e275736848483818110611f2c57611f2c613927565b9050602002810190611f3e919061396b565b335f81815260ce60209081526040808320549051949550939192611f689290918591879101613ab9565b604051602081830303815290604052805190602001209050611f898361229d565b335f90815260cf602090815260408083208484529091529020805460ff19166001908117909155611fbb908390613ae8565b335f81815260ce602052604090819020929092559051829184917f450a367a380c4e339e5ae7340c8464ef27af7781ad9945cfe8abd828f89e628190612002908890613afb565b60405180910390a4612023333060408601803590610e0b90602089016134e6565b505050600101611f11565b6066546004906010908116036120575760405163840a48d560e01b815260040160405180910390fd5b335f90815260d1602052604090205460ff1661208657604051635c427cd960e01b815260040160405180910390fd5b61208e612244565b5f5b82811015610e2757368484838181106120ab576120ab613927565b90506020028101906120bd919061396b565b335f81815260ce602090815260408083205490519495509391926120e79290918591879101613ab9565b6040516020818303038152906040528051906020012090506121088361229d565b335f90815260d2602090815260408083208484529091529020805460ff1916600190811790915561213a908390613ae8565b335f81815260ce602052604090819020929092559051829184917f5251b6fdefcb5d81144e735f69ea4c695fd43b0289ca53dc075033f5fc80068b90612181908890613afb565b60405180910390a46121a2333060408601803590610e0b90602089016134e6565b505050600101612090565b6033546001600160a01b0316331461120d5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401611b23565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a250565b6002609754036122965760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401611b23565b6002609755565b6122cf6122aa8280613d55565b6122ba60808501606086016136f8565b6122ca60a08601608087016136f8565b612ddd565b5f8160400135116122f3576040516310eb483f60e21b815260040160405180910390fd5b6f4b3b4ca85a86c47a098a223fffffffff816040013511156123285760405163070b5a6f60e21b815260040160405180910390fd5b61235863ffffffff7f00000000000000000000000000000000000000000000000000000000000000001642613ae8565b61236860808301606084016136f8565b63ffffffff16111561115d57604051637ee2b44360e01b815260040160405180910390fd5b6040516001600160a01b03808516602483015283166044820152606481018290526110eb9085906323b872dd60e01b906084015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b0319909316929092179091526130b5565b5f60ca61240860208501856136f8565b63ffffffff168154811061241e5761241e613927565b5f91825260209182902060408051608081018252600293909302909101805483526001015463ffffffff80821694840194909452600160201b810490931690820152600160401b90910460ff1615156060820152905061247e8382612761565b5f61248f60808501606086016134e6565b6001600160a01b038082165f90815260cc602052604090205491925016806124b45750805b336001600160a01b038216146124dd57604051635c427cd960e01b815260040160405180910390fd5b5f5b6124ec60a0870187613d9b565b9050811015611c62573661250360e0880188613d55565b8381811061251357612513613927565b6001600160a01b0387165f90815260cd602090815260408083209302949094019450929091508290612547908501856134e6565b6001600160a01b03166001600160a01b031681526020019081526020015f205490508082602001351161258d5760405163aa385e8160e01b815260040160405180910390fd5b5f61259c826020850135613914565b6001600160a01b0387165f90815260cd602090815260408220929350850180359291906125c990876134e6565b6001600160a01b031681526020808201929092526040015f209190915561260a90899083906125fa908701876134e6565b6001600160a01b03169190613188565b86516001600160a01b03808a1691878216918916907f9543dbd55580842586a951f0386e24d68a5df99ae29e3b216588b45fd684ce319061264e60208901896134e6565b604080519283526001600160a01b039091166020830152810186905260600160405180910390a45050506001016124df565b5f816040015163ffffffff165f14806126b25750815161ffff9081161480156126b25750816040015163ffffffff1642105b156126ca57505060cb54600160e01b900461ffff1690565b816040015163ffffffff164210156126e3578151611146565b506020015190565b919050565b60cb546040805163ffffffff600160a01b9093048316815291831660208301527faf557c6c02c208794817a705609cfa935f827312a1adfdd26494b6b95dd2b4b3910160405180910390a160cb805463ffffffff909216600160a01b0263ffffffff60a01b19909216919091179055565b80606001511561278457604051631b14174b60e01b815260040160405180910390fd5b806040015163ffffffff164210156127af57604051631437a2bb60e31b815260040160405180910390fd5b6127bc60c0830183613d9b565b90506127cb60a0840184613d9b565b9050146127eb576040516343714afd60e01b815260040160405180910390fd5b6127f860e0830183613d55565b905061280760c0840184613d9b565b905014612827576040516343714afd60e01b815260040160405180910390fd5b80516128539061283d60408501602086016136f8565b61284a6040860186613de1565b866060016131b8565b5f5b61286260a0840184613d9b565b9050811015610e32576128fc608084013561288060a0860186613d9b565b8481811061289057612890613927565b90506020020160208101906128a591906136f8565b6128b260c0870187613d9b565b858181106128c2576128c2613927565b90506020028101906128d49190613de1565b6128e160e0890189613d55565b878181106128f1576128f1613927565b90506040020161325c565b600101612855565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b60cb546040516001600160a01b038084169216907f237b82f438d75fc568ebab484b75b01d9287b9e98b490b7c23221623b6705dbb905f90a360cb80546001600160a01b0319166001600160a01b0392909216919091179055565b604051631beb2b9760e31b81526001600160a01b0382811660048301523360248301523060448301525f80356001600160e01b0319166064840152917f00000000000000000000000000000000000000000000000000000000000000009091169063df595cb8906084016020604051808303815f875af1158015612a36573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111469190613950565b5f612a88612a688380613d55565b612a7860808601606087016136f8565b6122ca60a08701608088016136f8565b5f612a966040840184613d55565b905011612ab65760405163796cc52560e01b815260040160405180910390fd5b42612ac760a08401608085016136f8565b612ad760808501606086016136f8565b612ae19190613b0d565b63ffffffff1610612b055760405163150358a160e21b815260040160405180910390fd5b5f80805b612b166040860186613d55565b9050811015612c075736612b2d6040870187613d55565b83818110612b3d57612b3d613927565b6040029190910191505f9050612b5660208301836134e6565b6001600160a01b031603612b7d57604051630863a45360e11b815260040160405180910390fd5b612b8a60208201826134e6565b6001600160a01b0316836001600160a01b031610612bbb576040516310fb47f160e31b815260040160405180910390fd5b5f816020013511612bdf576040516310eb483f60e21b815260040160405180910390fd5b612bec60208201826134e6565b9250612bfc602082013585613ae8565b935050600101612b09565b506f4b3b4ca85a86c47a098a223fffffffff821115612c395760405163070b5a6f60e21b815260040160405180910390fd5b5092915050565b6001600160a01b038083165f81815260cc602052604080822080548686166001600160a01b0319821681179092559151919094169392849290917fbab947934d42e0ad206f25c9cab18b5bb6ae144acfb00f40b4e3aa59590ca3129190a4505050565b60cb546040805161ffff600160e01b9093048316815291831660208301527fe6cd4edfdcc1f6d130ab35f73d72378f3a642944fb4ee5bd84b7807a81ea1c4e910160405180910390a160cb805461ffff909216600160e01b0261ffff60e01b19909216919091179055565b61271061ffff83161115612d355760405163891c63df60e01b815260040160405180910390fd5b8254600160201b900463ffffffff164211612d6357604051637b1e25c560e01b815260040160405180910390fd5b8254600160201b900463ffffffff165f03612d8a57825461ffff191661ffff178355612da1565b825462010000810461ffff1661ffff199091161783555b825463ffffffff909116600160201b0267ffffffff000000001961ffff90931662010000029290921667ffffffffffff00001990911617179055565b82612dfb5760405163796cc52560e01b815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000063ffffffff168163ffffffff161115612e4857604051630dd0b9f560e21b815260040160405180910390fd5b612e727f000000000000000000000000000000000000000000000000000000000000000082613e38565b63ffffffff1615612e965760405163ee66470560e01b815260040160405180910390fd5b612ec07f000000000000000000000000000000000000000000000000000000000000000083613e38565b63ffffffff1615612ee457604051633c1a94f160e21b815260040160405180910390fd5b8163ffffffff167f000000000000000000000000000000000000000000000000000000000000000063ffffffff1642612f1d9190613914565b11158015612f5757508163ffffffff167f000000000000000000000000000000000000000000000000000000000000000063ffffffff1611155b612f745760405163041aa75760e11b815260040160405180910390fd5b5f805b84811015611c62575f868683818110612f9257612f92613927565b612fa892602060409092020190810191506134e6565b60405163198f077960e21b81526001600160a01b0380831660048301529192507f00000000000000000000000000000000000000000000000000000000000000009091169063663c1de490602401602060405180830381865afa158015613011573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906130359190613950565b8061305c57506001600160a01b03811673beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac0145b61307957604051632efd965160e11b815260040160405180910390fd5b806001600160a01b0316836001600160a01b0316106130ab5760405163dfad9ca160e01b815260040160405180910390fd5b9150600101612f77565b5f613109826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b031661329a9092919063ffffffff16565b905080515f14806131295750808060200190518101906131299190613950565b610e325760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401611b23565b6040516001600160a01b038316602482015260448101829052610e3290849063a9059cbb60e01b906064016123c1565b6131c3602083613e5f565b6001901b8463ffffffff16106131eb5760405162c6c39d60e71b815260040160405180910390fd5b5f6131f582610c22565b905061323f84848080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152508a92508591505063ffffffff89166132b0565b611c62576040516369ca16c960e01b815260040160405180910390fd5b613267602083613e5f565b6001901b8463ffffffff16106132905760405163054ff4df60e51b815260040160405180910390fd5b5f6131f582611c6a565b60606132a884845f856132c7565b949350505050565b5f836132bd86858561339e565b1495945050505050565b6060824710156133285760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401611b23565b5f5f866001600160a01b031685876040516133439190613e72565b5f6040518083038185875af1925050503d805f811461337d576040519150601f19603f3d011682016040523d82523d5f602084013e613382565b606091505b509150915061339387838387613435565b979650505050505050565b5f602084516133ad9190613e88565b156133cb576040516313717da960e21b815260040160405180910390fd5b8260205b8551811161342c576133e2600285613e88565b5f0361340357815f528086015160205260405f20915060028404935061341a565b808601515f528160205260405f2091506002840493505b613425602082613ae8565b90506133cf565b50949350505050565b606083156134a35782515f0361349c576001600160a01b0385163b61349c5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401611b23565b50816132a8565b6132a883838151156134b85781518083602001fd5b8060405162461bcd60e51b8152600401611b239190613e9b565b6001600160a01b038116811461115d575f5ffd5b5f602082840312156134f6575f5ffd5b81356118c8816134d2565b801515811461115d575f5ffd5b5f5f6040838503121561351f575f5ffd5b823561352a816134d2565b9150602083013561353a81613501565b809150509250929050565b5f60208284031215613555575f5ffd5b5035919050565b5f6040828403121561356c575f5ffd5b50919050565b5f60408284031215613582575f5ffd5b6118c8838361355c565b5f5f83601f84011261359c575f5ffd5b50813567ffffffffffffffff8111156135b3575f5ffd5b6020830191508360208260051b85010111156135cd575f5ffd5b9250929050565b5f5f602083850312156135e5575f5ffd5b823567ffffffffffffffff8111156135fb575f5ffd5b6136078582860161358c565b90969095509350505050565b5f610100828403121561356c575f5ffd5b5f5f60408385031215613635575f5ffd5b823567ffffffffffffffff81111561364b575f5ffd5b61365785828601613613565b925050602083013561353a816134d2565b803563ffffffff811681146126eb575f5ffd5b5f5f6040838503121561368c575f5ffd5b8235915061369c60208401613668565b90509250929050565b5f5f5f604084860312156136b7575f5ffd5b833567ffffffffffffffff8111156136cd575f5ffd5b6136d98682870161358c565b90945092505060208401356136ed816134d2565b809150509250925092565b5f60208284031215613708575f5ffd5b6118c882613668565b5f60208284031215613721575f5ffd5b813560ff811681146118c8575f5ffd5b5f60208284031215613741575f5ffd5b813567ffffffffffffffff811115613757575f5ffd5b6132a884828501613613565b5f5f60408385031215613774575f5ffd5b823561377f816134d2565b946020939093013593505050565b5f5f6040838503121561379e575f5ffd5b82356137a9816134d2565b9150602083013561353a816134d2565b5f5f5f604084860312156137cb575f5ffd5b83356137d6816134d2565b9250602084013567ffffffffffffffff8111156137f1575f5ffd5b6137fd8682870161358c565b9497909650939450505050565b803561ffff811681146126eb575f5ffd5b5f6020828403121561382b575f5ffd5b6118c88261380a565b5f5f60408385031215613845575f5ffd5b8235613850816134d2565b915061369c6020840161380a565b5f5f5f60608486031215613870575f5ffd5b833561387b816134d2565b9250602084013561388b816134d2565b91506138996040850161380a565b90509250925092565b5f5f5f5f5f60a086880312156138b6575f5ffd5b85356138c1816134d2565b94506020860135935060408601356138d8816134d2565b92506138e660608701613668565b91506138f46080870161380a565b90509295509295909350565b634e487b7160e01b5f52601160045260245ffd5b8181038181111561114657611146613900565b634e487b7160e01b5f52603260045260245ffd5b5f8161394957613949613900565b505f190190565b5f60208284031215613960575f5ffd5b81516118c881613501565b5f8235609e1983360301811261397f575f5ffd5b9190910192915050565b5f5f8335601e1984360301811261399e575f5ffd5b830160208101925035905067ffffffffffffffff8111156139bd575f5ffd5b8060061b36038213156135cd575f5ffd5b8183526020830192505f815f5b84811015613a315781356139ee816134d2565b6001600160a01b0316865260208201356bffffffffffffffffffffffff8116808214613a18575f5ffd5b60208801525060409586019591909101906001016139db565b5093949350505050565b5f613a468283613989565b60a08552613a5860a0860182846139ce565b9150506020830135613a69816134d2565b6001600160a01b031660208501526040838101359085015263ffffffff613a9260608501613668565b16606085015263ffffffff613aa960808501613668565b1660808501528091505092915050565b60018060a01b0384168152826020820152606060408201525f613adf6060830184613a3b565b95945050505050565b8082018082111561114657611146613900565b602081525f6118c86020830184613a3b565b63ffffffff818116838216019081111561114657611146613900565b5f823560fe1983360301811261397f575f5ffd5b5f823560be1983360301811261397f575f5ffd5b5f5f8335601e19843603018112613b66575f5ffd5b830160208101925035905067ffffffffffffffff811115613b85575f5ffd5b8036038213156135cd575f5ffd5b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b5f613bc68283613989565b60c08552613bd860c0860182846139ce565b9150506020830135613be9816134d2565b6001600160a01b03166020850152613c046040840184613989565b858303604087015280835290915f91906020015b81831015613c53578335613c2b816134d2565b6001600160a01b03168152602084810135908201526040938401936001939093019201613c18565b613c5f60608701613668565b63ffffffff811660608901529350613c7960808701613668565b63ffffffff811660808901529350613c9460a0870187613b51565b9450925086810360a0880152613393818585613b93565b60018060a01b0384168152826020820152606060408201525f613adf6060830184613bbb565b828152604060208201525f6132a86040830184613bbb565b63ffffffff828116828216039081111561114657611146613900565b5f63ffffffff821680613d1a57613d1a613900565b5f190192915050565b5f60208284031215613d33575f5ffd5b5051919050565b5f60208284031215613d4a575f5ffd5b81516118c8816134d2565b5f5f8335601e19843603018112613d6a575f5ffd5b83018035915067ffffffffffffffff821115613d84575f5ffd5b6020019150600681901b36038213156135cd575f5ffd5b5f5f8335601e19843603018112613db0575f5ffd5b83018035915067ffffffffffffffff821115613dca575f5ffd5b6020019150600581901b36038213156135cd575f5ffd5b5f5f8335601e19843603018112613df6575f5ffd5b83018035915067ffffffffffffffff821115613e10575f5ffd5b6020019150368190038213156135cd575f5ffd5b634e487b7160e01b5f52601260045260245ffd5b5f63ffffffff831680613e4d57613e4d613e24565b8063ffffffff84160691505092915050565b5f82613e6d57613e6d613e24565b500490565b5f82518060208501845e5f920191825250919050565b5f82613e9657613e96613e24565b500690565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f8301168401019150509291505056fea264697066735822122038b85e072953498a6772816d5247c44e56b614c9fdac6ebf7b0e16c898f84d4b64736f6c634300081b0033", +>>>>>>> 7da92a53 (fix: remove token param from Deposit event and related APIs (#1013)) } // RewardsCoordinatorABI is the input ABI used to generate the binding from. diff --git a/pkg/bindings/SlashingLib/binding.go b/pkg/bindings/SlashingLib/binding.go index 32b0744054..59d3b1afeb 100644 --- a/pkg/bindings/SlashingLib/binding.go +++ b/pkg/bindings/SlashingLib/binding.go @@ -32,7 +32,7 @@ var ( // SlashingLibMetaData contains all meta data concerning the SlashingLib contract. var SlashingLibMetaData = &bind.MetaData{ ABI: "[]", - Bin: "0x60556032600b8282823980515f1a607314602657634e487b7160e01b5f525f60045260245ffd5b305f52607381538281f3fe730000000000000000000000000000000000000000301460806040525f5ffdfea2646970667358221220031531159115e859f21eed5ce5e4aaa5ca9fd89d5ab9cee05fde16361a4e53a664736f6c634300081b0033", + Bin: "0x60556032600b8282823980515f1a607314602657634e487b7160e01b5f525f60045260245ffd5b305f52607381538281f3fe730000000000000000000000000000000000000000301460806040525f5ffdfea264697066735822122037a101287b0a7f2671ca731d282a04490481ee7903f1147b16ca0a6bea1d179b64736f6c634300081b0033", } // SlashingLibABI is the input ABI used to generate the binding from. diff --git a/pkg/bindings/Snapshots/binding.go b/pkg/bindings/Snapshots/binding.go index 351dab3266..1f35924709 100644 --- a/pkg/bindings/Snapshots/binding.go +++ b/pkg/bindings/Snapshots/binding.go @@ -32,7 +32,7 @@ var ( // SnapshotsMetaData contains all meta data concerning the Snapshots contract. var SnapshotsMetaData = &bind.MetaData{ ABI: "[{\"type\":\"error\",\"name\":\"InvalidSnapshotOrdering\",\"inputs\":[]}]", - Bin: "0x60556032600b8282823980515f1a607314602657634e487b7160e01b5f525f60045260245ffd5b305f52607381538281f3fe730000000000000000000000000000000000000000301460806040525f5ffdfea26469706673582212202269455111f3a63331a42edaf90ec124683e8dcd2c97e7d0cc1d0f6a66af373f64736f6c634300081b0033", + Bin: "0x60556032600b8282823980515f1a607314602657634e487b7160e01b5f525f60045260245ffd5b305f52607381538281f3fe730000000000000000000000000000000000000000301460806040525f5ffdfea2646970667358221220402ddde4d006c9e7fe1fcff86c3b43945e43ee02d19b30e2eaa8f4d5605fd37d64736f6c634300081b0033", } // SnapshotsABI is the input ABI used to generate the binding from. diff --git a/pkg/bindings/StrategyBase/binding.go b/pkg/bindings/StrategyBase/binding.go index ac8559c396..92f5430931 100644 --- a/pkg/bindings/StrategyBase/binding.go +++ b/pkg/bindings/StrategyBase/binding.go @@ -32,7 +32,7 @@ var ( // StrategyBaseMetaData contains all meta data concerning the StrategyBase contract. var StrategyBaseMetaData = &bind.MetaData{ ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"_strategyManager\",\"type\":\"address\",\"internalType\":\"contractIStrategyManager\"},{\"name\":\"_pauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"deposit\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"newShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"explanation\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"_underlyingToken\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"pauseAll\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[{\"name\":\"index\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pauserRegistry\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"shares\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"sharesToUnderlying\",\"inputs\":[{\"name\":\"amountShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"sharesToUnderlyingView\",\"inputs\":[{\"name\":\"amountShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"strategyManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategyManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"totalShares\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"underlyingToShares\",\"inputs\":[{\"name\":\"amountUnderlying\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"underlyingToSharesView\",\"inputs\":[{\"name\":\"amountUnderlying\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"underlyingToken\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"userUnderlying\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"userUnderlyingView\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"withdraw\",\"inputs\":[{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amountShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"ExchangeRateEmitted\",\"inputs\":[{\"name\":\"rate\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StrategyTokenSet\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIERC20\"},{\"name\":\"decimals\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"BalanceExceedsMaxTotalDeposits\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"CurrentlyPaused\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InputAddressZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidNewPausedStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"MaxPerDepositExceedsMax\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NewSharesZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyPauser\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyStrategyManager\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyUnderlyingToken\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyUnpauser\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"TotalSharesExceedsMax\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"WithdrawalAmountExceedsTotalDeposits\",\"inputs\":[]}]", - Bin: "0x60c060405234801561000f575f5ffd5b506040516113a63803806113a683398101604081905261002e9161014b565b806001600160a01b038116610056576040516339b190bb60e11b815260040160405180910390fd5b6001600160a01b03908116608052821660a052610071610078565b5050610183565b5f54610100900460ff16156100e35760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff90811614610132575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b0381168114610148575f5ffd5b50565b5f5f6040838503121561015c575f5ffd5b825161016781610134565b602084015190925061017881610134565b809150509250929050565b60805160a0516111d86101ce5f395f81816101750152818161040201528181610796015261083301525f818161022b0152818161030f01528181610543015261096101526111d85ff3fe608060405234801561000f575f5ffd5b5060043610610127575f3560e01c8063886f1195116100a9578063ce7c2ac21161006e578063ce7c2ac21461029b578063d9caed12146102ae578063e3dae51c146102c1578063f3e73875146102d4578063fabc1cbc146102e7575f5ffd5b8063886f1195146102265780638c8710191461024d5780638f6a624014610260578063ab5921e114610273578063c4d66de814610288575f5ffd5b8063553ca5f8116100ef578063553ca5f8146101c1578063595c6a67146101d45780635ac86ab7146101dc5780635c975abb1461020b5780637a8b263714610213575f5ffd5b8063136439dd1461012b5780632495a5991461014057806339b70e38146101705780633a98ef391461019757806347e7ef24146101ae575b5f5ffd5b61013e610139366004610f4d565b6102fa565b005b603254610153906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b6101537f000000000000000000000000000000000000000000000000000000000000000081565b6101a060335481565b604051908152602001610167565b6101a06101bc366004610f7b565b6103cf565b6101a06101cf366004610fa5565b61051b565b61013e61052e565b6101fb6101ea366004610fd5565b6001805460ff9092161b9081161490565b6040519015158152602001610167565b6001546101a0565b6101a0610221366004610f4d565b6105dd565b6101537f000000000000000000000000000000000000000000000000000000000000000081565b6101a061025b366004610f4d565b610626565b6101a061026e366004610fa5565b610630565b61027b61063d565b6040516101679190610ff0565b61013e610296366004610fa5565b61065d565b6101a06102a9366004610fa5565b61076f565b61013e6102bc366004611025565b610801565b6101a06102cf366004610f4d565b61091e565b6101a06102e2366004610f4d565b610955565b61013e6102f5366004610f4d565b61095f565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa15801561035c573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103809190611063565b61039d57604051631d77d47760e21b815260040160405180910390fd5b60015481811681146103c25760405163c61dca5d60e01b815260040160405180910390fd5b6103cb82610a75565b5050565b600180545f9182918116036103f75760405163840a48d560e01b815260040160405180910390fd5b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610440576040516348da714f60e01b815260040160405180910390fd5b61044a8484610ab2565b6033545f61045a6103e883611096565b90505f6103e8610468610ae0565b6104729190611096565b90505f61047f87836110a9565b90508061048c84896110bc565b61049691906110d3565b9550855f036104b857604051630c392ed360e11b815260040160405180910390fd5b6104c28685611096565b60338190556f4b3b4ca85a86c47a098a223fffffffff10156104f757604051632f14e8a360e11b815260040160405180910390fd5b610510826103e860335461050b9190611096565b610b4f565b505050505092915050565b5f6105286102218361076f565b92915050565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa158015610590573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105b49190611063565b6105d157604051631d77d47760e21b815260040160405180910390fd5b6105db5f19610a75565b565b5f5f6103e86033546105ef9190611096565b90505f6103e86105fd610ae0565b6106079190611096565b90508161061485836110bc565b61061e91906110d3565b949350505050565b5f6105288261091e565b5f6105286102e28361076f565b60606040518060800160405280604d8152602001611156604d9139905090565b5f54610100900460ff161580801561067b57505f54600160ff909116105b806106945750303b15801561069457505f5460ff166001145b6106fc5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b5f805460ff19166001179055801561071d575f805461ff0019166101001790555b61072682610b9b565b80156103cb575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498906020015b60405180910390a15050565b60405163fe243a1760e01b81526001600160a01b0382811660048301523060248301525f917f00000000000000000000000000000000000000000000000000000000000000009091169063fe243a1790604401602060405180830381865afa1580156107dd573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061052891906110f2565b600180546002908116036108285760405163840a48d560e01b815260040160405180910390fd5b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610871576040516348da714f60e01b815260040160405180910390fd5b61087c848484610ce6565b603354808311156108a057604051630b469df360e41b815260040160405180910390fd5b5f6108ad6103e883611096565b90505f6103e86108bb610ae0565b6108c59190611096565b90505f826108d387846110bc565b6108dd91906110d3565b90506108e986856110a9565b6033556109096108f982846110a9565b6103e860335461050b9190611096565b610914888883610d19565b5050505050505050565b5f5f6103e86033546109309190611096565b90505f6103e861093e610ae0565b6109489190611096565b90508061061483866110bc565b5f610528826105dd565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156109bb573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109df9190611109565b6001600160a01b0316336001600160a01b031614610a105760405163794821ff60e01b815260040160405180910390fd5b60015480198219811614610a375760405163c61dca5d60e01b815260040160405180910390fd5b600182905560405182815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c9060200160405180910390a25050565b600181905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a250565b6032546001600160a01b038381169116146103cb57604051630312abdd60e61b815260040160405180910390fd5b6032546040516370a0823160e01b81523060048201525f916001600160a01b0316906370a0823190602401602060405180830381865afa158015610b26573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b4a91906110f2565b905090565b7fd2494f3479e5da49d386657c292c610b5b01df313d07c62eb0cfa49924a31be881610b8384670de0b6b3a76400006110bc565b610b8d91906110d3565b604051908152602001610763565b5f54610100900460ff16610c055760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b60648201526084016106f3565b603280546001600160a01b0319166001600160a01b038316179055610c295f610a75565b7f1c540707b00eb5427b6b774fc799d756516a54aee108b64b327acc55af55750760325f9054906101000a90046001600160a01b0316826001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015610c9b573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610cbf9190611124565b604080516001600160a01b03909316835260ff90911660208301520160405180910390a150565b6032546001600160a01b03838116911614610d1457604051630312abdd60e61b815260040160405180910390fd5b505050565b604080516001600160a01b03858116602483015260448083018590528351808403909101815260649092018352602080830180516001600160e01b031663a9059cbb60e01b17905283518085019094528084527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c656490840152610d1492908516918691859185918591905f90610db19084908490610e30565b905080515f1480610dd1575080806020019051810190610dd19190611063565b610d145760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016106f3565b606061061e84845f85855f5f866001600160a01b03168587604051610e55919061113f565b5f6040518083038185875af1925050503d805f8114610e8f576040519150601f19603f3d011682016040523d82523d5f602084013e610e94565b606091505b5091509150610ea587838387610eb0565b979650505050505050565b60608315610f1e5782515f03610f17576001600160a01b0385163b610f175760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016106f3565b508161061e565b61061e8383815115610f335781518083602001fd5b8060405162461bcd60e51b81526004016106f39190610ff0565b5f60208284031215610f5d575f5ffd5b5035919050565b6001600160a01b0381168114610f78575f5ffd5b50565b5f5f60408385031215610f8c575f5ffd5b8235610f9781610f64565b946020939093013593505050565b5f60208284031215610fb5575f5ffd5b8135610fc081610f64565b9392505050565b60ff81168114610f78575f5ffd5b5f60208284031215610fe5575f5ffd5b8135610fc081610fc7565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b5f5f5f60608486031215611037575f5ffd5b833561104281610f64565b9250602084013561105281610f64565b929592945050506040919091013590565b5f60208284031215611073575f5ffd5b81518015158114610fc0575f5ffd5b634e487b7160e01b5f52601160045260245ffd5b8082018082111561052857610528611082565b8181038181111561052857610528611082565b808202811582820484141761052857610528611082565b5f826110ed57634e487b7160e01b5f52601260045260245ffd5b500490565b5f60208284031215611102575f5ffd5b5051919050565b5f60208284031215611119575f5ffd5b8151610fc081610f64565b5f60208284031215611134575f5ffd5b8151610fc081610fc7565b5f82518060208501845e5f92019182525091905056fe4261736520537472617465677920696d706c656d656e746174696f6e20746f20696e68657269742066726f6d20666f72206d6f726520636f6d706c657820696d706c656d656e746174696f6e73a2646970667358221220a9e1d168f120543456936f851169e525e4634e520a4ecc4b7511b0e89c451d2f64736f6c634300081b0033", + Bin: "0x60c060405234801561000f575f5ffd5b506040516113a63803806113a683398101604081905261002e9161014b565b806001600160a01b038116610056576040516339b190bb60e11b815260040160405180910390fd5b6001600160a01b03908116608052821660a052610071610078565b5050610183565b5f54610100900460ff16156100e35760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff90811614610132575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b0381168114610148575f5ffd5b50565b5f5f6040838503121561015c575f5ffd5b825161016781610134565b602084015190925061017881610134565b809150509250929050565b60805160a0516111d86101ce5f395f81816101750152818161040201528181610796015261083301525f818161022b0152818161030f01528181610543015261096101526111d85ff3fe608060405234801561000f575f5ffd5b5060043610610127575f3560e01c8063886f1195116100a9578063ce7c2ac21161006e578063ce7c2ac21461029b578063d9caed12146102ae578063e3dae51c146102c1578063f3e73875146102d4578063fabc1cbc146102e7575f5ffd5b8063886f1195146102265780638c8710191461024d5780638f6a624014610260578063ab5921e114610273578063c4d66de814610288575f5ffd5b8063553ca5f8116100ef578063553ca5f8146101c1578063595c6a67146101d45780635ac86ab7146101dc5780635c975abb1461020b5780637a8b263714610213575f5ffd5b8063136439dd1461012b5780632495a5991461014057806339b70e38146101705780633a98ef391461019757806347e7ef24146101ae575b5f5ffd5b61013e610139366004610f4d565b6102fa565b005b603254610153906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b6101537f000000000000000000000000000000000000000000000000000000000000000081565b6101a060335481565b604051908152602001610167565b6101a06101bc366004610f7b565b6103cf565b6101a06101cf366004610fa5565b61051b565b61013e61052e565b6101fb6101ea366004610fd5565b6001805460ff9092161b9081161490565b6040519015158152602001610167565b6001546101a0565b6101a0610221366004610f4d565b6105dd565b6101537f000000000000000000000000000000000000000000000000000000000000000081565b6101a061025b366004610f4d565b610626565b6101a061026e366004610fa5565b610630565b61027b61063d565b6040516101679190610ff0565b61013e610296366004610fa5565b61065d565b6101a06102a9366004610fa5565b61076f565b61013e6102bc366004611025565b610801565b6101a06102cf366004610f4d565b61091e565b6101a06102e2366004610f4d565b610955565b61013e6102f5366004610f4d565b61095f565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa15801561035c573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103809190611063565b61039d57604051631d77d47760e21b815260040160405180910390fd5b60015481811681146103c25760405163c61dca5d60e01b815260040160405180910390fd5b6103cb82610a75565b5050565b600180545f9182918116036103f75760405163840a48d560e01b815260040160405180910390fd5b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610440576040516348da714f60e01b815260040160405180910390fd5b61044a8484610ab2565b6033545f61045a6103e883611096565b90505f6103e8610468610ae0565b6104729190611096565b90505f61047f87836110a9565b90508061048c84896110bc565b61049691906110d3565b9550855f036104b857604051630c392ed360e11b815260040160405180910390fd5b6104c28685611096565b60338190556f4b3b4ca85a86c47a098a223fffffffff10156104f757604051632f14e8a360e11b815260040160405180910390fd5b610510826103e860335461050b9190611096565b610b4f565b505050505092915050565b5f6105286102218361076f565b92915050565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa158015610590573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105b49190611063565b6105d157604051631d77d47760e21b815260040160405180910390fd5b6105db5f19610a75565b565b5f5f6103e86033546105ef9190611096565b90505f6103e86105fd610ae0565b6106079190611096565b90508161061485836110bc565b61061e91906110d3565b949350505050565b5f6105288261091e565b5f6105286102e28361076f565b60606040518060800160405280604d8152602001611156604d9139905090565b5f54610100900460ff161580801561067b57505f54600160ff909116105b806106945750303b15801561069457505f5460ff166001145b6106fc5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b5f805460ff19166001179055801561071d575f805461ff0019166101001790555b61072682610b9b565b80156103cb575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498906020015b60405180910390a15050565b60405163fe243a1760e01b81526001600160a01b0382811660048301523060248301525f917f00000000000000000000000000000000000000000000000000000000000000009091169063fe243a1790604401602060405180830381865afa1580156107dd573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061052891906110f2565b600180546002908116036108285760405163840a48d560e01b815260040160405180910390fd5b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610871576040516348da714f60e01b815260040160405180910390fd5b61087c848484610ce6565b603354808311156108a057604051630b469df360e41b815260040160405180910390fd5b5f6108ad6103e883611096565b90505f6103e86108bb610ae0565b6108c59190611096565b90505f826108d387846110bc565b6108dd91906110d3565b90506108e986856110a9565b6033556109096108f982846110a9565b6103e860335461050b9190611096565b610914888883610d19565b5050505050505050565b5f5f6103e86033546109309190611096565b90505f6103e861093e610ae0565b6109489190611096565b90508061061483866110bc565b5f610528826105dd565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156109bb573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109df9190611109565b6001600160a01b0316336001600160a01b031614610a105760405163794821ff60e01b815260040160405180910390fd5b60015480198219811614610a375760405163c61dca5d60e01b815260040160405180910390fd5b600182905560405182815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c9060200160405180910390a25050565b600181905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a250565b6032546001600160a01b038381169116146103cb57604051630312abdd60e61b815260040160405180910390fd5b6032546040516370a0823160e01b81523060048201525f916001600160a01b0316906370a0823190602401602060405180830381865afa158015610b26573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b4a91906110f2565b905090565b7fd2494f3479e5da49d386657c292c610b5b01df313d07c62eb0cfa49924a31be881610b8384670de0b6b3a76400006110bc565b610b8d91906110d3565b604051908152602001610763565b5f54610100900460ff16610c055760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b60648201526084016106f3565b603280546001600160a01b0319166001600160a01b038316179055610c295f610a75565b7f1c540707b00eb5427b6b774fc799d756516a54aee108b64b327acc55af55750760325f9054906101000a90046001600160a01b0316826001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015610c9b573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610cbf9190611124565b604080516001600160a01b03909316835260ff90911660208301520160405180910390a150565b6032546001600160a01b03838116911614610d1457604051630312abdd60e61b815260040160405180910390fd5b505050565b604080516001600160a01b03858116602483015260448083018590528351808403909101815260649092018352602080830180516001600160e01b031663a9059cbb60e01b17905283518085019094528084527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c656490840152610d1492908516918691859185918591905f90610db19084908490610e30565b905080515f1480610dd1575080806020019051810190610dd19190611063565b610d145760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016106f3565b606061061e84845f85855f5f866001600160a01b03168587604051610e55919061113f565b5f6040518083038185875af1925050503d805f8114610e8f576040519150601f19603f3d011682016040523d82523d5f602084013e610e94565b606091505b5091509150610ea587838387610eb0565b979650505050505050565b60608315610f1e5782515f03610f17576001600160a01b0385163b610f175760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016106f3565b508161061e565b61061e8383815115610f335781518083602001fd5b8060405162461bcd60e51b81526004016106f39190610ff0565b5f60208284031215610f5d575f5ffd5b5035919050565b6001600160a01b0381168114610f78575f5ffd5b50565b5f5f60408385031215610f8c575f5ffd5b8235610f9781610f64565b946020939093013593505050565b5f60208284031215610fb5575f5ffd5b8135610fc081610f64565b9392505050565b60ff81168114610f78575f5ffd5b5f60208284031215610fe5575f5ffd5b8135610fc081610fc7565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b5f5f5f60608486031215611037575f5ffd5b833561104281610f64565b9250602084013561105281610f64565b929592945050506040919091013590565b5f60208284031215611073575f5ffd5b81518015158114610fc0575f5ffd5b634e487b7160e01b5f52601160045260245ffd5b8082018082111561052857610528611082565b8181038181111561052857610528611082565b808202811582820484141761052857610528611082565b5f826110ed57634e487b7160e01b5f52601260045260245ffd5b500490565b5f60208284031215611102575f5ffd5b5051919050565b5f60208284031215611119575f5ffd5b8151610fc081610f64565b5f60208284031215611134575f5ffd5b8151610fc081610fc7565b5f82518060208501845e5f92019182525091905056fe4261736520537472617465677920696d706c656d656e746174696f6e20746f20696e68657269742066726f6d20666f72206d6f726520636f6d706c657820696d706c656d656e746174696f6e73a264697066735822122008bdccf69f7396adcf67fdc972effdb8a3cf009cbbb0388591668d00f8d8e00664736f6c634300081b0033", } // 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 474dfd630a..ea3b7cdf62 100644 --- a/pkg/bindings/StrategyBaseTVLLimits/binding.go +++ b/pkg/bindings/StrategyBaseTVLLimits/binding.go @@ -32,7 +32,7 @@ var ( // StrategyBaseTVLLimitsMetaData contains all meta data concerning the StrategyBaseTVLLimits contract. var StrategyBaseTVLLimitsMetaData = &bind.MetaData{ ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"_strategyManager\",\"type\":\"address\",\"internalType\":\"contractIStrategyManager\"},{\"name\":\"_pauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"deposit\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"newShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"explanation\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"getTVLLimits\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"_maxPerDeposit\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_maxTotalDeposits\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_underlyingToken\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"_underlyingToken\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"maxPerDeposit\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"maxTotalDeposits\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"pauseAll\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[{\"name\":\"index\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pauserRegistry\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"setTVLLimits\",\"inputs\":[{\"name\":\"newMaxPerDeposit\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"newMaxTotalDeposits\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"shares\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"sharesToUnderlying\",\"inputs\":[{\"name\":\"amountShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"sharesToUnderlyingView\",\"inputs\":[{\"name\":\"amountShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"strategyManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategyManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"totalShares\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"underlyingToShares\",\"inputs\":[{\"name\":\"amountUnderlying\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"underlyingToSharesView\",\"inputs\":[{\"name\":\"amountUnderlying\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"underlyingToken\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"userUnderlying\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"userUnderlyingView\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"withdraw\",\"inputs\":[{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amountShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"ExchangeRateEmitted\",\"inputs\":[{\"name\":\"rate\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"MaxPerDepositUpdated\",\"inputs\":[{\"name\":\"previousValue\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"newValue\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"MaxTotalDepositsUpdated\",\"inputs\":[{\"name\":\"previousValue\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"newValue\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StrategyTokenSet\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIERC20\"},{\"name\":\"decimals\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"BalanceExceedsMaxTotalDeposits\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"CurrentlyPaused\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InputAddressZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidNewPausedStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"MaxPerDepositExceedsMax\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NewSharesZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyPauser\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyStrategyManager\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyUnderlyingToken\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyUnpauser\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"TotalSharesExceedsMax\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"WithdrawalAmountExceedsTotalDeposits\",\"inputs\":[]}]", - Bin: "0x60c060405234801561000f575f5ffd5b5060405161173e38038061173e83398101604081905261002e9161014f565b8181806001600160a01b038116610058576040516339b190bb60e11b815260040160405180910390fd5b6001600160a01b03908116608052821660a05261007361007c565b50505050610187565b5f54610100900460ff16156100e75760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff90811614610136575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b038116811461014c575f5ffd5b50565b5f5f60408385031215610160575f5ffd5b825161016b81610138565b602084015190925061017c81610138565b809150509250929050565b60805160a0516115656101d95f395f81816101ce01528181610556015281816109790152610a1601525f81816102960152818161039501528181610467015281816106970152610b4401526115655ff3fe608060405234801561000f575f5ffd5b506004361061016d575f3560e01c80637a8b2637116100d9578063c4d66de811610093578063df6fadc11161006e578063df6fadc11461033f578063e3dae51c1461035a578063f3e738751461036d578063fabc1cbc14610380575f5ffd5b8063c4d66de814610306578063ce7c2ac214610319578063d9caed121461032c575f5ffd5b80637a8b26371461027e578063886f1195146102915780638c871019146102b85780638f6a6240146102cb578063a6ab36f2146102de578063ab5921e1146102f1575f5ffd5b806347e7ef241161012a57806347e7ef2414610210578063553ca5f814610223578063595c6a67146102365780635ac86ab71461023e5780635c975abb1461026d57806361b01b5d14610275575f5ffd5b806311c70c9d14610171578063136439dd146101865780632495a5991461019957806339b70e38146101c95780633a98ef39146101f057806343fe08b014610207575b5f5ffd5b61018461017f366004611236565b610393565b005b610184610194366004611256565b610452565b6032546101ac906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b6101ac7f000000000000000000000000000000000000000000000000000000000000000081565b6101f960335481565b6040519081526020016101c0565b6101f960645481565b6101f961021e366004611284565b610523565b6101f96102313660046112ae565b61066f565b610184610682565b61025d61024c3660046112de565b6001805460ff9092161b9081161490565b60405190151581526020016101c0565b6001546101f9565b6101f960655481565b6101f961028c366004611256565b610731565b6101ac7f000000000000000000000000000000000000000000000000000000000000000081565b6101f96102c6366004611256565b61077a565b6101f96102d93660046112ae565b610784565b6101846102ec3660046112f9565b610791565b6102f961086c565b6040516101c0919061132f565b6101846103143660046112ae565b61088c565b6101f96103273660046112ae565b610952565b61018461033a366004611364565b6109e4565b606454606554604080519283526020830191909152016101c0565b6101f9610368366004611256565b610b01565b6101f961037b366004611256565b610b38565b61018461038e366004611256565b610b42565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156103ef573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061041391906113a2565b6001600160a01b0316336001600160a01b0316146104445760405163794821ff60e01b815260040160405180910390fd5b61044e8282610c58565b5050565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa1580156104b4573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104d891906113bd565b6104f557604051631d77d47760e21b815260040160405180910390fd5b600154818116811461051a5760405163c61dca5d60e01b815260040160405180910390fd5b61044e82610cfc565b600180545f91829181160361054b5760405163840a48d560e01b815260040160405180910390fd5b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610594576040516348da714f60e01b815260040160405180910390fd5b61059e8484610d39565b6033545f6105ae6103e8836113f0565b90505f6103e86105bc610d90565b6105c691906113f0565b90505f6105d38783611403565b9050806105e08489611416565b6105ea919061142d565b9550855f0361060c57604051630c392ed360e11b815260040160405180910390fd5b61061686856113f0565b60338190556f4b3b4ca85a86c47a098a223fffffffff101561064b57604051632f14e8a360e11b815260040160405180910390fd5b610664826103e860335461065f91906113f0565b610dff565b505050505092915050565b5f61067c61028c83610952565b92915050565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa1580156106e4573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061070891906113bd565b61072557604051631d77d47760e21b815260040160405180910390fd5b61072f5f19610cfc565b565b5f5f6103e860335461074391906113f0565b90505f6103e8610751610d90565b61075b91906113f0565b9050816107688583611416565b610772919061142d565b949350505050565b5f61067c82610b01565b5f61067c61037b83610952565b5f54610100900460ff16158080156107af57505f54600160ff909116105b806107c85750303b1580156107c857505f5460ff166001145b6107ed5760405162461bcd60e51b81526004016107e49061144c565b60405180910390fd5b5f805460ff19166001179055801561080e575f805461ff0019166101001790555b6108188484610c58565b61082182610e4b565b8015610866575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b60606040518060800160405280604d81526020016114e3604d9139905090565b5f54610100900460ff16158080156108aa57505f54600160ff909116105b806108c35750303b1580156108c357505f5460ff166001145b6108df5760405162461bcd60e51b81526004016107e49061144c565b5f805460ff191660011790558015610900575f805461ff0019166101001790555b61090982610e4b565b801561044e575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498906020015b60405180910390a15050565b60405163fe243a1760e01b81526001600160a01b0382811660048301523060248301525f917f00000000000000000000000000000000000000000000000000000000000000009091169063fe243a1790604401602060405180830381865afa1580156109c0573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061067c919061149a565b60018054600290811603610a0b5760405163840a48d560e01b815260040160405180910390fd5b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610a54576040516348da714f60e01b815260040160405180910390fd5b610a5f848484610f96565b60335480831115610a8357604051630b469df360e41b815260040160405180910390fd5b5f610a906103e8836113f0565b90505f6103e8610a9e610d90565b610aa891906113f0565b90505f82610ab68784611416565b610ac0919061142d565b9050610acc8685611403565b603355610aec610adc8284611403565b6103e860335461065f91906113f0565b610af7888883610fc9565b5050505050505050565b5f5f6103e8603354610b1391906113f0565b90505f6103e8610b21610d90565b610b2b91906113f0565b9050806107688386611416565b5f61067c82610731565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b9e573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610bc291906113a2565b6001600160a01b0316336001600160a01b031614610bf35760405163794821ff60e01b815260040160405180910390fd5b60015480198219811614610c1a5760405163c61dca5d60e01b815260040160405180910390fd5b600182905560405182815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c9060200160405180910390a25050565b60645460408051918252602082018490527ff97ed4e083acac67830025ecbc756d8fe847cdbdca4cee3fe1e128e98b54ecb5910160405180910390a160655460408051918252602082018390527f6ab181e0440bfbf4bacdf2e99674735ce6638005490688c5f994f5399353e452910160405180910390a180821115610cf15760405163052b07b760e21b815260040160405180910390fd5b606491909155606555565b600181905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a250565b606454811115610d5c5760405163052b07b760e21b815260040160405180910390fd5b606554610d67610d90565b1115610d865760405163d86bae6760e01b815260040160405180910390fd5b61044e8282610fdd565b6032546040516370a0823160e01b81523060048201525f916001600160a01b0316906370a0823190602401602060405180830381865afa158015610dd6573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610dfa919061149a565b905090565b7fd2494f3479e5da49d386657c292c610b5b01df313d07c62eb0cfa49924a31be881610e3384670de0b6b3a7640000611416565b610e3d919061142d565b604051908152602001610946565b5f54610100900460ff16610eb55760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b60648201526084016107e4565b603280546001600160a01b0319166001600160a01b038316179055610ed95f610cfc565b7f1c540707b00eb5427b6b774fc799d756516a54aee108b64b327acc55af55750760325f9054906101000a90046001600160a01b0316826001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f4b573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f6f91906114b1565b604080516001600160a01b03909316835260ff90911660208301520160405180910390a150565b6032546001600160a01b03838116911614610fc457604051630312abdd60e61b815260040160405180910390fd5b505050565b610fc46001600160a01b038316848361100b565b6032546001600160a01b0383811691161461044e57604051630312abdd60e61b815260040160405180910390fd5b604080516001600160a01b03848116602483015260448083018590528351808403909101815260649092018352602080830180516001600160e01b031663a9059cbb60e01b17905283518085019094528084527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c656490840152610fc4928692915f9161109a918516908490611119565b905080515f14806110ba5750808060200190518101906110ba91906113bd565b610fc45760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016107e4565b606061077284845f85855f5f866001600160a01b0316858760405161113e91906114cc565b5f6040518083038185875af1925050503d805f8114611178576040519150601f19603f3d011682016040523d82523d5f602084013e61117d565b606091505b509150915061118e87838387611199565b979650505050505050565b606083156112075782515f03611200576001600160a01b0385163b6112005760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016107e4565b5081610772565b610772838381511561121c5781518083602001fd5b8060405162461bcd60e51b81526004016107e4919061132f565b5f5f60408385031215611247575f5ffd5b50508035926020909101359150565b5f60208284031215611266575f5ffd5b5035919050565b6001600160a01b0381168114611281575f5ffd5b50565b5f5f60408385031215611295575f5ffd5b82356112a08161126d565b946020939093013593505050565b5f602082840312156112be575f5ffd5b81356112c98161126d565b9392505050565b60ff81168114611281575f5ffd5b5f602082840312156112ee575f5ffd5b81356112c9816112d0565b5f5f5f6060848603121561130b575f5ffd5b833592506020840135915060408401356113248161126d565b809150509250925092565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b5f5f5f60608486031215611376575f5ffd5b83356113818161126d565b925060208401356113918161126d565b929592945050506040919091013590565b5f602082840312156113b2575f5ffd5b81516112c98161126d565b5f602082840312156113cd575f5ffd5b815180151581146112c9575f5ffd5b634e487b7160e01b5f52601160045260245ffd5b8082018082111561067c5761067c6113dc565b8181038181111561067c5761067c6113dc565b808202811582820484141761067c5761067c6113dc565b5f8261144757634e487b7160e01b5f52601260045260245ffd5b500490565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b5f602082840312156114aa575f5ffd5b5051919050565b5f602082840312156114c1575f5ffd5b81516112c9816112d0565b5f82518060208501845e5f92019182525091905056fe4261736520537472617465677920696d706c656d656e746174696f6e20746f20696e68657269742066726f6d20666f72206d6f726520636f6d706c657820696d706c656d656e746174696f6e73a26469706673582212208c53540f8e55ee9e91a437707dac638091cff6d578e7c91da177d7e72a1d24c664736f6c634300081b0033", + Bin: "0x60c060405234801561000f575f5ffd5b5060405161173e38038061173e83398101604081905261002e9161014f565b8181806001600160a01b038116610058576040516339b190bb60e11b815260040160405180910390fd5b6001600160a01b03908116608052821660a05261007361007c565b50505050610187565b5f54610100900460ff16156100e75760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff90811614610136575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b038116811461014c575f5ffd5b50565b5f5f60408385031215610160575f5ffd5b825161016b81610138565b602084015190925061017c81610138565b809150509250929050565b60805160a0516115656101d95f395f81816101ce01528181610556015281816109790152610a1601525f81816102960152818161039501528181610467015281816106970152610b4401526115655ff3fe608060405234801561000f575f5ffd5b506004361061016d575f3560e01c80637a8b2637116100d9578063c4d66de811610093578063df6fadc11161006e578063df6fadc11461033f578063e3dae51c1461035a578063f3e738751461036d578063fabc1cbc14610380575f5ffd5b8063c4d66de814610306578063ce7c2ac214610319578063d9caed121461032c575f5ffd5b80637a8b26371461027e578063886f1195146102915780638c871019146102b85780638f6a6240146102cb578063a6ab36f2146102de578063ab5921e1146102f1575f5ffd5b806347e7ef241161012a57806347e7ef2414610210578063553ca5f814610223578063595c6a67146102365780635ac86ab71461023e5780635c975abb1461026d57806361b01b5d14610275575f5ffd5b806311c70c9d14610171578063136439dd146101865780632495a5991461019957806339b70e38146101c95780633a98ef39146101f057806343fe08b014610207575b5f5ffd5b61018461017f366004611236565b610393565b005b610184610194366004611256565b610452565b6032546101ac906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b6101ac7f000000000000000000000000000000000000000000000000000000000000000081565b6101f960335481565b6040519081526020016101c0565b6101f960645481565b6101f961021e366004611284565b610523565b6101f96102313660046112ae565b61066f565b610184610682565b61025d61024c3660046112de565b6001805460ff9092161b9081161490565b60405190151581526020016101c0565b6001546101f9565b6101f960655481565b6101f961028c366004611256565b610731565b6101ac7f000000000000000000000000000000000000000000000000000000000000000081565b6101f96102c6366004611256565b61077a565b6101f96102d93660046112ae565b610784565b6101846102ec3660046112f9565b610791565b6102f961086c565b6040516101c0919061132f565b6101846103143660046112ae565b61088c565b6101f96103273660046112ae565b610952565b61018461033a366004611364565b6109e4565b606454606554604080519283526020830191909152016101c0565b6101f9610368366004611256565b610b01565b6101f961037b366004611256565b610b38565b61018461038e366004611256565b610b42565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156103ef573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061041391906113a2565b6001600160a01b0316336001600160a01b0316146104445760405163794821ff60e01b815260040160405180910390fd5b61044e8282610c58565b5050565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa1580156104b4573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104d891906113bd565b6104f557604051631d77d47760e21b815260040160405180910390fd5b600154818116811461051a5760405163c61dca5d60e01b815260040160405180910390fd5b61044e82610cfc565b600180545f91829181160361054b5760405163840a48d560e01b815260040160405180910390fd5b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610594576040516348da714f60e01b815260040160405180910390fd5b61059e8484610d39565b6033545f6105ae6103e8836113f0565b90505f6103e86105bc610d90565b6105c691906113f0565b90505f6105d38783611403565b9050806105e08489611416565b6105ea919061142d565b9550855f0361060c57604051630c392ed360e11b815260040160405180910390fd5b61061686856113f0565b60338190556f4b3b4ca85a86c47a098a223fffffffff101561064b57604051632f14e8a360e11b815260040160405180910390fd5b610664826103e860335461065f91906113f0565b610dff565b505050505092915050565b5f61067c61028c83610952565b92915050565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa1580156106e4573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061070891906113bd565b61072557604051631d77d47760e21b815260040160405180910390fd5b61072f5f19610cfc565b565b5f5f6103e860335461074391906113f0565b90505f6103e8610751610d90565b61075b91906113f0565b9050816107688583611416565b610772919061142d565b949350505050565b5f61067c82610b01565b5f61067c61037b83610952565b5f54610100900460ff16158080156107af57505f54600160ff909116105b806107c85750303b1580156107c857505f5460ff166001145b6107ed5760405162461bcd60e51b81526004016107e49061144c565b60405180910390fd5b5f805460ff19166001179055801561080e575f805461ff0019166101001790555b6108188484610c58565b61082182610e4b565b8015610866575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b60606040518060800160405280604d81526020016114e3604d9139905090565b5f54610100900460ff16158080156108aa57505f54600160ff909116105b806108c35750303b1580156108c357505f5460ff166001145b6108df5760405162461bcd60e51b81526004016107e49061144c565b5f805460ff191660011790558015610900575f805461ff0019166101001790555b61090982610e4b565b801561044e575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498906020015b60405180910390a15050565b60405163fe243a1760e01b81526001600160a01b0382811660048301523060248301525f917f00000000000000000000000000000000000000000000000000000000000000009091169063fe243a1790604401602060405180830381865afa1580156109c0573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061067c919061149a565b60018054600290811603610a0b5760405163840a48d560e01b815260040160405180910390fd5b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610a54576040516348da714f60e01b815260040160405180910390fd5b610a5f848484610f96565b60335480831115610a8357604051630b469df360e41b815260040160405180910390fd5b5f610a906103e8836113f0565b90505f6103e8610a9e610d90565b610aa891906113f0565b90505f82610ab68784611416565b610ac0919061142d565b9050610acc8685611403565b603355610aec610adc8284611403565b6103e860335461065f91906113f0565b610af7888883610fc9565b5050505050505050565b5f5f6103e8603354610b1391906113f0565b90505f6103e8610b21610d90565b610b2b91906113f0565b9050806107688386611416565b5f61067c82610731565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b9e573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610bc291906113a2565b6001600160a01b0316336001600160a01b031614610bf35760405163794821ff60e01b815260040160405180910390fd5b60015480198219811614610c1a5760405163c61dca5d60e01b815260040160405180910390fd5b600182905560405182815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c9060200160405180910390a25050565b60645460408051918252602082018490527ff97ed4e083acac67830025ecbc756d8fe847cdbdca4cee3fe1e128e98b54ecb5910160405180910390a160655460408051918252602082018390527f6ab181e0440bfbf4bacdf2e99674735ce6638005490688c5f994f5399353e452910160405180910390a180821115610cf15760405163052b07b760e21b815260040160405180910390fd5b606491909155606555565b600181905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a250565b606454811115610d5c5760405163052b07b760e21b815260040160405180910390fd5b606554610d67610d90565b1115610d865760405163d86bae6760e01b815260040160405180910390fd5b61044e8282610fdd565b6032546040516370a0823160e01b81523060048201525f916001600160a01b0316906370a0823190602401602060405180830381865afa158015610dd6573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610dfa919061149a565b905090565b7fd2494f3479e5da49d386657c292c610b5b01df313d07c62eb0cfa49924a31be881610e3384670de0b6b3a7640000611416565b610e3d919061142d565b604051908152602001610946565b5f54610100900460ff16610eb55760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b60648201526084016107e4565b603280546001600160a01b0319166001600160a01b038316179055610ed95f610cfc565b7f1c540707b00eb5427b6b774fc799d756516a54aee108b64b327acc55af55750760325f9054906101000a90046001600160a01b0316826001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f4b573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f6f91906114b1565b604080516001600160a01b03909316835260ff90911660208301520160405180910390a150565b6032546001600160a01b03838116911614610fc457604051630312abdd60e61b815260040160405180910390fd5b505050565b610fc46001600160a01b038316848361100b565b6032546001600160a01b0383811691161461044e57604051630312abdd60e61b815260040160405180910390fd5b604080516001600160a01b03848116602483015260448083018590528351808403909101815260649092018352602080830180516001600160e01b031663a9059cbb60e01b17905283518085019094528084527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c656490840152610fc4928692915f9161109a918516908490611119565b905080515f14806110ba5750808060200190518101906110ba91906113bd565b610fc45760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016107e4565b606061077284845f85855f5f866001600160a01b0316858760405161113e91906114cc565b5f6040518083038185875af1925050503d805f8114611178576040519150601f19603f3d011682016040523d82523d5f602084013e61117d565b606091505b509150915061118e87838387611199565b979650505050505050565b606083156112075782515f03611200576001600160a01b0385163b6112005760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016107e4565b5081610772565b610772838381511561121c5781518083602001fd5b8060405162461bcd60e51b81526004016107e4919061132f565b5f5f60408385031215611247575f5ffd5b50508035926020909101359150565b5f60208284031215611266575f5ffd5b5035919050565b6001600160a01b0381168114611281575f5ffd5b50565b5f5f60408385031215611295575f5ffd5b82356112a08161126d565b946020939093013593505050565b5f602082840312156112be575f5ffd5b81356112c98161126d565b9392505050565b60ff81168114611281575f5ffd5b5f602082840312156112ee575f5ffd5b81356112c9816112d0565b5f5f5f6060848603121561130b575f5ffd5b833592506020840135915060408401356113248161126d565b809150509250925092565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b5f5f5f60608486031215611376575f5ffd5b83356113818161126d565b925060208401356113918161126d565b929592945050506040919091013590565b5f602082840312156113b2575f5ffd5b81516112c98161126d565b5f602082840312156113cd575f5ffd5b815180151581146112c9575f5ffd5b634e487b7160e01b5f52601160045260245ffd5b8082018082111561067c5761067c6113dc565b8181038181111561067c5761067c6113dc565b808202811582820484141761067c5761067c6113dc565b5f8261144757634e487b7160e01b5f52601260045260245ffd5b500490565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b5f602082840312156114aa575f5ffd5b5051919050565b5f602082840312156114c1575f5ffd5b81516112c9816112d0565b5f82518060208501845e5f92019182525091905056fe4261736520537472617465677920696d706c656d656e746174696f6e20746f20696e68657269742066726f6d20666f72206d6f726520636f6d706c657820696d706c656d656e746174696f6e73a26469706673582212208881d7f24e0aaa802aa95109d02da54b43f8bec344dd464bcec12afbcd6ff49f64736f6c634300081b0033", } // 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 aa6f42a465..598d583cb2 100644 --- a/pkg/bindings/StrategyFactory/binding.go +++ b/pkg/bindings/StrategyFactory/binding.go @@ -32,7 +32,7 @@ var ( // StrategyFactoryMetaData contains all meta data concerning the StrategyFactory contract. var StrategyFactoryMetaData = &bind.MetaData{ ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"_strategyManager\",\"type\":\"address\",\"internalType\":\"contractIStrategyManager\"},{\"name\":\"_pauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"blacklistTokens\",\"inputs\":[{\"name\":\"tokens\",\"type\":\"address[]\",\"internalType\":\"contractIERC20[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"deployNewStrategy\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"outputs\":[{\"name\":\"newStrategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"deployedStrategies\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"_initialOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_initialPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_strategyBeacon\",\"type\":\"address\",\"internalType\":\"contractIBeacon\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"isBlacklisted\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"pauseAll\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[{\"name\":\"index\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pauserRegistry\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"removeStrategiesFromWhitelist\",\"inputs\":[{\"name\":\"strategiesToRemoveFromWhitelist\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"strategyBeacon\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIBeacon\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"strategyManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategyManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"whitelistStrategies\",\"inputs\":[{\"name\":\"strategiesToWhitelist\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StrategyBeaconModified\",\"inputs\":[{\"name\":\"previousBeacon\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIBeacon\"},{\"name\":\"newBeacon\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIBeacon\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StrategySetForToken\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIERC20\"},{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TokenBlacklisted\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIERC20\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"AlreadyBlacklisted\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"BlacklistedToken\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"CurrentlyPaused\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InputAddressZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidNewPausedStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyPauser\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyUnpauser\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StrategyAlreadyExists\",\"inputs\":[]}]", - Bin: "0x60c060405234801561000f575f5ffd5b5060405161195e38038061195e83398101604081905261002e9161014e565b806001600160a01b038116610056576040516339b190bb60e11b815260040160405180910390fd5b6001600160a01b03908116608052821660a052610071610078565b5050610186565b603354610100900460ff16156100e45760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60335460ff90811614610135576033805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b038116811461014b575f5ffd5b50565b5f5f6040838503121561015f575f5ffd5b825161016a81610137565b602084015190925061017b81610137565b809150509250929050565b60805160a0516117866101d85f395f8181610142015281816105d501528181610869015281816109060152610c4701525f8181610215015281816102f0015281816106530152610b1401526117865ff3fe608060405234801561000f575f5ffd5b5060043610610111575f3560e01c8063886f11951161009e578063f0062d9a1161006e578063f0062d9a1461026e578063f2fde38b14610280578063fabc1cbc14610293578063fe38b32d146102a6578063fe575a87146102b9575f5ffd5b8063886f1195146102105780638da5cb5b14610237578063b768ebc914610248578063c350a1b51461025b575f5ffd5b8063595c6a67116100e4578063595c6a67146101a95780635ac86ab7146101b15780635c975abb146101e45780636b9b6229146101f5578063715018a614610208575f5ffd5b8063136439dd1461011557806323103c411461012a57806339b70e381461013d578063581dfd6514610181575b5f5ffd5b610128610123366004610e44565b6102db565b005b610128610138366004610ea3565b6103b0565b6101647f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020015b60405180910390f35b61016461018f366004610ef6565b60016020525f90815260409020546001600160a01b031681565b61012861063e565b6101d46101bf366004610f18565b609954600160ff9092169190911b9081161490565b6040519015158152602001610178565b609954604051908152602001610178565b610164610203366004610ef6565b6106ed565b6101286108d6565b6101647f000000000000000000000000000000000000000000000000000000000000000081565b6066546001600160a01b0316610164565b610128610256366004610ea3565b6108e7565b610128610269366004610f38565b61096e565b5f54610164906001600160a01b031681565b61012861028e366004610ef6565b610a99565b6101286102a1366004610e44565b610b12565b6101286102b4366004610ea3565b610c28565b6101d46102c7366004610ef6565b60026020525f908152604090205460ff1681565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa15801561033d573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103619190610f77565b61037e57604051631d77d47760e21b815260040160405180910390fd5b60995481811681146103a35760405163c61dca5d60e01b815260040160405180910390fd5b6103ac82610c7e565b5050565b6103b8610cbb565b5f8167ffffffffffffffff8111156103d2576103d2610f96565b6040519080825280602002602001820160405280156103fb578160200160208202803683370190505b5090505f805b838110156105b45760025f86868481811061041e5761041e610faa565b90506020020160208101906104339190610ef6565b6001600160a01b0316815260208101919091526040015f205460ff161561046d5760405163f53de75f60e01b815260040160405180910390fd5b600160025f87878581811061048457610484610faa565b90506020020160208101906104999190610ef6565b6001600160a01b0316815260208101919091526040015f20805460ff19169115159190911790557f75519c51f39873ec0e27dd3bbc09549e4865a113f505393fb9eab5898f6418b38585838181106104f3576104f3610faa565b90506020020160208101906105089190610ef6565b6040516001600160a01b03909116815260200160405180910390a15f60015f87878581811061053957610539610faa565b905060200201602081019061054e9190610ef6565b6001600160a01b03908116825260208201929092526040015f205416905080156105ab578084848151811061058557610585610faa565b6001600160a01b0390921660209283029190910190910152826105a781610fbe565b9350505b50600101610401565b508082528015610638576040516316bb16b760e31b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063b5d8b5b89061060a908590600401610fe2565b5f604051808303815f87803b158015610621575f5ffd5b505af1158015610633573d5f5f3e3d5ffd5b505050505b50505050565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa1580156106a0573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106c49190610f77565b6106e157604051631d77d47760e21b815260040160405180910390fd5b6106eb5f19610c7e565b565b6099545f9081906001908116036107175760405163840a48d560e01b815260040160405180910390fd5b6001600160a01b0383165f9081526002602052604090205460ff16156107505760405163091867bd60e11b815260040160405180910390fd5b6001600160a01b038381165f9081526001602052604090205416156107885760405163c45546f760e01b815260040160405180910390fd5b5f8054604080516001600160a01b0387811660248084019190915283518084039091018152604490920183526020820180516001600160e01b031663189acdbd60e31b17905291519190921691906107df90610e37565b6107ea92919061102d565b604051809103905ff080158015610803573d5f5f3e3d5ffd5b5090506108108482610d15565b6040805160018082528183019092525f916020808301908036833701905050905081815f8151811061084457610844610faa565b6001600160a01b039283166020918202929092010152604051632ef047f960e11b81527f000000000000000000000000000000000000000000000000000000000000000090911690635de08ff2906108a0908490600401610fe2565b5f604051808303815f87803b1580156108b7575f5ffd5b505af11580156108c9573d5f5f3e3d5ffd5b5093979650505050505050565b6108de610cbb565b6106eb5f610d7f565b6108ef610cbb565b604051632ef047f960e11b81526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690635de08ff29061093d9085908590600401611071565b5f604051808303815f87803b158015610954575f5ffd5b505af1158015610966573d5f5f3e3d5ffd5b505050505050565b603354610100900460ff161580801561098e5750603354600160ff909116105b806109a85750303b1580156109a8575060335460ff166001145b610a105760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b6033805460ff191660011790558015610a33576033805461ff0019166101001790555b610a3c84610d7f565b610a4583610c7e565b610a4e82610dd0565b8015610638576033805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a150505050565b610aa1610cbb565b6001600160a01b038116610b065760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610a07565b610b0f81610d7f565b50565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b6e573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b9291906110bd565b6001600160a01b0316336001600160a01b031614610bc35760405163794821ff60e01b815260040160405180910390fd5b60995480198219811614610bea5760405163c61dca5d60e01b815260040160405180910390fd5b609982905560405182815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c9060200160405180910390a25050565b610c30610cbb565b6040516316bb16b760e31b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063b5d8b5b89061093d9085908590600401611071565b609981905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a250565b6066546001600160a01b031633146106eb5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a07565b6001600160a01b038281165f8181526001602090815260409182902080546001600160a01b031916948616948517905581519283528201929092527f6852a55230ef089d785bce7ffbf757985de34026df90a87d7b4a6e56f95d251f910160405180910390a15050565b606680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b5f54604080516001600160a01b03928316815291831660208301527fe21755962a7d7e100b59b9c3e4d4b54085b146313719955efb6a7a25c5c7feee910160405180910390a15f80546001600160a01b0319166001600160a01b0392909216919091179055565b610678806110d983390190565b5f60208284031215610e54575f5ffd5b5035919050565b5f5f83601f840112610e6b575f5ffd5b50813567ffffffffffffffff811115610e82575f5ffd5b6020830191508360208260051b8501011115610e9c575f5ffd5b9250929050565b5f5f60208385031215610eb4575f5ffd5b823567ffffffffffffffff811115610eca575f5ffd5b610ed685828601610e5b565b90969095509350505050565b6001600160a01b0381168114610b0f575f5ffd5b5f60208284031215610f06575f5ffd5b8135610f1181610ee2565b9392505050565b5f60208284031215610f28575f5ffd5b813560ff81168114610f11575f5ffd5b5f5f5f60608486031215610f4a575f5ffd5b8335610f5581610ee2565b9250602084013591506040840135610f6c81610ee2565b809150509250925092565b5f60208284031215610f87575f5ffd5b81518015158114610f11575f5ffd5b634e487b7160e01b5f52604160045260245ffd5b634e487b7160e01b5f52603260045260245ffd5b5f60018201610fdb57634e487b7160e01b5f52601160045260245ffd5b5060010190565b602080825282518282018190525f918401906040840190835b818110156110225783516001600160a01b0316835260209384019390920191600101610ffb565b509095945050505050565b60018060a01b0383168152604060208201525f82518060408401528060208501606085015e5f606082850101526060601f19601f8301168401019150509392505050565b602080825281018290525f8360408301825b858110156110b357823561109681610ee2565b6001600160a01b0316825260209283019290910190600101611083565b5095945050505050565b5f602082840312156110cd575f5ffd5b8151610f1181610ee256fe6080604052604051610678380380610678833981016040819052610022916103ed565b61002d82825f610034565b5050610513565b61003d836100f1565b6040516001600160a01b038416907f1cf3b03a6cf19fa2baba4df148e9dcabedea7f8a5c07840e207e5c089be95d3e905f90a25f8251118061007c5750805b156100ec576100ea836001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156100c0573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906100e491906104af565b83610273565b505b505050565b6001600160a01b0381163b61015b5760405162461bcd60e51b815260206004820152602560248201527f455243313936373a206e657720626561636f6e206973206e6f74206120636f6e6044820152641d1c9858dd60da1b60648201526084015b60405180910390fd5b6101cd816001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561019a573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906101be91906104af565b6001600160a01b03163b151590565b6102325760405162461bcd60e51b815260206004820152603060248201527f455243313936373a20626561636f6e20696d706c656d656e746174696f6e206960448201526f1cc81b9bdd08184818dbdb9d1c9858dd60821b6064820152608401610152565b7fa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d5080546001600160a01b0319166001600160a01b0392909216919091179055565b606061029883836040518060600160405280602781526020016106516027913961029f565b9392505050565b60605f5f856001600160a01b0316856040516102bb91906104c8565b5f60405180830381855af49150503d805f81146102f3576040519150601f19603f3d011682016040523d82523d5f602084013e6102f8565b606091505b50909250905061030a86838387610314565b9695505050505050565b606083156103825782515f0361037b576001600160a01b0385163b61037b5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610152565b508161038c565b61038c8383610394565b949350505050565b8151156103a45781518083602001fd5b8060405162461bcd60e51b815260040161015291906104de565b80516001600160a01b03811681146103d4575f5ffd5b919050565b634e487b7160e01b5f52604160045260245ffd5b5f5f604083850312156103fe575f5ffd5b610407836103be565b60208401519092506001600160401b03811115610422575f5ffd5b8301601f81018513610432575f5ffd5b80516001600160401b0381111561044b5761044b6103d9565b604051601f8201601f19908116603f011681016001600160401b0381118282101715610479576104796103d9565b604052818152828201602001871015610490575f5ffd5b8160208401602083015e5f602083830101528093505050509250929050565b5f602082840312156104bf575f5ffd5b610298826103be565b5f82518060208501845e5f920191825250919050565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b610131806105205f395ff3fe608060405236601057600e6013565b005b600e5b601f601b6021565b60b3565b565b5f60527fa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50546001600160a01b031690565b6001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015608c573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019060ae919060d0565b905090565b365f5f375f5f365f845af43d5f5f3e80801560cc573d5ff35b3d5ffd5b5f6020828403121560df575f5ffd5b81516001600160a01b038116811460f4575f5ffd5b939250505056fea2646970667358221220f37d2ffd80ec7d14cc9a0f17394e9d97446c1f630de382043b1ed4ccacf6a7d464736f6c634300081b0033416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a26469706673582212204d3c33703abfc3abdc8b755aa836265d0b4b850a6fda4e8380b8558b8d975be164736f6c634300081b0033", + Bin: "0x60c060405234801561000f575f5ffd5b5060405161195e38038061195e83398101604081905261002e9161014e565b806001600160a01b038116610056576040516339b190bb60e11b815260040160405180910390fd5b6001600160a01b03908116608052821660a052610071610078565b5050610186565b603354610100900460ff16156100e45760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60335460ff90811614610135576033805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b038116811461014b575f5ffd5b50565b5f5f6040838503121561015f575f5ffd5b825161016a81610137565b602084015190925061017b81610137565b809150509250929050565b60805160a0516117866101d85f395f8181610142015281816105d501528181610869015281816109060152610c4701525f8181610215015281816102f0015281816106530152610b1401526117865ff3fe608060405234801561000f575f5ffd5b5060043610610111575f3560e01c8063886f11951161009e578063f0062d9a1161006e578063f0062d9a1461026e578063f2fde38b14610280578063fabc1cbc14610293578063fe38b32d146102a6578063fe575a87146102b9575f5ffd5b8063886f1195146102105780638da5cb5b14610237578063b768ebc914610248578063c350a1b51461025b575f5ffd5b8063595c6a67116100e4578063595c6a67146101a95780635ac86ab7146101b15780635c975abb146101e45780636b9b6229146101f5578063715018a614610208575f5ffd5b8063136439dd1461011557806323103c411461012a57806339b70e381461013d578063581dfd6514610181575b5f5ffd5b610128610123366004610e44565b6102db565b005b610128610138366004610ea3565b6103b0565b6101647f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020015b60405180910390f35b61016461018f366004610ef6565b60016020525f90815260409020546001600160a01b031681565b61012861063e565b6101d46101bf366004610f18565b609954600160ff9092169190911b9081161490565b6040519015158152602001610178565b609954604051908152602001610178565b610164610203366004610ef6565b6106ed565b6101286108d6565b6101647f000000000000000000000000000000000000000000000000000000000000000081565b6066546001600160a01b0316610164565b610128610256366004610ea3565b6108e7565b610128610269366004610f38565b61096e565b5f54610164906001600160a01b031681565b61012861028e366004610ef6565b610a99565b6101286102a1366004610e44565b610b12565b6101286102b4366004610ea3565b610c28565b6101d46102c7366004610ef6565b60026020525f908152604090205460ff1681565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa15801561033d573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103619190610f77565b61037e57604051631d77d47760e21b815260040160405180910390fd5b60995481811681146103a35760405163c61dca5d60e01b815260040160405180910390fd5b6103ac82610c7e565b5050565b6103b8610cbb565b5f8167ffffffffffffffff8111156103d2576103d2610f96565b6040519080825280602002602001820160405280156103fb578160200160208202803683370190505b5090505f805b838110156105b45760025f86868481811061041e5761041e610faa565b90506020020160208101906104339190610ef6565b6001600160a01b0316815260208101919091526040015f205460ff161561046d5760405163f53de75f60e01b815260040160405180910390fd5b600160025f87878581811061048457610484610faa565b90506020020160208101906104999190610ef6565b6001600160a01b0316815260208101919091526040015f20805460ff19169115159190911790557f75519c51f39873ec0e27dd3bbc09549e4865a113f505393fb9eab5898f6418b38585838181106104f3576104f3610faa565b90506020020160208101906105089190610ef6565b6040516001600160a01b03909116815260200160405180910390a15f60015f87878581811061053957610539610faa565b905060200201602081019061054e9190610ef6565b6001600160a01b03908116825260208201929092526040015f205416905080156105ab578084848151811061058557610585610faa565b6001600160a01b0390921660209283029190910190910152826105a781610fbe565b9350505b50600101610401565b508082528015610638576040516316bb16b760e31b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063b5d8b5b89061060a908590600401610fe2565b5f604051808303815f87803b158015610621575f5ffd5b505af1158015610633573d5f5f3e3d5ffd5b505050505b50505050565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa1580156106a0573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106c49190610f77565b6106e157604051631d77d47760e21b815260040160405180910390fd5b6106eb5f19610c7e565b565b6099545f9081906001908116036107175760405163840a48d560e01b815260040160405180910390fd5b6001600160a01b0383165f9081526002602052604090205460ff16156107505760405163091867bd60e11b815260040160405180910390fd5b6001600160a01b038381165f9081526001602052604090205416156107885760405163c45546f760e01b815260040160405180910390fd5b5f8054604080516001600160a01b0387811660248084019190915283518084039091018152604490920183526020820180516001600160e01b031663189acdbd60e31b17905291519190921691906107df90610e37565b6107ea92919061102d565b604051809103905ff080158015610803573d5f5f3e3d5ffd5b5090506108108482610d15565b6040805160018082528183019092525f916020808301908036833701905050905081815f8151811061084457610844610faa565b6001600160a01b039283166020918202929092010152604051632ef047f960e11b81527f000000000000000000000000000000000000000000000000000000000000000090911690635de08ff2906108a0908490600401610fe2565b5f604051808303815f87803b1580156108b7575f5ffd5b505af11580156108c9573d5f5f3e3d5ffd5b5093979650505050505050565b6108de610cbb565b6106eb5f610d7f565b6108ef610cbb565b604051632ef047f960e11b81526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690635de08ff29061093d9085908590600401611071565b5f604051808303815f87803b158015610954575f5ffd5b505af1158015610966573d5f5f3e3d5ffd5b505050505050565b603354610100900460ff161580801561098e5750603354600160ff909116105b806109a85750303b1580156109a8575060335460ff166001145b610a105760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b6033805460ff191660011790558015610a33576033805461ff0019166101001790555b610a3c84610d7f565b610a4583610c7e565b610a4e82610dd0565b8015610638576033805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a150505050565b610aa1610cbb565b6001600160a01b038116610b065760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610a07565b610b0f81610d7f565b50565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b6e573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b9291906110bd565b6001600160a01b0316336001600160a01b031614610bc35760405163794821ff60e01b815260040160405180910390fd5b60995480198219811614610bea5760405163c61dca5d60e01b815260040160405180910390fd5b609982905560405182815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c9060200160405180910390a25050565b610c30610cbb565b6040516316bb16b760e31b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063b5d8b5b89061093d9085908590600401611071565b609981905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a250565b6066546001600160a01b031633146106eb5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a07565b6001600160a01b038281165f8181526001602090815260409182902080546001600160a01b031916948616948517905581519283528201929092527f6852a55230ef089d785bce7ffbf757985de34026df90a87d7b4a6e56f95d251f910160405180910390a15050565b606680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b5f54604080516001600160a01b03928316815291831660208301527fe21755962a7d7e100b59b9c3e4d4b54085b146313719955efb6a7a25c5c7feee910160405180910390a15f80546001600160a01b0319166001600160a01b0392909216919091179055565b610678806110d983390190565b5f60208284031215610e54575f5ffd5b5035919050565b5f5f83601f840112610e6b575f5ffd5b50813567ffffffffffffffff811115610e82575f5ffd5b6020830191508360208260051b8501011115610e9c575f5ffd5b9250929050565b5f5f60208385031215610eb4575f5ffd5b823567ffffffffffffffff811115610eca575f5ffd5b610ed685828601610e5b565b90969095509350505050565b6001600160a01b0381168114610b0f575f5ffd5b5f60208284031215610f06575f5ffd5b8135610f1181610ee2565b9392505050565b5f60208284031215610f28575f5ffd5b813560ff81168114610f11575f5ffd5b5f5f5f60608486031215610f4a575f5ffd5b8335610f5581610ee2565b9250602084013591506040840135610f6c81610ee2565b809150509250925092565b5f60208284031215610f87575f5ffd5b81518015158114610f11575f5ffd5b634e487b7160e01b5f52604160045260245ffd5b634e487b7160e01b5f52603260045260245ffd5b5f60018201610fdb57634e487b7160e01b5f52601160045260245ffd5b5060010190565b602080825282518282018190525f918401906040840190835b818110156110225783516001600160a01b0316835260209384019390920191600101610ffb565b509095945050505050565b60018060a01b0383168152604060208201525f82518060408401528060208501606085015e5f606082850101526060601f19601f8301168401019150509392505050565b602080825281018290525f8360408301825b858110156110b357823561109681610ee2565b6001600160a01b0316825260209283019290910190600101611083565b5095945050505050565b5f602082840312156110cd575f5ffd5b8151610f1181610ee256fe6080604052604051610678380380610678833981016040819052610022916103ed565b61002d82825f610034565b5050610513565b61003d836100f1565b6040516001600160a01b038416907f1cf3b03a6cf19fa2baba4df148e9dcabedea7f8a5c07840e207e5c089be95d3e905f90a25f8251118061007c5750805b156100ec576100ea836001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156100c0573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906100e491906104af565b83610273565b505b505050565b6001600160a01b0381163b61015b5760405162461bcd60e51b815260206004820152602560248201527f455243313936373a206e657720626561636f6e206973206e6f74206120636f6e6044820152641d1c9858dd60da1b60648201526084015b60405180910390fd5b6101cd816001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561019a573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906101be91906104af565b6001600160a01b03163b151590565b6102325760405162461bcd60e51b815260206004820152603060248201527f455243313936373a20626561636f6e20696d706c656d656e746174696f6e206960448201526f1cc81b9bdd08184818dbdb9d1c9858dd60821b6064820152608401610152565b7fa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d5080546001600160a01b0319166001600160a01b0392909216919091179055565b606061029883836040518060600160405280602781526020016106516027913961029f565b9392505050565b60605f5f856001600160a01b0316856040516102bb91906104c8565b5f60405180830381855af49150503d805f81146102f3576040519150601f19603f3d011682016040523d82523d5f602084013e6102f8565b606091505b50909250905061030a86838387610314565b9695505050505050565b606083156103825782515f0361037b576001600160a01b0385163b61037b5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610152565b508161038c565b61038c8383610394565b949350505050565b8151156103a45781518083602001fd5b8060405162461bcd60e51b815260040161015291906104de565b80516001600160a01b03811681146103d4575f5ffd5b919050565b634e487b7160e01b5f52604160045260245ffd5b5f5f604083850312156103fe575f5ffd5b610407836103be565b60208401519092506001600160401b03811115610422575f5ffd5b8301601f81018513610432575f5ffd5b80516001600160401b0381111561044b5761044b6103d9565b604051601f8201601f19908116603f011681016001600160401b0381118282101715610479576104796103d9565b604052818152828201602001871015610490575f5ffd5b8160208401602083015e5f602083830101528093505050509250929050565b5f602082840312156104bf575f5ffd5b610298826103be565b5f82518060208501845e5f920191825250919050565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b610131806105205f395ff3fe608060405236601057600e6013565b005b600e5b601f601b6021565b60b3565b565b5f60527fa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50546001600160a01b031690565b6001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015608c573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019060ae919060d0565b905090565b365f5f375f5f365f845af43d5f5f3e80801560cc573d5ff35b3d5ffd5b5f6020828403121560df575f5ffd5b81516001600160a01b038116811460f4575f5ffd5b939250505056fea2646970667358221220b2cd81c8646f248580ef0bc50fea50b23b0ad9d543d91e6e625e3aba226c5b5264736f6c634300081b0033416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a26469706673582212201e30e1c7e25f9e71470ec33d1e4eb1694538e630b96f5c3ddfa78f24010d1bd164736f6c634300081b0033", } // StrategyFactoryABI 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 0f82c23b68..6465263cee 100644 --- a/pkg/bindings/StrategyManager/binding.go +++ b/pkg/bindings/StrategyManager/binding.go @@ -31,8 +31,8 @@ var ( // StrategyManagerMetaData contains all meta data concerning the StrategyManager contract. var StrategyManagerMetaData = &bind.MetaData{ - ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"_delegation\",\"type\":\"address\",\"internalType\":\"contractIDelegationManager\"},{\"name\":\"_pauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"DEFAULT_BURN_ADDRESS\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"DEPOSIT_TYPEHASH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"addShares\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"shares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"addStrategiesToDepositWhitelist\",\"inputs\":[{\"name\":\"strategiesToWhitelist\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"burnShares\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"burnableShares\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"calculateStrategyDepositDigestHash\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"nonce\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"delegation\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIDelegationManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"depositIntoStrategy\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"depositShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"depositIntoStrategyWithSignature\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"depositShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"domainSeparator\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getDeposits\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getStakerStrategyList\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"increaseBurnableShares\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"addedSharesToBurn\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"initialOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"initialStrategyWhitelister\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"initialPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"nonces\",\"inputs\":[{\"name\":\"signer\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"nonce\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"pauseAll\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[{\"name\":\"index\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pauserRegistry\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"removeDepositShares\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"depositSharesToRemove\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"removeStrategiesFromDepositWhitelist\",\"inputs\":[{\"name\":\"strategiesToRemoveFromWhitelist\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setStrategyWhitelister\",\"inputs\":[{\"name\":\"newStrategyWhitelister\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"stakerDepositShares\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"shares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"stakerStrategyList\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"strategies\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"stakerStrategyListLength\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"strategyIsWhitelistedForDeposit\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"whitelisted\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"strategyWhitelister\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"withdrawSharesAsTokens\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"shares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"BurnableSharesDecreased\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"shares\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BurnableSharesIncreased\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"shares\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Deposit\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"token\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIERC20\"},{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"shares\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StrategyAddedToDepositWhitelist\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StrategyRemovedFromDepositWhitelist\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StrategyWhitelisterChanged\",\"inputs\":[{\"name\":\"previousAddress\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"newAddress\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"CurrentlyPaused\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InputAddressZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidNewPausedStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidSignature\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"MaxStrategiesExceeded\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyDelegationManager\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyPauser\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyStrategyWhitelister\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyUnpauser\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SharesAmountTooHigh\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SharesAmountZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SignatureExpired\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StakerAddressZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StrategyNotFound\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StrategyNotWhitelisted\",\"inputs\":[]}]", - Bin: "0x610100604052348015610010575f5ffd5b5060405161286038038061286083398101604081905261002f916101ed565b81816001600160a01b038116610058576040516339b190bb60e11b815260040160405180910390fd5b6001600160a01b039081166080521660a0524660c052610108604080518082018252600a81526922b4b3b2b72630bcb2b960b11b60209182015281517f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a866818301527f71b625cfad44bac63b13dba07f2e1d6084ee04b6f8752101ece6126d584ee6ea81840152466060820152306080808301919091528351808303909101815260a0909101909252815191012090565b60e05261011361011a565b5050610225565b5f54610100900460ff16156101855760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff908116146101d4575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b03811681146101ea575f5ffd5b50565b5f5f604083850312156101fe575f5ffd5b8251610209816101d6565b602084015190925061021a816101d6565b809150509250929050565b60805160a05160c05160e0516125d06102905f395f6112ef01525f61122f01525f81816104c50152818161076201528181610bfb01528181610f99015281816110b401526116d301525f81816103720152818161057101528181610a06015261131301526125d05ff3fe608060405234801561000f575f5ffd5b50600436106101fd575f3560e01c80638da5cb5b11610114578063de44acb6116100a9578063f2fde38b11610079578063f2fde38b146104fa578063f3b4a0001461050d578063f698da2514610517578063fabc1cbc1461051f578063fe243a1714610532575f5ffd5b8063de44acb61461048d578063debe1eab146104ad578063df5cf723146104c0578063e7a050aa146104e7575f5ffd5b8063b5d8b5b8116100e4578063b5d8b5b81461042c578063c4623ea11461043f578063c665670214610467578063cbc2bd621461047a575f5ffd5b80638da5cb5b146103d457806394f649dd146103e5578063967fc0d2146104065780639ac01d6114610419575f5ffd5b80635ac86ab711610195578063715018a611610165578063715018a614610333578063724af4231461033b5780637ecebe001461034e578063886f11951461036d5780638b8aac3c146103ac575f5ffd5b80635ac86ab7146102c35780635c975abb146102f65780635de08ff2146102fe578063663c1de414610311575f5ffd5b806332e89ace116101d057806332e89ace1461026e57806348825e94146102815780634b6d5d6e146102a8578063595c6a67146102bb575f5ffd5b8063136439dd146102015780631794bb3c146102165780631b3cbdc1146102295780632eae418c1461025b575b5f5ffd5b61021461020f36600461207e565b61055c565b005b6102146102243660046120a9565b610631565b6102486102373660046120e7565b60d46020525f908152604090205481565b6040519081526020015b60405180910390f35b610214610269366004612102565b610757565b61024861027c366004612164565b61080b565b6102487f4337f82d142e41f2a8c10547cd8c859bddb92262a61058e77842e24d9dea922481565b6102146102b63660046120e7565b6108af565b6102146109f1565b6102e66102d136600461225f565b609854600160ff9092169190911b9081161490565b6040519015158152602001610252565b609854610248565b61021461030c36600461227f565b610aa0565b6102e661031f3660046120e7565b60d16020525f908152604090205460ff1681565b610214610bdf565b6102146103493660046120a9565b610bf0565b61024861035c3660046120e7565b60ca6020525f908152604090205481565b6103947f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610252565b6102486103ba3660046120e7565b6001600160a01b03165f90815260ce602052604090205490565b6033546001600160a01b0316610394565b6103f86103f33660046120e7565b610c44565b604051610252929190612333565b60cb54610394906001600160a01b031681565b61024861042736600461238b565b610dbc565b61021461043a36600461227f565b610e4d565b61045261044d366004612102565b610f8c565b60408051928352602083019190915201610252565b6102146104753660046120e7565b610ff1565b6103946104883660046123ec565b611002565b6104a061049b3660046120e7565b611036565b6040516102529190612416565b6102146104bb3660046123ec565b6110a9565b6103947f000000000000000000000000000000000000000000000000000000000000000081565b6102486104f53660046120a9565b611164565b6102146105083660046120e7565b6111b6565b610394620e16e481565b61024861122c565b61021461052d36600461207e565b611311565b610248610540366004612428565b60cd60209081525f928352604080842090915290825290205481565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa1580156105be573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105e2919061245f565b6105ff57604051631d77d47760e21b815260040160405180910390fd5b60985481811681146106245760405163c61dca5d60e01b815260040160405180910390fd5b61062d82611427565b5050565b5f54610100900460ff161580801561064f57505f54600160ff909116105b806106685750303b15801561066857505f5460ff166001145b6106d05760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b5f805460ff1916600117905580156106f1575f805461ff0019166101001790555b6106fa82611427565b61070384611464565b61070c836114b5565b8015610751575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146107a05760405163f739589b60e01b815260040160405180910390fd5b604051636ce5768960e11b81526001600160a01b03858116600483015283811660248301526044820183905284169063d9caed12906064015f604051808303815f87803b1580156107ef575f5ffd5b505af1158015610801573d5f5f3e3d5ffd5b5050505050505050565b6098545f9081906001908116036108355760405163840a48d560e01b815260040160405180910390fd5b61083d61151e565b6001600160a01b0385165f90815260ca602052604090205461086e86610867818c8c8c878c610dbc565b8688611577565b6001600160a01b0386165f90815260ca60205260409020600182019055610897868a8a8a6115c9565b9250506108a46001606555565b509695505050505050565b6108b761151e565b6001600160a01b0381165f81815260d4602090815260408083208054939055805193845290830182905290917fd9d082c3ec4f3a3ffa55c324939a06407f5fbcb87d5e0ce3b9508c92c84ed839910160405180910390a1816001600160a01b031663d9caed12620e16e4846001600160a01b0316632495a5996040518163ffffffff1660e01b8152600401602060405180830381865afa15801561095d573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610981919061247e565b6040516001600160e01b031960e085901b1681526001600160a01b03928316600482015291166024820152604481018490526064015f604051808303815f87803b1580156109cd575f5ffd5b505af11580156109df573d5f5f3e3d5ffd5b50505050506109ee6001606555565b50565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa158015610a53573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a77919061245f565b610a9457604051631d77d47760e21b815260040160405180910390fd5b610a9e5f19611427565b565b60cb546001600160a01b03163314610acb576040516320ba3ff960e21b815260040160405180910390fd5b805f5b818110156107515760d15f858584818110610aeb57610aeb612499565b9050602002016020810190610b0091906120e7565b6001600160a01b0316815260208101919091526040015f205460ff16610bd757600160d15f868685818110610b3757610b37612499565b9050602002016020810190610b4c91906120e7565b6001600160a01b0316815260208101919091526040015f20805460ff19169115159190911790557f0c35b17d91c96eb2751cd456e1252f42a386e524ef9ff26ecc9950859fdc04fe848483818110610ba657610ba6612499565b9050602002016020810190610bbb91906120e7565b6040516001600160a01b03909116815260200160405180910390a15b600101610ace565b610be7611737565b610a9e5f611464565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610c395760405163f739589b60e01b815260040160405180910390fd5b610751838383611791565b6001600160a01b0381165f90815260ce60205260408120546060918291908167ffffffffffffffff811115610c7b57610c7b612150565b604051908082528060200260200182016040528015610ca4578160200160208202803683370190505b5090505f5b82811015610d32576001600160a01b0386165f90815260cd6020908152604080832060ce9092528220805491929184908110610ce757610ce7612499565b5f9182526020808320909101546001600160a01b031683528201929092526040019020548251839083908110610d1f57610d1f612499565b6020908102919091010152600101610ca9565b5060ce5f866001600160a01b03166001600160a01b031681526020019081526020015f208181805480602002602001604051908101604052809291908181526020018280548015610daa57602002820191905f5260205f20905b81546001600160a01b03168152600190910190602001808311610d8c575b50505050509150935093505050915091565b604080517f4337f82d142e41f2a8c10547cd8c859bddb92262a61058e77842e24d9dea922460208201526001600160a01b03808916928201929092528187166060820152908516608082015260a0810184905260c0810183905260e081018290525f90610e42906101000160405160208183030381529060405280519060200120611855565b979650505050505050565b60cb546001600160a01b03163314610e78576040516320ba3ff960e21b815260040160405180910390fd5b805f5b818110156107515760d15f858584818110610e9857610e98612499565b9050602002016020810190610ead91906120e7565b6001600160a01b0316815260208101919091526040015f205460ff1615610f84575f60d15f868685818110610ee457610ee4612499565b9050602002016020810190610ef991906120e7565b6001600160a01b0316815260208101919091526040015f20805460ff19169115159190911790557f4074413b4b443e4e58019f2855a8765113358c7c72e39509c6af45fc0f5ba030848483818110610f5357610f53612499565b9050602002016020810190610f6891906120e7565b6040516001600160a01b03909116815260200160405180910390a15b600101610e7b565b5f80336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610fd75760405163f739589b60e01b815260040160405180910390fd5b610fe38685878661189b565b915091505b94509492505050565b610ff9611737565b6109ee816114b5565b60ce602052815f5260405f20818154811061101b575f80fd5b5f918252602090912001546001600160a01b03169150829050565b6001600160a01b0381165f90815260ce602090815260409182902080548351818402810184019094528084526060939283018282801561109d57602002820191905f5260205f20905b81546001600160a01b0316815260019091019060200180831161107f575b50505050509050919050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146110f25760405163f739589b60e01b815260040160405180910390fd5b6001600160a01b0382165f90815260d46020526040812080548392906111199084906124c1565b9091555050604080516001600160a01b0384168152602081018390527fca3e02a4ab7ad3c47a8e36e5a624c30170791726ab720f1babfef21046d953ff910160405180910390a15050565b6098545f90819060019081160361118e5760405163840a48d560e01b815260040160405180910390fd5b61119661151e565b6111a2338686866115c9565b91506111ae6001606555565b509392505050565b6111be611737565b6001600160a01b0381166112235760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016106c7565b6109ee81611464565b5f7f000000000000000000000000000000000000000000000000000000000000000046146112ec5750604080518082018252600a81526922b4b3b2b72630bcb2b960b11b60209182015281517f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a866818301527f71b625cfad44bac63b13dba07f2e1d6084ee04b6f8752101ece6126d584ee6ea81840152466060820152306080808301919091528351808303909101815260a0909101909252815191012090565b507f000000000000000000000000000000000000000000000000000000000000000090565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561136d573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611391919061247e565b6001600160a01b0316336001600160a01b0316146113c25760405163794821ff60e01b815260040160405180910390fd5b609854801982198116146113e95760405163c61dca5d60e01b815260040160405180910390fd5b609882905560405182815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c9060200160405180910390a25050565b609881905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a250565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b60cb54604080516001600160a01b03928316815291831660208301527f4264275e593955ff9d6146a51a4525f6ddace2e81db9391abcc9d1ca48047d29910160405180910390a160cb80546001600160a01b0319166001600160a01b0392909216919091179055565b6002606554036115705760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016106c7565b6002606555565b4281101561159857604051630819bdcd60e01b815260040160405180910390fd5b6115ac6001600160a01b0385168484611a13565b61075157604051638baa579f60e01b815260040160405180910390fd5b6001600160a01b0383165f90815260d16020526040812054849060ff1661160357604051632efd965160e11b815260040160405180910390fd5b6116186001600160a01b038516338786611a71565b6040516311f9fbc960e21b81526001600160a01b038581166004830152602482018590528616906347e7ef24906044016020604051808303815f875af1158015611664573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061168891906124da565b91505f5f6116988887898761189b565b604051631e328e7960e11b81526001600160a01b038b811660048301528a8116602483015260448201849052606482018390529294509092507f000000000000000000000000000000000000000000000000000000000000000090911690633c651cf2906084015f604051808303815f87803b158015611716575f5ffd5b505af1158015611728573d5f5f3e3d5ffd5b50505050505050949350505050565b6033546001600160a01b03163314610a9e5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016106c7565b5f815f036117b2576040516342061b2560e11b815260040160405180910390fd5b6001600160a01b038085165f90815260cd6020908152604080832093871683529290522054808311156117f857604051634b18b19360e01b815260040160405180910390fd5b61180283826124f1565b6001600160a01b038087165f90815260cd6020908152604080832093891683529290529081208290559091508190036118495761183f8585611acb565b600191505061184e565b5f9150505b9392505050565b5f61185e61122c565b60405161190160f01b6020820152602281019190915260428101839052606201604051602081830303815290604052805190602001209050919050565b5f806001600160a01b0386166118c4576040516316f2ccc960e01b815260040160405180910390fd5b825f036118e4576040516342061b2560e11b815260040160405180910390fd5b6001600160a01b038087165f90815260cd602090815260408083209388168352929052908120549081900361198a576001600160a01b0387165f90815260ce60209081526040909120541061194c576040516301a1443960e31b815260040160405180910390fd5b6001600160a01b038781165f90815260ce602090815260408220805460018101825590835291200180546001600160a01b0319169187169190911790555b61199484826124c1565b6001600160a01b038881165f81815260cd602090815260408083208b861680855290835292819020959095558451928352928a169282019290925291820152606081018590527f7cfff908a4b583f36430b25d75964c458d8ede8a99bd61be750e97ee1b2f3a969060800160405180910390a196929550919350505050565b5f5f5f611a208585611c49565b90925090505f816004811115611a3857611a38612504565b148015611a565750856001600160a01b0316826001600160a01b0316145b80611a675750611a67868686611c8b565b9695505050505050565b604080516001600160a01b0385811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b179052610751908590611d72565b6001600160a01b0382165f90815260ce6020526040812054905b81811015611bdd576001600160a01b038481165f90815260ce6020526040902080549185169183908110611b1b57611b1b612499565b5f918252602090912001546001600160a01b031603611bd5576001600160a01b0384165f90815260ce602052604090208054611b59906001906124f1565b81548110611b6957611b69612499565b5f9182526020808320909101546001600160a01b03878116845260ce9092526040909220805491909216919083908110611ba557611ba5612499565b905f5260205f20015f6101000a8154816001600160a01b0302191690836001600160a01b03160217905550611bdd565b600101611ae5565b818103611bfd57604051632df15a4160e11b815260040160405180910390fd5b6001600160a01b0384165f90815260ce60205260409020805480611c2357611c23612518565b5f8281526020902081015f1990810180546001600160a01b031916905501905550505050565b5f5f8251604103611c7d576020830151604084015160608501515f1a611c7187828585611e4a565b94509450505050611c84565b505f905060025b9250929050565b5f5f5f856001600160a01b0316631626ba7e60e01b8686604051602401611cb392919061255a565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b0319909416939093179092529051611cf19190612572565b5f60405180830381855afa9150503d805f8114611d29576040519150601f19603f3d011682016040523d82523d5f602084013e611d2e565b606091505b5091509150818015611d4257506020815110155b8015611a6757508051630b135d3f60e11b90611d6790830160209081019084016124da565b149695505050505050565b5f611dc6826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316611f049092919063ffffffff16565b905080515f1480611de6575080806020019051810190611de6919061245f565b611e455760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016106c7565b505050565b5f807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0831115611e7f57505f90506003610fe8565b604080515f8082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015611ed0573d5f5f3e3d5ffd5b5050604051601f1901519150506001600160a01b038116611ef8575f60019250925050610fe8565b965f9650945050505050565b6060611f1284845f85611f1a565b949350505050565b606082471015611f7b5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b60648201526084016106c7565b5f5f866001600160a01b03168587604051611f969190612572565b5f6040518083038185875af1925050503d805f8114611fd0576040519150601f19603f3d011682016040523d82523d5f602084013e611fd5565b606091505b5091509150610e42878383876060831561204f5782515f03612048576001600160a01b0385163b6120485760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016106c7565b5081611f12565b611f1283838151156120645781518083602001fd5b8060405162461bcd60e51b81526004016106c79190612588565b5f6020828403121561208e575f5ffd5b5035919050565b6001600160a01b03811681146109ee575f5ffd5b5f5f5f606084860312156120bb575f5ffd5b83356120c681612095565b925060208401356120d681612095565b929592945050506040919091013590565b5f602082840312156120f7575f5ffd5b813561184e81612095565b5f5f5f5f60808587031215612115575f5ffd5b843561212081612095565b9350602085013561213081612095565b9250604085013561214081612095565b9396929550929360600135925050565b634e487b7160e01b5f52604160045260245ffd5b5f5f5f5f5f5f60c08789031215612179575f5ffd5b863561218481612095565b9550602087013561219481612095565b94506040870135935060608701356121ab81612095565b92506080870135915060a087013567ffffffffffffffff8111156121cd575f5ffd5b8701601f810189136121dd575f5ffd5b803567ffffffffffffffff8111156121f7576121f7612150565b604051601f8201601f19908116603f0116810167ffffffffffffffff8111828210171561222657612226612150565b6040528181528282016020018b101561223d575f5ffd5b816020840160208301375f602083830101528093505050509295509295509295565b5f6020828403121561226f575f5ffd5b813560ff8116811461184e575f5ffd5b5f5f60208385031215612290575f5ffd5b823567ffffffffffffffff8111156122a6575f5ffd5b8301601f810185136122b6575f5ffd5b803567ffffffffffffffff8111156122cc575f5ffd5b8560208260051b84010111156122e0575f5ffd5b6020919091019590945092505050565b5f8151808452602084019350602083015f5b828110156123295781516001600160a01b0316865260209586019590910190600101612302565b5093949350505050565b604081525f61234560408301856122f0565b82810360208401528084518083526020830191506020860192505f5b8181101561237f578351835260209384019390920191600101612361565b50909695505050505050565b5f5f5f5f5f5f60c087890312156123a0575f5ffd5b86356123ab81612095565b955060208701356123bb81612095565b945060408701356123cb81612095565b959894975094956060810135955060808101359460a0909101359350915050565b5f5f604083850312156123fd575f5ffd5b823561240881612095565b946020939093013593505050565b602081525f61184e60208301846122f0565b5f5f60408385031215612439575f5ffd5b823561244481612095565b9150602083013561245481612095565b809150509250929050565b5f6020828403121561246f575f5ffd5b8151801515811461184e575f5ffd5b5f6020828403121561248e575f5ffd5b815161184e81612095565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b808201808211156124d4576124d46124ad565b92915050565b5f602082840312156124ea575f5ffd5b5051919050565b818103818111156124d4576124d46124ad565b634e487b7160e01b5f52602160045260245ffd5b634e487b7160e01b5f52603160045260245ffd5b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b828152604060208201525f611f12604083018461252c565b5f82518060208501845e5f920191825250919050565b602081525f61184e602083018461252c56fea2646970667358221220e6c8f87f676443985d75c469c68bfdb167c9e8f11afa84cb6476ed80f5e7836664736f6c634300081b0033", + ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"_delegation\",\"type\":\"address\",\"internalType\":\"contractIDelegationManager\"},{\"name\":\"_pauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"DEFAULT_BURN_ADDRESS\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"DEPOSIT_TYPEHASH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"addShares\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"shares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"addStrategiesToDepositWhitelist\",\"inputs\":[{\"name\":\"strategiesToWhitelist\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"burnShares\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"burnableShares\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"calculateStrategyDepositDigestHash\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"nonce\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"delegation\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIDelegationManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"depositIntoStrategy\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"depositShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"depositIntoStrategyWithSignature\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"depositShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"domainSeparator\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getDeposits\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getStakerStrategyList\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"increaseBurnableShares\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"addedSharesToBurn\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"initialOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"initialStrategyWhitelister\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"initialPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"nonces\",\"inputs\":[{\"name\":\"signer\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"nonce\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"pauseAll\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[{\"name\":\"index\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pauserRegistry\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"removeDepositShares\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"depositSharesToRemove\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"removeStrategiesFromDepositWhitelist\",\"inputs\":[{\"name\":\"strategiesToRemoveFromWhitelist\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setStrategyWhitelister\",\"inputs\":[{\"name\":\"newStrategyWhitelister\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"stakerDepositShares\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"shares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"stakerStrategyList\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"strategies\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"stakerStrategyListLength\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"strategyIsWhitelistedForDeposit\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"whitelisted\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"strategyWhitelister\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"withdrawSharesAsTokens\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"shares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"BurnableSharesDecreased\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"shares\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BurnableSharesIncreased\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"shares\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Deposit\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"shares\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StrategyAddedToDepositWhitelist\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StrategyRemovedFromDepositWhitelist\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StrategyWhitelisterChanged\",\"inputs\":[{\"name\":\"previousAddress\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"newAddress\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"CurrentlyPaused\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InputAddressZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidNewPausedStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidSignature\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"MaxStrategiesExceeded\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyDelegationManager\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyPauser\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyStrategyWhitelister\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyUnpauser\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SharesAmountTooHigh\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SharesAmountZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SignatureExpired\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StakerAddressZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StrategyNotFound\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StrategyNotWhitelisted\",\"inputs\":[]}]", + Bin: "0x610100604052348015610010575f5ffd5b5060405161285338038061285383398101604081905261002f916101ed565b81816001600160a01b038116610058576040516339b190bb60e11b815260040160405180910390fd5b6001600160a01b039081166080521660a0524660c052610108604080518082018252600a81526922b4b3b2b72630bcb2b960b11b60209182015281517f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a866818301527f71b625cfad44bac63b13dba07f2e1d6084ee04b6f8752101ece6126d584ee6ea81840152466060820152306080808301919091528351808303909101815260a0909101909252815191012090565b60e05261011361011a565b5050610225565b5f54610100900460ff16156101855760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff908116146101d4575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b03811681146101ea575f5ffd5b50565b5f5f604083850312156101fe575f5ffd5b8251610209816101d6565b602084015190925061021a816101d6565b809150509250929050565b60805160a05160c05160e0516125c36102905f395f6112ce01525f61120e01525f81816104c501528181610762015281816109e001528181610c3f0152818161109301526116b101525f818161039a0152818161057101528181610a4a01526112f201526125c35ff3fe608060405234801561000f575f5ffd5b50600436106101fd575f3560e01c80638b8aac3c11610114578063de44acb6116100a9578063f2fde38b11610079578063f2fde38b146104fa578063f3b4a0001461050d578063f698da2514610517578063fabc1cbc1461051f578063fe243a1714610532575f5ffd5b8063de44acb61461048d578063debe1eab146104ad578063df5cf723146104c0578063e7a050aa146104e7575f5ffd5b80639ac01d61116100e45780639ac01d6114610441578063b5d8b5b814610454578063c665670214610467578063cbc2bd621461047a575f5ffd5b80638b8aac3c146103d45780638da5cb5b146103fc57806394f649dd1461040d578063967fc0d21461042e575f5ffd5b8063595c6a6711610195578063663c1de411610165578063663c1de414610339578063715018a61461035b578063724af423146103635780637ecebe0014610376578063886f119514610395575f5ffd5b8063595c6a67146102e35780635ac86ab7146102eb5780635c975abb1461031e5780635de08ff214610326575f5ffd5b806332e89ace116101d057806332e89ace1461026e57806348825e94146102815780634b6d5d6e146102a857806350ff7225146102bb575f5ffd5b8063136439dd146102015780631794bb3c146102165780631b3cbdc1146102295780632eae418c1461025b575b5f5ffd5b61021461020f36600461204d565b61055c565b005b610214610224366004612078565b610631565b6102486102373660046120b6565b60d46020525f908152604090205481565b6040519081526020015b60405180910390f35b6102146102693660046120d1565b610757565b61024861027c366004612133565b610803565b6102487f4337f82d142e41f2a8c10547cd8c859bddb92262a61058e77842e24d9dea922481565b6102146102b63660046120b6565b6108a7565b6102ce6102c9366004612078565b6109d3565b60408051928352602083019190915201610252565b610214610a35565b61030e6102f936600461222e565b609854600160ff9092169190911b9081161490565b6040519015158152602001610252565b609854610248565b61021461033436600461224e565b610ae4565b61030e6103473660046120b6565b60d16020525f908152604090205460ff1681565b610214610c23565b610214610371366004612078565b610c34565b6102486103843660046120b6565b60ca6020525f908152604090205481565b6103bc7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610252565b6102486103e23660046120b6565b6001600160a01b03165f90815260ce602052604090205490565b6033546001600160a01b03166103bc565b61042061041b3660046120b6565b610c88565b604051610252929190612302565b60cb546103bc906001600160a01b031681565b61024861044f36600461235a565b610e00565b61021461046236600461224e565b610e91565b6102146104753660046120b6565b610fd0565b6103bc6104883660046123bb565b610fe1565b6104a061049b3660046120b6565b611015565b60405161025291906123e5565b6102146104bb3660046123bb565b611088565b6103bc7f000000000000000000000000000000000000000000000000000000000000000081565b6102486104f5366004612078565b611143565b6102146105083660046120b6565b611195565b6103bc620e16e481565b61024861120b565b61021461052d36600461204d565b6112f0565b6102486105403660046123f7565b60cd60209081525f928352604080842090915290825290205481565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa1580156105be573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105e2919061242e565b6105ff57604051631d77d47760e21b815260040160405180910390fd5b60985481811681146106245760405163c61dca5d60e01b815260040160405180910390fd5b61062d82611406565b5050565b5f54610100900460ff161580801561064f57505f54600160ff909116105b806106685750303b15801561066857505f5460ff166001145b6106d05760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b5f805460ff1916600117905580156106f1575f805461ff0019166101001790555b6106fa82611406565b61070384611443565b61070c83611494565b8015610751575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146107a05760405163f739589b60e01b815260040160405180910390fd5b604051636ce5768960e11b81526001600160a01b0384169063d9caed12906107d09087908690869060040161244d565b5f604051808303815f87803b1580156107e7575f5ffd5b505af11580156107f9573d5f5f3e3d5ffd5b5050505050505050565b6098545f90819060019081160361082d5760405163840a48d560e01b815260040160405180910390fd5b6108356114fd565b6001600160a01b0385165f90815260ca60205260409020546108668661085f818c8c8c878c610e00565b8688611556565b6001600160a01b0386165f90815260ca6020526040902060018201905561088f868a8a8a6115a8565b92505061089c6001606555565b509695505050505050565b6108af6114fd565b6001600160a01b0381165f81815260d4602090815260408083208054939055805193845290830182905290917fd9d082c3ec4f3a3ffa55c324939a06407f5fbcb87d5e0ce3b9508c92c84ed839910160405180910390a1816001600160a01b031663d9caed12620e16e4846001600160a01b0316632495a5996040518163ffffffff1660e01b8152600401602060405180830381865afa158015610955573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109799190612471565b846040518463ffffffff1660e01b81526004016109989392919061244d565b5f604051808303815f87803b1580156109af575f5ffd5b505af11580156109c1573d5f5f3e3d5ffd5b50505050506109d06001606555565b50565b5f80336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610a1e5760405163f739589b60e01b815260040160405180910390fd5b610a29858585611715565b91509150935093915050565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa158015610a97573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610abb919061242e565b610ad857604051631d77d47760e21b815260040160405180910390fd5b610ae25f19611406565b565b60cb546001600160a01b03163314610b0f576040516320ba3ff960e21b815260040160405180910390fd5b805f5b818110156107515760d15f858584818110610b2f57610b2f61248c565b9050602002016020810190610b4491906120b6565b6001600160a01b0316815260208101919091526040015f205460ff16610c1b57600160d15f868685818110610b7b57610b7b61248c565b9050602002016020810190610b9091906120b6565b6001600160a01b0316815260208101919091526040015f20805460ff19169115159190911790557f0c35b17d91c96eb2751cd456e1252f42a386e524ef9ff26ecc9950859fdc04fe848483818110610bea57610bea61248c565b9050602002016020810190610bff91906120b6565b6040516001600160a01b03909116815260200160405180910390a15b600101610b12565b610c2b61187d565b610ae25f611443565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610c7d5760405163f739589b60e01b815260040160405180910390fd5b6107518383836118d7565b6001600160a01b0381165f90815260ce60205260408120546060918291908167ffffffffffffffff811115610cbf57610cbf61211f565b604051908082528060200260200182016040528015610ce8578160200160208202803683370190505b5090505f5b82811015610d76576001600160a01b0386165f90815260cd6020908152604080832060ce9092528220805491929184908110610d2b57610d2b61248c565b5f9182526020808320909101546001600160a01b031683528201929092526040019020548251839083908110610d6357610d6361248c565b6020908102919091010152600101610ced565b5060ce5f866001600160a01b03166001600160a01b031681526020019081526020015f208181805480602002602001604051908101604052809291908181526020018280548015610dee57602002820191905f5260205f20905b81546001600160a01b03168152600190910190602001808311610dd0575b50505050509150935093505050915091565b604080517f4337f82d142e41f2a8c10547cd8c859bddb92262a61058e77842e24d9dea922460208201526001600160a01b03808916928201929092528187166060820152908516608082015260a0810184905260c0810183905260e081018290525f90610e8690610100016040516020818303038152906040528051906020012061199b565b979650505050505050565b60cb546001600160a01b03163314610ebc576040516320ba3ff960e21b815260040160405180910390fd5b805f5b818110156107515760d15f858584818110610edc57610edc61248c565b9050602002016020810190610ef191906120b6565b6001600160a01b0316815260208101919091526040015f205460ff1615610fc8575f60d15f868685818110610f2857610f2861248c565b9050602002016020810190610f3d91906120b6565b6001600160a01b0316815260208101919091526040015f20805460ff19169115159190911790557f4074413b4b443e4e58019f2855a8765113358c7c72e39509c6af45fc0f5ba030848483818110610f9757610f9761248c565b9050602002016020810190610fac91906120b6565b6040516001600160a01b03909116815260200160405180910390a15b600101610ebf565b610fd861187d565b6109d081611494565b60ce602052815f5260405f208181548110610ffa575f80fd5b5f918252602090912001546001600160a01b03169150829050565b6001600160a01b0381165f90815260ce602090815260409182902080548351818402810184019094528084526060939283018282801561107c57602002820191905f5260205f20905b81546001600160a01b0316815260019091019060200180831161105e575b50505050509050919050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146110d15760405163f739589b60e01b815260040160405180910390fd5b6001600160a01b0382165f90815260d46020526040812080548392906110f89084906124b4565b9091555050604080516001600160a01b0384168152602081018390527fca3e02a4ab7ad3c47a8e36e5a624c30170791726ab720f1babfef21046d953ff910160405180910390a15050565b6098545f90819060019081160361116d5760405163840a48d560e01b815260040160405180910390fd5b6111756114fd565b611181338686866115a8565b915061118d6001606555565b509392505050565b61119d61187d565b6001600160a01b0381166112025760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016106c7565b6109d081611443565b5f7f000000000000000000000000000000000000000000000000000000000000000046146112cb5750604080518082018252600a81526922b4b3b2b72630bcb2b960b11b60209182015281517f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a866818301527f71b625cfad44bac63b13dba07f2e1d6084ee04b6f8752101ece6126d584ee6ea81840152466060820152306080808301919091528351808303909101815260a0909101909252815191012090565b507f000000000000000000000000000000000000000000000000000000000000000090565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561134c573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113709190612471565b6001600160a01b0316336001600160a01b0316146113a15760405163794821ff60e01b815260040160405180910390fd5b609854801982198116146113c85760405163c61dca5d60e01b815260040160405180910390fd5b609882905560405182815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c9060200160405180910390a25050565b609881905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a250565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b60cb54604080516001600160a01b03928316815291831660208301527f4264275e593955ff9d6146a51a4525f6ddace2e81db9391abcc9d1ca48047d29910160405180910390a160cb80546001600160a01b0319166001600160a01b0392909216919091179055565b60026065540361154f5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016106c7565b6002606555565b4281101561157757604051630819bdcd60e01b815260040160405180910390fd5b61158b6001600160a01b03851684846119e1565b61075157604051638baa579f60e01b815260040160405180910390fd5b6001600160a01b0383165f90815260d16020526040812054849060ff166115e257604051632efd965160e11b815260040160405180910390fd5b6115f76001600160a01b038516338786611a3f565b6040516311f9fbc960e21b81526001600160a01b038581166004830152602482018590528616906347e7ef24906044016020604051808303815f875af1158015611643573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061166791906124cd565b91505f5f611676888886611715565b604051631e328e7960e11b81526001600160a01b038b811660048301528a8116602483015260448201849052606482018390529294509092507f000000000000000000000000000000000000000000000000000000000000000090911690633c651cf2906084015f604051808303815f87803b1580156116f4575f5ffd5b505af1158015611706573d5f5f3e3d5ffd5b50505050505050949350505050565b5f806001600160a01b03851661173e576040516316f2ccc960e01b815260040160405180910390fd5b825f0361175e576040516342061b2560e11b815260040160405180910390fd5b6001600160a01b038086165f90815260cd6020908152604080832093881683529290529081205490819003611804576001600160a01b0386165f90815260ce6020908152604090912054106117c6576040516301a1443960e31b815260040160405180910390fd5b6001600160a01b038681165f90815260ce602090815260408220805460018101825590835291200180546001600160a01b0319169187169190911790555b61180e84826124b4565b6001600160a01b038088165f90815260cd60209081526040808320938a16835292905281902091909155517f5548c837ab068cf56a2c2479df0882a4922fd203edb7517321831d95078c5f629061186a9088908890889061244d565b60405180910390a1959294509192505050565b6033546001600160a01b03163314610ae25760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016106c7565b5f815f036118f8576040516342061b2560e11b815260040160405180910390fd5b6001600160a01b038085165f90815260cd60209081526040808320938716835292905220548083111561193e57604051634b18b19360e01b815260040160405180910390fd5b61194883826124e4565b6001600160a01b038087165f90815260cd60209081526040808320938916835292905290812082905590915081900361198f576119858585611a97565b6001915050611994565b5f9150505b9392505050565b5f6119a461120b565b60405161190160f01b6020820152602281019190915260428101839052606201604051602081830303815290604052805190602001209050919050565b5f5f5f6119ee8585611c15565b90925090505f816004811115611a0657611a066124f7565b148015611a245750856001600160a01b0316826001600160a01b0316145b80611a355750611a35868686611c57565b9695505050505050565b610751846323b872dd60e01b858585604051602401611a609392919061244d565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152611d3e565b6001600160a01b0382165f90815260ce6020526040812054905b81811015611ba9576001600160a01b038481165f90815260ce6020526040902080549185169183908110611ae757611ae761248c565b5f918252602090912001546001600160a01b031603611ba1576001600160a01b0384165f90815260ce602052604090208054611b25906001906124e4565b81548110611b3557611b3561248c565b5f9182526020808320909101546001600160a01b03878116845260ce9092526040909220805491909216919083908110611b7157611b7161248c565b905f5260205f20015f6101000a8154816001600160a01b0302191690836001600160a01b03160217905550611ba9565b600101611ab1565b818103611bc957604051632df15a4160e11b815260040160405180910390fd5b6001600160a01b0384165f90815260ce60205260409020805480611bef57611bef61250b565b5f8281526020902081015f1990810180546001600160a01b031916905501905550505050565b5f5f8251604103611c49576020830151604084015160608501515f1a611c3d87828585611e16565b94509450505050611c50565b505f905060025b9250929050565b5f5f5f856001600160a01b0316631626ba7e60e01b8686604051602401611c7f92919061254d565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b0319909416939093179092529051611cbd9190612565565b5f60405180830381855afa9150503d805f8114611cf5576040519150601f19603f3d011682016040523d82523d5f602084013e611cfa565b606091505b5091509150818015611d0e57506020815110155b8015611a3557508051630b135d3f60e11b90611d3390830160209081019084016124cd565b149695505050505050565b5f611d92826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316611ed39092919063ffffffff16565b905080515f1480611db2575080806020019051810190611db2919061242e565b611e115760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016106c7565b505050565b5f807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0831115611e4b57505f90506003611eca565b604080515f8082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015611e9c573d5f5f3e3d5ffd5b5050604051601f1901519150506001600160a01b038116611ec4575f60019250925050611eca565b91505f90505b94509492505050565b6060611ee184845f85611ee9565b949350505050565b606082471015611f4a5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b60648201526084016106c7565b5f5f866001600160a01b03168587604051611f659190612565565b5f6040518083038185875af1925050503d805f8114611f9f576040519150601f19603f3d011682016040523d82523d5f602084013e611fa4565b606091505b5091509150610e86878383876060831561201e5782515f03612017576001600160a01b0385163b6120175760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016106c7565b5081611ee1565b611ee183838151156120335781518083602001fd5b8060405162461bcd60e51b81526004016106c7919061257b565b5f6020828403121561205d575f5ffd5b5035919050565b6001600160a01b03811681146109d0575f5ffd5b5f5f5f6060848603121561208a575f5ffd5b833561209581612064565b925060208401356120a581612064565b929592945050506040919091013590565b5f602082840312156120c6575f5ffd5b813561199481612064565b5f5f5f5f608085870312156120e4575f5ffd5b84356120ef81612064565b935060208501356120ff81612064565b9250604085013561210f81612064565b9396929550929360600135925050565b634e487b7160e01b5f52604160045260245ffd5b5f5f5f5f5f5f60c08789031215612148575f5ffd5b863561215381612064565b9550602087013561216381612064565b945060408701359350606087013561217a81612064565b92506080870135915060a087013567ffffffffffffffff81111561219c575f5ffd5b8701601f810189136121ac575f5ffd5b803567ffffffffffffffff8111156121c6576121c661211f565b604051601f8201601f19908116603f0116810167ffffffffffffffff811182821017156121f5576121f561211f565b6040528181528282016020018b101561220c575f5ffd5b816020840160208301375f602083830101528093505050509295509295509295565b5f6020828403121561223e575f5ffd5b813560ff81168114611994575f5ffd5b5f5f6020838503121561225f575f5ffd5b823567ffffffffffffffff811115612275575f5ffd5b8301601f81018513612285575f5ffd5b803567ffffffffffffffff81111561229b575f5ffd5b8560208260051b84010111156122af575f5ffd5b6020919091019590945092505050565b5f8151808452602084019350602083015f5b828110156122f85781516001600160a01b03168652602095860195909101906001016122d1565b5093949350505050565b604081525f61231460408301856122bf565b82810360208401528084518083526020830191506020860192505f5b8181101561234e578351835260209384019390920191600101612330565b50909695505050505050565b5f5f5f5f5f5f60c0878903121561236f575f5ffd5b863561237a81612064565b9550602087013561238a81612064565b9450604087013561239a81612064565b959894975094956060810135955060808101359460a0909101359350915050565b5f5f604083850312156123cc575f5ffd5b82356123d781612064565b946020939093013593505050565b602081525f61199460208301846122bf565b5f5f60408385031215612408575f5ffd5b823561241381612064565b9150602083013561242381612064565b809150509250929050565b5f6020828403121561243e575f5ffd5b81518015158114611994575f5ffd5b6001600160a01b039384168152919092166020820152604081019190915260600190565b5f60208284031215612481575f5ffd5b815161199481612064565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b808201808211156124c7576124c76124a0565b92915050565b5f602082840312156124dd575f5ffd5b5051919050565b818103818111156124c7576124c76124a0565b634e487b7160e01b5f52602160045260245ffd5b634e487b7160e01b5f52603160045260245ffd5b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b828152604060208201525f611ee1604083018461251f565b5f82518060208501845e5f920191825250919050565b602081525f611994602083018461251f56fea2646970667358221220c3ca26b6e79744d7bfa4ad414d769be211c62e44eabfb7c1ce9505e5c417db0d64736f6c634300081b0033", } // StrategyManagerABI is the input ABI used to generate the binding from. @@ -761,25 +761,25 @@ func (_StrategyManager *StrategyManagerCallerSession) StrategyWhitelister() (com return _StrategyManager.Contract.StrategyWhitelister(&_StrategyManager.CallOpts) } -// AddShares is a paid mutator transaction binding the contract method 0xc4623ea1. +// AddShares is a paid mutator transaction binding the contract method 0x50ff7225. // -// Solidity: function addShares(address staker, address strategy, address token, uint256 shares) returns(uint256, uint256) -func (_StrategyManager *StrategyManagerTransactor) AddShares(opts *bind.TransactOpts, staker common.Address, strategy common.Address, token common.Address, shares *big.Int) (*types.Transaction, error) { - return _StrategyManager.contract.Transact(opts, "addShares", staker, strategy, token, shares) +// Solidity: function addShares(address staker, address strategy, uint256 shares) returns(uint256, uint256) +func (_StrategyManager *StrategyManagerTransactor) AddShares(opts *bind.TransactOpts, staker common.Address, strategy common.Address, shares *big.Int) (*types.Transaction, error) { + return _StrategyManager.contract.Transact(opts, "addShares", staker, strategy, shares) } -// AddShares is a paid mutator transaction binding the contract method 0xc4623ea1. +// AddShares is a paid mutator transaction binding the contract method 0x50ff7225. // -// Solidity: function addShares(address staker, address strategy, address token, uint256 shares) returns(uint256, uint256) -func (_StrategyManager *StrategyManagerSession) AddShares(staker common.Address, strategy common.Address, token common.Address, shares *big.Int) (*types.Transaction, error) { - return _StrategyManager.Contract.AddShares(&_StrategyManager.TransactOpts, staker, strategy, token, shares) +// Solidity: function addShares(address staker, address strategy, uint256 shares) returns(uint256, uint256) +func (_StrategyManager *StrategyManagerSession) AddShares(staker common.Address, strategy common.Address, shares *big.Int) (*types.Transaction, error) { + return _StrategyManager.Contract.AddShares(&_StrategyManager.TransactOpts, staker, strategy, shares) } -// AddShares is a paid mutator transaction binding the contract method 0xc4623ea1. +// AddShares is a paid mutator transaction binding the contract method 0x50ff7225. // -// Solidity: function addShares(address staker, address strategy, address token, uint256 shares) returns(uint256, uint256) -func (_StrategyManager *StrategyManagerTransactorSession) AddShares(staker common.Address, strategy common.Address, token common.Address, shares *big.Int) (*types.Transaction, error) { - return _StrategyManager.Contract.AddShares(&_StrategyManager.TransactOpts, staker, strategy, token, shares) +// Solidity: function addShares(address staker, address strategy, uint256 shares) returns(uint256, uint256) +func (_StrategyManager *StrategyManagerTransactorSession) AddShares(staker common.Address, strategy common.Address, shares *big.Int) (*types.Transaction, error) { + return _StrategyManager.Contract.AddShares(&_StrategyManager.TransactOpts, staker, strategy, shares) } // AddStrategiesToDepositWhitelist is a paid mutator transaction binding the contract method 0x5de08ff2. @@ -1437,15 +1437,14 @@ func (it *StrategyManagerDepositIterator) Close() error { // StrategyManagerDeposit represents a Deposit event raised by the StrategyManager contract. type StrategyManagerDeposit struct { Staker common.Address - Token common.Address Strategy common.Address Shares *big.Int Raw types.Log // Blockchain specific contextual infos } -// FilterDeposit is a free log retrieval operation binding the contract event 0x7cfff908a4b583f36430b25d75964c458d8ede8a99bd61be750e97ee1b2f3a96. +// FilterDeposit is a free log retrieval operation binding the contract event 0x5548c837ab068cf56a2c2479df0882a4922fd203edb7517321831d95078c5f62. // -// Solidity: event Deposit(address staker, address token, address strategy, uint256 shares) +// Solidity: event Deposit(address staker, address strategy, uint256 shares) func (_StrategyManager *StrategyManagerFilterer) FilterDeposit(opts *bind.FilterOpts) (*StrategyManagerDepositIterator, error) { logs, sub, err := _StrategyManager.contract.FilterLogs(opts, "Deposit") @@ -1455,9 +1454,9 @@ func (_StrategyManager *StrategyManagerFilterer) FilterDeposit(opts *bind.Filter return &StrategyManagerDepositIterator{contract: _StrategyManager.contract, event: "Deposit", logs: logs, sub: sub}, nil } -// WatchDeposit is a free log subscription operation binding the contract event 0x7cfff908a4b583f36430b25d75964c458d8ede8a99bd61be750e97ee1b2f3a96. +// WatchDeposit is a free log subscription operation binding the contract event 0x5548c837ab068cf56a2c2479df0882a4922fd203edb7517321831d95078c5f62. // -// Solidity: event Deposit(address staker, address token, address strategy, uint256 shares) +// Solidity: event Deposit(address staker, address strategy, uint256 shares) func (_StrategyManager *StrategyManagerFilterer) WatchDeposit(opts *bind.WatchOpts, sink chan<- *StrategyManagerDeposit) (event.Subscription, error) { logs, sub, err := _StrategyManager.contract.WatchLogs(opts, "Deposit") @@ -1492,9 +1491,9 @@ func (_StrategyManager *StrategyManagerFilterer) WatchDeposit(opts *bind.WatchOp }), nil } -// ParseDeposit is a log parse operation binding the contract event 0x7cfff908a4b583f36430b25d75964c458d8ede8a99bd61be750e97ee1b2f3a96. +// ParseDeposit is a log parse operation binding the contract event 0x5548c837ab068cf56a2c2479df0882a4922fd203edb7517321831d95078c5f62. // -// Solidity: event Deposit(address staker, address token, address strategy, uint256 shares) +// Solidity: event Deposit(address staker, address strategy, uint256 shares) func (_StrategyManager *StrategyManagerFilterer) ParseDeposit(log types.Log) (*StrategyManagerDeposit, error) { event := new(StrategyManagerDeposit) if err := _StrategyManager.contract.UnpackLog(event, "Deposit", log); err != nil { diff --git a/pkg/bindings/StrategyManagerStorage/binding.go b/pkg/bindings/StrategyManagerStorage/binding.go index b7d1f40902..f6cc5469e6 100644 --- a/pkg/bindings/StrategyManagerStorage/binding.go +++ b/pkg/bindings/StrategyManagerStorage/binding.go @@ -31,7 +31,7 @@ var ( // StrategyManagerStorageMetaData contains all meta data concerning the StrategyManagerStorage contract. var StrategyManagerStorageMetaData = &bind.MetaData{ - ABI: "[{\"type\":\"function\",\"name\":\"DEFAULT_BURN_ADDRESS\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"DEPOSIT_TYPEHASH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"addShares\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"shares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"addStrategiesToDepositWhitelist\",\"inputs\":[{\"name\":\"strategiesToWhitelist\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"burnShares\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"burnableShares\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"calculateStrategyDepositDigestHash\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"nonce\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"delegation\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIDelegationManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"depositIntoStrategy\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"depositShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"depositIntoStrategyWithSignature\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"depositShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"getDeposits\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getStakerStrategyList\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"increaseBurnableShares\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"addedSharesToBurn\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"initialOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"initialStrategyWhitelister\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"initialPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"nonces\",\"inputs\":[{\"name\":\"signer\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"nonce\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"removeDepositShares\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"depositSharesToRemove\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"removeStrategiesFromDepositWhitelist\",\"inputs\":[{\"name\":\"strategiesToRemoveFromWhitelist\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setStrategyWhitelister\",\"inputs\":[{\"name\":\"newStrategyWhitelister\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"stakerDepositShares\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"shares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"stakerStrategyList\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"strategies\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"stakerStrategyListLength\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"strategyIsWhitelistedForDeposit\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"whitelisted\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"strategyWhitelister\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"withdrawSharesAsTokens\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"shares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"BurnableSharesDecreased\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"shares\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BurnableSharesIncreased\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"shares\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Deposit\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"token\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIERC20\"},{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"shares\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StrategyAddedToDepositWhitelist\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StrategyRemovedFromDepositWhitelist\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StrategyWhitelisterChanged\",\"inputs\":[{\"name\":\"previousAddress\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"newAddress\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"MaxStrategiesExceeded\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyDelegationManager\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyStrategyWhitelister\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SharesAmountTooHigh\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SharesAmountZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StakerAddressZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StrategyNotFound\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StrategyNotWhitelisted\",\"inputs\":[]}]", + ABI: "[{\"type\":\"function\",\"name\":\"DEFAULT_BURN_ADDRESS\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"DEPOSIT_TYPEHASH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"addShares\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"shares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"addStrategiesToDepositWhitelist\",\"inputs\":[{\"name\":\"strategiesToWhitelist\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"burnShares\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"burnableShares\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"calculateStrategyDepositDigestHash\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"nonce\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"delegation\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIDelegationManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"depositIntoStrategy\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"depositShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"depositIntoStrategyWithSignature\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"depositShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"getDeposits\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getStakerStrategyList\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"increaseBurnableShares\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"addedSharesToBurn\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"initialOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"initialStrategyWhitelister\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"initialPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"nonces\",\"inputs\":[{\"name\":\"signer\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"nonce\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"removeDepositShares\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"depositSharesToRemove\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"removeStrategiesFromDepositWhitelist\",\"inputs\":[{\"name\":\"strategiesToRemoveFromWhitelist\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setStrategyWhitelister\",\"inputs\":[{\"name\":\"newStrategyWhitelister\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"stakerDepositShares\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"shares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"stakerStrategyList\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"strategies\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"stakerStrategyListLength\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"strategyIsWhitelistedForDeposit\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"whitelisted\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"strategyWhitelister\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"withdrawSharesAsTokens\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"shares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"BurnableSharesDecreased\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"shares\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BurnableSharesIncreased\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"shares\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Deposit\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"shares\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StrategyAddedToDepositWhitelist\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StrategyRemovedFromDepositWhitelist\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StrategyWhitelisterChanged\",\"inputs\":[{\"name\":\"previousAddress\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"newAddress\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"MaxStrategiesExceeded\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyDelegationManager\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyStrategyWhitelister\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SharesAmountTooHigh\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SharesAmountZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StakerAddressZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StrategyNotFound\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StrategyNotWhitelisted\",\"inputs\":[]}]", } // StrategyManagerStorageABI is the input ABI used to generate the binding from. @@ -584,25 +584,25 @@ func (_StrategyManagerStorage *StrategyManagerStorageCallerSession) StrategyWhit return _StrategyManagerStorage.Contract.StrategyWhitelister(&_StrategyManagerStorage.CallOpts) } -// AddShares is a paid mutator transaction binding the contract method 0xc4623ea1. +// AddShares is a paid mutator transaction binding the contract method 0x50ff7225. // -// Solidity: function addShares(address staker, address strategy, address token, uint256 shares) returns(uint256, uint256) -func (_StrategyManagerStorage *StrategyManagerStorageTransactor) AddShares(opts *bind.TransactOpts, staker common.Address, strategy common.Address, token common.Address, shares *big.Int) (*types.Transaction, error) { - return _StrategyManagerStorage.contract.Transact(opts, "addShares", staker, strategy, token, shares) +// Solidity: function addShares(address staker, address strategy, uint256 shares) returns(uint256, uint256) +func (_StrategyManagerStorage *StrategyManagerStorageTransactor) AddShares(opts *bind.TransactOpts, staker common.Address, strategy common.Address, shares *big.Int) (*types.Transaction, error) { + return _StrategyManagerStorage.contract.Transact(opts, "addShares", staker, strategy, shares) } -// AddShares is a paid mutator transaction binding the contract method 0xc4623ea1. +// AddShares is a paid mutator transaction binding the contract method 0x50ff7225. // -// Solidity: function addShares(address staker, address strategy, address token, uint256 shares) returns(uint256, uint256) -func (_StrategyManagerStorage *StrategyManagerStorageSession) AddShares(staker common.Address, strategy common.Address, token common.Address, shares *big.Int) (*types.Transaction, error) { - return _StrategyManagerStorage.Contract.AddShares(&_StrategyManagerStorage.TransactOpts, staker, strategy, token, shares) +// Solidity: function addShares(address staker, address strategy, uint256 shares) returns(uint256, uint256) +func (_StrategyManagerStorage *StrategyManagerStorageSession) AddShares(staker common.Address, strategy common.Address, shares *big.Int) (*types.Transaction, error) { + return _StrategyManagerStorage.Contract.AddShares(&_StrategyManagerStorage.TransactOpts, staker, strategy, shares) } -// AddShares is a paid mutator transaction binding the contract method 0xc4623ea1. +// AddShares is a paid mutator transaction binding the contract method 0x50ff7225. // -// Solidity: function addShares(address staker, address strategy, address token, uint256 shares) returns(uint256, uint256) -func (_StrategyManagerStorage *StrategyManagerStorageTransactorSession) AddShares(staker common.Address, strategy common.Address, token common.Address, shares *big.Int) (*types.Transaction, error) { - return _StrategyManagerStorage.Contract.AddShares(&_StrategyManagerStorage.TransactOpts, staker, strategy, token, shares) +// Solidity: function addShares(address staker, address strategy, uint256 shares) returns(uint256, uint256) +func (_StrategyManagerStorage *StrategyManagerStorageTransactorSession) AddShares(staker common.Address, strategy common.Address, shares *big.Int) (*types.Transaction, error) { + return _StrategyManagerStorage.Contract.AddShares(&_StrategyManagerStorage.TransactOpts, staker, strategy, shares) } // AddStrategiesToDepositWhitelist is a paid mutator transaction binding the contract method 0x5de08ff2. @@ -1155,15 +1155,14 @@ func (it *StrategyManagerStorageDepositIterator) Close() error { // StrategyManagerStorageDeposit represents a Deposit event raised by the StrategyManagerStorage contract. type StrategyManagerStorageDeposit struct { Staker common.Address - Token common.Address Strategy common.Address Shares *big.Int Raw types.Log // Blockchain specific contextual infos } -// FilterDeposit is a free log retrieval operation binding the contract event 0x7cfff908a4b583f36430b25d75964c458d8ede8a99bd61be750e97ee1b2f3a96. +// FilterDeposit is a free log retrieval operation binding the contract event 0x5548c837ab068cf56a2c2479df0882a4922fd203edb7517321831d95078c5f62. // -// Solidity: event Deposit(address staker, address token, address strategy, uint256 shares) +// Solidity: event Deposit(address staker, address strategy, uint256 shares) func (_StrategyManagerStorage *StrategyManagerStorageFilterer) FilterDeposit(opts *bind.FilterOpts) (*StrategyManagerStorageDepositIterator, error) { logs, sub, err := _StrategyManagerStorage.contract.FilterLogs(opts, "Deposit") @@ -1173,9 +1172,9 @@ func (_StrategyManagerStorage *StrategyManagerStorageFilterer) FilterDeposit(opt return &StrategyManagerStorageDepositIterator{contract: _StrategyManagerStorage.contract, event: "Deposit", logs: logs, sub: sub}, nil } -// WatchDeposit is a free log subscription operation binding the contract event 0x7cfff908a4b583f36430b25d75964c458d8ede8a99bd61be750e97ee1b2f3a96. +// WatchDeposit is a free log subscription operation binding the contract event 0x5548c837ab068cf56a2c2479df0882a4922fd203edb7517321831d95078c5f62. // -// Solidity: event Deposit(address staker, address token, address strategy, uint256 shares) +// Solidity: event Deposit(address staker, address strategy, uint256 shares) func (_StrategyManagerStorage *StrategyManagerStorageFilterer) WatchDeposit(opts *bind.WatchOpts, sink chan<- *StrategyManagerStorageDeposit) (event.Subscription, error) { logs, sub, err := _StrategyManagerStorage.contract.WatchLogs(opts, "Deposit") @@ -1210,9 +1209,9 @@ func (_StrategyManagerStorage *StrategyManagerStorageFilterer) WatchDeposit(opts }), nil } -// ParseDeposit is a log parse operation binding the contract event 0x7cfff908a4b583f36430b25d75964c458d8ede8a99bd61be750e97ee1b2f3a96. +// ParseDeposit is a log parse operation binding the contract event 0x5548c837ab068cf56a2c2479df0882a4922fd203edb7517321831d95078c5f62. // -// Solidity: event Deposit(address staker, address token, address strategy, uint256 shares) +// Solidity: event Deposit(address staker, address strategy, uint256 shares) func (_StrategyManagerStorage *StrategyManagerStorageFilterer) ParseDeposit(log types.Log) (*StrategyManagerStorageDeposit, error) { event := new(StrategyManagerStorageDeposit) if err := _StrategyManagerStorage.contract.UnpackLog(event, "Deposit", log); err != nil { diff --git a/src/contracts/core/DelegationManager.sol b/src/contracts/core/DelegationManager.sol index 1678c139cb..658b3e9999 100644 --- a/src/contracts/core/DelegationManager.sol +++ b/src/contracts/core/DelegationManager.sol @@ -582,7 +582,6 @@ contract DelegationManager is (uint256 prevDepositShares, uint256 addedShares) = shareManager.addShares({ staker: withdrawal.staker, strategy: withdrawal.strategies[i], - token: tokens[i], shares: sharesToWithdraw }); diff --git a/src/contracts/core/StrategyManager.sol b/src/contracts/core/StrategyManager.sol index 09c347f22e..8ffcf3c344 100644 --- a/src/contracts/core/StrategyManager.sol +++ b/src/contracts/core/StrategyManager.sol @@ -124,10 +124,9 @@ contract StrategyManager is function addShares( address staker, IStrategy strategy, - IERC20 token, uint256 shares ) external onlyDelegationManager returns (uint256, uint256) { - return _addShares(staker, token, strategy, shares); + return _addShares(staker, strategy, shares); } /// @inheritdoc IShareManager @@ -197,19 +196,13 @@ contract StrategyManager is /** * @notice This function adds `shares` for a given `strategy` to the `staker` and runs through the necessary update logic. * @param staker The address to add shares to - * @param token The token that is being deposited (used for indexing) * @param strategy The Strategy in which the `staker` is receiving shares * @param shares The amount of shares to grant to the `staker` * @dev In particular, this function calls `delegation.increaseDelegatedShares(staker, strategy, shares)` to ensure that all * delegated shares are tracked, increases the stored share amount in `stakerDepositShares[staker][strategy]`, and adds `strategy` * to the `staker`'s list of strategies, if it is not in the list already. */ - function _addShares( - address staker, - IERC20 token, - IStrategy strategy, - uint256 shares - ) internal returns (uint256, uint256) { + function _addShares(address staker, IStrategy strategy, uint256 shares) internal returns (uint256, uint256) { // sanity checks on inputs require(staker != address(0), StakerAddressZero()); require(shares != 0, SharesAmountZero()); @@ -225,7 +218,7 @@ contract StrategyManager is // add the returned depositedShares to their existing shares for this strategy stakerDepositShares[staker][strategy] = prevDepositShares + shares; - emit Deposit(staker, token, strategy, shares); + emit Deposit(staker, strategy, shares); return (prevDepositShares, shares); } @@ -251,7 +244,7 @@ contract StrategyManager is shares = strategy.deposit(token, amount); // add the returned shares to the staker's existing shares for this strategy - (uint256 prevDepositShares, uint256 addedShares) = _addShares(staker, token, strategy, shares); + (uint256 prevDepositShares, uint256 addedShares) = _addShares(staker, strategy, shares); // Increase shares delegated to operator delegation.increaseDelegatedShares({ diff --git a/src/contracts/interfaces/IShareManager.sol b/src/contracts/interfaces/IShareManager.sol index 756c62c05f..a188ff7d7b 100644 --- a/src/contracts/interfaces/IShareManager.sol +++ b/src/contracts/interfaces/IShareManager.sol @@ -18,15 +18,9 @@ interface IShareManager { /// @notice Used by the DelegationManager to award a Staker some shares that have passed through the withdrawal queue /// @dev strategy must be beaconChainETH when talking to the EigenPodManager - /// @dev token is not validated; it is only emitted as an event /// @return existingDepositShares the shares the staker had before any were added /// @return addedShares the new shares added to the staker's balance - function addShares( - address staker, - IStrategy strategy, - IERC20 token, - uint256 shares - ) external returns (uint256, uint256); + function addShares(address staker, IStrategy strategy, uint256 shares) external returns (uint256, uint256); /// @notice Used by the DelegationManager to convert deposit shares to tokens and send them to a staker /// @dev strategy must be beaconChainETH when talking to the EigenPodManager diff --git a/src/contracts/interfaces/IStrategyManager.sol b/src/contracts/interfaces/IStrategyManager.sol index 25808d2637..fd5360faab 100644 --- a/src/contracts/interfaces/IStrategyManager.sol +++ b/src/contracts/interfaces/IStrategyManager.sol @@ -30,10 +30,9 @@ interface IStrategyManagerEvents { * @notice Emitted when a new deposit occurs on behalf of `staker`. * @param staker Is the staker who is depositing funds into EigenLayer. * @param strategy Is the strategy that `staker` has deposited into. - * @param token Is the token that `staker` deposited. * @param shares Is the number of new shares `staker` has been granted in `strategy`. */ - event Deposit(address staker, IERC20 token, IStrategy strategy, uint256 shares); + event Deposit(address staker, IStrategy strategy, uint256 shares); /// @notice Emitted when the `strategyWhitelister` is changed event StrategyWhitelisterChanged(address previousAddress, address newAddress); diff --git a/src/contracts/pods/EigenPodManager.sol b/src/contracts/pods/EigenPodManager.sol index 697b8d0f76..c1ffc9dea4 100644 --- a/src/contracts/pods/EigenPodManager.sol +++ b/src/contracts/pods/EigenPodManager.sol @@ -159,7 +159,6 @@ contract EigenPodManager is function addShares( address staker, IStrategy strategy, - IERC20, uint256 shares ) external onlyDelegationManager returns (uint256, uint256) { require(strategy == beaconChainETHStrategy, InvalidStrategy()); diff --git a/src/test/mocks/DelegationManagerMock.sol b/src/test/mocks/DelegationManagerMock.sol index 0c9ed77411..74660ae04f 100644 --- a/src/test/mocks/DelegationManagerMock.sol +++ b/src/test/mocks/DelegationManagerMock.sol @@ -89,11 +89,10 @@ contract DelegationManagerMock is Test { function addShares( IStrategyManager strategyManager, address staker, - IERC20 token, IStrategy strategy, uint256 shares ) external { - strategyManager.addShares(staker, strategy, token, shares); + strategyManager.addShares(staker, strategy, shares); } function removeDepositShares( diff --git a/src/test/mocks/EigenPodManagerMock.sol b/src/test/mocks/EigenPodManagerMock.sol index ecf6028707..d59d77ff4d 100644 --- a/src/test/mocks/EigenPodManagerMock.sol +++ b/src/test/mocks/EigenPodManagerMock.sol @@ -39,7 +39,6 @@ contract EigenPodManagerMock is Test, Pausable { function addShares( address podOwner, IStrategy, - IERC20, uint256 shares ) external returns (uint256, uint256) { uint256 existingDepositShares = uint256(podOwnerDepositShares[podOwner]); diff --git a/src/test/mocks/StrategyManagerMock.sol b/src/test/mocks/StrategyManagerMock.sol index 57ffd5f520..e47feacdcb 100644 --- a/src/test/mocks/StrategyManagerMock.sol +++ b/src/test/mocks/StrategyManagerMock.sol @@ -102,8 +102,7 @@ contract StrategyManagerMock is Test { function addShares( address staker, - IStrategy strategy, - IERC20, // token + IStrategy strategy, uint256 addedShares ) external returns (uint, uint) { // Increase the staker's shares diff --git a/src/test/unit/EigenPodManagerUnit.t.sol b/src/test/unit/EigenPodManagerUnit.t.sol index e73087e523..4cb3d3ec97 100644 --- a/src/test/unit/EigenPodManagerUnit.t.sol +++ b/src/test/unit/EigenPodManagerUnit.t.sol @@ -78,7 +78,7 @@ contract EigenPodManagerUnitTests is EigenLayerUnitTestSetup, IEigenPodManagerEv if (shares >= 0) { cheats.prank(address(delegationManagerMock)); - eigenPodManager.addShares(podOwner, beaconChainETHStrategy, IERC20(address(0)), uint256(shares)); + eigenPodManager.addShares(podOwner, beaconChainETHStrategy, uint256(shares)); } else { EigenPodManagerWrapper(address(eigenPodManager)).setPodOwnerShares(podOwner, shares); } @@ -193,20 +193,20 @@ contract EigenPodManagerUnitTests_ShareUpdateTests is EigenPodManagerUnitTests { cheats.assume(notDelegationManager != address(delegationManagerMock)); cheats.prank(notDelegationManager); cheats.expectRevert(IEigenPodManagerErrors.OnlyDelegationManager.selector); - eigenPodManager.addShares(defaultStaker, IStrategy(address(0)), IERC20(address(0)), 0); + eigenPodManager.addShares(defaultStaker, IStrategy(address(0)), 0); } function test_addShares_revert_podOwnerZeroAddress() public { cheats.prank(address(delegationManagerMock)); cheats.expectRevert(IEigenPodErrors.InputAddressZero.selector); - eigenPodManager.addShares(address(0), beaconChainETHStrategy, IERC20(address(0)), 0); + eigenPodManager.addShares(address(0), beaconChainETHStrategy, 0); } function testFuzz_addShares_revert_sharesNegative(int256 shares) public { cheats.assume(shares < 0); cheats.prank(address(delegationManagerMock)); cheats.expectRevert(IEigenPodManagerErrors.SharesNegative.selector); - eigenPodManager.addShares(defaultStaker, beaconChainETHStrategy, IERC20(address(0)), uint256(shares)); + eigenPodManager.addShares(defaultStaker, beaconChainETHStrategy, uint256(shares)); } function testFuzz_addShares(uint256 shares) public { @@ -217,7 +217,7 @@ contract EigenPodManagerUnitTests_ShareUpdateTests is EigenPodManagerUnitTests { // Add shares cheats.prank(address(delegationManagerMock)); - eigenPodManager.addShares(defaultStaker, beaconChainETHStrategy, IERC20(address(0)), shares); + eigenPodManager.addShares(defaultStaker, beaconChainETHStrategy, shares); // Check storage update assertEq(eigenPodManager.podOwnerDepositShares(defaultStaker), int256(shares), "Incorrect number of shares added"); diff --git a/src/test/unit/StrategyManagerUnit.t.sol b/src/test/unit/StrategyManagerUnit.t.sol index d5ba4146ee..1486ce0841 100644 --- a/src/test/unit/StrategyManagerUnit.t.sol +++ b/src/test/unit/StrategyManagerUnit.t.sol @@ -120,7 +120,7 @@ contract StrategyManagerUnitTests is EigenLayerUnitTestSetup, IStrategyManagerEv token.approve(address(strategyManager), amount); cheats.expectEmit(true, true, true, true, address(strategyManager)); - emit Deposit(staker, token, strategy, expectedDepositShares); + emit Deposit(staker, strategy, expectedDepositShares); uint256 shares = strategyManager.depositIntoStrategy(strategy, token, amount); cheats.stopPrank(); @@ -182,7 +182,7 @@ contract StrategyManagerUnitTests is EigenLayerUnitTestSetup, IStrategyManagerEv // needed for expecting an event with the right parameters uint256 expectedDepositShares = amount; cheats.expectEmit(true, true, true, true, address(strategyManager)); - emit Deposit(staker, dummyToken, dummyStrat, expectedDepositShares); + emit Deposit(staker, dummyStrat, expectedDepositShares); } uint256 shares = strategyManager.depositIntoStrategyWithSignature( dummyStrat, @@ -297,7 +297,7 @@ contract StrategyManagerUnitTests_depositIntoStrategy is StrategyManagerUnitTest token.approve(address(strategyManager), amount); cheats.expectEmit(true, true, true, true, address(strategyManager)); - emit Deposit(staker, token, strategy, expectedDepositShares); + emit Deposit(staker, strategy, expectedDepositShares); uint256 depositedShares = strategyManager.depositIntoStrategy(strategy, token, amount); cheats.stopPrank(); @@ -1300,18 +1300,18 @@ contract StrategyManagerUnitTests_addShares is StrategyManagerUnitTests { function test_Revert_DelegationManagerModifier() external { DelegationManagerMock invalidDelegationManager = new DelegationManagerMock(); cheats.expectRevert(IStrategyManagerErrors.OnlyDelegationManager.selector); - invalidDelegationManager.addShares(strategyManager, address(this), dummyToken, dummyStrat, 1); + invalidDelegationManager.addShares(strategyManager, address(this), dummyStrat, 1); } function testFuzz_Revert_StakerZeroAddress(uint256 amount) external { cheats.expectRevert(IStrategyManagerErrors.StakerAddressZero.selector); - delegationManagerMock.addShares(strategyManager, address(0), dummyToken, dummyStrat, amount); + delegationManagerMock.addShares(strategyManager, address(0), dummyStrat, amount); } function testFuzz_Revert_ZeroShares(address staker) external filterFuzzedAddressInputs(staker) { cheats.assume(staker != address(0)); cheats.expectRevert(IStrategyManagerErrors.SharesAmountZero.selector); - delegationManagerMock.addShares(strategyManager, staker, dummyToken, dummyStrat, 0); + delegationManagerMock.addShares(strategyManager, staker, dummyStrat, 0); } function testFuzz_AppendsStakerStrategyList( @@ -1324,7 +1324,7 @@ contract StrategyManagerUnitTests_addShares is StrategyManagerUnitTests { assertEq(depositSharesBefore, 0, "Staker has already deposited into this strategy"); assertFalse(_isDepositedStrategy(staker, dummyStrat), "strategy should not be deposited"); - delegationManagerMock.addShares(strategyManager, staker, dummyToken, dummyStrat, amount); + delegationManagerMock.addShares(strategyManager, staker, dummyStrat, amount); uint256 stakerStrategyListLengthAfter = strategyManager.stakerStrategyListLength(staker); uint256 depositSharesAfter = strategyManager.stakerDepositShares(staker, dummyStrat); assertEq( @@ -1349,7 +1349,7 @@ contract StrategyManagerUnitTests_addShares is StrategyManagerUnitTests { assertEq(depositSharesBefore, initialAmount, "Staker has not deposited amount into strategy"); assertTrue(_isDepositedStrategy(staker, strategy), "strategy should be deposited"); - delegationManagerMock.addShares(strategyManager, staker, dummyToken, dummyStrat, sharesAmount); + delegationManagerMock.addShares(strategyManager, staker, dummyStrat, sharesAmount); uint256 stakerStrategyListLengthAfter = strategyManager.stakerStrategyListLength(staker); uint256 depositSharesAfter = strategyManager.stakerDepositShares(staker, dummyStrat); assertEq( @@ -1397,7 +1397,7 @@ contract StrategyManagerUnitTests_addShares is StrategyManagerUnitTests { cheats.prank(staker); cheats.expectRevert(IStrategyManagerErrors.MaxStrategiesExceeded.selector); - delegationManagerMock.addShares(strategyManager, staker, dummyToken, strategy, amount); + delegationManagerMock.addShares(strategyManager, staker, strategy, amount); cheats.expectRevert(IStrategyManagerErrors.MaxStrategiesExceeded.selector); strategyManager.depositIntoStrategy(strategy, token, amount); From b8f0bf99b95761064bf0cf838b55a4c1ae9d2f7a Mon Sep 17 00:00:00 2001 From: Alex <18387287+wadealexc@users.noreply.github.com> Date: Tue, 21 Jan 2025 11:16:04 -0500 Subject: [PATCH 09/35] feat: better introspection for encumbered magnitude (#1038) * feat: better introspection for encumbered magnitude * chore: bindings * chore: fix comment and make bindings --- pkg/bindings/AVSDirectory/binding.go | 2 +- pkg/bindings/AllocationManager/binding.go | 66 +++++++++---------- .../AllocationManagerStorage/binding.go | 64 +++++++++--------- pkg/bindings/BackingEigen/binding.go | 2 +- pkg/bindings/BeaconChainProofs/binding.go | 2 +- pkg/bindings/BytesLib/binding.go | 2 +- pkg/bindings/DelegationManager/binding.go | 2 +- pkg/bindings/Eigen/binding.go | 2 +- pkg/bindings/EigenPod/binding.go | 2 +- pkg/bindings/EigenPodManager/binding.go | 2 +- pkg/bindings/EigenStrategy/binding.go | 2 +- pkg/bindings/Endian/binding.go | 2 +- pkg/bindings/Merkle/binding.go | 2 +- pkg/bindings/OperatorSetLib/binding.go | 2 +- pkg/bindings/PauserRegistry/binding.go | 2 +- pkg/bindings/PermissionController/binding.go | 2 +- pkg/bindings/RewardsCoordinator/binding.go | 4 ++ pkg/bindings/SlashingLib/binding.go | 2 +- pkg/bindings/Snapshots/binding.go | 2 +- pkg/bindings/StrategyBase/binding.go | 2 +- pkg/bindings/StrategyBaseTVLLimits/binding.go | 2 +- pkg/bindings/StrategyFactory/binding.go | 2 +- pkg/bindings/StrategyManager/binding.go | 2 +- src/contracts/core/AllocationManager.sol | 22 ++++++- .../core/AllocationManagerStorage.sol | 4 +- .../interfaces/IAllocationManager.sol | 8 +++ src/test/integration/IntegrationBase.t.sol | 2 +- src/test/unit/AllocationManagerUnit.t.sol | 26 +++----- 28 files changed, 128 insertions(+), 108 deletions(-) diff --git a/pkg/bindings/AVSDirectory/binding.go b/pkg/bindings/AVSDirectory/binding.go index ca79d413fa..8143a24853 100644 --- a/pkg/bindings/AVSDirectory/binding.go +++ b/pkg/bindings/AVSDirectory/binding.go @@ -39,7 +39,7 @@ type ISignatureUtilsSignatureWithSaltAndExpiry struct { // AVSDirectoryMetaData contains all meta data concerning the AVSDirectory contract. var AVSDirectoryMetaData = &bind.MetaData{ ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"_delegation\",\"type\":\"address\",\"internalType\":\"contractIDelegationManager\"},{\"name\":\"_pauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"OPERATOR_AVS_REGISTRATION_TYPEHASH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"OPERATOR_SET_FORCE_DEREGISTRATION_TYPEHASH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"OPERATOR_SET_REGISTRATION_TYPEHASH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"avsOperatorStatus\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"enumIAVSDirectoryTypes.OperatorAVSRegistrationStatus\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"calculateOperatorAVSRegistrationDigestHash\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"cancelSalt\",\"inputs\":[{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"delegation\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIDelegationManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"deregisterOperatorFromAVS\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"domainSeparator\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"initialOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"initialPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"operatorSaltIsSpent\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"isSpent\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"pauseAll\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[{\"name\":\"index\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pauserRegistry\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"registerOperatorToAVS\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSignature\",\"type\":\"tuple\",\"internalType\":\"structISignatureUtils.SignatureWithSaltAndExpiry\",\"components\":[{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"updateAVSMetadataURI\",\"inputs\":[{\"name\":\"metadataURI\",\"type\":\"string\",\"internalType\":\"string\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"AVSMetadataURIUpdated\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"metadataURI\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorAVSRegistrationStatusUpdated\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"avs\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"status\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"enumIAVSDirectoryTypes.OperatorAVSRegistrationStatus\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"CurrentlyPaused\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InputAddressZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidNewPausedStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidSignature\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyPauser\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyUnpauser\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OperatorAlreadyRegisteredToAVS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OperatorNotRegisteredToAVS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OperatorNotRegisteredToEigenLayer\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SaltSpent\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SignatureExpired\",\"inputs\":[]}]", - Bin: "0x610100604052348015610010575f5ffd5b5060405161170438038061170483398101604081905261002f916101ed565b81816001600160a01b038116610058576040516339b190bb60e11b815260040160405180910390fd5b6001600160a01b039081166080521660a0524660c052610108604080518082018252600a81526922b4b3b2b72630bcb2b960b11b60209182015281517f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a866818301527f71b625cfad44bac63b13dba07f2e1d6084ee04b6f8752101ece6126d584ee6ea81840152466060820152306080808301919091528351808303909101815260a0909101909252815191012090565b60e05261011361011a565b5050610225565b5f54610100900460ff16156101855760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff908116146101d4575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b03811681146101ea575f5ffd5b50565b5f5f604083850312156101fe575f5ffd5b8251610209816101d6565b602084015190925061021a816101d6565b809150509250929050565b60805160a05160c05160e0516114906102745f395f610b7a01525f610aba01525f8181610340015261063d01525f818161021c015281816103d8015281816104ad0152610b9e01526114905ff3fe608060405234801561000f575f5ffd5b506004361061013d575f3560e01c8063a364f4da116100b4578063dce974b911610079578063dce974b914610314578063df5cf7231461033b578063ec76f44214610362578063f2fde38b14610395578063f698da25146103a8578063fabc1cbc146103b0575f5ffd5b8063a364f4da1461028d578063a98fb355146102a0578063c825fe68146102b3578063cd6dc687146102da578063d79aceab146102ed575f5ffd5b80635c975abb116101055780635c975abb146101fd578063715018a61461020f578063886f1195146102175780638da5cb5b146102565780639926ee7d14610267578063a1060c881461027a575f5ffd5b8063136439dd14610141578063374823b51461015657806349075da314610198578063595c6a67146101d25780635ac86ab7146101da575b5f5ffd5b61015461014f366004611075565b6103c3565b005b6101836101643660046110a0565b609960209081525f928352604080842090915290825290205460ff1681565b60405190151581526020015b60405180910390f35b6101c56101a63660046110ca565b609860209081525f928352604080842090915290825290205460ff1681565b60405161018f9190611115565b610154610498565b6101836101e836600461113b565b606654600160ff9092169190911b9081161490565b6066545b60405190815260200161018f565b610154610547565b61023e7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200161018f565b6033546001600160a01b031661023e565b6101546102753660046111d0565b610558565b6102016102883660046112bd565b610777565b61015461029b366004611300565b6107f6565b6101546102ae36600461131b565b6108db565b6102017f809c5ac049c45b7a7f050a20f00c16cf63797efbf8b1eb8d749fdfa39ff8f92981565b6101546102e83660046110a0565b610922565b6102017fda2c89bafdd34776a2b8bb9c83c82f419e20cc8c67207f70edd58249b92661bd81565b6102017f4ee65f64218c67b68da66fd0db16560040a6b973290b9e71912d661ee53fe49581565b61023e7f000000000000000000000000000000000000000000000000000000000000000081565b610154610370366004611075565b335f90815260996020908152604080832093835292905220805460ff19166001179055565b6101546103a3366004611300565b610a3e565b610201610ab7565b6101546103be366004611075565b610b9c565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa158015610425573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104499190611389565b61046657604051631d77d47760e21b815260040160405180910390fd5b606654818116811461048b5760405163c61dca5d60e01b815260040160405180910390fd5b61049482610cab565b5050565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa1580156104fa573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061051e9190611389565b61053b57604051631d77d47760e21b815260040160405180910390fd5b6105455f19610cab565b565b61054f610ce8565b6105455f610d42565b6066545f906001908116036105805760405163840a48d560e01b815260040160405180910390fd5b6001335f9081526098602090815260408083206001600160a01b038816845290915290205460ff1660018111156105b9576105b9611101565b036105d757604051631aa528bb60e11b815260040160405180910390fd5b6001600160a01b0383165f90815260996020908152604080832085830151845290915290205460ff161561061e57604051630d4c4c9160e21b815260040160405180910390fd5b6040516336b87bd760e11b81526001600160a01b0384811660048301527f00000000000000000000000000000000000000000000000000000000000000001690636d70f7ae90602401602060405180830381865afa158015610682573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106a69190611389565b6106c357604051639f88c8af60e01b815260040160405180910390fd5b6106e7836106db853386602001518760400151610777565b84516040860151610d93565b6001600160a01b0383165f81815260996020908152604080832086830151845282528083208054600160ff19918216811790925533808652609885528386208787529094529382902080549094168117909355519092917ff0952b1c65271d819d39983d2abb044b9cace59bcc4d4dd389f586ebdcb15b419161076a9190611115565b60405180910390a3505050565b604080517fda2c89bafdd34776a2b8bb9c83c82f419e20cc8c67207f70edd58249b92661bd60208201526001600160a01b038087169282019290925290841660608201526080810183905260a081018290525f906107ed9060c00160405160208183030381529060405280519060200120610deb565b95945050505050565b6066545f9060019081160361081e5760405163840a48d560e01b815260040160405180910390fd5b6001335f9081526098602090815260408083206001600160a01b038716845290915290205460ff16600181111561085757610857611101565b14610875576040516352df45c960e01b815260040160405180910390fd5b335f8181526098602090815260408083206001600160a01b0387168085529252808320805460ff191690555190917ff0952b1c65271d819d39983d2abb044b9cace59bcc4d4dd389f586ebdcb15b41916108cf9190611115565b60405180910390a35050565b336001600160a01b03167fa89c1dc243d8908a96dd84944bcc97d6bc6ac00dd78e20621576be6a3c94371383836040516109169291906113a8565b60405180910390a25050565b5f54610100900460ff161580801561094057505f54600160ff909116105b806109595750303b15801561095957505f5460ff166001145b6109c15760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b5f805460ff1916600117905580156109e2575f805461ff0019166101001790555b6109eb82610cab565b6109f483610d42565b8015610a39575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050565b610a46610ce8565b6001600160a01b038116610aab5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016109b8565b610ab481610d42565b50565b5f7f00000000000000000000000000000000000000000000000000000000000000004614610b775750604080518082018252600a81526922b4b3b2b72630bcb2b960b11b60209182015281517f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a866818301527f71b625cfad44bac63b13dba07f2e1d6084ee04b6f8752101ece6126d584ee6ea81840152466060820152306080808301919091528351808303909101815260a0909101909252815191012090565b507f000000000000000000000000000000000000000000000000000000000000000090565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610bf8573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c1c91906113d6565b6001600160a01b0316336001600160a01b031614610c4d5760405163794821ff60e01b815260040160405180910390fd5b60665480198219811614610c745760405163c61dca5d60e01b815260040160405180910390fd5b606682905560405182815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c90602001610916565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a250565b6033546001600160a01b031633146105455760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016109b8565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b42811015610db457604051630819bdcd60e01b815260040160405180910390fd5b610dc86001600160a01b0385168484610e31565b610de557604051638baa579f60e01b815260040160405180910390fd5b50505050565b5f610df4610ab7565b60405161190160f01b6020820152602281019190915260428101839052606201604051602081830303815290604052805190602001209050919050565b5f5f5f610e3e8585610e8f565b90925090505f816004811115610e5657610e56611101565b148015610e745750856001600160a01b0316826001600160a01b0316145b80610e855750610e85868686610ed1565b9695505050505050565b5f5f8251604103610ec3576020830151604084015160608501515f1a610eb787828585610fb8565b94509450505050610eca565b505f905060025b9250929050565b5f5f5f856001600160a01b0316631626ba7e60e01b8686604051602401610ef99291906113f1565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b0319909416939093179092529051610f37919061142d565b5f60405180830381855afa9150503d805f8114610f6f576040519150601f19603f3d011682016040523d82523d5f602084013e610f74565b606091505b5091509150818015610f8857506020815110155b8015610e8557508051630b135d3f60e11b90610fad9083016020908101908401611443565b149695505050505050565b5f807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0831115610fed57505f9050600361106c565b604080515f8082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa15801561103e573d5f5f3e3d5ffd5b5050604051601f1901519150506001600160a01b038116611066575f6001925092505061106c565b91505f90505b94509492505050565b5f60208284031215611085575f5ffd5b5035919050565b6001600160a01b0381168114610ab4575f5ffd5b5f5f604083850312156110b1575f5ffd5b82356110bc8161108c565b946020939093013593505050565b5f5f604083850312156110db575f5ffd5b82356110e68161108c565b915060208301356110f68161108c565b809150509250929050565b634e487b7160e01b5f52602160045260245ffd5b602081016002831061113557634e487b7160e01b5f52602160045260245ffd5b91905290565b5f6020828403121561114b575f5ffd5b813560ff8116811461115b575f5ffd5b9392505050565b634e487b7160e01b5f52604160045260245ffd5b6040516060810167ffffffffffffffff8111828210171561119957611199611162565b60405290565b604051601f8201601f1916810167ffffffffffffffff811182821017156111c8576111c8611162565b604052919050565b5f5f604083850312156111e1575f5ffd5b82356111ec8161108c565b9150602083013567ffffffffffffffff811115611207575f5ffd5b830160608186031215611218575f5ffd5b611220611176565b813567ffffffffffffffff811115611236575f5ffd5b8201601f81018713611246575f5ffd5b803567ffffffffffffffff81111561126057611260611162565b611273601f8201601f191660200161119f565b818152886020838501011115611287575f5ffd5b816020840160208301375f6020928201830152835283810135908301525060409182013591810191909152919491935090915050565b5f5f5f5f608085870312156112d0575f5ffd5b84356112db8161108c565b935060208501356112eb8161108c565b93969395505050506040820135916060013590565b5f60208284031215611310575f5ffd5b813561115b8161108c565b5f5f6020838503121561132c575f5ffd5b823567ffffffffffffffff811115611342575f5ffd5b8301601f81018513611352575f5ffd5b803567ffffffffffffffff811115611368575f5ffd5b856020828401011115611379575f5ffd5b6020919091019590945092505050565b5f60208284031215611399575f5ffd5b8151801515811461115b575f5ffd5b60208152816020820152818360408301375f818301604090810191909152601f909201601f19160101919050565b5f602082840312156113e6575f5ffd5b815161115b8161108c565b828152604060208201525f82518060408401528060208501606085015e5f606082850101526060601f19601f8301168401019150509392505050565b5f82518060208501845e5f920191825250919050565b5f60208284031215611453575f5ffd5b505191905056fea2646970667358221220dd58927808a5d420cc6c9f6a25152778d4f182ee1e97e729f478130f5b06873b64736f6c634300081b0033", + Bin: "0x610100604052348015610010575f5ffd5b50604051612ac3380380612ac38339818101604052810190610032919061032c565b81815f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610099576040517f7363217600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff1681525050508073ffffffffffffffffffffffffffffffffffffffff1660a08173ffffffffffffffffffffffffffffffffffffffff1681525050504660c0818152505061011961013560201b60201c565b60e0818152505061012e6101c460201b60201c565b50506104be565b5f7f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a8666040518060400160405280600a81526020017f456967656e4c61796572000000000000000000000000000000000000000000008152508051906020012046306040516020016101a994939291906103a9565b60405160208183030381529060405280519060200120905090565b5f60019054906101000a900460ff1615610213576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161020a9061046c565b60405180910390fd5b60ff80165f5f9054906101000a900460ff1660ff16146102805760ff5f5f6101000a81548160ff021916908360ff1602179055507f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb384740249860ff60405161027791906104a5565b60405180910390a15b565b5f5ffd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6102af82610286565b9050919050565b5f6102c0826102a5565b9050919050565b6102d0816102b6565b81146102da575f5ffd5b50565b5f815190506102eb816102c7565b92915050565b5f6102fb826102a5565b9050919050565b61030b816102f1565b8114610315575f5ffd5b50565b5f8151905061032681610302565b92915050565b5f5f6040838503121561034257610341610282565b5b5f61034f858286016102dd565b925050602061036085828601610318565b9150509250929050565b5f819050919050565b61037c8161036a565b82525050565b5f819050919050565b61039481610382565b82525050565b6103a3816102a5565b82525050565b5f6080820190506103bc5f830187610373565b6103c96020830186610373565b6103d6604083018561038b565b6103e3606083018461039a565b95945050505050565b5f82825260208201905092915050565b7f496e697469616c697a61626c653a20636f6e747261637420697320696e6974695f8201527f616c697a696e6700000000000000000000000000000000000000000000000000602082015250565b5f6104566027836103ec565b9150610461826103fc565b604082019050919050565b5f6020820190508181035f8301526104838161044a565b9050919050565b5f60ff82169050919050565b61049f8161048a565b82525050565b5f6020820190506104b85f830184610496565b92915050565b60805160a05160c05160e0516125b661050d5f395f6110c701525f61109301525f818161088c0152610f8501525f81816103ea0152818161055a0152818161068a01526110ee01526125b65ff3fe608060405234801561000f575f5ffd5b5060043610610140575f3560e01c8063a364f4da116100b6578063dce974b91161007a578063dce974b91461033a578063df5cf72314610358578063ec76f44214610376578063f2fde38b14610392578063f698da25146103ae578063fabc1cbc146103cc57610140565b8063a364f4da146102aa578063a98fb355146102c6578063c825fe68146102e2578063cd6dc68714610300578063d79aceab1461031c57610140565b80635c975abb116101085780635c975abb146101fa578063715018a614610218578063886f1195146102225780638da5cb5b146102405780639926ee7d1461025e578063a1060c881461027a57610140565b8063136439dd14610144578063374823b51461016057806349075da314610190578063595c6a67146101c05780635ac86ab7146101ca575b5f5ffd5b61015e600480360381019061015991906118d7565b6103e8565b005b61017a6004803603810190610175919061198f565b610504565b60405161018791906119e7565b60405180910390f35b6101aa60048036038101906101a59190611a00565b61052e565b6040516101b79190611ab1565b60405180910390f35b6101c8610558565b005b6101e460048036038101906101df9190611b00565b610651565b6040516101f191906119e7565b60405180910390f35b61020261066c565b60405161020f9190611b3a565b60405180910390f35b610220610675565b005b61022a610688565b6040516102379190611bae565b60405180910390f35b6102486106ac565b6040516102559190611bd6565b60405180910390f35b61027860048036038101906102739190611db0565b6106d4565b005b610294600480360381019061028f9190611e0a565b610af1565b6040516102a19190611e7d565b60405180910390f35b6102c460048036038101906102bf9190611e96565b610b53565b005b6102e060048036038101906102db9190611f1e565b610d7d565b005b6102ea610dd1565b6040516102f79190611e7d565b60405180910390f35b61031a60048036038101906103159190611f69565b610df5565b005b610324610f3b565b6040516103319190611e7d565b60405180910390f35b610342610f5f565b60405161034f9190611e7d565b60405180910390f35b610360610f83565b60405161036d9190611fc7565b60405180910390f35b610390600480360381019061038b9190611fe0565b610fa7565b005b6103ac60048036038101906103a79190611e96565b61100e565b005b6103b6611090565b6040516103c39190611e7d565b60405180910390f35b6103e660048036038101906103e191906118d7565b6110ec565b005b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166346fbf68e336040518263ffffffff1660e01b81526004016104419190611bd6565b602060405180830381865afa15801561045c573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104809190612035565b6104b6576040517f75df51dc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f606654905080828216146104f7576040517fc61dca5d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6105008261127a565b5050565b6099602052815f5260405f20602052805f5260405f205f915091509054906101000a900460ff1681565b6098602052815f5260405f20602052805f5260405f205f915091509054906101000a900460ff1681565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166346fbf68e336040518263ffffffff1660e01b81526004016105b19190611bd6565b602060405180830381865afa1580156105cc573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105f09190612035565b610626576040517f75df51dc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61064f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61127a565b565b5f5f8260ff166001901b905080816066541614915050919050565b5f606654905090565b61067d6112d2565b6106865f611350565b565b7f000000000000000000000000000000000000000000000000000000000000000081565b5f60335f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b5f6106de81610651565b15610715576040517f840a48d500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60018081111561072857610727611a3e565b5b60985f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1660018111156107bf576107be611a3e565b5b036107f6576040517f354a517600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60995f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f836020015181526020019081526020015f205f9054906101000a900460ff161561088a576040517f3531324400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16636d70f7ae846040518263ffffffff1660e01b81526004016108e39190611bd6565b602060405180830381865afa1580156108fe573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109229190612035565b610958576040517f9f88c8af00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61097e83610970853386602001518760400151610af1565b845f01518560400151611413565b600160995f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f846020015181526020019081526020015f205f6101000a81548160ff021916908315150217905550600160985f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff02191690836001811115610a8157610a80611a3e565b5b02179055503373ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167ff0952b1c65271d819d39983d2abb044b9cace59bcc4d4dd389f586ebdcb15b416001604051610ae49190611ab1565b60405180910390a3505050565b5f610b497fda2c89bafdd34776a2b8bb9c83c82f419e20cc8c67207f70edd58249b92661bd86868686604051602001610b2e959493929190612060565b604051602081830303815290604052805190602001206114b4565b9050949350505050565b5f610b5d81610651565b15610b94576040517f840a48d500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180811115610ba757610ba6611a3e565b5b60985f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff166001811115610c3e57610c3d611a3e565b5b14610c75576040517f52df45c900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f60985f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff02191690836001811115610d0f57610d0e611a3e565b5b02179055503373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167ff0952b1c65271d819d39983d2abb044b9cace59bcc4d4dd389f586ebdcb15b415f604051610d719190611ab1565b60405180910390a35050565b3373ffffffffffffffffffffffffffffffffffffffff167fa89c1dc243d8908a96dd84944bcc97d6bc6ac00dd78e20621576be6a3c9437138383604051610dc59291906120ed565b60405180910390a25050565b7f809c5ac049c45b7a7f050a20f00c16cf63797efbf8b1eb8d749fdfa39ff8f92981565b5f5f60019054906101000a900460ff16159050808015610e25575060015f5f9054906101000a900460ff1660ff16105b80610e525750610e34306114ec565b158015610e51575060015f5f9054906101000a900460ff1660ff16145b5b610e91576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e889061217f565b60405180910390fd5b60015f5f6101000a81548160ff021916908360ff1602179055508015610ecc5760015f60016101000a81548160ff0219169083151502179055505b610ed58261127a565b610ede83611350565b8015610f36575f5f60016101000a81548160ff0219169083151502179055507f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024986001604051610f2d91906121d6565b60405180910390a15b505050565b7fda2c89bafdd34776a2b8bb9c83c82f419e20cc8c67207f70edd58249b92661bd81565b7f4ee65f64218c67b68da66fd0db16560040a6b973290b9e71912d661ee53fe49581565b7f000000000000000000000000000000000000000000000000000000000000000081565b600160995f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8381526020019081526020015f205f6101000a81548160ff02191690831515021790555050565b6110166112d2565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611084576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161107b9061225f565b60405180910390fd5b61108d81611350565b50565b5f7f000000000000000000000000000000000000000000000000000000000000000046146110c5576110c061150e565b6110e7565b7f00000000000000000000000000000000000000000000000000000000000000005b905090565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611155573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111799190612291565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146111dd576040517f794821ff00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f60665490508019821982191614611221576040517fc61dca5d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b816066819055503373ffffffffffffffffffffffffffffffffffffffff167f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c8360405161126e9190611b3a565b60405180910390a25050565b806066819055503373ffffffffffffffffffffffffffffffffffffffff167fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d826040516112c79190611b3a565b60405180910390a250565b6112da61159d565b73ffffffffffffffffffffffffffffffffffffffff166112f86106ac565b73ffffffffffffffffffffffffffffffffffffffff161461134e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161134590612306565b60405180910390fd5b565b5f60335f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160335f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b4281101561144d576040517f0819bdcd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61147883838673ffffffffffffffffffffffffffffffffffffffff166115a49092919063ffffffff16565b6114ae576040517f8baa579f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b5f6114bd611090565b826040516020016114cf929190612398565b604051602081830303815290604052805190602001209050919050565b5f5f8273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b5f7f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a8666040518060400160405280600a81526020017f456967656e4c617965720000000000000000000000000000000000000000000081525080519060200120463060405160200161158294939291906123ce565b60405160208183030381529060405280519060200120905090565b5f33905090565b5f5f5f6115b18585611630565b915091505f60048111156115c8576115c7611a3e565b5b8160048111156115db576115da611a3e565b5b14801561161357508573ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b80611625575061162486868661167c565b5b925050509392505050565b5f5f604183510361166d575f5f5f602086015192506040860151915060608601515f1a9050611661878285856117bb565b94509450505050611675565b5f6002915091505b9250929050565b5f5f5f8573ffffffffffffffffffffffffffffffffffffffff16631626ba7e60e01b86866040516024016116b1929190612471565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505060405161171b91906124d9565b5f60405180830381855afa9150503d805f8114611753576040519150601f19603f3d011682016040523d82523d5f602084013e611758565b606091505b509150915081801561176c57506020815110155b80156117b05750631626ba7e60e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916818060200190518101906117ae9190612503565b145b925050509392505050565b5f5f7f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0835f1c11156117f3575f60039150915061188a565b5f6001878787876040515f8152602001604052604051611816949392919061253d565b6020604051602081039080840390855afa158015611836573d5f5f3e3d5ffd5b5050506020604051035190505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611882575f6001925092505061188a565b805f92509250505b94509492505050565b5f604051905090565b5f5ffd5b5f5ffd5b5f819050919050565b6118b6816118a4565b81146118c0575f5ffd5b50565b5f813590506118d1816118ad565b92915050565b5f602082840312156118ec576118eb61189c565b5b5f6118f9848285016118c3565b91505092915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f61192b82611902565b9050919050565b61193b81611921565b8114611945575f5ffd5b50565b5f8135905061195681611932565b92915050565b5f819050919050565b61196e8161195c565b8114611978575f5ffd5b50565b5f8135905061198981611965565b92915050565b5f5f604083850312156119a5576119a461189c565b5b5f6119b285828601611948565b92505060206119c38582860161197b565b9150509250929050565b5f8115159050919050565b6119e1816119cd565b82525050565b5f6020820190506119fa5f8301846119d8565b92915050565b5f5f60408385031215611a1657611a1561189c565b5b5f611a2385828601611948565b9250506020611a3485828601611948565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b60028110611a7c57611a7b611a3e565b5b50565b5f819050611a8c82611a6b565b919050565b5f611a9b82611a7f565b9050919050565b611aab81611a91565b82525050565b5f602082019050611ac45f830184611aa2565b92915050565b5f60ff82169050919050565b611adf81611aca565b8114611ae9575f5ffd5b50565b5f81359050611afa81611ad6565b92915050565b5f60208284031215611b1557611b1461189c565b5b5f611b2284828501611aec565b91505092915050565b611b34816118a4565b82525050565b5f602082019050611b4d5f830184611b2b565b92915050565b5f819050919050565b5f611b76611b71611b6c84611902565b611b53565b611902565b9050919050565b5f611b8782611b5c565b9050919050565b5f611b9882611b7d565b9050919050565b611ba881611b8e565b82525050565b5f602082019050611bc15f830184611b9f565b92915050565b611bd081611921565b82525050565b5f602082019050611be95f830184611bc7565b92915050565b5f5ffd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b611c3982611bf3565b810181811067ffffffffffffffff82111715611c5857611c57611c03565b5b80604052505050565b5f611c6a611893565b9050611c768282611c30565b919050565b5f5ffd5b5f5ffd5b5f5ffd5b5f67ffffffffffffffff821115611ca157611ca0611c03565b5b611caa82611bf3565b9050602081019050919050565b828183375f83830152505050565b5f611cd7611cd284611c87565b611c61565b905082815260208101848484011115611cf357611cf2611c83565b5b611cfe848285611cb7565b509392505050565b5f82601f830112611d1a57611d19611c7f565b5b8135611d2a848260208601611cc5565b91505092915050565b5f60608284031215611d4857611d47611bef565b5b611d526060611c61565b90505f82013567ffffffffffffffff811115611d7157611d70611c7b565b5b611d7d84828501611d06565b5f830152506020611d908482850161197b565b6020830152506040611da4848285016118c3565b60408301525092915050565b5f5f60408385031215611dc657611dc561189c565b5b5f611dd385828601611948565b925050602083013567ffffffffffffffff811115611df457611df36118a0565b5b611e0085828601611d33565b9150509250929050565b5f5f5f5f60808587031215611e2257611e2161189c565b5b5f611e2f87828801611948565b9450506020611e4087828801611948565b9350506040611e518782880161197b565b9250506060611e62878288016118c3565b91505092959194509250565b611e778161195c565b82525050565b5f602082019050611e905f830184611e6e565b92915050565b5f60208284031215611eab57611eaa61189c565b5b5f611eb884828501611948565b91505092915050565b5f5ffd5b5f5ffd5b5f5f83601f840112611ede57611edd611c7f565b5b8235905067ffffffffffffffff811115611efb57611efa611ec1565b5b602083019150836001820283011115611f1757611f16611ec5565b5b9250929050565b5f5f60208385031215611f3457611f3361189c565b5b5f83013567ffffffffffffffff811115611f5157611f506118a0565b5b611f5d85828601611ec9565b92509250509250929050565b5f5f60408385031215611f7f57611f7e61189c565b5b5f611f8c85828601611948565b9250506020611f9d858286016118c3565b9150509250929050565b5f611fb182611b7d565b9050919050565b611fc181611fa7565b82525050565b5f602082019050611fda5f830184611fb8565b92915050565b5f60208284031215611ff557611ff461189c565b5b5f6120028482850161197b565b91505092915050565b612014816119cd565b811461201e575f5ffd5b50565b5f8151905061202f8161200b565b92915050565b5f6020828403121561204a5761204961189c565b5b5f61205784828501612021565b91505092915050565b5f60a0820190506120735f830188611e6e565b6120806020830187611bc7565b61208d6040830186611bc7565b61209a6060830185611e6e565b6120a76080830184611b2b565b9695505050505050565b5f82825260208201905092915050565b5f6120cc83856120b1565b93506120d9838584611cb7565b6120e283611bf3565b840190509392505050565b5f6020820190508181035f8301526121068184866120c1565b90509392505050565b7f496e697469616c697a61626c653a20636f6e747261637420697320616c7265615f8201527f647920696e697469616c697a6564000000000000000000000000000000000000602082015250565b5f612169602e836120b1565b91506121748261210f565b604082019050919050565b5f6020820190508181035f8301526121968161215d565b9050919050565b5f819050919050565b5f6121c06121bb6121b68461219d565b611b53565b611aca565b9050919050565b6121d0816121a6565b82525050565b5f6020820190506121e95f8301846121c7565b92915050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f20615f8201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b5f6122496026836120b1565b9150612254826121ef565b604082019050919050565b5f6020820190508181035f8301526122768161223d565b9050919050565b5f8151905061228b81611932565b92915050565b5f602082840312156122a6576122a561189c565b5b5f6122b38482850161227d565b91505092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65725f82015250565b5f6122f06020836120b1565b91506122fb826122bc565b602082019050919050565b5f6020820190508181035f83015261231d816122e4565b9050919050565b5f81905092915050565b7f19010000000000000000000000000000000000000000000000000000000000005f82015250565b5f612362600283612324565b915061236d8261232e565b600282019050919050565b5f819050919050565b61239261238d8261195c565b612378565b82525050565b5f6123a282612356565b91506123ae8285612381565b6020820191506123be8284612381565b6020820191508190509392505050565b5f6080820190506123e15f830187611e6e565b6123ee6020830186611e6e565b6123fb6040830185611b2b565b6124086060830184611bc7565b95945050505050565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f61244382612411565b61244d818561241b565b935061245d81856020860161242b565b61246681611bf3565b840191505092915050565b5f6040820190506124845f830185611e6e565b81810360208301526124968184612439565b90509392505050565b5f81905092915050565b5f6124b382612411565b6124bd818561249f565b93506124cd81856020860161242b565b80840191505092915050565b5f6124e482846124a9565b915081905092915050565b5f815190506124fd81611965565b92915050565b5f602082840312156125185761251761189c565b5b5f612525848285016124ef565b91505092915050565b61253781611aca565b82525050565b5f6080820190506125505f830187611e6e565b61255d602083018661252e565b61256a6040830185611e6e565b6125776060830184611e6e565b9594505050505056fea2646970667358221220925329a0da45be69255de62f8f9fdf914899d8e2b6a85309c61398e68a75a3b164736f6c634300081b0033", } // AVSDirectoryABI is the input ABI used to generate the binding from. diff --git a/pkg/bindings/AllocationManager/binding.go b/pkg/bindings/AllocationManager/binding.go index cea51cb22e..a4e215221a 100644 --- a/pkg/bindings/AllocationManager/binding.go +++ b/pkg/bindings/AllocationManager/binding.go @@ -80,8 +80,8 @@ type OperatorSet struct { // AllocationManagerMetaData contains all meta data concerning the AllocationManager contract. var AllocationManagerMetaData = &bind.MetaData{ - ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"_delegation\",\"type\":\"address\",\"internalType\":\"contractIDelegationManager\"},{\"name\":\"_pauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"},{\"name\":\"_permissionController\",\"type\":\"address\",\"internalType\":\"contractIPermissionController\"},{\"name\":\"_DEALLOCATION_DELAY\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"_ALLOCATION_CONFIGURATION_DELAY\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"ALLOCATION_CONFIGURATION_DELAY\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"DEALLOCATION_DELAY\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"addStrategiesToOperatorSet\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetId\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"clearDeallocationQueue\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"numToClear\",\"type\":\"uint16[]\",\"internalType\":\"uint16[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"createOperatorSets\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"params\",\"type\":\"tuple[]\",\"internalType\":\"structIAllocationManagerTypes.CreateSetParams[]\",\"components\":[{\"name\":\"operatorSetId\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"delegation\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIDelegationManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"deregisterFromOperatorSets\",\"inputs\":[{\"name\":\"params\",\"type\":\"tuple\",\"internalType\":\"structIAllocationManagerTypes.DeregisterParams\",\"components\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetIds\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"encumberedMagnitude\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAVSRegistrar\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIAVSRegistrar\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAllocatableMagnitude\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAllocatedSets\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple[]\",\"internalType\":\"structOperatorSet[]\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAllocatedStrategies\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAllocation\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIAllocationManagerTypes.Allocation\",\"components\":[{\"name\":\"currentMagnitude\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"pendingDiff\",\"type\":\"int128\",\"internalType\":\"int128\"},{\"name\":\"effectBlock\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAllocationDelay\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAllocations\",\"inputs\":[{\"name\":\"operators\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple[]\",\"internalType\":\"structIAllocationManagerTypes.Allocation[]\",\"components\":[{\"name\":\"currentMagnitude\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"pendingDiff\",\"type\":\"int128\",\"internalType\":\"int128\"},{\"name\":\"effectBlock\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getMaxMagnitude\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getMaxMagnitudes\",\"inputs\":[{\"name\":\"operators\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64[]\",\"internalType\":\"uint64[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getMaxMagnitudes\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64[]\",\"internalType\":\"uint64[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getMaxMagnitudesAtBlock\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"blockNumber\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64[]\",\"internalType\":\"uint64[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getMemberCount\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getMembers\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getMinimumSlashableStake\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"operators\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"futureBlock\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[{\"name\":\"slashableStake\",\"type\":\"uint256[][]\",\"internalType\":\"uint256[][]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getOperatorSetCount\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getRegisteredSets\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple[]\",\"internalType\":\"structOperatorSet[]\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getStrategiesInOperatorSet\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getStrategyAllocations\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple[]\",\"internalType\":\"structOperatorSet[]\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"\",\"type\":\"tuple[]\",\"internalType\":\"structIAllocationManagerTypes.Allocation[]\",\"components\":[{\"name\":\"currentMagnitude\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"pendingDiff\",\"type\":\"int128\",\"internalType\":\"int128\"},{\"name\":\"effectBlock\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"initialOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"initialPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"isMemberOfOperatorSet\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isOperatorSet\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"modifyAllocations\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"params\",\"type\":\"tuple[]\",\"internalType\":\"structIAllocationManagerTypes.AllocateParams[]\",\"components\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"newMagnitudes\",\"type\":\"uint64[]\",\"internalType\":\"uint64[]\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"pauseAll\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[{\"name\":\"index\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pauserRegistry\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"permissionController\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIPermissionController\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"registerForOperatorSets\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"params\",\"type\":\"tuple\",\"internalType\":\"structIAllocationManagerTypes.RegisterParams\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetIds\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"removeStrategiesFromOperatorSet\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetId\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setAVSRegistrar\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"registrar\",\"type\":\"address\",\"internalType\":\"contractIAVSRegistrar\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setAllocationDelay\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"delay\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"slashOperator\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"params\",\"type\":\"tuple\",\"internalType\":\"structIAllocationManagerTypes.SlashingParams\",\"components\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetId\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"wadsToSlash\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"},{\"name\":\"description\",\"type\":\"string\",\"internalType\":\"string\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"updateAVSMetadataURI\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"metadataURI\",\"type\":\"string\",\"internalType\":\"string\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"AVSMetadataURIUpdated\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"metadataURI\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"AVSRegistrarSet\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"registrar\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIAVSRegistrar\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"AllocationDelaySet\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"delay\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"},{\"name\":\"effectBlock\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"AllocationUpdated\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"magnitude\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"effectBlock\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"EncumberedMagnitudeUpdated\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"encumberedMagnitude\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"MaxMagnitudeUpdated\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"maxMagnitude\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorAddedToOperatorSet\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorRemovedFromOperatorSet\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorSetCreated\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorSlashed\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"strategies\",\"type\":\"address[]\",\"indexed\":false,\"internalType\":\"contractIStrategy[]\"},{\"name\":\"wadSlashed\",\"type\":\"uint256[]\",\"indexed\":false,\"internalType\":\"uint256[]\"},{\"name\":\"description\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StrategyAddedToOperatorSet\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StrategyRemovedFromOperatorSet\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"AlreadyMemberOfSet\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"CurrentlyPaused\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"Empty\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InputAddressZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InputArrayLengthMismatch\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InsufficientMagnitude\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidCaller\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidNewPausedStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidOperator\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidOperatorSet\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidPermissions\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidSnapshotOrdering\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidWadToSlash\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ModificationAlreadyPending\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotMemberOfSet\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyPauser\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyUnpauser\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OperatorNotSlashable\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OutOfBounds\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SameMagnitude\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StrategiesMustBeInAscendingOrder\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StrategyAlreadyInOperatorSet\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StrategyNotInOperatorSet\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"UninitializedAllocationDelay\",\"inputs\":[]}]", - Bin: "0x610120604052348015610010575f5ffd5b50604051615a80380380615a8083398101604081905261002f91610180565b82858383876001600160a01b03811661005b576040516339b190bb60e11b815260040160405180910390fd5b6001600160a01b0390811660805292831660a05263ffffffff91821660c0521660e052166101005261008b610095565b50505050506101e9565b5f54610100900460ff16156101005760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff9081161461014f575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b0381168114610165575f5ffd5b50565b805163ffffffff8116811461017b575f5ffd5b919050565b5f5f5f5f5f60a08688031215610194575f5ffd5b855161019f81610151565b60208701519095506101b081610151565b60408701519094506101c181610151565b92506101cf60608701610168565b91506101dd60808701610168565b90509295509295909350565b60805160a05160c05160e0516101005161580661027a5f395f81816103f9015261370301525f81816105480152613d0301525f818161031e0152818161223e015261293501525f81816106fa01528181610c970152818161161c01528181611c8301528181611ced0152612bfc01525f818161056f0152818161079201528181611d92015261337a01526158065ff3fe608060405234801561000f575f5ffd5b5060043610610281575f3560e01c80636e875dba11610156578063a984eb3a116100ca578063c221d8ae11610084578063c221d8ae146106bc578063cd6dc687146106cf578063d3d96ff4146106e2578063df5cf723146106f5578063f2fde38b1461071c578063fabc1cbc1461072f575f5ffd5b8063a984eb3a1461060e578063adc2e3d914610641578063b2447af714610654578063b66bd98914610667578063b9fbaed11461067a578063ba1a84e5146106a9575f5ffd5b80638ce648541161011b5780638ce64854146105915780638da5cb5b146105b157806394d7d00c146105c2578063952899ee146105d5578063a9333ec8146105e8578063a9821821146105fb575f5ffd5b80636e875dba14610515578063715018a61461052857806379ae50cd146105305780637bc1ef6114610543578063886f11951461056a575f5ffd5b80634657e26a116101f8578063595c6a67116101b2578063595c6a67146104875780635ac86ab71461048f5780635c975abb146104b2578063670d3ba2146104c45780636cfb4481146104d75780636e3492b514610502575f5ffd5b80634657e26a146103f45780634a10ffe51461041b5780634b5046ef1461043b57806350feea201461044e578063547afb871461046157806356c483e614610474575f5ffd5b80632981eb77116102495780632981eb77146103195780632bab2c4a14610355578063304c10cd1461037557806336352057146103a057806340120dab146103b35780634177a87c146103d4575f5ffd5b806310e1b9b814610285578063136439dd146102ae57806315fe5028146102c3578063260dc758146102e3578063261f84e014610306575b5f5ffd5b610298610293366004614733565b610742565b6040516102a5919061477a565b60405180910390f35b6102c16102bc3660046147ad565b61077d565b005b6102d66102d13660046147c4565b610852565b6040516102a59190614842565b6102f66102f1366004614854565b610969565b60405190151581526020016102a5565b6102c16103143660046148ae565b6109a0565b6103407f000000000000000000000000000000000000000000000000000000000000000081565b60405163ffffffff90911681526020016102a5565b610368610363366004614993565b610c43565b6040516102a59190614a47565b6103886103833660046147c4565b610f30565b6040516001600160a01b0390911681526020016102a5565b6102c16103ae366004614aaa565b610f5f565b6103c66103c1366004614afc565b611771565b6040516102a5929190614b89565b6103e76103e2366004614854565b6118ec565b6040516102a59190614be6565b6103887f000000000000000000000000000000000000000000000000000000000000000081565b61042e610429366004614bf8565b611910565b6040516102a59190614c3b565b6102c1610449366004614c86565b6119b8565b6102c161045c366004614d06565b611a72565b61042e61046f366004614d64565b611bd0565b6102c1610482366004614db0565b611c78565b6102c1611d7d565b6102f661049d366004614de3565b606654600160ff9092169190911b9081161490565b6066545b6040519081526020016102a5565b6102f66104d2366004614e03565b611e2c565b6104ea6104e5366004614afc565b611e3d565b6040516001600160401b0390911681526020016102a5565b6102c1610510366004614e44565b611faa565b6103e7610523366004614854565b61237a565b6102c161238b565b6102d661053e3660046147c4565b61239c565b6103407f000000000000000000000000000000000000000000000000000000000000000081565b6103887f000000000000000000000000000000000000000000000000000000000000000081565b6105a461059f366004614e75565b612476565b6040516102a59190614eb8565b6033546001600160a01b0316610388565b61042e6105d0366004614eca565b61253b565b6102c16105e3366004614f25565b612627565b6104ea6105f6366004614afc565b612aee565b6102c16106093660046150ce565b612b1d565b6104ea61061c366004614afc565b60a260209081525f92835260408084209091529082529020546001600160401b031681565b6102c161064f36600461514c565b612b8d565b6104b6610662366004614854565b612edc565b6102c1610675366004614d06565b612efe565b61068d6106883660046147c4565b613058565b60408051921515835263ffffffff9091166020830152016102a5565b6104b66106b73660046147c4565b6130f2565b6103e76106ca366004614e03565b613112565b6102c16106dd36600461518e565b613143565b6102c16106f0366004614afc565b613260565b6103887f000000000000000000000000000000000000000000000000000000000000000081565b6102c161072a3660046147c4565b6132ff565b6102c161073d3660046147ad565b613378565b604080516060810182525f80825260208201819052918101829052906107718561076b8661348e565b856134f1565b925050505b9392505050565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa1580156107df573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061080391906151b8565b61082057604051631d77d47760e21b815260040160405180910390fd5b60665481811681146108455760405163c61dca5d60e01b815260040160405180910390fd5b61084e8261365d565b5050565b6001600160a01b0381165f908152609d60205260408120606091906108769061369a565b90505f816001600160401b0381111561089157610891614657565b6040519080825280602002602001820160405280156108d557816020015b604080518082019091525f80825260208201528152602001906001900390816108af5790505b5090505f5b82811015610961576001600160a01b0385165f908152609d6020526040902061093c9061090790836136a3565b604080518082019091525f80825260208201525060408051808201909152606082901c815263ffffffff909116602082015290565b82828151811061094e5761094e6151d7565b60209081029190910101526001016108da565b509392505050565b60208082015182516001600160a01b03165f90815260989092526040822061099a9163ffffffff908116906136ae16565b92915050565b826109aa816136c5565b6109c75760405163932d94f760e01b815260040160405180910390fd5b5f5b82811015610c3c575f6040518060400160405280876001600160a01b031681526020018686858181106109fe576109fe6151d7565b9050602002810190610a1091906151eb565b610a1e906020810190615209565b63ffffffff168152509050610a68816020015163ffffffff1660985f896001600160a01b03166001600160a01b031681526020019081526020015f2061376f90919063ffffffff16565b610a8557604051631fb1705560e21b815260040160405180910390fd5b7f31629285ead2335ae0933f86ed2ae63321f7af77b4e6eaabc42c057880977e6c6040518060400160405280886001600160a01b03168152602001836020015163ffffffff16815250604051610adb9190615222565b60405180910390a15f610aed8261348e565b90505f5b868685818110610b0357610b036151d7565b9050602002810190610b1591906151eb565b610b23906020810190615230565b9050811015610c3157610b99878786818110610b4157610b416151d7565b9050602002810190610b5391906151eb565b610b61906020810190615230565b83818110610b7157610b716151d7565b9050602002016020810190610b8691906147c4565b5f8481526099602052604090209061377a565b507f7ab260fe0af193db5f4986770d831bda4ea46099dc817e8b6716dcae8af8e88b83888887818110610bce57610bce6151d7565b9050602002810190610be091906151eb565b610bee906020810190615230565b84818110610bfe57610bfe6151d7565b9050602002016020810190610c1391906147c4565b604051610c21929190615275565b60405180910390a1600101610af1565b5050506001016109c9565b5050505050565b606083516001600160401b03811115610c5e57610c5e614657565b604051908082528060200260200182016040528015610c9157816020015b6060815260200190600190039081610c7c5790505b5090505f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663f0e0e67686866040518363ffffffff1660e01b8152600401610ce392919061529b565b5f60405180830381865afa158015610cfd573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610d2491908101906152bf565b90505f5b8551811015610f26575f868281518110610d4457610d446151d7565b6020026020010151905085516001600160401b03811115610d6757610d67614657565b604051908082528060200260200182016040528015610d90578160200160208202803683370190505b50848381518110610da357610da36151d7565b60209081029190910101525f5b8651811015610f1c575f878281518110610dcc57610dcc6151d7565b6020908102919091018101516001600160a01b038086165f90815260a1845260408082209284168252919093528220909250610e079061378e565b9050806001600160401b03165f03610e20575050610f14565b5f610e2c858d85610742565b90508863ffffffff16816040015163ffffffff1611158015610e5457505f8160200151600f0b125b15610e7657610e6a815f015182602001516137a1565b6001600160401b031681525b80515f90610e91906001600160401b039081169085166137b5565b9050610ed881898981518110610ea957610ea96151d7565b60200260200101518781518110610ec257610ec26151d7565b60200260200101516137c990919063ffffffff16565b898881518110610eea57610eea6151d7565b60200260200101518681518110610f0357610f036151d7565b602002602001018181525050505050505b600101610db0565b5050600101610d28565b5050949350505050565b6001600160a01b038082165f908152609760205260408120549091168015610f585780610776565b5090919050565b606654600190600290811603610f885760405163840a48d560e01b815260040160405180910390fd5b82610f92816136c5565b610faf5760405163932d94f760e01b815260040160405180910390fd5b5f6040518060400160405280866001600160a01b03168152602001856020016020810190610fdd9190615209565b63ffffffff16905290505f610ffe610ff860208701876147c4565b836137dd565b905061100d6060860186615230565b905061101c6040870187615230565b90501461103c576040516343714afd60e01b815260040160405180910390fd5b60208083015183516001600160a01b03165f9081526098909252604090912061106e9163ffffffff908116906136ae16565b61108b57604051631fb1705560e21b815260040160405180910390fd5b806110a95760405163ebbff49760e01b815260040160405180910390fd5b5f6110b76040870187615230565b90506001600160401b038111156110d0576110d0614657565b6040519080825280602002602001820160405280156110f9578160200160208202803683370190505b5090505f5b61110b6040880188615230565b90508110156117025780158061119e57506111296040880188615230565b6111346001846153df565b818110611143576111436151d7565b905060200201602081019061115891906147c4565b6001600160a01b031661116e6040890189615230565b8381811061117e5761117e6151d7565b905060200201602081019061119391906147c4565b6001600160a01b0316115b6111bb57604051639f1c805360e01b815260040160405180910390fd5b6111c86060880188615230565b828181106111d8576111d86151d7565b905060200201355f1080156112185750670de0b6b3a76400006111fe6060890189615230565b8381811061120e5761120e6151d7565b9050602002013511155b61123557604051631353603160e01b815260040160405180910390fd5b6112916112456040890189615230565b83818110611255576112556151d7565b905060200201602081019061126a91906147c4565b60995f6112768861348e565b81526020019081526020015f2061385390919063ffffffff16565b6112ae576040516331bc342760e11b815260040160405180910390fd5b5f806113006112c060208b018b6147c4565b6112c98861348e565b6112d660408d018d615230565b878181106112e6576112e66151d7565b90506020020160208101906112fb91906147c4565b6134f1565b805191935091506001600160401b03165f0361131d5750506116fa565b5f61135861132e60608c018c615230565b8681811061133e5761133e6151d7565b85516001600160401b031692602090910201359050613874565b83519091506113736001600160401b038084169083166137b5565b868681518110611385576113856151d7565b60200260200101818152505081835f018181516113a291906153f2565b6001600160401b03169052508351829085906113bf9083906153f2565b6001600160401b03169052506020840180518391906113df9083906153f2565b6001600160401b031690525060208301515f600f9190910b12156114fa575f61144261140e60608e018e615230565b8881811061141e5761141e6151d7565b90506020020135856020015161143390615411565b6001600160801b031690613874565b9050806001600160401b03168460200181815161145f9190615435565b600f0b9052507f1487af5418c47ee5ea45ef4a93398668120890774a9e13487e61e9dc3baf76dd61149360208e018e6147c4565b8a8e80604001906114a49190615230565b8a8181106114b4576114b46151d7565b90506020020160208101906114c991906147c4565b6114da885f015189602001516137a1565b88604001516040516114f0959493929190615462565b60405180910390a1505b61154c61150a60208d018d6147c4565b6115138a61348e565b61152060408f018f615230565b89818110611530576115306151d7565b905060200201602081019061154591906147c4565b878761388a565b7f1487af5418c47ee5ea45ef4a93398668120890774a9e13487e61e9dc3baf76dd61157a60208d018d6147c4565b8961158860408f018f615230565b89818110611598576115986151d7565b90506020020160208101906115ad91906147c4565b86516040516115c194939291904390615462565b60405180910390a16116126115d960208d018d6147c4565b6115e660408e018e615230565b888181106115f6576115f66151d7565b905060200201602081019061160b91906147c4565b8651613aca565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001663601bb36f61164e60208e018e6147c4565b61165b60408f018f615230565b8981811061166b5761166b6151d7565b905060200201602081019061168091906147c4565b875160405160e085901b6001600160e01b03191681526001600160a01b0393841660048201529290911660248301526001600160401b0380861660448401521660648201526084015f604051808303815f87803b1580156116df575f5ffd5b505af11580156116f1573d5f5f3e3d5ffd5b50505050505050505b6001016110fe565b507f80969ad29428d6797ee7aad084f9e4a42a82fc506dcd2ca3b6fb431f85ccebe561173160208801886147c4565b8461173f60408a018a615230565b8561174d60808d018d6154b3565b604051611760979695949392919061551d565b60405180910390a150505050505050565b6001600160a01b0382165f908152609d6020526040812060609182916117969061369a565b90505f816001600160401b038111156117b1576117b1614657565b6040519080825280602002602001820160405280156117f557816020015b604080518082019091525f80825260208201528152602001906001900390816117cf5790505b5090505f826001600160401b0381111561181157611811614657565b60405190808252806020026020018201604052801561185a57816020015b604080516060810182525f80825260208083018290529282015282525f1990920191018161182f5790505b5090505f5b838110156118dd576001600160a01b0388165f908152609d6020526040812061188c9061090790846136a3565b9050808483815181106118a1576118a16151d7565b60200260200101819052506118b789828a610742565b8383815181106118c9576118c96151d7565b60209081029190910101525060010161185f565b509093509150505b9250929050565b60605f61077660995f6118fe8661348e565b81526020019081526020015f20613b4c565b60605f83516001600160401b0381111561192c5761192c614657565b604051908082528060200260200182016040528015611955578160200160208202803683370190505b5090505f5b845181101561096157611986858281518110611978576119786151d7565b602002602001015185612aee565b828281518110611998576119986151d7565b6001600160401b039092166020928302919091019091015260010161195a565b6066545f906001908116036119e05760405163840a48d560e01b815260040160405180910390fd5b838214611a00576040516343714afd60e01b815260040160405180910390fd5b5f5b84811015611a6957611a6187878784818110611a2057611a206151d7565b9050602002016020810190611a3591906147c4565b868685818110611a4757611a476151d7565b9050602002016020810190611a5c91906155b3565b613b58565b600101611a02565b50505050505050565b83611a7c816136c5565b611a995760405163932d94f760e01b815260040160405180910390fd5b604080518082019091526001600160a01b038616815263ffffffff851660208201525f611ac58261348e565b9050611b06826020015163ffffffff1660985f8a6001600160a01b03166001600160a01b031681526020019081526020015f206136ae90919063ffffffff16565b611b2357604051631fb1705560e21b815260040160405180910390fd5b5f5b84811015611bc657611b42868683818110610b7157610b716151d7565b611b5f5760405163585cfb2f60e01b815260040160405180910390fd5b7f7ab260fe0af193db5f4986770d831bda4ea46099dc817e8b6716dcae8af8e88b83878784818110611b9357611b936151d7565b9050602002016020810190611ba891906147c4565b604051611bb6929190615275565b60405180910390a1600101611b25565b5050505050505050565b60605f82516001600160401b03811115611bec57611bec614657565b604051908082528060200260200182016040528015611c15578160200160208202803683370190505b5090505f5b835181101561096157611c4685858381518110611c3957611c396151d7565b6020026020010151612aee565b828281518110611c5857611c586151d7565b6001600160401b0390921660209283029190910190910152600101611c1a565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614611d7357611cb1826136c5565b611cce576040516348f5c3ed60e01b815260040160405180910390fd5b6040516336b87bd760e11b81526001600160a01b0383811660048301527f00000000000000000000000000000000000000000000000000000000000000001690636d70f7ae90602401602060405180830381865afa158015611d32573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611d5691906151b8565b611d735760405163ccea9e6f60e01b815260040160405180910390fd5b61084e8282613c5c565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa158015611ddf573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611e0391906151b8565b611e2057604051631d77d47760e21b815260040160405180910390fd5b611e2a5f1961365d565b565b5f61077683609a5f6112768661348e565b6001600160a01b038281165f81815260a2602090815260408083209486168084529482528083205493835260a38252808320948352939052918220546001600160401b0390911690600f81810b600160801b909204900b03825b81811015611f67576001600160a01b038087165f90815260a3602090815260408083209389168352929052908120611ecf9083613e08565b6001600160a01b038881165f90815260a0602090815260408083208584528252808320938b16835292815290829020825160608101845290546001600160401b0381168252600160401b8104600f0b92820192909252600160c01b90910463ffffffff16918101829052919250431015611f4a575050611f67565b611f588582602001516137a1565b94505050806001019050611e97565b506001600160a01b038086165f90815260a1602090815260408083209388168352929052208290611f979061378e565b611fa191906153f2565b95945050505050565b606654600290600490811603611fd35760405163840a48d560e01b815260040160405180910390fd5b611fe8611fe360208401846147c4565b6136c5565b806120015750612001611fe360408401602085016147c4565b61201e576040516348f5c3ed60e01b815260040160405180910390fd5b5f5b61202d6040840184615230565b90508110156122ef575f604051806040016040528085602001602081019061205591906147c4565b6001600160a01b031681526020016120706040870187615230565b85818110612080576120806151d7565b90506020020160208101906120959190615209565b63ffffffff1681525090506120e2816020015163ffffffff1660985f8760200160208101906120c491906147c4565b6001600160a01b0316815260208101919091526040015f20906136ae565b6120ff57604051631fb1705560e21b815260040160405180910390fd5b609e5f61210f60208701876147c4565b6001600160a01b03166001600160a01b031681526020019081526020015f205f6121388361348e565b815260208101919091526040015f205460ff16612168576040516325131d4f60e01b815260040160405180910390fd5b6121a26121748261348e565b609c5f61218460208901896147c4565b6001600160a01b0316815260208101919091526040015f2090613e77565b506121da6121b360208601866147c4565b609a5f6121bf8561348e565b81526020019081526020015f20613e8290919063ffffffff16565b506121e860208501856147c4565b6001600160a01b03167fad34c3070be1dffbcaa499d000ba2b8d9848aefcac3059df245dd95c4ece14fe826040516122209190615222565b60405180910390a2604080518082019091525f8152602081016122637f0000000000000000000000000000000000000000000000000000000000000000436155d4565b63ffffffff169052609e5f61227b60208801886147c4565b6001600160a01b03166001600160a01b031681526020019081526020015f205f6122a48461348e565b81526020808201929092526040015f2082518154939092015163ffffffff166101000264ffffffff00199215159290921664ffffffffff199093169290921717905550600101612020565b5061230361038360408401602085016147c4565b6001600160a01b0316639d8e0c2361231e60208501856147c4565b61232b6040860186615230565b6040518463ffffffff1660e01b815260040161234993929190615629565b5f604051808303815f87803b158015612360575f5ffd5b505af1925050508015612371575060015b1561084e575050565b606061099a609a5f6118fe8561348e565b612393613e96565b611e2a5f613ef0565b6001600160a01b0381165f908152609c60205260408120606091906123c09061369a565b90505f816001600160401b038111156123db576123db614657565b60405190808252806020026020018201604052801561241f57816020015b604080518082019091525f80825260208201528152602001906001900390816123f95790505b5090505f5b82811015610961576001600160a01b0385165f908152609c602052604090206124519061090790836136a3565b828281518110612463576124636151d7565b6020908102919091010152600101612424565b60605f84516001600160401b0381111561249257612492614657565b6040519080825280602002602001820160405280156124db57816020015b604080516060810182525f80825260208083018290529282015282525f199092019101816124b05790505b5090505f5b85518110156125325761250d8682815181106124fe576124fe6151d7565b60200260200101518686610742565b82828151811061251f5761251f6151d7565b60209081029190910101526001016124e0565b50949350505050565b60605f83516001600160401b0381111561255757612557614657565b604051908082528060200260200182016040528015612580578160200160208202803683370190505b5090505f5b8451811015612532576001600160a01b0386165f90815260a16020526040812086516125f5928792918990869081106125c0576125c06151d7565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020015f20613f4190919063ffffffff16565b828281518110612607576126076151d7565b6001600160401b0390921660209283029190910190910152600101612585565b6066545f9060019081160361264f5760405163840a48d560e01b815260040160405180910390fd5b612658836136c5565b612675576040516348f5c3ed60e01b815260040160405180910390fd5b5f5f5f61268186613058565b91509150816126a35760405163fa55fc8160e01b815260040160405180910390fd5b91505f90505b8351811015610c3c578381815181106126c4576126c46151d7565b602002602001015160400151518482815181106126e3576126e36151d7565b602002602001015160200151511461270e576040516343714afd60e01b815260040160405180910390fd5b5f848281518110612721576127216151d7565b602090810291909101810151518082015181516001600160a01b03165f908152609890935260409092209092506127619163ffffffff908116906136ae16565b61277e57604051631fb1705560e21b815260040160405180910390fd5b5f61278987836137dd565b90505f5b86848151811061279f5761279f6151d7565b60200260200101516020015151811015612ae3575f8785815181106127c6576127c66151d7565b60200260200101516020015182815181106127e3576127e36151d7565b602002602001015190506127fa898261ffff613b58565b5f5f6128098b61076b8861348e565b915091508060200151600f0b5f1461283457604051630d8fcbe360e41b815260040160405180910390fd5b5f61284187858489613f55565b9050612886825f01518c8a8151811061285c5761285c6151d7565b6020026020010151604001518781518110612879576128796151d7565b6020026020010151613f8b565b600f0b602083018190525f036128af57604051634606179360e11b815260040160405180910390fd5b5f8260200151600f0b12156129f3578015612975576129306128d08861348e565b6001600160a01b03808f165f90815260a360209081526040808320938a16835292905220908154600160801b90819004600f0b5f818152600180860160205260409091209390935583546001600160801b03908116939091011602179055565b61295a7f0000000000000000000000000000000000000000000000000000000000000000436155d4565b6129659060016155d4565b63ffffffff166040830152612a60565b612987836020015183602001516137a1565b6001600160401b031660208401528a518b90899081106129a9576129a96151d7565b60200260200101516040015185815181106129c6576129c66151d7565b6020908102919091018101516001600160401b031683525f9083015263ffffffff43166040830152612a60565b5f8260200151600f0b1315612a6057612a14836020015183602001516137a1565b6001600160401b039081166020850181905284519091161015612a4a57604051636c9be0bf60e01b815260040160405180910390fd5b612a5489436155d4565b63ffffffff1660408301525b612a758c612a6d8961348e565b86868661388a565b7f1487af5418c47ee5ea45ef4a93398668120890774a9e13487e61e9dc3baf76dd8c612aa36109078a61348e565b86612ab5865f015187602001516137a1565b8660400151604051612acb959493929190615462565b60405180910390a150506001909201915061278d9050565b5050506001016126a9565b6001600160a01b038083165f90815260a16020908152604080832093851683529290529081206107769061378e565b82612b27816136c5565b612b445760405163932d94f760e01b815260040160405180910390fd5b836001600160a01b03167fa89c1dc243d8908a96dd84944bcc97d6bc6ac00dd78e20621576be6a3c9437138484604051612b7f92919061564d565b60405180910390a250505050565b606654600290600490811603612bb65760405163840a48d560e01b815260040160405180910390fd5b82612bc0816136c5565b612bdd5760405163932d94f760e01b815260040160405180910390fd5b6040516336b87bd760e11b81526001600160a01b0385811660048301527f00000000000000000000000000000000000000000000000000000000000000001690636d70f7ae90602401602060405180830381865afa158015612c41573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612c6591906151b8565b612c825760405163ccea9e6f60e01b815260040160405180910390fd5b5f5b612c916020850185615230565b9050811015612e5957604080518082019091525f9080612cb460208801886147c4565b6001600160a01b03168152602001868060200190612cd29190615230565b85818110612ce257612ce26151d7565b9050602002016020810190612cf79190615209565b63ffffffff90811690915260208083015183516001600160a01b03165f90815260989092526040909120929350612d339291908116906136ae16565b612d5057604051631fb1705560e21b815260040160405180910390fd5b612d5a86826137dd565b15612d7857604051636c6c6e2760e11b815260040160405180910390fd5b612da1612d848261348e565b6001600160a01b0388165f908152609c602052604090209061376f565b50612dcd86609a5f612db28561348e565b81526020019081526020015f2061377a90919063ffffffff16565b50856001600160a01b03167f43232edf9071753d2321e5fa7e018363ee248e5f2142e6c08edd3265bfb4895e82604051612e079190615222565b60405180910390a26001600160a01b0386165f908152609e60205260408120600191612e328461348e565b815260208101919091526040015f20805460ff191691151591909117905550600101612c84565b50612e6a61038360208501856147c4565b6001600160a01b031663adcf73f785612e866020870187615230565b612e9360408901896154b3565b6040518663ffffffff1660e01b8152600401612eb3959493929190615660565b5f604051808303815f87803b158015612eca575f5ffd5b505af1158015611bc6573d5f5f3e3d5ffd5b5f61099a609a5f612eec8561348e565b81526020019081526020015f2061369a565b83612f08816136c5565b612f255760405163932d94f760e01b815260040160405180910390fd5b6040805180820182526001600160a01b03871680825263ffffffff80881660208085018290525f93845260989052939091209192612f6492916136ae16565b612f8157604051631fb1705560e21b815260040160405180910390fd5b5f612f8b8261348e565b90505f5b84811015611bc657612fd4868683818110612fac57612fac6151d7565b9050602002016020810190612fc191906147c4565b5f84815260996020526040902090613e82565b612ff1576040516331bc342760e11b815260040160405180910390fd5b7f7b4b073d80dcac55a11177d8459ad9f664ceeb91f71f27167bb14f8152a7eeee83878784818110613025576130256151d7565b905060200201602081019061303a91906147c4565b604051613048929190615275565b60405180910390a1600101612f8f565b6001600160a01b0381165f908152609b602090815260408083208151608081018352905463ffffffff80821680845260ff600160201b8404161515958401869052650100000000008304821694840194909452600160481b9091041660608201819052849391929190158015906130d95750826060015163ffffffff164310155b156130e8575050604081015160015b9590945092505050565b6001600160a01b0381165f90815260986020526040812061099a9061369a565b6001600160a01b0382165f908152609f602052604081206060919061313b90826118fe8661348e565b949350505050565b5f54610100900460ff161580801561316157505f54600160ff909116105b8061317a5750303b15801561317a57505f5460ff166001145b6131e25760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b5f805460ff191660011790558015613203575f805461ff0019166101001790555b61320c8261365d565b61321583613ef0565b801561325b575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498906020015b60405180910390a15b505050565b8161326a816136c5565b6132875760405163932d94f760e01b815260040160405180910390fd5b6001600160a01b038381165f90815260976020526040902080546001600160a01b0319169184169190911790557f2ae945c40c44dc0ec263f95609c3fdc6952e0aefa22d6374e44f2c997acedf85836132df81610f30565b604080516001600160a01b03938416815292909116602083015201613252565b613307613e96565b6001600160a01b03811661336c5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016131d9565b61337581613ef0565b50565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156133d4573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906133f891906156a3565b6001600160a01b0316336001600160a01b0316146134295760405163794821ff60e01b815260040160405180910390fd5b606654801982198116146134505760405163c61dca5d60e01b815260040160405180910390fd5b606682905560405182815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c9060200160405180910390a25050565b5f815f0151826020015163ffffffff166040516020016134d992919060609290921b6bffffffffffffffffffffffff1916825260a01b6001600160a01b031916601482015260200190565b60405160208183030381529060405261099a906156be565b6040805180820182525f80825260208083018290528351606081018552828152808201839052808501839052845180860186526001600160a01b03898116855260a18452868520908816855290925293822092939281906135519061378e565b6001600160401b0390811682526001600160a01b038981165f81815260a260209081526040808320948c168084529482528083205486169682019690965291815260a082528481208b8252825284812092815291815290839020835160608101855290549283168152600160401b8304600f0b91810191909152600160c01b90910463ffffffff169181018290529192504310156135f3579092509050613655565b613604815f015182602001516137a1565b6001600160401b0316815260208101515f600f9190910b121561364257613633826020015182602001516137a1565b6001600160401b031660208301525b5f60408201819052602082015290925090505b935093915050565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a250565b5f61099a825490565b5f6107768383613fa2565b5f8181526001830160205260408120541515610776565b604051631beb2b9760e31b81526001600160a01b0382811660048301523360248301523060448301525f80356001600160e01b0319166064840152917f00000000000000000000000000000000000000000000000000000000000000009091169063df595cb8906084016020604051808303815f875af115801561374b573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061099a91906151b8565b5f6107768383613fc8565b5f610776836001600160a01b038416613fc8565b5f61099a82670de0b6b3a7640000614014565b5f610776826001600160401b038516615435565b5f61077683670de0b6b3a764000084614058565b5f6107768383670de0b6b3a7640000614058565b6001600160a01b0382165f908152609e602052604081208190816138008561348e565b815260208082019290925260409081015f2081518083019092525460ff8116151580835261010090910463ffffffff169282019290925291508061313b57506020015163ffffffff164311159392505050565b6001600160a01b0381165f9081526001830160205260408120541515610776565b5f6107768383670de0b6b3a7640000600161413d565b6020808301516001600160a01b038088165f90815260a284526040808220928816825291909352909120546001600160401b0390811691161461395057602082810180516001600160a01b038881165f81815260a286526040808220938a1680835293875290819020805467ffffffffffffffff19166001600160401b0395861617905593518451918252948101919091529216908201527facf9095feb3a370c9cf692421c69ef320d4db5c66e6a7d29c7694eb02364fc559060600160405180910390a15b6001600160a01b038086165f90815260a060209081526040808320888452825280832093871683529281529082902083518154928501519385015163ffffffff16600160c01b0263ffffffff60c01b196001600160801b038616600160401b026001600160c01b03199095166001600160401b03909316929092179390931716919091179055600f0b15613a32576001600160a01b0385165f908152609f602090815260408083208784529091529020613a0a908461377a565b506001600160a01b0385165f908152609d60205260409020613a2c908561376f565b50610c3c565b80516001600160401b03165f03610c3c576001600160a01b0385165f908152609f602090815260408083208784529091529020613a6f9084613e82565b506001600160a01b0385165f908152609f602090815260408083208784529091529020613a9b9061369a565b5f03610c3c576001600160a01b0385165f908152609d60205260409020613ac29085613e77565b505050505050565b6001600160a01b038084165f90815260a160209081526040808320938616835292905220613af9904383614196565b604080516001600160a01b038086168252841660208201526001600160401b038316918101919091527f1c6458079a41077d003c11faf9bf097e693bd67979e4e6500bac7b29db779b5c90606001613252565b60605f610776836141aa565b6001600160a01b038381165f90815260a360209081526040808320938616835292905290812054600f81810b600160801b909204900b035b5f81118015613ba257508261ffff1682105b15610c3c576001600160a01b038086165f90815260a3602090815260408083209388168352929052908120613bd690614203565b90505f5f613be58884896134f1565b91509150806040015163ffffffff16431015613c0357505050610c3c565b613c10888489858561388a565b6001600160a01b038089165f90815260a360209081526040808320938b16835292905220613c3d90614255565b50613c47856156e1565b9450613c52846156f9565b9350505050613b90565b6001600160a01b0382165f908152609b60209081526040918290208251608081018452905463ffffffff808216835260ff600160201b830416151593830193909352650100000000008104831693820193909352600160481b909204166060820181905215801590613cd85750806060015163ffffffff164310155b15613cf257604081015163ffffffff168152600160208201525b63ffffffff82166040820152613d287f0000000000000000000000000000000000000000000000000000000000000000436155d4565b613d339060016155d4565b63ffffffff90811660608381019182526001600160a01b0386165f818152609b602090815260409182902087518154838a0151858b01519851928a1664ffffffffff1990921691909117600160201b91151591909102176cffffffffffffffff0000000000191665010000000000978916979097026cffffffff000000000000000000191696909617600160481b968816968702179055815192835294871694820194909452928301919091527f4e85751d6331506c6c62335f207eb31f12a61e570f34f5c17640308785c6d4db9101613252565b5f5f613e2a613e16846142d2565b8554613e259190600f0b61570e565b61433f565b8454909150600160801b9004600f90810b9082900b12613e5d57604051632d0483c560e21b815260040160405180910390fd5b600f0b5f9081526001939093016020525050604090205490565b5f61077683836143a8565b5f610776836001600160a01b0384166143a8565b6033546001600160a01b03163314611e2a5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016131d9565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b5f6107768383670de0b6b3a764000061448b565b5f613f668460995f6112768961348e565b8015613f6f5750815b8015611fa157505090516001600160401b031615159392505050565b5f6107766001600160401b03808516908416615735565b5f825f018281548110613fb757613fb76151d7565b905f5260205f200154905092915050565b5f81815260018301602052604081205461400d57508154600181810184555f84815260208082209093018490558454848252828601909352604090209190915561099a565b505f61099a565b81545f9080156140505761403a8461402d6001846153df565b5f91825260209091200190565b54600160201b90046001600160e01b031661313b565b509092915050565b5f80805f19858709858702925082811083820303915050805f0361408f5783828161408557614085615762565b0492505050610776565b8084116140d65760405162461bcd60e51b81526020600482015260156024820152744d6174683a206d756c446976206f766572666c6f7760581b60448201526064016131d9565b5f8486880960026001871981018816978890046003810283188082028403028082028403028082028403028082028403028082028403029081029092039091025f889003889004909101858311909403939093029303949094049190911702949350505050565b5f5f61414a868686614058565b9050600183600281111561416057614160615776565b14801561417c57505f848061417757614177615762565b868809115b15611fa15761418c60018261578a565b9695505050505050565b61325b83836001600160401b0384166144d3565b6060815f018054806020026020016040519081016040528092919081815260200182805480156141f757602002820191905f5260205f20905b8154815260200190600101908083116141e3575b50505050509050919050565b5f61421d8254600f81810b600160801b909204900b131590565b1561423b57604051631ed9509560e11b815260040160405180910390fd5b508054600f0b5f9081526001909101602052604090205490565b5f61426f8254600f81810b600160801b909204900b131590565b1561428d57604051631ed9509560e11b815260040160405180910390fd5b508054600f0b5f818152600180840160205260408220805492905583546fffffffffffffffffffffffffffffffff191692016001600160801b03169190911790915590565b5f6001600160ff1b0382111561433b5760405162461bcd60e51b815260206004820152602860248201527f53616665436173743a2076616c756520646f65736e27742066697420696e2061604482015267371034b73a191a9b60c11b60648201526084016131d9565b5090565b80600f81900b81146143a35760405162461bcd60e51b815260206004820152602760248201527f53616665436173743a2076616c756520646f65736e27742066697420696e20316044820152663238206269747360c81b60648201526084016131d9565b919050565b5f8181526001830160205260408120548015614482575f6143ca6001836153df565b85549091505f906143dd906001906153df565b905081811461443c575f865f0182815481106143fb576143fb6151d7565b905f5260205f200154905080875f01848154811061441b5761441b6151d7565b5f918252602080832090910192909255918252600188019052604090208390555b855486908061444d5761444d61579d565b600190038181905f5260205f20015f90559055856001015f8681526020019081526020015f205f90556001935050505061099a565b5f91505061099a565b82545f908161449c868683856145d6565b905080156144c9576144b38661402d6001846153df565b54600160201b90046001600160e01b0316610771565b5091949350505050565b82548015614589575f6144eb8561402d6001856153df565b60408051808201909152905463ffffffff808216808452600160201b9092046001600160e01b03166020840152919250908516101561453d5760405163151b8e3f60e11b815260040160405180910390fd5b805163ffffffff808616911603614587578261455e8661402d6001866153df565b80546001600160e01b0392909216600160201b0263ffffffff9092169190911790555050505050565b505b506040805180820190915263ffffffff92831681526001600160e01b03918216602080830191825285546001810187555f968752952091519051909216600160201b029190921617910155565b5f5b81831015610961575f6145eb8484614629565b5f8781526020902090915063ffffffff86169082015463ffffffff16111561461557809250614623565b61462081600161578a565b93505b506145d8565b5f61463760028484186157b1565b6107769084841661578a565b6001600160a01b0381168114613375575f5ffd5b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b038111828210171561468d5761468d614657565b60405290565b604051601f8201601f191681016001600160401b03811182821017156146bb576146bb614657565b604052919050565b803563ffffffff811681146143a3575f5ffd5b5f604082840312156146e6575f5ffd5b604080519081016001600160401b038111828210171561470857614708614657565b604052905080823561471981614643565b8152614727602084016146c3565b60208201525092915050565b5f5f5f60808486031215614745575f5ffd5b833561475081614643565b925061475f85602086016146d6565b9150606084013561476f81614643565b809150509250925092565b81516001600160401b03168152602080830151600f0b9082015260408083015163ffffffff16908201526060810161099a565b5f602082840312156147bd575f5ffd5b5035919050565b5f602082840312156147d4575f5ffd5b813561077681614643565b80516001600160a01b0316825260209081015163ffffffff16910152565b5f8151808452602084019350602083015f5b82811015614838576148228683516147df565b604095909501946020919091019060010161480f565b5093949350505050565b602081525f61077660208301846147fd565b5f60408284031215614864575f5ffd5b61077683836146d6565b5f5f83601f84011261487e575f5ffd5b5081356001600160401b03811115614894575f5ffd5b6020830191508360208260051b85010111156118e5575f5ffd5b5f5f5f604084860312156148c0575f5ffd5b83356148cb81614643565b925060208401356001600160401b038111156148e5575f5ffd5b6148f18682870161486e565b9497909650939450505050565b5f6001600160401b0382111561491657614916614657565b5060051b60200190565b5f82601f83011261492f575f5ffd5b813561494261493d826148fe565b614693565b8082825260208201915060208360051b860101925085831115614963575f5ffd5b602085015b8381101561498957803561497b81614643565b835260209283019201614968565b5095945050505050565b5f5f5f5f60a085870312156149a6575f5ffd5b6149b086866146d6565b935060408501356001600160401b038111156149ca575f5ffd5b6149d687828801614920565b93505060608501356001600160401b038111156149f1575f5ffd5b6149fd87828801614920565b925050614a0c608086016146c3565b905092959194509250565b5f8151808452602084019350602083015f5b82811015614838578151865260209586019590910190600101614a29565b5f602082016020835280845180835260408501915060408160051b8601019250602086015f5b82811015614a9e57603f19878603018452614a89858351614a17565b94506020938401939190910190600101614a6d565b50929695505050505050565b5f5f60408385031215614abb575f5ffd5b8235614ac681614643565b915060208301356001600160401b03811115614ae0575f5ffd5b830160a08186031215614af1575f5ffd5b809150509250929050565b5f5f60408385031215614b0d575f5ffd5b8235614b1881614643565b91506020830135614af181614643565b5f8151808452602084019350602083015f5b8281101561483857614b7386835180516001600160401b03168252602080820151600f0b9083015260409081015163ffffffff16910152565b6060959095019460209190910190600101614b3a565b604081525f614b9b60408301856147fd565b8281036020840152611fa18185614b28565b5f8151808452602084019350602083015f5b828110156148385781516001600160a01b0316865260209586019590910190600101614bbf565b602081525f6107766020830184614bad565b5f5f60408385031215614c09575f5ffd5b82356001600160401b03811115614c1e575f5ffd5b614c2a85828601614920565b9250506020830135614af181614643565b602080825282518282018190525f918401906040840190835b81811015614c7b5783516001600160401b0316835260209384019390920191600101614c54565b509095945050505050565b5f5f5f5f5f60608688031215614c9a575f5ffd5b8535614ca581614643565b945060208601356001600160401b03811115614cbf575f5ffd5b614ccb8882890161486e565b90955093505060408601356001600160401b03811115614ce9575f5ffd5b614cf58882890161486e565b969995985093965092949392505050565b5f5f5f5f60608587031215614d19575f5ffd5b8435614d2481614643565b9350614d32602086016146c3565b925060408501356001600160401b03811115614d4c575f5ffd5b614d588782880161486e565b95989497509550505050565b5f5f60408385031215614d75575f5ffd5b8235614d8081614643565b915060208301356001600160401b03811115614d9a575f5ffd5b614da685828601614920565b9150509250929050565b5f5f60408385031215614dc1575f5ffd5b8235614dcc81614643565b9150614dda602084016146c3565b90509250929050565b5f60208284031215614df3575f5ffd5b813560ff81168114610776575f5ffd5b5f5f60608385031215614e14575f5ffd5b8235614e1f81614643565b9150614dda84602085016146d6565b5f60608284031215614e3e575f5ffd5b50919050565b5f60208284031215614e54575f5ffd5b81356001600160401b03811115614e69575f5ffd5b61313b84828501614e2e565b5f5f5f60808486031215614e87575f5ffd5b83356001600160401b03811115614e9c575f5ffd5b614ea886828701614920565b93505061475f85602086016146d6565b602081525f6107766020830184614b28565b5f5f5f60608486031215614edc575f5ffd5b8335614ee781614643565b925060208401356001600160401b03811115614f01575f5ffd5b614f0d86828701614920565b925050614f1c604085016146c3565b90509250925092565b5f5f60408385031215614f36575f5ffd5b8235614f4181614643565b915060208301356001600160401b03811115614f5b575f5ffd5b8301601f81018513614f6b575f5ffd5b8035614f7961493d826148fe565b8082825260208201915060208360051b850101925087831115614f9a575f5ffd5b602084015b838110156150bf5780356001600160401b03811115614fbc575f5ffd5b85016080818b03601f19011215614fd1575f5ffd5b614fd961466b565b614fe68b602084016146d6565b815260608201356001600160401b03811115615000575f5ffd5b61500f8c602083860101614920565b60208301525060808201356001600160401b0381111561502d575f5ffd5b6020818401019250508a601f830112615044575f5ffd5b813561505261493d826148fe565b8082825260208201915060208360051b86010192508d831115615073575f5ffd5b6020850194505b828510156150a95784356001600160401b0381168114615098575f5ffd5b82526020948501949091019061507a565b6040840152505084525060209283019201614f9f565b50809450505050509250929050565b5f5f5f604084860312156150e0575f5ffd5b83356150eb81614643565b925060208401356001600160401b03811115615105575f5ffd5b8401601f81018613615115575f5ffd5b80356001600160401b0381111561512a575f5ffd5b86602082840101111561513b575f5ffd5b939660209190910195509293505050565b5f5f6040838503121561515d575f5ffd5b823561516881614643565b915060208301356001600160401b03811115615182575f5ffd5b614da685828601614e2e565b5f5f6040838503121561519f575f5ffd5b82356151aa81614643565b946020939093013593505050565b5f602082840312156151c8575f5ffd5b81518015158114610776575f5ffd5b634e487b7160e01b5f52603260045260245ffd5b5f8235603e198336030181126151ff575f5ffd5b9190910192915050565b5f60208284031215615219575f5ffd5b610776826146c3565b6040810161099a82846147df565b5f5f8335601e19843603018112615245575f5ffd5b8301803591506001600160401b0382111561525e575f5ffd5b6020019150600581901b36038213156118e5575f5ffd5b6060810161528382856147df565b6001600160a01b039290921660409190910152919050565b604081525f6152ad6040830185614bad565b8281036020840152611fa18185614bad565b5f602082840312156152cf575f5ffd5b81516001600160401b038111156152e4575f5ffd5b8201601f810184136152f4575f5ffd5b805161530261493d826148fe565b8082825260208201915060208360051b850101925086831115615323575f5ffd5b602084015b838110156153c05780516001600160401b03811115615345575f5ffd5b8501603f81018913615355575f5ffd5b602081015161536661493d826148fe565b808282526020820191506020808460051b8601010192508b831115615389575f5ffd5b6040840193505b828410156153ab578351825260209384019390910190615390565b86525050602093840193919091019050615328565b509695505050505050565b634e487b7160e01b5f52601160045260245ffd5b8181038181111561099a5761099a6153cb565b6001600160401b03828116828216039081111561099a5761099a6153cb565b5f81600f0b60016001607f1b0319810361542d5761542d6153cb565b5f0392915050565b600f81810b9083900b0160016001607f1b03811360016001607f1b03198212171561099a5761099a6153cb565b6001600160a01b038616815260c0810161547f60208301876147df565b6001600160a01b039490941660608201526001600160401b0392909216608083015263ffffffff1660a09091015292915050565b5f5f8335601e198436030181126154c8575f5ffd5b8301803591506001600160401b038211156154e1575f5ffd5b6020019150368190038213156118e5575f5ffd5b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b6001600160a01b03881681525f60c0820161553b602084018a6147df565b60c060608401528690528660e083015f5b8881101561557c57823561555f81614643565b6001600160a01b031682526020928301929091019060010161554c565b50838103608085015261558f8188614a17565b91505082810360a08401526155a58185876154f5565b9a9950505050505050505050565b5f602082840312156155c3575f5ffd5b813561ffff81168114610776575f5ffd5b63ffffffff818116838216019081111561099a5761099a6153cb565b8183526020830192505f815f5b848110156148385763ffffffff615613836146c3565b16865260209586019591909101906001016155fd565b6001600160a01b03841681526040602082018190525f90611fa190830184866155f0565b602081525f61313b6020830184866154f5565b6001600160a01b03861681526060602082018190525f9061568490830186886155f0565b82810360408401526156978185876154f5565b98975050505050505050565b5f602082840312156156b3575f5ffd5b815161077681614643565b80516020808301519190811015614e3e575f1960209190910360031b1b16919050565b5f600182016156f2576156f26153cb565b5060010190565b5f81615707576157076153cb565b505f190190565b8082018281125f83128015821682158216171561572d5761572d6153cb565b505092915050565b600f82810b9082900b0360016001607f1b0319811260016001607f1b038213171561099a5761099a6153cb565b634e487b7160e01b5f52601260045260245ffd5b634e487b7160e01b5f52602160045260245ffd5b8082018082111561099a5761099a6153cb565b634e487b7160e01b5f52603160045260245ffd5b5f826157cb57634e487b7160e01b5f52601260045260245ffd5b50049056fea2646970667358221220eed5160c376c397184ef01a45fd09b1e24a4957cc6c60444d3c5fcc04001e14764736f6c634300081b0033", + ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"_delegation\",\"type\":\"address\",\"internalType\":\"contractIDelegationManager\"},{\"name\":\"_pauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"},{\"name\":\"_permissionController\",\"type\":\"address\",\"internalType\":\"contractIPermissionController\"},{\"name\":\"_DEALLOCATION_DELAY\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"_ALLOCATION_CONFIGURATION_DELAY\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"ALLOCATION_CONFIGURATION_DELAY\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"DEALLOCATION_DELAY\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"addStrategiesToOperatorSet\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetId\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"clearDeallocationQueue\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"numToClear\",\"type\":\"uint16[]\",\"internalType\":\"uint16[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"createOperatorSets\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"params\",\"type\":\"tuple[]\",\"internalType\":\"structIAllocationManagerTypes.CreateSetParams[]\",\"components\":[{\"name\":\"operatorSetId\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"delegation\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIDelegationManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"deregisterFromOperatorSets\",\"inputs\":[{\"name\":\"params\",\"type\":\"tuple\",\"internalType\":\"structIAllocationManagerTypes.DeregisterParams\",\"components\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetIds\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"getAVSRegistrar\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIAVSRegistrar\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAllocatableMagnitude\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAllocatedSets\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple[]\",\"internalType\":\"structOperatorSet[]\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAllocatedStrategies\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAllocation\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIAllocationManagerTypes.Allocation\",\"components\":[{\"name\":\"currentMagnitude\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"pendingDiff\",\"type\":\"int128\",\"internalType\":\"int128\"},{\"name\":\"effectBlock\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAllocationDelay\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAllocations\",\"inputs\":[{\"name\":\"operators\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple[]\",\"internalType\":\"structIAllocationManagerTypes.Allocation[]\",\"components\":[{\"name\":\"currentMagnitude\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"pendingDiff\",\"type\":\"int128\",\"internalType\":\"int128\"},{\"name\":\"effectBlock\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getEncumberedMagnitude\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getMaxMagnitude\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getMaxMagnitudes\",\"inputs\":[{\"name\":\"operators\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64[]\",\"internalType\":\"uint64[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getMaxMagnitudes\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64[]\",\"internalType\":\"uint64[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getMaxMagnitudesAtBlock\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"blockNumber\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64[]\",\"internalType\":\"uint64[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getMemberCount\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getMembers\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getMinimumSlashableStake\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"operators\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"futureBlock\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[{\"name\":\"slashableStake\",\"type\":\"uint256[][]\",\"internalType\":\"uint256[][]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getOperatorSetCount\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getRegisteredSets\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple[]\",\"internalType\":\"structOperatorSet[]\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getStrategiesInOperatorSet\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getStrategyAllocations\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple[]\",\"internalType\":\"structOperatorSet[]\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"\",\"type\":\"tuple[]\",\"internalType\":\"structIAllocationManagerTypes.Allocation[]\",\"components\":[{\"name\":\"currentMagnitude\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"pendingDiff\",\"type\":\"int128\",\"internalType\":\"int128\"},{\"name\":\"effectBlock\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"initialOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"initialPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"isMemberOfOperatorSet\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isOperatorSet\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"modifyAllocations\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"params\",\"type\":\"tuple[]\",\"internalType\":\"structIAllocationManagerTypes.AllocateParams[]\",\"components\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"newMagnitudes\",\"type\":\"uint64[]\",\"internalType\":\"uint64[]\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"pauseAll\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[{\"name\":\"index\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pauserRegistry\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"permissionController\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIPermissionController\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"registerForOperatorSets\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"params\",\"type\":\"tuple\",\"internalType\":\"structIAllocationManagerTypes.RegisterParams\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetIds\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"removeStrategiesFromOperatorSet\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetId\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setAVSRegistrar\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"registrar\",\"type\":\"address\",\"internalType\":\"contractIAVSRegistrar\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setAllocationDelay\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"delay\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"slashOperator\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"params\",\"type\":\"tuple\",\"internalType\":\"structIAllocationManagerTypes.SlashingParams\",\"components\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetId\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"wadsToSlash\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"},{\"name\":\"description\",\"type\":\"string\",\"internalType\":\"string\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"updateAVSMetadataURI\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"metadataURI\",\"type\":\"string\",\"internalType\":\"string\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"AVSMetadataURIUpdated\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"metadataURI\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"AVSRegistrarSet\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"registrar\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIAVSRegistrar\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"AllocationDelaySet\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"delay\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"},{\"name\":\"effectBlock\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"AllocationUpdated\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"magnitude\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"effectBlock\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"EncumberedMagnitudeUpdated\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"encumberedMagnitude\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"MaxMagnitudeUpdated\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"maxMagnitude\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorAddedToOperatorSet\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorRemovedFromOperatorSet\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorSetCreated\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorSlashed\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"strategies\",\"type\":\"address[]\",\"indexed\":false,\"internalType\":\"contractIStrategy[]\"},{\"name\":\"wadSlashed\",\"type\":\"uint256[]\",\"indexed\":false,\"internalType\":\"uint256[]\"},{\"name\":\"description\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StrategyAddedToOperatorSet\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StrategyRemovedFromOperatorSet\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"AlreadyMemberOfSet\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"CurrentlyPaused\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"Empty\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InputAddressZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InputArrayLengthMismatch\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InsufficientMagnitude\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidCaller\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidNewPausedStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidOperator\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidOperatorSet\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidPermissions\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidSnapshotOrdering\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidWadToSlash\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ModificationAlreadyPending\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotMemberOfSet\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyPauser\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyUnpauser\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OperatorNotSlashable\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OutOfBounds\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SameMagnitude\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StrategiesMustBeInAscendingOrder\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StrategyAlreadyInOperatorSet\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StrategyNotInOperatorSet\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"UninitializedAllocationDelay\",\"inputs\":[]}]", + Bin: "0x610120604052348015610010575f5ffd5b50604051615a79380380615a7983398101604081905261002f91610180565b82858383876001600160a01b03811661005b576040516339b190bb60e11b815260040160405180910390fd5b6001600160a01b0390811660805292831660a05263ffffffff91821660c0521660e052166101005261008b610095565b50505050506101e9565b5f54610100900460ff16156101005760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff9081161461014f575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b0381168114610165575f5ffd5b50565b805163ffffffff8116811461017b575f5ffd5b919050565b5f5f5f5f5f60a08688031215610194575f5ffd5b855161019f81610151565b60208701519095506101b081610151565b60408701519094506101c181610151565b92506101cf60608701610168565b91506101dd60808701610168565b90509295509295909350565b60805160a05160c05160e051610100516157ff61027a5f395f81816103f9015261359701525f81816105480152613b9701525f818161031e015281816120c601526127bd01525f81816106c701528181610c77015281816115fc01528181611c6301528181611ccd0152612a8401525f818161056f0152818161077201528181611d72015261320e01526157ff5ff3fe608060405234801561000f575f5ffd5b5060043610610281575f3560e01c80636e875dba11610156578063adc2e3d9116100ca578063cd6dc68711610084578063cd6dc6871461069c578063d3d96ff4146106af578063df5cf723146106c2578063f2fde38b146106e9578063f605ce08146106fc578063fabc1cbc1461070f575f5ffd5b8063adc2e3d91461060e578063b2447af714610621578063b66bd98914610634578063b9fbaed114610647578063ba1a84e514610676578063c221d8ae14610689575f5ffd5b80638ce648541161011b5780638ce64854146105915780638da5cb5b146105b157806394d7d00c146105c2578063952899ee146105d5578063a9333ec8146105e8578063a9821821146105fb575f5ffd5b80636e875dba14610515578063715018a61461052857806379ae50cd146105305780637bc1ef6114610543578063886f11951461056a575f5ffd5b80634657e26a116101f8578063595c6a67116101b2578063595c6a67146104875780635ac86ab71461048f5780635c975abb146104b2578063670d3ba2146104c45780636cfb4481146104d75780636e3492b514610502575f5ffd5b80634657e26a146103f45780634a10ffe51461041b5780634b5046ef1461043b57806350feea201461044e578063547afb871461046157806356c483e614610474575f5ffd5b80632981eb77116102495780632981eb77146103195780632bab2c4a14610355578063304c10cd1461037557806336352057146103a057806340120dab146103b35780634177a87c146103d4575f5ffd5b806310e1b9b814610285578063136439dd146102ae57806315fe5028146102c3578063260dc758146102e3578063261f84e014610306575b5f5ffd5b610298610293366004614736565b610722565b6040516102a5919061477d565b60405180910390f35b6102c16102bc3660046147b0565b61075d565b005b6102d66102d13660046147c7565b610832565b6040516102a59190614845565b6102f66102f1366004614857565b610949565b60405190151581526020016102a5565b6102c16103143660046148b1565b610980565b6103407f000000000000000000000000000000000000000000000000000000000000000081565b60405163ffffffff90911681526020016102a5565b610368610363366004614996565b610c23565b6040516102a59190614a4a565b6103886103833660046147c7565b610f10565b6040516001600160a01b0390911681526020016102a5565b6102c16103ae366004614aad565b610f3f565b6103c66103c1366004614aff565b611751565b6040516102a5929190614b8c565b6103e76103e2366004614857565b6118cc565b6040516102a59190614be9565b6103887f000000000000000000000000000000000000000000000000000000000000000081565b61042e610429366004614bfb565b6118f0565b6040516102a59190614c3e565b6102c1610449366004614c89565b611998565b6102c161045c366004614d09565b611a52565b61042e61046f366004614d67565b611bb0565b6102c1610482366004614da9565b611c58565b6102c1611d5d565b6102f661049d366004614ddc565b606654600160ff9092169190911b9081161490565b6066545b6040519081526020016102a5565b6102f66104d2366004614dfc565b611e0c565b6104ea6104e5366004614aff565b611e1d565b6040516001600160401b0390911681526020016102a5565b6102c1610510366004614e3d565b611e32565b6103e7610523366004614857565b612202565b6102c1612213565b6102d661053e3660046147c7565b612224565b6103407f000000000000000000000000000000000000000000000000000000000000000081565b6103887f000000000000000000000000000000000000000000000000000000000000000081565b6105a461059f366004614e6e565b6122fe565b6040516102a59190614eb1565b6033546001600160a01b0316610388565b61042e6105d0366004614ec3565b6123c3565b6102c16105e3366004614f1e565b6124af565b6104ea6105f6366004614aff565b612976565b6102c16106093660046150c7565b6129a5565b6102c161061c366004615145565b612a15565b6104b661062f366004614857565b612d64565b6102c1610642366004614d09565b612d86565b61065a6106553660046147c7565b612ee0565b60408051921515835263ffffffff9091166020830152016102a5565b6104b66106843660046147c7565b612f7a565b6103e7610697366004614dfc565b612f9a565b6102c16106aa366004615187565b612fcb565b6102c16106bd366004614aff565b6130e8565b6103887f000000000000000000000000000000000000000000000000000000000000000081565b6102c16106f73660046147c7565b613187565b6104ea61070a366004614aff565b613200565b6102c161071d3660046147b0565b61320c565b604080516060810182525f80825260208201819052918101829052906107518561074b86613322565b85613385565b925050505b9392505050565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa1580156107bf573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107e391906151b1565b61080057604051631d77d47760e21b815260040160405180910390fd5b60665481811681146108255760405163c61dca5d60e01b815260040160405180910390fd5b61082e826134f1565b5050565b6001600160a01b0381165f908152609d60205260408120606091906108569061352e565b90505f816001600160401b038111156108715761087161465a565b6040519080825280602002602001820160405280156108b557816020015b604080518082019091525f808252602082015281526020019060019003908161088f5790505b5090505f5b82811015610941576001600160a01b0385165f908152609d6020526040902061091c906108e79083613537565b604080518082019091525f80825260208201525060408051808201909152606082901c815263ffffffff909116602082015290565b82828151811061092e5761092e6151d0565b60209081029190910101526001016108ba565b509392505050565b60208082015182516001600160a01b03165f90815260989092526040822061097a9163ffffffff9081169061354216565b92915050565b8261098a81613559565b6109a75760405163932d94f760e01b815260040160405180910390fd5b5f5b82811015610c1c575f6040518060400160405280876001600160a01b031681526020018686858181106109de576109de6151d0565b90506020028101906109f091906151e4565b6109fe906020810190615202565b63ffffffff168152509050610a48816020015163ffffffff1660985f896001600160a01b03166001600160a01b031681526020019081526020015f2061360390919063ffffffff16565b610a6557604051631fb1705560e21b815260040160405180910390fd5b7f31629285ead2335ae0933f86ed2ae63321f7af77b4e6eaabc42c057880977e6c6040518060400160405280886001600160a01b03168152602001836020015163ffffffff16815250604051610abb919061521b565b60405180910390a15f610acd82613322565b90505f5b868685818110610ae357610ae36151d0565b9050602002810190610af591906151e4565b610b03906020810190615229565b9050811015610c1157610b79878786818110610b2157610b216151d0565b9050602002810190610b3391906151e4565b610b41906020810190615229565b83818110610b5157610b516151d0565b9050602002016020810190610b6691906147c7565b5f8481526099602052604090209061360e565b507f7ab260fe0af193db5f4986770d831bda4ea46099dc817e8b6716dcae8af8e88b83888887818110610bae57610bae6151d0565b9050602002810190610bc091906151e4565b610bce906020810190615229565b84818110610bde57610bde6151d0565b9050602002016020810190610bf391906147c7565b604051610c0192919061526e565b60405180910390a1600101610ad1565b5050506001016109a9565b5050505050565b606083516001600160401b03811115610c3e57610c3e61465a565b604051908082528060200260200182016040528015610c7157816020015b6060815260200190600190039081610c5c5790505b5090505f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663f0e0e67686866040518363ffffffff1660e01b8152600401610cc3929190615294565b5f60405180830381865afa158015610cdd573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610d0491908101906152b8565b90505f5b8551811015610f06575f868281518110610d2457610d246151d0565b6020026020010151905085516001600160401b03811115610d4757610d4761465a565b604051908082528060200260200182016040528015610d70578160200160208202803683370190505b50848381518110610d8357610d836151d0565b60209081029190910101525f5b8651811015610efc575f878281518110610dac57610dac6151d0565b6020908102919091018101516001600160a01b038086165f90815260a1845260408082209284168252919093528220909250610de790613622565b9050806001600160401b03165f03610e00575050610ef4565b5f610e0c858d85610722565b90508863ffffffff16816040015163ffffffff1611158015610e3457505f8160200151600f0b125b15610e5657610e4a815f01518260200151613635565b6001600160401b031681525b80515f90610e71906001600160401b03908116908516613649565b9050610eb881898981518110610e8957610e896151d0565b60200260200101518781518110610ea257610ea26151d0565b602002602001015161365d90919063ffffffff16565b898881518110610eca57610eca6151d0565b60200260200101518681518110610ee357610ee36151d0565b602002602001018181525050505050505b600101610d90565b5050600101610d08565b5050949350505050565b6001600160a01b038082165f908152609760205260408120549091168015610f385780610756565b5090919050565b606654600190600290811603610f685760405163840a48d560e01b815260040160405180910390fd5b82610f7281613559565b610f8f5760405163932d94f760e01b815260040160405180910390fd5b5f6040518060400160405280866001600160a01b03168152602001856020016020810190610fbd9190615202565b63ffffffff16905290505f610fde610fd860208701876147c7565b83613671565b9050610fed6060860186615229565b9050610ffc6040870187615229565b90501461101c576040516343714afd60e01b815260040160405180910390fd5b60208083015183516001600160a01b03165f9081526098909252604090912061104e9163ffffffff9081169061354216565b61106b57604051631fb1705560e21b815260040160405180910390fd5b806110895760405163ebbff49760e01b815260040160405180910390fd5b5f6110976040870187615229565b90506001600160401b038111156110b0576110b061465a565b6040519080825280602002602001820160405280156110d9578160200160208202803683370190505b5090505f5b6110eb6040880188615229565b90508110156116e25780158061117e57506111096040880188615229565b6111146001846153d8565b818110611123576111236151d0565b905060200201602081019061113891906147c7565b6001600160a01b031661114e6040890189615229565b8381811061115e5761115e6151d0565b905060200201602081019061117391906147c7565b6001600160a01b0316115b61119b57604051639f1c805360e01b815260040160405180910390fd5b6111a86060880188615229565b828181106111b8576111b86151d0565b905060200201355f1080156111f85750670de0b6b3a76400006111de6060890189615229565b838181106111ee576111ee6151d0565b9050602002013511155b61121557604051631353603160e01b815260040160405180910390fd5b6112716112256040890189615229565b83818110611235576112356151d0565b905060200201602081019061124a91906147c7565b60995f61125688613322565b81526020019081526020015f206136e790919063ffffffff16565b61128e576040516331bc342760e11b815260040160405180910390fd5b5f806112e06112a060208b018b6147c7565b6112a988613322565b6112b660408d018d615229565b878181106112c6576112c66151d0565b90506020020160208101906112db91906147c7565b613385565b805191935091506001600160401b03165f036112fd5750506116da565b5f61133861130e60608c018c615229565b8681811061131e5761131e6151d0565b85516001600160401b031692602090910201359050613708565b83519091506113536001600160401b03808416908316613649565b868681518110611365576113656151d0565b60200260200101818152505081835f0181815161138291906153eb565b6001600160401b031690525083518290859061139f9083906153eb565b6001600160401b03169052506020840180518391906113bf9083906153eb565b6001600160401b031690525060208301515f600f9190910b12156114da575f6114226113ee60608e018e615229565b888181106113fe576113fe6151d0565b9050602002013585602001516114139061540a565b6001600160801b031690613708565b9050806001600160401b03168460200181815161143f919061542e565b600f0b9052507f1487af5418c47ee5ea45ef4a93398668120890774a9e13487e61e9dc3baf76dd61147360208e018e6147c7565b8a8e80604001906114849190615229565b8a818110611494576114946151d0565b90506020020160208101906114a991906147c7565b6114ba885f01518960200151613635565b88604001516040516114d095949392919061545b565b60405180910390a1505b61152c6114ea60208d018d6147c7565b6114f38a613322565b61150060408f018f615229565b89818110611510576115106151d0565b905060200201602081019061152591906147c7565b878761371e565b7f1487af5418c47ee5ea45ef4a93398668120890774a9e13487e61e9dc3baf76dd61155a60208d018d6147c7565b8961156860408f018f615229565b89818110611578576115786151d0565b905060200201602081019061158d91906147c7565b86516040516115a19493929190439061545b565b60405180910390a16115f26115b960208d018d6147c7565b6115c660408e018e615229565b888181106115d6576115d66151d0565b90506020020160208101906115eb91906147c7565b865161395e565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001663601bb36f61162e60208e018e6147c7565b61163b60408f018f615229565b8981811061164b5761164b6151d0565b905060200201602081019061166091906147c7565b875160405160e085901b6001600160e01b03191681526001600160a01b0393841660048201529290911660248301526001600160401b0380861660448401521660648201526084015f604051808303815f87803b1580156116bf575f5ffd5b505af11580156116d1573d5f5f3e3d5ffd5b50505050505050505b6001016110de565b507f80969ad29428d6797ee7aad084f9e4a42a82fc506dcd2ca3b6fb431f85ccebe561171160208801886147c7565b8461171f60408a018a615229565b8561172d60808d018d6154ac565b6040516117409796959493929190615516565b60405180910390a150505050505050565b6001600160a01b0382165f908152609d6020526040812060609182916117769061352e565b90505f816001600160401b038111156117915761179161465a565b6040519080825280602002602001820160405280156117d557816020015b604080518082019091525f80825260208201528152602001906001900390816117af5790505b5090505f826001600160401b038111156117f1576117f161465a565b60405190808252806020026020018201604052801561183a57816020015b604080516060810182525f80825260208083018290529282015282525f1990920191018161180f5790505b5090505f5b838110156118bd576001600160a01b0388165f908152609d6020526040812061186c906108e79084613537565b905080848381518110611881576118816151d0565b602002602001018190525061189789828a610722565b8383815181106118a9576118a96151d0565b60209081029190910101525060010161183f565b509093509150505b9250929050565b60605f61075660995f6118de86613322565b81526020019081526020015f206139e0565b60605f83516001600160401b0381111561190c5761190c61465a565b604051908082528060200260200182016040528015611935578160200160208202803683370190505b5090505f5b845181101561094157611966858281518110611958576119586151d0565b602002602001015185612976565b828281518110611978576119786151d0565b6001600160401b039092166020928302919091019091015260010161193a565b6066545f906001908116036119c05760405163840a48d560e01b815260040160405180910390fd5b8382146119e0576040516343714afd60e01b815260040160405180910390fd5b5f5b84811015611a4957611a4187878784818110611a0057611a006151d0565b9050602002016020810190611a1591906147c7565b868685818110611a2757611a276151d0565b9050602002016020810190611a3c91906155ac565b6139ec565b6001016119e2565b50505050505050565b83611a5c81613559565b611a795760405163932d94f760e01b815260040160405180910390fd5b604080518082019091526001600160a01b038616815263ffffffff851660208201525f611aa582613322565b9050611ae6826020015163ffffffff1660985f8a6001600160a01b03166001600160a01b031681526020019081526020015f2061354290919063ffffffff16565b611b0357604051631fb1705560e21b815260040160405180910390fd5b5f5b84811015611ba657611b22868683818110610b5157610b516151d0565b611b3f5760405163585cfb2f60e01b815260040160405180910390fd5b7f7ab260fe0af193db5f4986770d831bda4ea46099dc817e8b6716dcae8af8e88b83878784818110611b7357611b736151d0565b9050602002016020810190611b8891906147c7565b604051611b9692919061526e565b60405180910390a1600101611b05565b5050505050505050565b60605f82516001600160401b03811115611bcc57611bcc61465a565b604051908082528060200260200182016040528015611bf5578160200160208202803683370190505b5090505f5b835181101561094157611c2685858381518110611c1957611c196151d0565b6020026020010151612976565b828281518110611c3857611c386151d0565b6001600160401b0390921660209283029190910190910152600101611bfa565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614611d5357611c9182613559565b611cae576040516348f5c3ed60e01b815260040160405180910390fd5b6040516336b87bd760e11b81526001600160a01b0383811660048301527f00000000000000000000000000000000000000000000000000000000000000001690636d70f7ae90602401602060405180830381865afa158015611d12573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611d3691906151b1565b611d535760405163ccea9e6f60e01b815260040160405180910390fd5b61082e8282613af0565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa158015611dbf573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611de391906151b1565b611e0057604051631d77d47760e21b815260040160405180910390fd5b611e0a5f196134f1565b565b5f61075683609a5f61125686613322565b5f5f611e298484613c9c565b95945050505050565b606654600290600490811603611e5b5760405163840a48d560e01b815260040160405180910390fd5b611e70611e6b60208401846147c7565b613559565b80611e895750611e89611e6b60408401602085016147c7565b611ea6576040516348f5c3ed60e01b815260040160405180910390fd5b5f5b611eb56040840184615229565b9050811015612177575f6040518060400160405280856020016020810190611edd91906147c7565b6001600160a01b03168152602001611ef86040870187615229565b85818110611f0857611f086151d0565b9050602002016020810190611f1d9190615202565b63ffffffff168152509050611f6a816020015163ffffffff1660985f876020016020810190611f4c91906147c7565b6001600160a01b0316815260208101919091526040015f2090613542565b611f8757604051631fb1705560e21b815260040160405180910390fd5b609e5f611f9760208701876147c7565b6001600160a01b03166001600160a01b031681526020019081526020015f205f611fc083613322565b815260208101919091526040015f205460ff16611ff0576040516325131d4f60e01b815260040160405180910390fd5b61202a611ffc82613322565b609c5f61200c60208901896147c7565b6001600160a01b0316815260208101919091526040015f2090613e0b565b5061206261203b60208601866147c7565b609a5f61204785613322565b81526020019081526020015f20613e1690919063ffffffff16565b5061207060208501856147c7565b6001600160a01b03167fad34c3070be1dffbcaa499d000ba2b8d9848aefcac3059df245dd95c4ece14fe826040516120a8919061521b565b60405180910390a2604080518082019091525f8152602081016120eb7f0000000000000000000000000000000000000000000000000000000000000000436155cd565b63ffffffff169052609e5f61210360208801886147c7565b6001600160a01b03166001600160a01b031681526020019081526020015f205f61212c84613322565b81526020808201929092526040015f2082518154939092015163ffffffff166101000264ffffffff00199215159290921664ffffffffff199093169290921717905550600101611ea8565b5061218b61038360408401602085016147c7565b6001600160a01b0316639d8e0c236121a660208501856147c7565b6121b36040860186615229565b6040518463ffffffff1660e01b81526004016121d193929190615622565b5f604051808303815f87803b1580156121e8575f5ffd5b505af19250505080156121f9575060015b1561082e575050565b606061097a609a5f6118de85613322565b61221b613e2a565b611e0a5f613e84565b6001600160a01b0381165f908152609c60205260408120606091906122489061352e565b90505f816001600160401b038111156122635761226361465a565b6040519080825280602002602001820160405280156122a757816020015b604080518082019091525f80825260208201528152602001906001900390816122815790505b5090505f5b82811015610941576001600160a01b0385165f908152609c602052604090206122d9906108e79083613537565b8282815181106122eb576122eb6151d0565b60209081029190910101526001016122ac565b60605f84516001600160401b0381111561231a5761231a61465a565b60405190808252806020026020018201604052801561236357816020015b604080516060810182525f80825260208083018290529282015282525f199092019101816123385790505b5090505f5b85518110156123ba57612395868281518110612386576123866151d0565b60200260200101518686610722565b8282815181106123a7576123a76151d0565b6020908102919091010152600101612368565b50949350505050565b60605f83516001600160401b038111156123df576123df61465a565b604051908082528060200260200182016040528015612408578160200160208202803683370190505b5090505f5b84518110156123ba576001600160a01b0386165f90815260a160205260408120865161247d92879291899086908110612448576124486151d0565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020015f20613ed590919063ffffffff16565b82828151811061248f5761248f6151d0565b6001600160401b039092166020928302919091019091015260010161240d565b6066545f906001908116036124d75760405163840a48d560e01b815260040160405180910390fd5b6124e083613559565b6124fd576040516348f5c3ed60e01b815260040160405180910390fd5b5f5f5f61250986612ee0565b915091508161252b5760405163fa55fc8160e01b815260040160405180910390fd5b91505f90505b8351811015610c1c5783818151811061254c5761254c6151d0565b6020026020010151604001515184828151811061256b5761256b6151d0565b6020026020010151602001515114612596576040516343714afd60e01b815260040160405180910390fd5b5f8482815181106125a9576125a96151d0565b602090810291909101810151518082015181516001600160a01b03165f908152609890935260409092209092506125e99163ffffffff9081169061354216565b61260657604051631fb1705560e21b815260040160405180910390fd5b5f6126118783613671565b90505f5b868481518110612627576126276151d0565b6020026020010151602001515181101561296b575f87858151811061264e5761264e6151d0565b602002602001015160200151828151811061266b5761266b6151d0565b60200260200101519050612682898261ffff6139ec565b5f5f6126918b61074b88613322565b915091508060200151600f0b5f146126bc57604051630d8fcbe360e41b815260040160405180910390fd5b5f6126c987858489613ee9565b905061270e825f01518c8a815181106126e4576126e46151d0565b6020026020010151604001518781518110612701576127016151d0565b6020026020010151613f1f565b600f0b602083018190525f0361273757604051634606179360e11b815260040160405180910390fd5b5f8260200151600f0b121561287b5780156127fd576127b861275888613322565b6001600160a01b03808f165f90815260a360209081526040808320938a16835292905220908154600160801b90819004600f0b5f818152600180860160205260409091209390935583546001600160801b03908116939091011602179055565b6127e27f0000000000000000000000000000000000000000000000000000000000000000436155cd565b6127ed9060016155cd565b63ffffffff1660408301526128e8565b61280f83602001518360200151613635565b6001600160401b031660208401528a518b9089908110612831576128316151d0565b602002602001015160400151858151811061284e5761284e6151d0565b6020908102919091018101516001600160401b031683525f9083015263ffffffff431660408301526128e8565b5f8260200151600f0b13156128e85761289c83602001518360200151613635565b6001600160401b0390811660208501819052845190911610156128d257604051636c9be0bf60e01b815260040160405180910390fd5b6128dc89436155cd565b63ffffffff1660408301525b6128fd8c6128f589613322565b86868661371e565b7f1487af5418c47ee5ea45ef4a93398668120890774a9e13487e61e9dc3baf76dd8c61292b6108e78a613322565b8661293d865f01518760200151613635565b866040015160405161295395949392919061545b565b60405180910390a15050600190920191506126159050565b505050600101612531565b6001600160a01b038083165f90815260a160209081526040808320938516835292905290812061075690613622565b826129af81613559565b6129cc5760405163932d94f760e01b815260040160405180910390fd5b836001600160a01b03167fa89c1dc243d8908a96dd84944bcc97d6bc6ac00dd78e20621576be6a3c9437138484604051612a07929190615646565b60405180910390a250505050565b606654600290600490811603612a3e5760405163840a48d560e01b815260040160405180910390fd5b82612a4881613559565b612a655760405163932d94f760e01b815260040160405180910390fd5b6040516336b87bd760e11b81526001600160a01b0385811660048301527f00000000000000000000000000000000000000000000000000000000000000001690636d70f7ae90602401602060405180830381865afa158015612ac9573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612aed91906151b1565b612b0a5760405163ccea9e6f60e01b815260040160405180910390fd5b5f5b612b196020850185615229565b9050811015612ce157604080518082019091525f9080612b3c60208801886147c7565b6001600160a01b03168152602001868060200190612b5a9190615229565b85818110612b6a57612b6a6151d0565b9050602002016020810190612b7f9190615202565b63ffffffff90811690915260208083015183516001600160a01b03165f90815260989092526040909120929350612bbb92919081169061354216565b612bd857604051631fb1705560e21b815260040160405180910390fd5b612be28682613671565b15612c0057604051636c6c6e2760e11b815260040160405180910390fd5b612c29612c0c82613322565b6001600160a01b0388165f908152609c6020526040902090613603565b50612c5586609a5f612c3a85613322565b81526020019081526020015f2061360e90919063ffffffff16565b50856001600160a01b03167f43232edf9071753d2321e5fa7e018363ee248e5f2142e6c08edd3265bfb4895e82604051612c8f919061521b565b60405180910390a26001600160a01b0386165f908152609e60205260408120600191612cba84613322565b815260208101919091526040015f20805460ff191691151591909117905550600101612b0c565b50612cf261038360208501856147c7565b6001600160a01b031663adcf73f785612d0e6020870187615229565b612d1b60408901896154ac565b6040518663ffffffff1660e01b8152600401612d3b959493929190615659565b5f604051808303815f87803b158015612d52575f5ffd5b505af1158015611ba6573d5f5f3e3d5ffd5b5f61097a609a5f612d7485613322565b81526020019081526020015f2061352e565b83612d9081613559565b612dad5760405163932d94f760e01b815260040160405180910390fd5b6040805180820182526001600160a01b03871680825263ffffffff80881660208085018290525f93845260989052939091209192612dec929161354216565b612e0957604051631fb1705560e21b815260040160405180910390fd5b5f612e1382613322565b90505f5b84811015611ba657612e5c868683818110612e3457612e346151d0565b9050602002016020810190612e4991906147c7565b5f84815260996020526040902090613e16565b612e79576040516331bc342760e11b815260040160405180910390fd5b7f7b4b073d80dcac55a11177d8459ad9f664ceeb91f71f27167bb14f8152a7eeee83878784818110612ead57612ead6151d0565b9050602002016020810190612ec291906147c7565b604051612ed092919061526e565b60405180910390a1600101612e17565b6001600160a01b0381165f908152609b602090815260408083208151608081018352905463ffffffff80821680845260ff600160201b8404161515958401869052650100000000008304821694840194909452600160481b909104166060820181905284939192919015801590612f615750826060015163ffffffff164310155b15612f70575050604081015160015b9590945092505050565b6001600160a01b0381165f90815260986020526040812061097a9061352e565b6001600160a01b0382165f908152609f6020526040812060609190612fc390826118de86613322565b949350505050565b5f54610100900460ff1615808015612fe957505f54600160ff909116105b806130025750303b15801561300257505f5460ff166001145b61306a5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b5f805460ff19166001179055801561308b575f805461ff0019166101001790555b613094826134f1565b61309d83613e84565b80156130e3575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498906020015b60405180910390a15b505050565b816130f281613559565b61310f5760405163932d94f760e01b815260040160405180910390fd5b6001600160a01b038381165f90815260976020526040902080546001600160a01b0319169184169190911790557f2ae945c40c44dc0ec263f95609c3fdc6952e0aefa22d6374e44f2c997acedf858361316781610f10565b604080516001600160a01b039384168152929091166020830152016130da565b61318f613e2a565b6001600160a01b0381166131f45760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401613061565b6131fd81613e84565b50565b5f5f6123ba8484613c9c565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015613268573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061328c919061569c565b6001600160a01b0316336001600160a01b0316146132bd5760405163794821ff60e01b815260040160405180910390fd5b606654801982198116146132e45760405163c61dca5d60e01b815260040160405180910390fd5b606682905560405182815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c9060200160405180910390a25050565b5f815f0151826020015163ffffffff1660405160200161336d92919060609290921b6bffffffffffffffffffffffff1916825260a01b6001600160a01b031916601482015260200190565b60405160208183030381529060405261097a906156b7565b6040805180820182525f80825260208083018290528351606081018552828152808201839052808501839052845180860186526001600160a01b03898116855260a18452868520908816855290925293822092939281906133e590613622565b6001600160401b0390811682526001600160a01b038981165f81815260a260209081526040808320948c168084529482528083205486169682019690965291815260a082528481208b8252825284812092815291815290839020835160608101855290549283168152600160401b8304600f0b91810191909152600160c01b90910463ffffffff169181018290529192504310156134875790925090506134e9565b613498815f01518260200151613635565b6001600160401b0316815260208101515f600f9190910b12156134d6576134c782602001518260200151613635565b6001600160401b031660208301525b5f60408201819052602082015290925090505b935093915050565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a250565b5f61097a825490565b5f6107568383613f36565b5f8181526001830160205260408120541515610756565b604051631beb2b9760e31b81526001600160a01b0382811660048301523360248301523060448301525f80356001600160e01b0319166064840152917f00000000000000000000000000000000000000000000000000000000000000009091169063df595cb8906084016020604051808303815f875af11580156135df573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061097a91906151b1565b5f6107568383613f5c565b5f610756836001600160a01b038416613f5c565b5f61097a82670de0b6b3a7640000613fa8565b5f610756826001600160401b03851661542e565b5f61075683670de0b6b3a764000084613fec565b5f6107568383670de0b6b3a7640000613fec565b6001600160a01b0382165f908152609e6020526040812081908161369485613322565b815260208082019290925260409081015f2081518083019092525460ff8116151580835261010090910463ffffffff1692820192909252915080612fc357506020015163ffffffff164311159392505050565b6001600160a01b0381165f9081526001830160205260408120541515610756565b5f6107568383670de0b6b3a764000060016140d1565b6020808301516001600160a01b038088165f90815260a284526040808220928816825291909352909120546001600160401b039081169116146137e457602082810180516001600160a01b038881165f81815260a286526040808220938a1680835293875290819020805467ffffffffffffffff19166001600160401b0395861617905593518451918252948101919091529216908201527facf9095feb3a370c9cf692421c69ef320d4db5c66e6a7d29c7694eb02364fc559060600160405180910390a15b6001600160a01b038086165f90815260a060209081526040808320888452825280832093871683529281529082902083518154928501519385015163ffffffff16600160c01b0263ffffffff60c01b196001600160801b038616600160401b026001600160c01b03199095166001600160401b03909316929092179390931716919091179055600f0b156138c6576001600160a01b0385165f908152609f60209081526040808320878452909152902061389e908461360e565b506001600160a01b0385165f908152609d602052604090206138c09085613603565b50610c1c565b80516001600160401b03165f03610c1c576001600160a01b0385165f908152609f6020908152604080832087845290915290206139039084613e16565b506001600160a01b0385165f908152609f60209081526040808320878452909152902061392f9061352e565b5f03610c1c576001600160a01b0385165f908152609d602052604090206139569085613e0b565b505050505050565b6001600160a01b038084165f90815260a16020908152604080832093861683529290522061398d90438361412a565b604080516001600160a01b038086168252841660208201526001600160401b038316918101919091527f1c6458079a41077d003c11faf9bf097e693bd67979e4e6500bac7b29db779b5c906060016130da565b60605f6107568361413e565b6001600160a01b038381165f90815260a360209081526040808320938616835292905290812054600f81810b600160801b909204900b035b5f81118015613a3657508261ffff1682105b15610c1c576001600160a01b038086165f90815260a3602090815260408083209388168352929052908120613a6a90614197565b90505f5f613a79888489613385565b91509150806040015163ffffffff16431015613a9757505050610c1c565b613aa4888489858561371e565b6001600160a01b038089165f90815260a360209081526040808320938b16835292905220613ad1906141e9565b50613adb856156da565b9450613ae6846156f2565b9350505050613a24565b6001600160a01b0382165f908152609b60209081526040918290208251608081018452905463ffffffff808216835260ff600160201b830416151593830193909352650100000000008104831693820193909352600160481b909204166060820181905215801590613b6c5750806060015163ffffffff164310155b15613b8657604081015163ffffffff168152600160208201525b63ffffffff82166040820152613bbc7f0000000000000000000000000000000000000000000000000000000000000000436155cd565b613bc79060016155cd565b63ffffffff90811660608381019182526001600160a01b0386165f818152609b602090815260409182902087518154838a0151858b01519851928a1664ffffffffff1990921691909117600160201b91151591909102176cffffffffffffffff0000000000191665010000000000978916979097026cffffffff000000000000000000191696909617600160481b968816968702179055815192835294871694820194909452928301919091527f4e85751d6331506c6c62335f207eb31f12a61e570f34f5c17640308785c6d4db91016130da565b6001600160a01b038281165f81815260a2602090815260408083209486168084529482528083205493835260a38252808320948352939052918220546001600160401b039091169190600f81810b600160801b909204900b03815b81811015613dc7576001600160a01b038087165f90815260a3602090815260408083209389168352929052908120613d2f9083614266565b6001600160a01b038881165f90815260a0602090815260408083208584528252808320938b16835292815290829020825160608101845290546001600160401b0381168252600160401b8104600f0b92820192909252600160c01b90910463ffffffff16918101829052919250431015613daa575050613dc7565b613db8868260200151613635565b95505050806001019050613cf7565b506001600160a01b038086165f90815260a1602090815260408083209388168352929052208390613df790613622565b613e0191906153eb565b9150509250929050565b5f61075683836142d5565b5f610756836001600160a01b0384166142d5565b6033546001600160a01b03163314611e0a5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401613061565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b5f6107568383670de0b6b3a76400006143b8565b5f613efa8460995f61125689613322565b8015613f035750815b8015611e2957505090516001600160401b031615159392505050565b5f6107566001600160401b03808516908416615707565b5f825f018281548110613f4b57613f4b6151d0565b905f5260205f200154905092915050565b5f818152600183016020526040812054613fa157508154600181810184555f84815260208082209093018490558454848252828601909352604090209190915561097a565b505f61097a565b81545f908015613fe457613fce84613fc16001846153d8565b5f91825260209091200190565b54600160201b90046001600160e01b0316612fc3565b509092915050565b5f80805f19858709858702925082811083820303915050805f036140235783828161401957614019615734565b0492505050610756565b80841161406a5760405162461bcd60e51b81526020600482015260156024820152744d6174683a206d756c446976206f766572666c6f7760581b6044820152606401613061565b5f8486880960026001871981018816978890046003810283188082028403028082028403028082028403028082028403028082028403029081029092039091025f889003889004909101858311909403939093029303949094049190911702949350505050565b5f5f6140de868686613fec565b905060018360028111156140f4576140f4615748565b14801561411057505f848061410b5761410b615734565b868809115b15611e295761412060018261575c565b9695505050505050565b6130e383836001600160401b038416614400565b6060815f0180548060200260200160405190810160405280929190818152602001828054801561418b57602002820191905f5260205f20905b815481526020019060010190808311614177575b50505050509050919050565b5f6141b18254600f81810b600160801b909204900b131590565b156141cf57604051631ed9509560e11b815260040160405180910390fd5b508054600f0b5f9081526001909101602052604090205490565b5f6142038254600f81810b600160801b909204900b131590565b1561422157604051631ed9509560e11b815260040160405180910390fd5b508054600f0b5f818152600180840160205260408220805492905583546fffffffffffffffffffffffffffffffff191692016001600160801b03169190911790915590565b5f5f61428861427484614503565b85546142839190600f0b61576f565b614570565b8454909150600160801b9004600f90810b9082900b126142bb57604051632d0483c560e21b815260040160405180910390fd5b600f0b5f9081526001939093016020525050604090205490565b5f81815260018301602052604081205480156143af575f6142f76001836153d8565b85549091505f9061430a906001906153d8565b9050818114614369575f865f018281548110614328576143286151d0565b905f5260205f200154905080875f018481548110614348576143486151d0565b5f918252602080832090910192909255918252600188019052604090208390555b855486908061437a5761437a615796565b600190038181905f5260205f20015f90559055856001015f8681526020019081526020015f205f90556001935050505061097a565b5f91505061097a565b82545f90816143c9868683856145d9565b905080156143f6576143e086613fc16001846153d8565b54600160201b90046001600160e01b0316610751565b5091949350505050565b825480156144b6575f61441885613fc16001856153d8565b60408051808201909152905463ffffffff808216808452600160201b9092046001600160e01b03166020840152919250908516101561446a5760405163151b8e3f60e11b815260040160405180910390fd5b805163ffffffff8086169116036144b4578261448b86613fc16001866153d8565b80546001600160e01b0392909216600160201b0263ffffffff9092169190911790555050505050565b505b506040805180820190915263ffffffff92831681526001600160e01b03918216602080830191825285546001810187555f968752952091519051909216600160201b029190921617910155565b5f6001600160ff1b0382111561456c5760405162461bcd60e51b815260206004820152602860248201527f53616665436173743a2076616c756520646f65736e27742066697420696e2061604482015267371034b73a191a9b60c11b6064820152608401613061565b5090565b80600f81900b81146145d45760405162461bcd60e51b815260206004820152602760248201527f53616665436173743a2076616c756520646f65736e27742066697420696e20316044820152663238206269747360c81b6064820152608401613061565b919050565b5f5b81831015610941575f6145ee848461462c565b5f8781526020902090915063ffffffff86169082015463ffffffff16111561461857809250614626565b61462381600161575c565b93505b506145db565b5f61463a60028484186157aa565b6107569084841661575c565b6001600160a01b03811681146131fd575f5ffd5b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b03811182821017156146905761469061465a565b60405290565b604051601f8201601f191681016001600160401b03811182821017156146be576146be61465a565b604052919050565b803563ffffffff811681146145d4575f5ffd5b5f604082840312156146e9575f5ffd5b604080519081016001600160401b038111828210171561470b5761470b61465a565b604052905080823561471c81614646565b815261472a602084016146c6565b60208201525092915050565b5f5f5f60808486031215614748575f5ffd5b833561475381614646565b925061476285602086016146d9565b9150606084013561477281614646565b809150509250925092565b81516001600160401b03168152602080830151600f0b9082015260408083015163ffffffff16908201526060810161097a565b5f602082840312156147c0575f5ffd5b5035919050565b5f602082840312156147d7575f5ffd5b813561075681614646565b80516001600160a01b0316825260209081015163ffffffff16910152565b5f8151808452602084019350602083015f5b8281101561483b576148258683516147e2565b6040959095019460209190910190600101614812565b5093949350505050565b602081525f6107566020830184614800565b5f60408284031215614867575f5ffd5b61075683836146d9565b5f5f83601f840112614881575f5ffd5b5081356001600160401b03811115614897575f5ffd5b6020830191508360208260051b85010111156118c5575f5ffd5b5f5f5f604084860312156148c3575f5ffd5b83356148ce81614646565b925060208401356001600160401b038111156148e8575f5ffd5b6148f486828701614871565b9497909650939450505050565b5f6001600160401b038211156149195761491961465a565b5060051b60200190565b5f82601f830112614932575f5ffd5b813561494561494082614901565b614696565b8082825260208201915060208360051b860101925085831115614966575f5ffd5b602085015b8381101561498c57803561497e81614646565b83526020928301920161496b565b5095945050505050565b5f5f5f5f60a085870312156149a9575f5ffd5b6149b386866146d9565b935060408501356001600160401b038111156149cd575f5ffd5b6149d987828801614923565b93505060608501356001600160401b038111156149f4575f5ffd5b614a0087828801614923565b925050614a0f608086016146c6565b905092959194509250565b5f8151808452602084019350602083015f5b8281101561483b578151865260209586019590910190600101614a2c565b5f602082016020835280845180835260408501915060408160051b8601019250602086015f5b82811015614aa157603f19878603018452614a8c858351614a1a565b94506020938401939190910190600101614a70565b50929695505050505050565b5f5f60408385031215614abe575f5ffd5b8235614ac981614646565b915060208301356001600160401b03811115614ae3575f5ffd5b830160a08186031215614af4575f5ffd5b809150509250929050565b5f5f60408385031215614b10575f5ffd5b8235614b1b81614646565b91506020830135614af481614646565b5f8151808452602084019350602083015f5b8281101561483b57614b7686835180516001600160401b03168252602080820151600f0b9083015260409081015163ffffffff16910152565b6060959095019460209190910190600101614b3d565b604081525f614b9e6040830185614800565b8281036020840152611e298185614b2b565b5f8151808452602084019350602083015f5b8281101561483b5781516001600160a01b0316865260209586019590910190600101614bc2565b602081525f6107566020830184614bb0565b5f5f60408385031215614c0c575f5ffd5b82356001600160401b03811115614c21575f5ffd5b614c2d85828601614923565b9250506020830135614af481614646565b602080825282518282018190525f918401906040840190835b81811015614c7e5783516001600160401b0316835260209384019390920191600101614c57565b509095945050505050565b5f5f5f5f5f60608688031215614c9d575f5ffd5b8535614ca881614646565b945060208601356001600160401b03811115614cc2575f5ffd5b614cce88828901614871565b90955093505060408601356001600160401b03811115614cec575f5ffd5b614cf888828901614871565b969995985093965092949392505050565b5f5f5f5f60608587031215614d1c575f5ffd5b8435614d2781614646565b9350614d35602086016146c6565b925060408501356001600160401b03811115614d4f575f5ffd5b614d5b87828801614871565b95989497509550505050565b5f5f60408385031215614d78575f5ffd5b8235614d8381614646565b915060208301356001600160401b03811115614d9d575f5ffd5b613e0185828601614923565b5f5f60408385031215614dba575f5ffd5b8235614dc581614646565b9150614dd3602084016146c6565b90509250929050565b5f60208284031215614dec575f5ffd5b813560ff81168114610756575f5ffd5b5f5f60608385031215614e0d575f5ffd5b8235614e1881614646565b9150614dd384602085016146d9565b5f60608284031215614e37575f5ffd5b50919050565b5f60208284031215614e4d575f5ffd5b81356001600160401b03811115614e62575f5ffd5b612fc384828501614e27565b5f5f5f60808486031215614e80575f5ffd5b83356001600160401b03811115614e95575f5ffd5b614ea186828701614923565b93505061476285602086016146d9565b602081525f6107566020830184614b2b565b5f5f5f60608486031215614ed5575f5ffd5b8335614ee081614646565b925060208401356001600160401b03811115614efa575f5ffd5b614f0686828701614923565b925050614f15604085016146c6565b90509250925092565b5f5f60408385031215614f2f575f5ffd5b8235614f3a81614646565b915060208301356001600160401b03811115614f54575f5ffd5b8301601f81018513614f64575f5ffd5b8035614f7261494082614901565b8082825260208201915060208360051b850101925087831115614f93575f5ffd5b602084015b838110156150b85780356001600160401b03811115614fb5575f5ffd5b85016080818b03601f19011215614fca575f5ffd5b614fd261466e565b614fdf8b602084016146d9565b815260608201356001600160401b03811115614ff9575f5ffd5b6150088c602083860101614923565b60208301525060808201356001600160401b03811115615026575f5ffd5b6020818401019250508a601f83011261503d575f5ffd5b813561504b61494082614901565b8082825260208201915060208360051b86010192508d83111561506c575f5ffd5b6020850194505b828510156150a25784356001600160401b0381168114615091575f5ffd5b825260209485019490910190615073565b6040840152505084525060209283019201614f98565b50809450505050509250929050565b5f5f5f604084860312156150d9575f5ffd5b83356150e481614646565b925060208401356001600160401b038111156150fe575f5ffd5b8401601f8101861361510e575f5ffd5b80356001600160401b03811115615123575f5ffd5b866020828401011115615134575f5ffd5b939660209190910195509293505050565b5f5f60408385031215615156575f5ffd5b823561516181614646565b915060208301356001600160401b0381111561517b575f5ffd5b613e0185828601614e27565b5f5f60408385031215615198575f5ffd5b82356151a381614646565b946020939093013593505050565b5f602082840312156151c1575f5ffd5b81518015158114610756575f5ffd5b634e487b7160e01b5f52603260045260245ffd5b5f8235603e198336030181126151f8575f5ffd5b9190910192915050565b5f60208284031215615212575f5ffd5b610756826146c6565b6040810161097a82846147e2565b5f5f8335601e1984360301811261523e575f5ffd5b8301803591506001600160401b03821115615257575f5ffd5b6020019150600581901b36038213156118c5575f5ffd5b6060810161527c82856147e2565b6001600160a01b039290921660409190910152919050565b604081525f6152a66040830185614bb0565b8281036020840152611e298185614bb0565b5f602082840312156152c8575f5ffd5b81516001600160401b038111156152dd575f5ffd5b8201601f810184136152ed575f5ffd5b80516152fb61494082614901565b8082825260208201915060208360051b85010192508683111561531c575f5ffd5b602084015b838110156153b95780516001600160401b0381111561533e575f5ffd5b8501603f8101891361534e575f5ffd5b602081015161535f61494082614901565b808282526020820191506020808460051b8601010192508b831115615382575f5ffd5b6040840193505b828410156153a4578351825260209384019390910190615389565b86525050602093840193919091019050615321565b509695505050505050565b634e487b7160e01b5f52601160045260245ffd5b8181038181111561097a5761097a6153c4565b6001600160401b03828116828216039081111561097a5761097a6153c4565b5f81600f0b60016001607f1b03198103615426576154266153c4565b5f0392915050565b600f81810b9083900b0160016001607f1b03811360016001607f1b03198212171561097a5761097a6153c4565b6001600160a01b038616815260c0810161547860208301876147e2565b6001600160a01b039490941660608201526001600160401b0392909216608083015263ffffffff1660a09091015292915050565b5f5f8335601e198436030181126154c1575f5ffd5b8301803591506001600160401b038211156154da575f5ffd5b6020019150368190038213156118c5575f5ffd5b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b6001600160a01b03881681525f60c08201615534602084018a6147e2565b60c060608401528690528660e083015f5b8881101561557557823561555881614646565b6001600160a01b0316825260209283019290910190600101615545565b5083810360808501526155888188614a1a565b91505082810360a084015261559e8185876154ee565b9a9950505050505050505050565b5f602082840312156155bc575f5ffd5b813561ffff81168114610756575f5ffd5b63ffffffff818116838216019081111561097a5761097a6153c4565b8183526020830192505f815f5b8481101561483b5763ffffffff61560c836146c6565b16865260209586019591909101906001016155f6565b6001600160a01b03841681526040602082018190525f90611e2990830184866155e9565b602081525f612fc36020830184866154ee565b6001600160a01b03861681526060602082018190525f9061567d90830186886155e9565b82810360408401526156908185876154ee565b98975050505050505050565b5f602082840312156156ac575f5ffd5b815161075681614646565b80516020808301519190811015614e37575f1960209190910360031b1b16919050565b5f600182016156eb576156eb6153c4565b5060010190565b5f81615700576157006153c4565b505f190190565b600f82810b9082900b0360016001607f1b0319811260016001607f1b038213171561097a5761097a6153c4565b634e487b7160e01b5f52601260045260245ffd5b634e487b7160e01b5f52602160045260245ffd5b8082018082111561097a5761097a6153c4565b8082018281125f83128015821682158216171561578e5761578e6153c4565b505092915050565b634e487b7160e01b5f52603160045260245ffd5b5f826157c457634e487b7160e01b5f52601260045260245ffd5b50049056fea2646970667358221220ff7b3d6eba82cde361f8cfb28b8ec6b1dd4f114bf6fd9c7228e0203e36010e3064736f6c634300081b0033", } // AllocationManagerABI is the input ABI used to generate the binding from. @@ -344,37 +344,6 @@ func (_AllocationManager *AllocationManagerCallerSession) Delegation() (common.A return _AllocationManager.Contract.Delegation(&_AllocationManager.CallOpts) } -// EncumberedMagnitude is a free data retrieval call binding the contract method 0xa984eb3a. -// -// Solidity: function encumberedMagnitude(address operator, address strategy) view returns(uint64) -func (_AllocationManager *AllocationManagerCaller) EncumberedMagnitude(opts *bind.CallOpts, operator common.Address, strategy common.Address) (uint64, error) { - var out []interface{} - err := _AllocationManager.contract.Call(opts, &out, "encumberedMagnitude", operator, strategy) - - if err != nil { - return *new(uint64), err - } - - out0 := *abi.ConvertType(out[0], new(uint64)).(*uint64) - - return out0, err - -} - -// EncumberedMagnitude is a free data retrieval call binding the contract method 0xa984eb3a. -// -// Solidity: function encumberedMagnitude(address operator, address strategy) view returns(uint64) -func (_AllocationManager *AllocationManagerSession) EncumberedMagnitude(operator common.Address, strategy common.Address) (uint64, error) { - return _AllocationManager.Contract.EncumberedMagnitude(&_AllocationManager.CallOpts, operator, strategy) -} - -// EncumberedMagnitude is a free data retrieval call binding the contract method 0xa984eb3a. -// -// Solidity: function encumberedMagnitude(address operator, address strategy) view returns(uint64) -func (_AllocationManager *AllocationManagerCallerSession) EncumberedMagnitude(operator common.Address, strategy common.Address) (uint64, error) { - return _AllocationManager.Contract.EncumberedMagnitude(&_AllocationManager.CallOpts, operator, strategy) -} - // GetAVSRegistrar is a free data retrieval call binding the contract method 0x304c10cd. // // Solidity: function getAVSRegistrar(address avs) view returns(address) @@ -593,6 +562,37 @@ func (_AllocationManager *AllocationManagerCallerSession) GetAllocations(operato return _AllocationManager.Contract.GetAllocations(&_AllocationManager.CallOpts, operators, operatorSet, strategy) } +// GetEncumberedMagnitude is a free data retrieval call binding the contract method 0xf605ce08. +// +// Solidity: function getEncumberedMagnitude(address operator, address strategy) view returns(uint64) +func (_AllocationManager *AllocationManagerCaller) GetEncumberedMagnitude(opts *bind.CallOpts, operator common.Address, strategy common.Address) (uint64, error) { + var out []interface{} + err := _AllocationManager.contract.Call(opts, &out, "getEncumberedMagnitude", operator, strategy) + + if err != nil { + return *new(uint64), err + } + + out0 := *abi.ConvertType(out[0], new(uint64)).(*uint64) + + return out0, err + +} + +// GetEncumberedMagnitude is a free data retrieval call binding the contract method 0xf605ce08. +// +// Solidity: function getEncumberedMagnitude(address operator, address strategy) view returns(uint64) +func (_AllocationManager *AllocationManagerSession) GetEncumberedMagnitude(operator common.Address, strategy common.Address) (uint64, error) { + return _AllocationManager.Contract.GetEncumberedMagnitude(&_AllocationManager.CallOpts, operator, strategy) +} + +// GetEncumberedMagnitude is a free data retrieval call binding the contract method 0xf605ce08. +// +// Solidity: function getEncumberedMagnitude(address operator, address strategy) view returns(uint64) +func (_AllocationManager *AllocationManagerCallerSession) GetEncumberedMagnitude(operator common.Address, strategy common.Address) (uint64, error) { + return _AllocationManager.Contract.GetEncumberedMagnitude(&_AllocationManager.CallOpts, operator, strategy) +} + // GetMaxMagnitude is a free data retrieval call binding the contract method 0xa9333ec8. // // Solidity: function getMaxMagnitude(address operator, address strategy) view returns(uint64) diff --git a/pkg/bindings/AllocationManagerStorage/binding.go b/pkg/bindings/AllocationManagerStorage/binding.go index fd74bd41af..e48b70e4bc 100644 --- a/pkg/bindings/AllocationManagerStorage/binding.go +++ b/pkg/bindings/AllocationManagerStorage/binding.go @@ -80,7 +80,7 @@ type OperatorSet struct { // AllocationManagerStorageMetaData contains all meta data concerning the AllocationManagerStorage contract. var AllocationManagerStorageMetaData = &bind.MetaData{ - ABI: "[{\"type\":\"function\",\"name\":\"ALLOCATION_CONFIGURATION_DELAY\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"DEALLOCATION_DELAY\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"addStrategiesToOperatorSet\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetId\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"clearDeallocationQueue\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"numToClear\",\"type\":\"uint16[]\",\"internalType\":\"uint16[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"createOperatorSets\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"params\",\"type\":\"tuple[]\",\"internalType\":\"structIAllocationManagerTypes.CreateSetParams[]\",\"components\":[{\"name\":\"operatorSetId\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"delegation\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIDelegationManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"deregisterFromOperatorSets\",\"inputs\":[{\"name\":\"params\",\"type\":\"tuple\",\"internalType\":\"structIAllocationManagerTypes.DeregisterParams\",\"components\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetIds\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"encumberedMagnitude\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAVSRegistrar\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIAVSRegistrar\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAllocatableMagnitude\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAllocatedSets\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple[]\",\"internalType\":\"structOperatorSet[]\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAllocatedStrategies\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAllocation\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIAllocationManagerTypes.Allocation\",\"components\":[{\"name\":\"currentMagnitude\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"pendingDiff\",\"type\":\"int128\",\"internalType\":\"int128\"},{\"name\":\"effectBlock\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAllocationDelay\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"isSet\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"delay\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAllocations\",\"inputs\":[{\"name\":\"operators\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple[]\",\"internalType\":\"structIAllocationManagerTypes.Allocation[]\",\"components\":[{\"name\":\"currentMagnitude\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"pendingDiff\",\"type\":\"int128\",\"internalType\":\"int128\"},{\"name\":\"effectBlock\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getMaxMagnitude\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getMaxMagnitudes\",\"inputs\":[{\"name\":\"operators\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64[]\",\"internalType\":\"uint64[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getMaxMagnitudes\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64[]\",\"internalType\":\"uint64[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getMaxMagnitudesAtBlock\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"blockNumber\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64[]\",\"internalType\":\"uint64[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getMemberCount\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getMembers\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[{\"name\":\"operators\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getMinimumSlashableStake\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"operators\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"futureBlock\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[{\"name\":\"slashableStake\",\"type\":\"uint256[][]\",\"internalType\":\"uint256[][]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getOperatorSetCount\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getRegisteredSets\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"operatorSets\",\"type\":\"tuple[]\",\"internalType\":\"structOperatorSet[]\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getStrategiesInOperatorSet\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getStrategyAllocations\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple[]\",\"internalType\":\"structOperatorSet[]\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"\",\"type\":\"tuple[]\",\"internalType\":\"structIAllocationManagerTypes.Allocation[]\",\"components\":[{\"name\":\"currentMagnitude\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"pendingDiff\",\"type\":\"int128\",\"internalType\":\"int128\"},{\"name\":\"effectBlock\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"initialOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"initialPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"isMemberOfOperatorSet\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isOperatorSet\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"modifyAllocations\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"params\",\"type\":\"tuple[]\",\"internalType\":\"structIAllocationManagerTypes.AllocateParams[]\",\"components\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"newMagnitudes\",\"type\":\"uint64[]\",\"internalType\":\"uint64[]\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"registerForOperatorSets\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"params\",\"type\":\"tuple\",\"internalType\":\"structIAllocationManagerTypes.RegisterParams\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetIds\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"removeStrategiesFromOperatorSet\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetId\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setAVSRegistrar\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"registrar\",\"type\":\"address\",\"internalType\":\"contractIAVSRegistrar\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setAllocationDelay\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"delay\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"slashOperator\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"params\",\"type\":\"tuple\",\"internalType\":\"structIAllocationManagerTypes.SlashingParams\",\"components\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetId\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"wadsToSlash\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"},{\"name\":\"description\",\"type\":\"string\",\"internalType\":\"string\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"updateAVSMetadataURI\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"metadataURI\",\"type\":\"string\",\"internalType\":\"string\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"AVSMetadataURIUpdated\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"metadataURI\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"AVSRegistrarSet\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"registrar\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIAVSRegistrar\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"AllocationDelaySet\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"delay\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"},{\"name\":\"effectBlock\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"AllocationUpdated\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"magnitude\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"effectBlock\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"EncumberedMagnitudeUpdated\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"encumberedMagnitude\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"MaxMagnitudeUpdated\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"maxMagnitude\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorAddedToOperatorSet\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorRemovedFromOperatorSet\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorSetCreated\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorSlashed\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"strategies\",\"type\":\"address[]\",\"indexed\":false,\"internalType\":\"contractIStrategy[]\"},{\"name\":\"wadSlashed\",\"type\":\"uint256[]\",\"indexed\":false,\"internalType\":\"uint256[]\"},{\"name\":\"description\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StrategyAddedToOperatorSet\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StrategyRemovedFromOperatorSet\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"AlreadyMemberOfSet\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InputArrayLengthMismatch\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InsufficientMagnitude\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidAVSRegistrar\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidCaller\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidOperator\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidOperatorSet\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidWadToSlash\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ModificationAlreadyPending\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotMemberOfSet\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OperatorNotSlashable\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SameMagnitude\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StrategiesMustBeInAscendingOrder\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StrategyAlreadyInOperatorSet\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StrategyNotInOperatorSet\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"UninitializedAllocationDelay\",\"inputs\":[]}]", + ABI: "[{\"type\":\"function\",\"name\":\"ALLOCATION_CONFIGURATION_DELAY\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"DEALLOCATION_DELAY\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"addStrategiesToOperatorSet\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetId\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"clearDeallocationQueue\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"numToClear\",\"type\":\"uint16[]\",\"internalType\":\"uint16[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"createOperatorSets\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"params\",\"type\":\"tuple[]\",\"internalType\":\"structIAllocationManagerTypes.CreateSetParams[]\",\"components\":[{\"name\":\"operatorSetId\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"delegation\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIDelegationManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"deregisterFromOperatorSets\",\"inputs\":[{\"name\":\"params\",\"type\":\"tuple\",\"internalType\":\"structIAllocationManagerTypes.DeregisterParams\",\"components\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetIds\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"getAVSRegistrar\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIAVSRegistrar\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAllocatableMagnitude\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAllocatedSets\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple[]\",\"internalType\":\"structOperatorSet[]\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAllocatedStrategies\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAllocation\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIAllocationManagerTypes.Allocation\",\"components\":[{\"name\":\"currentMagnitude\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"pendingDiff\",\"type\":\"int128\",\"internalType\":\"int128\"},{\"name\":\"effectBlock\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAllocationDelay\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"isSet\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"delay\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAllocations\",\"inputs\":[{\"name\":\"operators\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple[]\",\"internalType\":\"structIAllocationManagerTypes.Allocation[]\",\"components\":[{\"name\":\"currentMagnitude\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"pendingDiff\",\"type\":\"int128\",\"internalType\":\"int128\"},{\"name\":\"effectBlock\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getEncumberedMagnitude\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getMaxMagnitude\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getMaxMagnitudes\",\"inputs\":[{\"name\":\"operators\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64[]\",\"internalType\":\"uint64[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getMaxMagnitudes\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64[]\",\"internalType\":\"uint64[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getMaxMagnitudesAtBlock\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"blockNumber\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64[]\",\"internalType\":\"uint64[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getMemberCount\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getMembers\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[{\"name\":\"operators\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getMinimumSlashableStake\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"operators\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"futureBlock\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[{\"name\":\"slashableStake\",\"type\":\"uint256[][]\",\"internalType\":\"uint256[][]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getOperatorSetCount\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getRegisteredSets\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"operatorSets\",\"type\":\"tuple[]\",\"internalType\":\"structOperatorSet[]\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getStrategiesInOperatorSet\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getStrategyAllocations\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple[]\",\"internalType\":\"structOperatorSet[]\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"\",\"type\":\"tuple[]\",\"internalType\":\"structIAllocationManagerTypes.Allocation[]\",\"components\":[{\"name\":\"currentMagnitude\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"pendingDiff\",\"type\":\"int128\",\"internalType\":\"int128\"},{\"name\":\"effectBlock\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"initialOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"initialPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"isMemberOfOperatorSet\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isOperatorSet\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"modifyAllocations\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"params\",\"type\":\"tuple[]\",\"internalType\":\"structIAllocationManagerTypes.AllocateParams[]\",\"components\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"newMagnitudes\",\"type\":\"uint64[]\",\"internalType\":\"uint64[]\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"registerForOperatorSets\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"params\",\"type\":\"tuple\",\"internalType\":\"structIAllocationManagerTypes.RegisterParams\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetIds\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"removeStrategiesFromOperatorSet\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetId\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setAVSRegistrar\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"registrar\",\"type\":\"address\",\"internalType\":\"contractIAVSRegistrar\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setAllocationDelay\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"delay\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"slashOperator\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"params\",\"type\":\"tuple\",\"internalType\":\"structIAllocationManagerTypes.SlashingParams\",\"components\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetId\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"wadsToSlash\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"},{\"name\":\"description\",\"type\":\"string\",\"internalType\":\"string\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"updateAVSMetadataURI\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"metadataURI\",\"type\":\"string\",\"internalType\":\"string\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"AVSMetadataURIUpdated\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"metadataURI\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"AVSRegistrarSet\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"registrar\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIAVSRegistrar\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"AllocationDelaySet\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"delay\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"},{\"name\":\"effectBlock\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"AllocationUpdated\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"magnitude\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"effectBlock\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"EncumberedMagnitudeUpdated\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"encumberedMagnitude\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"MaxMagnitudeUpdated\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"maxMagnitude\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorAddedToOperatorSet\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorRemovedFromOperatorSet\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorSetCreated\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorSlashed\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"strategies\",\"type\":\"address[]\",\"indexed\":false,\"internalType\":\"contractIStrategy[]\"},{\"name\":\"wadSlashed\",\"type\":\"uint256[]\",\"indexed\":false,\"internalType\":\"uint256[]\"},{\"name\":\"description\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StrategyAddedToOperatorSet\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StrategyRemovedFromOperatorSet\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"AlreadyMemberOfSet\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InputArrayLengthMismatch\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InsufficientMagnitude\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidCaller\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidOperator\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidOperatorSet\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidWadToSlash\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ModificationAlreadyPending\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotMemberOfSet\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OperatorNotSlashable\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SameMagnitude\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StrategiesMustBeInAscendingOrder\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StrategyAlreadyInOperatorSet\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StrategyNotInOperatorSet\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"UninitializedAllocationDelay\",\"inputs\":[]}]", } // AllocationManagerStorageABI is the input ABI used to generate the binding from. @@ -322,37 +322,6 @@ func (_AllocationManagerStorage *AllocationManagerStorageCallerSession) Delegati return _AllocationManagerStorage.Contract.Delegation(&_AllocationManagerStorage.CallOpts) } -// EncumberedMagnitude is a free data retrieval call binding the contract method 0xa984eb3a. -// -// Solidity: function encumberedMagnitude(address operator, address strategy) view returns(uint64) -func (_AllocationManagerStorage *AllocationManagerStorageCaller) EncumberedMagnitude(opts *bind.CallOpts, operator common.Address, strategy common.Address) (uint64, error) { - var out []interface{} - err := _AllocationManagerStorage.contract.Call(opts, &out, "encumberedMagnitude", operator, strategy) - - if err != nil { - return *new(uint64), err - } - - out0 := *abi.ConvertType(out[0], new(uint64)).(*uint64) - - return out0, err - -} - -// EncumberedMagnitude is a free data retrieval call binding the contract method 0xa984eb3a. -// -// Solidity: function encumberedMagnitude(address operator, address strategy) view returns(uint64) -func (_AllocationManagerStorage *AllocationManagerStorageSession) EncumberedMagnitude(operator common.Address, strategy common.Address) (uint64, error) { - return _AllocationManagerStorage.Contract.EncumberedMagnitude(&_AllocationManagerStorage.CallOpts, operator, strategy) -} - -// EncumberedMagnitude is a free data retrieval call binding the contract method 0xa984eb3a. -// -// Solidity: function encumberedMagnitude(address operator, address strategy) view returns(uint64) -func (_AllocationManagerStorage *AllocationManagerStorageCallerSession) EncumberedMagnitude(operator common.Address, strategy common.Address) (uint64, error) { - return _AllocationManagerStorage.Contract.EncumberedMagnitude(&_AllocationManagerStorage.CallOpts, operator, strategy) -} - // GetAVSRegistrar is a free data retrieval call binding the contract method 0x304c10cd. // // Solidity: function getAVSRegistrar(address avs) view returns(address) @@ -584,6 +553,37 @@ func (_AllocationManagerStorage *AllocationManagerStorageCallerSession) GetAlloc return _AllocationManagerStorage.Contract.GetAllocations(&_AllocationManagerStorage.CallOpts, operators, operatorSet, strategy) } +// GetEncumberedMagnitude is a free data retrieval call binding the contract method 0xf605ce08. +// +// Solidity: function getEncumberedMagnitude(address operator, address strategy) view returns(uint64) +func (_AllocationManagerStorage *AllocationManagerStorageCaller) GetEncumberedMagnitude(opts *bind.CallOpts, operator common.Address, strategy common.Address) (uint64, error) { + var out []interface{} + err := _AllocationManagerStorage.contract.Call(opts, &out, "getEncumberedMagnitude", operator, strategy) + + if err != nil { + return *new(uint64), err + } + + out0 := *abi.ConvertType(out[0], new(uint64)).(*uint64) + + return out0, err + +} + +// GetEncumberedMagnitude is a free data retrieval call binding the contract method 0xf605ce08. +// +// Solidity: function getEncumberedMagnitude(address operator, address strategy) view returns(uint64) +func (_AllocationManagerStorage *AllocationManagerStorageSession) GetEncumberedMagnitude(operator common.Address, strategy common.Address) (uint64, error) { + return _AllocationManagerStorage.Contract.GetEncumberedMagnitude(&_AllocationManagerStorage.CallOpts, operator, strategy) +} + +// GetEncumberedMagnitude is a free data retrieval call binding the contract method 0xf605ce08. +// +// Solidity: function getEncumberedMagnitude(address operator, address strategy) view returns(uint64) +func (_AllocationManagerStorage *AllocationManagerStorageCallerSession) GetEncumberedMagnitude(operator common.Address, strategy common.Address) (uint64, error) { + return _AllocationManagerStorage.Contract.GetEncumberedMagnitude(&_AllocationManagerStorage.CallOpts, operator, strategy) +} + // GetMaxMagnitude is a free data retrieval call binding the contract method 0xa9333ec8. // // Solidity: function getMaxMagnitude(address operator, address strategy) view returns(uint64) diff --git a/pkg/bindings/BackingEigen/binding.go b/pkg/bindings/BackingEigen/binding.go index 5367ed4b91..3e8b6142ff 100644 --- a/pkg/bindings/BackingEigen/binding.go +++ b/pkg/bindings/BackingEigen/binding.go @@ -38,7 +38,7 @@ type ERC20VotesUpgradeableCheckpoint struct { // BackingEigenMetaData contains all meta data concerning the BackingEigen contract. var BackingEigenMetaData = &bind.MetaData{ ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"_EIGEN\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"CLOCK_MODE\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"DOMAIN_SEPARATOR\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"EIGEN\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"allowance\",\"inputs\":[{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"spender\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"allowedFrom\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"allowedTo\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"approve\",\"inputs\":[{\"name\":\"spender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"balanceOf\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"burn\",\"inputs\":[{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"checkpoints\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"pos\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structERC20VotesUpgradeable.Checkpoint\",\"components\":[{\"name\":\"fromBlock\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"votes\",\"type\":\"uint224\",\"internalType\":\"uint224\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"clock\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint48\",\"internalType\":\"uint48\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"decimals\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"decreaseAllowance\",\"inputs\":[{\"name\":\"spender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"subtractedValue\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"delegate\",\"inputs\":[{\"name\":\"delegatee\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"delegateBySig\",\"inputs\":[{\"name\":\"delegatee\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"nonce\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"v\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"r\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"s\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"delegates\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"disableTransferRestrictions\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"eip712Domain\",\"inputs\":[],\"outputs\":[{\"name\":\"fields\",\"type\":\"bytes1\",\"internalType\":\"bytes1\"},{\"name\":\"name\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"version\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"chainId\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"verifyingContract\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"extensions\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getPastTotalSupply\",\"inputs\":[{\"name\":\"timepoint\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getPastVotes\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"timepoint\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getVotes\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"increaseAllowance\",\"inputs\":[{\"name\":\"spender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"addedValue\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"initialOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"isMinter\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"mint\",\"inputs\":[{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"name\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"nonces\",\"inputs\":[{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"numCheckpoints\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"permit\",\"inputs\":[{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"spender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"deadline\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"v\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"r\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"s\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setAllowedFrom\",\"inputs\":[{\"name\":\"from\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"isAllowedFrom\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setAllowedTo\",\"inputs\":[{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"isAllowedTo\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setIsMinter\",\"inputs\":[{\"name\":\"minterAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"newStatus\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"symbol\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"totalSupply\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"transfer\",\"inputs\":[{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"transferFrom\",\"inputs\":[{\"name\":\"from\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"transferRestrictionsDisabledAfter\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"event\",\"name\":\"Approval\",\"inputs\":[{\"name\":\"owner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"spender\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Backed\",\"inputs\":[],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegateChanged\",\"inputs\":[{\"name\":\"delegator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"fromDelegate\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"toDelegate\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegateVotesChanged\",\"inputs\":[{\"name\":\"delegate\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"previousBalance\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"newBalance\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"EIP712DomainChanged\",\"inputs\":[],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"IsMinterModified\",\"inputs\":[{\"name\":\"minterAddress\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newStatus\",\"type\":\"bool\",\"indexed\":false,\"internalType\":\"bool\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"SetAllowedFrom\",\"inputs\":[{\"name\":\"from\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"isAllowedFrom\",\"type\":\"bool\",\"indexed\":false,\"internalType\":\"bool\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"SetAllowedTo\",\"inputs\":[{\"name\":\"to\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"isAllowedTo\",\"type\":\"bool\",\"indexed\":false,\"internalType\":\"bool\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Transfer\",\"inputs\":[{\"name\":\"from\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TransferRestrictionsDisabled\",\"inputs\":[],\"anonymous\":false}]", - Bin: "0x60a060405234801561000f575f5ffd5b50604051612d11380380612d1183398101604081905261002e91610105565b6001600160a01b038116608052610043610049565b50610132565b5f54610100900460ff16156100b45760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff90811614610103575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b5f60208284031215610115575f5ffd5b81516001600160a01b038116811461012b575f5ffd5b9392505050565b608051612bb261015f5f395f81816105e901528181610dae01528181610dd90152610e040152612bb25ff3fe608060405234801561000f575f5ffd5b506004361061023f575f3560e01c80637ecebe0011610135578063aa271e1a116100b4578063dd62ed3e11610079578063dd62ed3e14610579578063eb415f451461058c578063f1127ed814610594578063f2fde38b146105d1578063fdc371ce146105e4575f5ffd5b8063aa271e1a1461050a578063b8c255941461052d578063c3cda52014610540578063c4d66de814610553578063d505accf14610566575f5ffd5b806395d89b41116100fa57806395d89b41146104bf5780639ab24eb0146104c75780639aec4bae146104da578063a457c2d7146104e4578063a9059cbb146104f7575f5ffd5b80637ecebe001461044e57806384b0196e146104615780638da5cb5b1461047c5780638e539e8c1461048d57806391ddadf4146104a0575f5ffd5b806340c10f19116101c157806366eb399f1161018657806366eb399f146103c05780636fcfff45146103d357806370a08231146103fb578063715018a61461042357806378aa33ba1461042b575f5ffd5b806340c10f191461031a57806342966c681461032d5780634bf5d7e914610340578063587cde1e1461036a5780635c19a95c146103ad575f5ffd5b806323b872dd1161020757806323b872dd146102ca578063313ce567146102dd5780633644e515146102ec57806339509351146102f45780633a46b1a814610307575f5ffd5b80630455e6941461024357806306fdde031461027b578063095ea7b31461029057806318160ddd146102a35780631ffacdef146102b5575b5f5ffd5b610266610251366004612682565b6101316020525f908152604090205460ff1681565b60405190151581526020015b60405180910390f35b61028361060b565b60405161027291906126c9565b61026661029e3660046126db565b61069b565b6067545b604051908152602001610272565b6102c86102c3366004612703565b6106b4565b005b6102666102d836600461273c565b6106ca565b60405160128152602001610272565b6102a76106ed565b6102666103023660046126db565b6106fb565b6102a76103153660046126db565b61071c565b6102c86103283660046126db565b6107a4565b6102c861033b366004612776565b61081f565b60408051808201909152600e81526d06d6f64653d74696d657374616d760941b6020820152610283565b610395610378366004612682565b6001600160a01b039081165f90815260fe60205260409020541690565b6040516001600160a01b039091168152602001610272565b6102c86103bb366004612682565b61082c565b6102c86103ce366004612703565b610836565b6103e66103e1366004612682565b6108ae565b60405163ffffffff9091168152602001610272565b6102a7610409366004612682565b6001600160a01b03165f9081526065602052604090205490565b6102c86108cf565b610266610439366004612682565b6101326020525f908152604090205460ff1681565b6102a761045c366004612682565b6108e2565b6104696108ff565b604051610272979695949392919061278d565b6033546001600160a01b0316610395565b6102a761049b366004612776565b610998565b6104a86109ff565b60405165ffffffffffff9091168152602001610272565b610283610a09565b6102a76104d5366004612682565b610a18565b6102a76101305481565b6102666104f23660046126db565b610a95565b6102666105053660046126db565b610b0f565b610266610518366004612682565b6101336020525f908152604090205460ff1681565b6102c861053b366004612703565b610b1c565b6102c861054e366004612833565b610b2e565b6102c8610561366004612682565b610c63565b6102c8610574366004612887565b610ea5565b6102a76105873660046128ed565b611006565b6102c8611030565b6105a76105a236600461291e565b6110fe565b60408051825163ffffffff1681526020928301516001600160e01b03169281019290925201610272565b6102c86105df366004612682565b61117f565b6103957f000000000000000000000000000000000000000000000000000000000000000081565b60606068805461061a90612950565b80601f016020809104026020016040519081016040528092919081815260200182805461064690612950565b80156106915780601f1061066857610100808354040283529160200191610691565b820191905f5260205f20905b81548152906001019060200180831161067457829003601f168201915b5050505050905090565b5f336106a88185856111f5565b60019150505b92915050565b6106bc611318565b6106c68282611372565b5050565b5f336106d78582856113d2565b6106e285858561144a565b506001949350505050565b5f6106f6611604565b905090565b5f336106a881858561070d8383611006565b6107179190612996565b6111f5565b5f6107256109ff565b65ffffffffffff16821061077c5760405162461bcd60e51b815260206004820152601960248201527804552433230566f7465733a20667574757265206c6f6f6b757603c1b60448201526064015b60405180910390fd5b6001600160a01b0383165f90815260ff6020526040902061079d908361160d565b9392505050565b335f908152610133602052604090205460ff166108155760405162461bcd60e51b815260206004820152602960248201527f4261636b696e67456967656e2e6d696e743a2063616c6c6572206973206e6f7460448201526810309036b4b73a32b960b91b6064820152608401610773565b6106c682826116ee565b6108293382611779565b50565b6108293382611792565b61083e611318565b816001600160a01b03167f0124b12503bddc2616c0f3f54fd23ed283f5ef0c1483a75409e42612176b8bde8260405161087b911515815260200190565b60405180910390a26001600160a01b03919091165f90815261013360205260409020805460ff1916911515919091179055565b6001600160a01b0381165f90815260ff60205260408120546106ae9061180b565b6108d7611318565b6108e05f611873565b565b6001600160a01b0381165f90815260cb60205260408120546106ae565b5f6060805f5f5f60606097545f5f1b14801561091b5750609854155b61095f5760405162461bcd60e51b81526020600482015260156024820152741152540dcc4c8e88155b9a5b9a5d1a585b1a5e9959605a1b6044820152606401610773565b6109676118c4565b61096f6118d3565b604080515f80825260208201909252600f60f81b9b939a50919850469750309650945092509050565b5f6109a16109ff565b65ffffffffffff1682106109f35760405162461bcd60e51b815260206004820152601960248201527804552433230566f7465733a20667574757265206c6f6f6b757603c1b6044820152606401610773565b6106ae6101008361160d565b5f6106f6426118e2565b60606069805461061a90612950565b6001600160a01b0381165f90815260ff60205260408120548015610a83576001600160a01b0383165f90815260ff6020526040902080545f198301908110610a6257610a626129bd565b5f9182526020909120015464010000000090046001600160e01b0316610a85565b5f5b6001600160e01b03169392505050565b5f3381610aa28286611006565b905083811015610b025760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610773565b6106e282868684036111f5565b5f336106a881858561144a565b610b24611318565b6106c68282611948565b83421115610b7e5760405162461bcd60e51b815260206004820152601d60248201527f4552433230566f7465733a207369676e617475726520657870697265640000006044820152606401610773565b604080517fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf60208201526001600160a01b0388169181019190915260608101869052608081018590525f90610bf790610bef9060a001604051602081830303815290604052805190602001206119a0565b8585856119cc565b9050610c02816119f2565b8614610c505760405162461bcd60e51b815260206004820152601960248201527f4552433230566f7465733a20696e76616c6964206e6f6e6365000000000000006044820152606401610773565b610c5a8188611792565b50505050505050565b5f54610100900460ff1615808015610c8157505f54600160ff909116105b80610c9a5750303b158015610c9a57505f5460ff166001145b610cfd5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610773565b5f805460ff191660011790558015610d1e575f805461ff0019166101001790555b610d26611a19565b610d736040518060400160405280600d81526020016c2130b1b5b4b7339022b4b3b2b760991b815250604051806040016040528060068152602001653122a4a3a2a760d11b815250611a47565b610d7c82611873565b610da3604051806040016040528060068152602001653122a4a3a2a760d11b815250611a77565b5f1961013055610dd47f00000000000000000000000000000000000000000000000000000000000000006001611372565b610dff7f00000000000000000000000000000000000000000000000000000000000000006001611948565b610e357f00000000000000000000000000000000000000000000000000000000000000006b05686877afb5cbccbf7340006116ee565b6040517fb7c23c1e2e36f298e9879a88ecfcd07e28fbb439bcfa9c78ca1363ca14370d26905f90a180156106c6575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15050565b83421115610ef55760405162461bcd60e51b815260206004820152601d60248201527f45524332305065726d69743a206578706972656420646561646c696e650000006044820152606401610773565b5f7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9888888610f238c6119f2565b6040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090505f610f7d826119a0565b90505f610f8c828787876119cc565b9050896001600160a01b0316816001600160a01b031614610fef5760405162461bcd60e51b815260206004820152601e60248201527f45524332305065726d69743a20696e76616c6964207369676e617475726500006044820152606401610773565b610ffa8a8a8a6111f5565b50505050505050505050565b6001600160a01b039182165f90815260666020908152604080832093909416825291909152205490565b611038611318565b5f1961013054146110ce5760405162461bcd60e51b815260206004820152605460248201527f4261636b696e67456967656e2e64697361626c655472616e736665725265737460448201527f72696374696f6e733a207472616e73666572207265737472696374696f6e7320606482015273185c9948185b1c9958591e48191a5cd8589b195960621b608482015260a401610773565b5f6101308190556040517f2b18986d3ba809db2f13a5d7bf17f60d357b37d9cbb55dd71cbbac8dc4060f649190a1565b604080518082019091525f80825260208201526001600160a01b0383165f90815260ff60205260409020805463ffffffff8416908110611140576111406129bd565b5f9182526020918290206040805180820190915291015463ffffffff8116825264010000000090046001600160e01b0316918101919091529392505050565b611187611318565b6001600160a01b0381166111ec5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610773565b61082981611873565b6001600160a01b0383166112575760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610773565b6001600160a01b0382166112b85760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610773565b6001600160a01b038381165f8181526066602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6033546001600160a01b031633146108e05760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610773565b6001600160a01b0382165f8181526101316020908152604091829020805460ff191685151590811790915591519182527fcf20b1ecb604b0e8888d579c64e8a3b10e590d45c1c2dddb393bed284362227191015b60405180910390a25050565b5f6113dd8484611006565b90505f19811461144457818110156114375760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610773565b61144484848484036111f5565b50505050565b6001600160a01b0383166114ae5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610773565b6001600160a01b0382166115105760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610773565b61151b838383611ac0565b6001600160a01b0383165f90815260656020526040902054818110156115925760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610773565b6001600160a01b038085165f8181526065602052604080822086860390559286168082529083902080548601905591517fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906115f19086815260200190565b60405180910390a3611444848484611b9c565b5f6106f6611bcd565b81545f9081816005811115611664575f61162684611c40565b61163090856129d1565b5f88815260209020909150869082015463ffffffff16111561165457809150611662565b61165f816001612996565b92505b505b808210156116af575f6116778383611d24565b5f88815260209020909150869082015463ffffffff16111561169b578091506116a9565b6116a6816001612996565b92505b50611664565b80156116d9575f8681526020902081015f19015464010000000090046001600160e01b03166116db565b5f5b6001600160e01b03169695505050505050565b6116f88282611d3e565b6067546001600160e01b03101561176a5760405162461bcd60e51b815260206004820152603060248201527f4552433230566f7465733a20746f74616c20737570706c79207269736b73206f60448201526f766572666c6f77696e6720766f74657360801b6064820152608401610773565b611444610100611e0f83611e1a565b6117838282611f86565b6114446101006120c983611e1a565b6001600160a01b038281165f81815260fe6020818152604080842080546065845282862054949093528787166001600160a01b03198416811790915590519190951694919391928592917f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f9190a46114448284836120d4565b5f63ffffffff82111561186f5760405162461bcd60e51b815260206004820152602660248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203360448201526532206269747360d01b6064820152608401610773565b5090565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b60606099805461061a90612950565b6060609a805461061a90612950565b5f65ffffffffffff82111561186f5760405162461bcd60e51b815260206004820152602660248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203460448201526538206269747360d01b6064820152608401610773565b6001600160a01b0382165f8181526101326020908152604091829020805460ff191685151590811790915591519182527f72a561d1af7409467dae4f1e9fc52590a9335a1dda17727e2b6aa8c4db35109b91016113c6565b5f6106ae6119ac611604565b8360405161190160f01b8152600281019290925260228201526042902090565b5f5f5f6119db8787878761220e565b915091506119e8816122cb565b5095945050505050565b6001600160a01b0381165f90815260cb602052604090208054600181018255905b50919050565b5f54610100900460ff16611a3f5760405162461bcd60e51b8152600401610773906129e4565b6108e0612414565b5f54610100900460ff16611a6d5760405162461bcd60e51b8152600401610773906129e4565b6106c68282612443565b5f54610100900460ff16611a9d5760405162461bcd60e51b8152600401610773906129e4565b61082981604051806040016040528060018152602001603160f81b815250612482565b610130544211611b97576001600160a01b0383165f908152610131602052604090205460ff1680611b0957506001600160a01b0382165f908152610132602052604090205460ff165b80611b1b57506001600160a01b038316155b611b975760405162461bcd60e51b815260206004820152604160248201527f4261636b696e67456967656e2e5f6265666f7265546f6b656e5472616e73666560448201527f723a2066726f6d206f7220746f206d7573742062652077686974656c697374656064820152601960fa1b608482015260a401610773565b505050565b6001600160a01b038381165f90815260fe6020526040808220548584168352912054611b97929182169116836120d4565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f611bf76124cf565b611bff612527565b60408051602081019490945283019190915260608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b5f815f03611c4f57505f919050565b5f6001611c5b84612557565b901c6001901b90506001818481611c7457611c74612a2f565b048201901c90506001818481611c8c57611c8c612a2f565b048201901c90506001818481611ca457611ca4612a2f565b048201901c90506001818481611cbc57611cbc612a2f565b048201901c90506001818481611cd457611cd4612a2f565b048201901c90506001818481611cec57611cec612a2f565b048201901c90506001818481611d0457611d04612a2f565b048201901c905061079d81828581611d1e57611d1e612a2f565b046125ea565b5f611d326002848418612a43565b61079d90848416612996565b6001600160a01b038216611d945760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610773565b611d9f5f8383611ac0565b8060675f828254611db09190612996565b90915550506001600160a01b0382165f818152606560209081526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a36106c65f8383611b9c565b5f61079d8284612996565b82545f908190818115611e64575f8781526020902082015f190160408051808201909152905463ffffffff8116825264010000000090046001600160e01b03166020820152611e78565b604080518082019091525f80825260208201525b905080602001516001600160e01b03169350611e9884868863ffffffff16565b92505f82118015611ec05750611eac6109ff565b65ffffffffffff16815f015163ffffffff16145b15611f0357611ece836125ff565b5f8881526020902083015f190180546001600160e01b03929092166401000000000263ffffffff909216919091179055611f7c565b866040518060400160405280611f27611f1a6109ff565b65ffffffffffff1661180b565b63ffffffff168152602001611f3b866125ff565b6001600160e01b0390811690915282546001810184555f938452602093849020835194909301519091166401000000000263ffffffff909316929092179101555b5050935093915050565b6001600160a01b038216611fe65760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401610773565b611ff1825f83611ac0565b6001600160a01b0382165f90815260656020526040902054818110156120645760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b6064820152608401610773565b6001600160a01b0383165f8181526065602090815260408083208686039055606780548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3611b97835f84611b9c565b5f61079d82846129d1565b816001600160a01b0316836001600160a01b0316141580156120f557505f81115b15611b97576001600160a01b03831615612182576001600160a01b0383165f90815260ff60205260408120819061212f906120c985611e1a565b91509150846001600160a01b03167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a7248383604051612177929190918252602082015260400190565b60405180910390a250505b6001600160a01b03821615611b97576001600160a01b0382165f90815260ff6020526040812081906121b790611e0f85611e1a565b91509150836001600160a01b03167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a72483836040516121ff929190918252602082015260400190565b60405180910390a25050505050565b5f807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a083111561224357505f905060036122c2565b604080515f8082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015612294573d5f5f3e3d5ffd5b5050604051601f1901519150506001600160a01b0381166122bc575f600192509250506122c2565b91505f90505b94509492505050565b5f8160048111156122de576122de612a62565b036122e65750565b60018160048111156122fa576122fa612a62565b036123475760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610773565b600281600481111561235b5761235b612a62565b036123a85760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610773565b60038160048111156123bc576123bc612a62565b036108295760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401610773565b5f54610100900460ff1661243a5760405162461bcd60e51b8152600401610773906129e4565b6108e033611873565b5f54610100900460ff166124695760405162461bcd60e51b8152600401610773906129e4565b60686124758382612ac1565b506069611b978282612ac1565b5f54610100900460ff166124a85760405162461bcd60e51b8152600401610773906129e4565b60996124b48382612ac1565b50609a6124c18282612ac1565b50505f609781905560985550565b5f5f6124d96118c4565b8051909150156124f0578051602090910120919050565b60975480156124ff5792915050565b7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4709250505090565b5f5f6125316118d3565b805190915015612548578051602090910120919050565b60985480156124ff5792915050565b5f80608083901c1561256b57608092831c92015b604083901c1561257d57604092831c92015b602083901c1561258f57602092831c92015b601083901c156125a157601092831c92015b600883901c156125b357600892831c92015b600483901c156125c557600492831c92015b600283901c156125d757600292831c92015b600183901c156106ae5760010192915050565b5f8183106125f8578161079d565b5090919050565b5f6001600160e01b0382111561186f5760405162461bcd60e51b815260206004820152602760248201527f53616665436173743a2076616c756520646f65736e27742066697420696e20326044820152663234206269747360c81b6064820152608401610773565b80356001600160a01b038116811461267d575f5ffd5b919050565b5f60208284031215612692575f5ffd5b61079d82612667565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f61079d602083018461269b565b5f5f604083850312156126ec575f5ffd5b6126f583612667565b946020939093013593505050565b5f5f60408385031215612714575f5ffd5b61271d83612667565b915060208301358015158114612731575f5ffd5b809150509250929050565b5f5f5f6060848603121561274e575f5ffd5b61275784612667565b925061276560208501612667565b929592945050506040919091013590565b5f60208284031215612786575f5ffd5b5035919050565b60ff60f81b8816815260e060208201525f6127ab60e083018961269b565b82810360408401526127bd818961269b565b606084018890526001600160a01b038716608085015260a0840186905283810360c0850152845180825260208087019350909101905f5b818110156128125783518352602093840193909201916001016127f4565b50909b9a5050505050505050505050565b803560ff8116811461267d575f5ffd5b5f5f5f5f5f5f60c08789031215612848575f5ffd5b61285187612667565b9550602087013594506040870135935061286d60608801612823565b9598949750929560808101359460a0909101359350915050565b5f5f5f5f5f5f5f60e0888a03121561289d575f5ffd5b6128a688612667565b96506128b460208901612667565b955060408801359450606088013593506128d060808901612823565b9699959850939692959460a0840135945060c09093013592915050565b5f5f604083850312156128fe575f5ffd5b61290783612667565b915061291560208401612667565b90509250929050565b5f5f6040838503121561292f575f5ffd5b61293883612667565b9150602083013563ffffffff81168114612731575f5ffd5b600181811c9082168061296457607f821691505b602082108103611a1357634e487b7160e01b5f52602260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b808201808211156106ae576106ae612982565b634e487b7160e01b5f52604160045260245ffd5b634e487b7160e01b5f52603260045260245ffd5b818103818111156106ae576106ae612982565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b634e487b7160e01b5f52601260045260245ffd5b5f82612a5d57634e487b7160e01b5f52601260045260245ffd5b500490565b634e487b7160e01b5f52602160045260245ffd5b601f821115611b9757805f5260205f20601f840160051c81016020851015612a9b5750805b601f840160051c820191505b81811015612aba575f8155600101612aa7565b5050505050565b815167ffffffffffffffff811115612adb57612adb6129a9565b612aef81612ae98454612950565b84612a76565b6020601f821160018114612b21575f8315612b0a5750848201515b5f19600385901b1c1916600184901b178455612aba565b5f84815260208120601f198516915b82811015612b505787850151825560209485019460019092019101612b30565b5084821015612b6d57868401515f19600387901b60f8161c191681555b50505050600190811b0190555056fea2646970667358221220bc65aa22c82ea1986fef941c8ffca5d6f9991e3fb75b2eefff53e26501e45f9064736f6c634300081b0033", + Bin: "0x60a060405234801561000f575f5ffd5b50604051615929380380615929833981810160405281019061003191906101a6565b8073ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff168152505061007361007960201b60201c565b506102a3565b5f60019054906101000a900460ff16156100c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100bf90610251565b60405180910390fd5b60ff80165f5f9054906101000a900460ff1660ff16146101355760ff5f5f6101000a81548160ff021916908360ff1602179055507f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb384740249860ff60405161012c919061028a565b60405180910390a15b565b5f5ffd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6101648261013b565b9050919050565b5f6101758261015a565b9050919050565b6101858161016b565b811461018f575f5ffd5b50565b5f815190506101a08161017c565b92915050565b5f602082840312156101bb576101ba610137565b5b5f6101c884828501610192565b91505092915050565b5f82825260208201905092915050565b7f496e697469616c697a61626c653a20636f6e747261637420697320696e6974695f8201527f616c697a696e6700000000000000000000000000000000000000000000000000602082015250565b5f61023b6027836101d1565b9150610246826101e1565b604082019050919050565b5f6020820190508181035f8301526102688161022f565b9050919050565b5f60ff82169050919050565b6102848161026f565b82525050565b5f60208201905061029d5f83018461027b565b92915050565b6080516156596102d05f395f81816113e5015281816114100152818161143b01526118e501526156595ff3fe608060405234801561000f575f5ffd5b5060043610610246575f3560e01c80637ecebe0011610139578063aa271e1a116100b6578063dd62ed3e1161007a578063dd62ed3e14610752578063eb415f4514610782578063f1127ed81461078c578063f2fde38b146107bc578063fdc371ce146107d857610246565b8063aa271e1a146106b2578063b8c25594146106e2578063c3cda520146106fe578063c4d66de81461071a578063d505accf1461073657610246565b806395d89b41116100fd57806395d89b41146105e65780639ab24eb0146106045780639aec4bae14610634578063a457c2d714610652578063a9059cbb1461068257610246565b80637ecebe001461052657806384b0196e146105565780638da5cb5b1461057a5780638e539e8c1461059857806391ddadf4146105c857610246565b806340c10f19116101c757806366eb399f1161018b57806366eb399f146104705780636fcfff451461048c57806370a08231146104bc578063715018a6146104ec57806378aa33ba146104f657610246565b806340c10f19146103ce57806342966c68146103ea5780634bf5d7e914610406578063587cde1e146104245780635c19a95c1461045457610246565b806323b872dd1161020e57806323b872dd14610302578063313ce567146103325780633644e51514610350578063395093511461036e5780633a46b1a81461039e57610246565b80630455e6941461024a57806306fdde031461027a578063095ea7b31461029857806318160ddd146102c85780631ffacdef146102e6575b5f5ffd5b610264600480360381019061025f91906138f3565b6107f6565b6040516102719190613938565b60405180910390f35b610282610814565b60405161028f91906139c1565b60405180910390f35b6102b260048036038101906102ad9190613a14565b6108a4565b6040516102bf9190613938565b60405180910390f35b6102d06108c6565b6040516102dd9190613a61565b60405180910390f35b61030060048036038101906102fb9190613aa4565b6108cf565b005b61031c60048036038101906103179190613ae2565b6108e5565b6040516103299190613938565b60405180910390f35b61033a610913565b6040516103479190613b4d565b60405180910390f35b61035861091b565b6040516103659190613b7e565b60405180910390f35b61038860048036038101906103839190613a14565b610929565b6040516103959190613938565b60405180910390f35b6103b860048036038101906103b39190613a14565b61095f565b6040516103c59190613a61565b60405180910390f35b6103e860048036038101906103e39190613a14565b6109ff565b005b61040460048036038101906103ff9190613b97565b610a97565b005b61040e610aab565b60405161041b91906139c1565b60405180910390f35b61043e600480360381019061043991906138f3565b610ae8565b60405161044b9190613bd1565b60405180910390f35b61046e600480360381019061046991906138f3565b610b4d565b005b61048a60048036038101906104859190613aa4565b610b61565b005b6104a660048036038101906104a191906138f3565b610c10565b6040516104b39190613c08565b60405180910390f35b6104d660048036038101906104d191906138f3565b610c61565b6040516104e39190613a61565b60405180910390f35b6104f4610ca7565b005b610510600480360381019061050b91906138f3565b610cba565b60405161051d9190613938565b60405180910390f35b610540600480360381019061053b91906138f3565b610cd8565b60405161054d9190613a61565b60405180910390f35b61055e610d25565b6040516105719796959493929190613d12565b60405180910390f35b610582610e1f565b60405161058f9190613bd1565b60405180910390f35b6105b260048036038101906105ad9190613b97565b610e47565b6040516105bf9190613a61565b60405180910390f35b6105d0610eac565b6040516105dd9190613db4565b60405180910390f35b6105ee610ebb565b6040516105fb91906139c1565b60405180910390f35b61061e600480360381019061061991906138f3565b610f4b565b60405161062b9190613a61565b60405180910390f35b61063c611049565b6040516106499190613a61565b60405180910390f35b61066c60048036038101906106679190613a14565b611050565b6040516106799190613938565b60405180910390f35b61069c60048036038101906106979190613a14565b6110c5565b6040516106a99190613938565b60405180910390f35b6106cc60048036038101906106c791906138f3565b6110e7565b6040516106d99190613938565b60405180910390f35b6106fc60048036038101906106f79190613aa4565b611105565b005b61071860048036038101906107139190613e21565b61111b565b005b610734600480360381019061072f91906138f3565b61121e565b005b610750600480360381019061074b9190613eaa565b6114f4565b005b61076c60048036038101906107679190613f47565b611633565b6040516107799190613a61565b60405180910390f35b61078a6116b5565b005b6107a660048036038101906107a19190613faf565b611758565b6040516107b3919061405f565b60405180910390f35b6107d660048036038101906107d191906138f3565b611861565b005b6107e06118e3565b6040516107ed91906140d3565b60405180910390f35b610131602052805f5260405f205f915054906101000a900460ff1681565b60606068805461082390614119565b80601f016020809104026020016040519081016040528092919081815260200182805461084f90614119565b801561089a5780601f106108715761010080835404028352916020019161089a565b820191905f5260205f20905b81548152906001019060200180831161087d57829003601f168201915b5050505050905090565b5f5f6108ae611907565b90506108bb81858561190e565b600191505092915050565b5f606754905090565b6108d7611ad1565b6108e18282611b4f565b5050565b5f5f6108ef611907565b90506108fc858285611bf6565b610907858585611c81565b60019150509392505050565b5f6012905090565b5f610924611ef0565b905090565b5f5f610933611907565b90506109548185856109458589611633565b61094f9190614176565b61190e565b600191505092915050565b5f610968610eac565b65ffffffffffff1682106109b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109a8906141f3565b60405180910390fd5b6109f760ff5f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2083611efe565b905092915050565b6101335f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16610a89576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a8090614281565b60405180910390fd5b610a93828261203e565b5050565b610aa8610aa2611907565b826120cc565b50565b60606040518060400160405280600e81526020017f6d6f64653d74696d657374616d70000000000000000000000000000000000000815250905090565b5f60fe5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b610b5e610b58611907565b826120eb565b50565b610b69611ad1565b8173ffffffffffffffffffffffffffffffffffffffff167f0124b12503bddc2616c0f3f54fd23ed283f5ef0c1483a75409e42612176b8bde82604051610baf9190613938565b60405180910390a2806101335f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055505050565b5f610c5a60ff5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2080549050612200565b9050919050565b5f60655f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b610caf611ad1565b610cb85f612252565b565b610132602052805f5260405f205f915054906101000a900460ff1681565b5f610d1e60cb5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20612315565b9050919050565b5f6060805f5f5f60605f5f1b609754148015610d4457505f5f1b609854145b610d83576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d7a906142e9565b60405180910390fd5b610d8b612321565b610d936123b1565b46305f5f1b5f67ffffffffffffffff811115610db257610db1614307565b5b604051908082528060200260200182016040528015610de05781602001602082028036833780820191505090505b507f0f00000000000000000000000000000000000000000000000000000000000000959493929190965096509650965096509650965090919293949596565b5f60335f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b5f610e50610eac565b65ffffffffffff168210610e99576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e90906141f3565b60405180910390fd5b610ea561010083611efe565b9050919050565b5f610eb642612441565b905090565b606060698054610eca90614119565b80601f0160208091040260200160405190810160405280929190818152602001828054610ef690614119565b8015610f415780601f10610f1857610100808354040283529160200191610f41565b820191905f5260205f20905b815481529060010190602001808311610f2457829003601f168201915b5050505050905090565b5f5f60ff5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f208054905090505f81146110215760ff5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206001820381548110610fe957610fe8614334565b5b905f5260205f20015f0160049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16611023565b5f5b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16915050919050565b6101305481565b5f5f61105a611907565b90505f6110678286611633565b9050838110156110ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110a3906143d1565b60405180910390fd5b6110b9828686840361190e565b60019250505092915050565b5f5f6110cf611907565b90506110dc818585611c81565b600191505092915050565b610133602052805f5260405f205f915054906101000a900460ff1681565b61110d611ad1565b6111178282612495565b5050565b8342111561115e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161115590614439565b60405180910390fd5b5f6111bf6111b77fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf89898960405160200161119c9493929190614457565b6040516020818303038152906040528051906020012061253c565b858585612555565b90506111ca8161257e565b861461120b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611202906144e4565b60405180910390fd5b61121581886120eb565b50505050505050565b5f5f60019054906101000a900460ff1615905080801561124e575060015f5f9054906101000a900460ff1660ff16105b8061127b575061125d306125d9565b15801561127a575060015f5f9054906101000a900460ff1660ff16145b5b6112ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112b190614572565b60405180910390fd5b60015f5f6101000a81548160ff021916908360ff16021790555080156112f55760015f60016101000a81548160ff0219169083151502179055505b6112fd6125fb565b6113716040518060400160405280600d81526020017f4261636b696e6720456967656e000000000000000000000000000000000000008152506040518060400160405280600681526020017f62454947454e0000000000000000000000000000000000000000000000000000815250612653565b61137a82612252565b6113b86040518060400160405280600681526020017f62454947454e00000000000000000000000000000000000000000000000000008152506126af565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6101308190555061140b7f00000000000000000000000000000000000000000000000000000000000000006001611b4f565b6114367f00000000000000000000000000000000000000000000000000000000000000006001612495565b61146c7f00000000000000000000000000000000000000000000000000000000000000006b05686877afb5cbccbf73400061203e565b7fb7c23c1e2e36f298e9879a88ecfcd07e28fbb439bcfa9c78ca1363ca14370d2660405160405180910390a180156114f0575f5f60016101000a81548160ff0219169083151502179055507f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb384740249860016040516114e791906145c9565b60405180910390a15b5050565b83421115611537576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161152e9061462c565b60405180910390fd5b5f7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98888886115658c61257e565b8960405160200161157b9695949392919061464a565b6040516020818303038152906040528051906020012090505f61159d8261253c565b90505f6115ac82878787612555565b90508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461161c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611613906146f3565b60405180910390fd5b6116278a8a8a61190e565b50505050505050505050565b5f60665f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905092915050565b6116bd611ad1565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6101305414611722576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611719906147a7565b60405180910390fd5b5f610130819055507f2b18986d3ba809db2f13a5d7bf17f60d357b37d9cbb55dd71cbbac8dc4060f6460405160405180910390a1565b611760613859565b60ff5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f208263ffffffff16815481106117b5576117b4614334565b5b905f5260205f20016040518060400160405290815f82015f9054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020015f820160049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1681525050905092915050565b611869611ad1565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036118d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118ce90614835565b60405180910390fd5b6118e081612252565b50565b7f000000000000000000000000000000000000000000000000000000000000000081565b5f33905090565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361197c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611973906148c3565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036119ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119e190614951565b60405180910390fd5b8060665f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92583604051611ac49190613a61565b60405180910390a3505050565b611ad9611907565b73ffffffffffffffffffffffffffffffffffffffff16611af7610e1f565b73ffffffffffffffffffffffffffffffffffffffff1614611b4d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b44906149b9565b60405180910390fd5b565b806101315f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff167fcf20b1ecb604b0e8888d579c64e8a3b10e590d45c1c2dddb393bed284362227182604051611bea9190613938565b60405180910390a25050565b5f611c018484611633565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114611c7b5781811015611c6d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c6490614a21565b60405180910390fd5b611c7a848484840361190e565b5b50505050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611cef576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ce690614aaf565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611d5d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d5490614b3d565b60405180910390fd5b611d6883838361273f565b5f60655f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905081811015611dec576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611de390614bcb565b60405180910390fd5b81810360655f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508160655f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051611ed79190613a61565b60405180910390a3611eea84848461286c565b50505050565b5f611ef9612897565b905090565b5f5f838054905090505f5f90505f8290506005831115611f72575f611f22846128fa565b84611f2d9190614be9565b905085611f3a88836129f0565b5f015f9054906101000a900463ffffffff1663ffffffff161115611f6057809150611f70565b600181611f6d9190614176565b92505b505b5b80821015611fcf575f611f868383612a02565b905085611f9388836129f0565b5f015f9054906101000a900463ffffffff1663ffffffff161115611fb957809150611fc9565b600181611fc69190614176565b92505b50611f73565b5f811461201357611fe386600183036129f0565b5f0160049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16612015565b5f5b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16935050505092915050565b6120488282612a27565b612050612b76565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff166120766108c6565b11156120b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120ae90614c8c565b60405180910390fd5b6120c6610100612b9983612bae565b50505050565b6120d68282612e77565b6120e561010061303c83612bae565b50505050565b5f6120f583610ae8565b90505f61210184610c61565b90508260fe5f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f60405160405180910390a46121fa828483613051565b50505050565b5f63ffffffff801682111561224a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161224190614d1a565b60405180910390fd5b819050919050565b5f60335f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160335f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f815f01549050919050565b60606099805461233090614119565b80601f016020809104026020016040519081016040528092919081815260200182805461235c90614119565b80156123a75780601f1061237e576101008083540402835291602001916123a7565b820191905f5260205f20905b81548152906001019060200180831161238a57829003601f168201915b5050505050905090565b6060609a80546123c090614119565b80601f01602080910402602001604051908101604052809291908181526020018280546123ec90614119565b80156124375780601f1061240e57610100808354040283529160200191612437565b820191905f5260205f20905b81548152906001019060200180831161241a57829003601f168201915b5050505050905090565b5f65ffffffffffff801682111561248d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161248490614da8565b60405180910390fd5b819050919050565b806101325f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff167f72a561d1af7409467dae4f1e9fc52590a9335a1dda17727e2b6aa8c4db35109b826040516125309190613938565b60405180910390a25050565b5f61254e612548611ef0565b83613241565b9050919050565b5f5f5f61256487878787613281565b9150915061257181613359565b8192505050949350505050565b5f5f60cb5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2090506125c881612315565b91506125d3816134be565b50919050565b5f5f8273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b5f60019054906101000a900460ff16612649576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161264090614e36565b60405180910390fd5b6126516134d2565b565b5f60019054906101000a900460ff166126a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161269890614e36565b60405180910390fd5b6126ab8282613532565b5050565b5f60019054906101000a900460ff166126fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126f490614e36565b60405180910390fd5b61273c816040518060400160405280600181526020017f31000000000000000000000000000000000000000000000000000000000000008152506135a4565b50565b61013054421161285c576101315f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16806127e657506101325f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff165b8061281c57505f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16145b61285b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161285290614eea565b60405180910390fd5b5b612867838383613628565b505050565b61287783838361362d565b61289261288384610ae8565b61288c84610ae8565b83613051565b505050565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f6128c1613632565b6128c9613699565b46306040516020016128df959493929190614f08565b60405160208183030381529060405280519060200120905090565b5f5f820361290a575f90506129eb565b5f600161291684613700565b901c6001901b905060018184816129305761292f614f59565b5b048201901c9050600181848161294957612948614f59565b5b048201901c9050600181848161296257612961614f59565b5b048201901c9050600181848161297b5761297a614f59565b5b048201901c9050600181848161299457612993614f59565b5b048201901c905060018184816129ad576129ac614f59565b5b048201901c905060018184816129c6576129c5614f59565b5b048201901c90506129e7818285816129e1576129e0614f59565b5b046137d7565b9150505b919050565b5f825f528160205f2001905092915050565b5f6002828418612a129190614f86565b828416612a1f9190614176565b905092915050565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612a95576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a8c90615000565b60405180910390fd5b612aa05f838361273f565b8060675f828254612ab19190614176565b925050819055508060655f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055508173ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051612b5f9190613a61565b60405180910390a3612b725f838361286c565b5050565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff905090565b5f8183612ba69190614176565b905092915050565b5f5f5f858054905090505f5f8214612c6e57612bcd87600184036129f0565b6040518060400160405290815f82015f9054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020015f820160049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1681525050612ca8565b60405180604001604052805f63ffffffff1681526020015f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff168152505b905080602001517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff169350612cdd84868863ffffffff16565b92505f82118015612d055750612cf1610eac565b65ffffffffffff16815f015163ffffffff16145b15612d7557612d13836137ef565b612d2088600185036129f0565b5f0160046101000a8154817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff02191690837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff160217905550612e6d565b866040518060400160405280612d99612d8c610eac565b65ffffffffffff16612200565b63ffffffff168152602001612dad866137ef565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16815250908060018154018082558091505060019003905f5260205f20015f909190919091505f820151815f015f6101000a81548163ffffffff021916908363ffffffff1602179055506020820151815f0160046101000a8154817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff02191690837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16021790555050505b5050935093915050565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612ee5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612edc9061508e565b60405180910390fd5b612ef0825f8361273f565b5f60655f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905081811015612f74576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f6b9061511c565b60405180910390fd5b81810360655f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508160675f82825403925050819055505f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516130249190613a61565b60405180910390a3613037835f8461286c565b505050565b5f81836130499190614be9565b905092915050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415801561308c57505f81115b1561323c575f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614613166575f5f61310f60ff5f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2061303c85612bae565b915091508473ffffffffffffffffffffffffffffffffffffffff167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a724838360405161315b92919061513a565b60405180910390a250505b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161461323b575f5f6131e460ff5f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20612b9985612bae565b915091508373ffffffffffffffffffffffffffffffffffffffff167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a724838360405161323092919061513a565b60405180910390a250505b5b505050565b5f6040517f190100000000000000000000000000000000000000000000000000000000000081528360028201528260228201526042812091505092915050565b5f5f7f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0835f1c11156132b9575f600391509150613350565b5f6001878787876040515f81526020016040526040516132dc9493929190615161565b6020604051602081039080840390855afa1580156132fc573d5f5f3e3d5ffd5b5050506020604051035190505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603613348575f60019250925050613350565b805f92509250505b94509492505050565b5f600481111561336c5761336b6151a4565b5b81600481111561337f5761337e6151a4565b5b03156134bb5760016004811115613399576133986151a4565b5b8160048111156133ac576133ab6151a4565b5b036133ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133e39061521b565b60405180910390fd5b60026004811115613400576133ff6151a4565b5b816004811115613413576134126151a4565b5b03613453576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161344a90615283565b60405180910390fd5b60036004811115613467576134666151a4565b5b81600481111561347a576134796151a4565b5b036134ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134b190615311565b60405180910390fd5b5b50565b6001815f015f828254019250508190555050565b5f60019054906101000a900460ff16613520576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161351790614e36565b60405180910390fd5b61353061352b611907565b612252565b565b5f60019054906101000a900460ff16613580576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161357790614e36565b60405180910390fd5b816068908161358f91906154c6565b50806069908161359f91906154c6565b505050565b5f60019054906101000a900460ff166135f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016135e990614e36565b60405180910390fd5b816099908161360191906154c6565b5080609a908161361191906154c6565b505f5f1b6097819055505f5f1b6098819055505050565b505050565b505050565b5f5f61363c612321565b90505f81511115613657578080519060200120915050613696565b5f60975490505f5f1b8114613670578092505050613696565b7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470925050505b90565b5f5f6136a36123b1565b90505f815111156136be5780805190602001209150506136fd565b5f60985490505f5f1b81146136d75780925050506136fd565b7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470925050505b90565b5f5f5f90505f608084901c111561371f57608083901c92506080810190505b5f604084901c111561373957604083901c92506040810190505b5f602084901c111561375357602083901c92506020810190505b5f601084901c111561376d57601083901c92506010810190505b5f600884901c111561378757600883901c92506008810190505b5f600484901c11156137a157600483901c92506004810190505b5f600284901c11156137bb57600283901c92506002810190505b5f600184901c11156137ce576001810190505b80915050919050565b5f8183106137e557816137e7565b825b905092915050565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8016821115613851576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161384890615605565b60405180910390fd5b819050919050565b60405180604001604052805f63ffffffff1681526020015f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1681525090565b5f5ffd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6138c282613899565b9050919050565b6138d2816138b8565b81146138dc575f5ffd5b50565b5f813590506138ed816138c9565b92915050565b5f6020828403121561390857613907613895565b5b5f613915848285016138df565b91505092915050565b5f8115159050919050565b6139328161391e565b82525050565b5f60208201905061394b5f830184613929565b92915050565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f601f19601f8301169050919050565b5f61399382613951565b61399d818561395b565b93506139ad81856020860161396b565b6139b681613979565b840191505092915050565b5f6020820190508181035f8301526139d98184613989565b905092915050565b5f819050919050565b6139f3816139e1565b81146139fd575f5ffd5b50565b5f81359050613a0e816139ea565b92915050565b5f5f60408385031215613a2a57613a29613895565b5b5f613a37858286016138df565b9250506020613a4885828601613a00565b9150509250929050565b613a5b816139e1565b82525050565b5f602082019050613a745f830184613a52565b92915050565b613a838161391e565b8114613a8d575f5ffd5b50565b5f81359050613a9e81613a7a565b92915050565b5f5f60408385031215613aba57613ab9613895565b5b5f613ac7858286016138df565b9250506020613ad885828601613a90565b9150509250929050565b5f5f5f60608486031215613af957613af8613895565b5b5f613b06868287016138df565b9350506020613b17868287016138df565b9250506040613b2886828701613a00565b9150509250925092565b5f60ff82169050919050565b613b4781613b32565b82525050565b5f602082019050613b605f830184613b3e565b92915050565b5f819050919050565b613b7881613b66565b82525050565b5f602082019050613b915f830184613b6f565b92915050565b5f60208284031215613bac57613bab613895565b5b5f613bb984828501613a00565b91505092915050565b613bcb816138b8565b82525050565b5f602082019050613be45f830184613bc2565b92915050565b5f63ffffffff82169050919050565b613c0281613bea565b82525050565b5f602082019050613c1b5f830184613bf9565b92915050565b5f7fff0000000000000000000000000000000000000000000000000000000000000082169050919050565b613c5581613c21565b82525050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b613c8d816139e1565b82525050565b5f613c9e8383613c84565b60208301905092915050565b5f602082019050919050565b5f613cc082613c5b565b613cca8185613c65565b9350613cd583613c75565b805f5b83811015613d05578151613cec8882613c93565b9750613cf783613caa565b925050600181019050613cd8565b5085935050505092915050565b5f60e082019050613d255f83018a613c4c565b8181036020830152613d378189613989565b90508181036040830152613d4b8188613989565b9050613d5a6060830187613a52565b613d676080830186613bc2565b613d7460a0830185613b6f565b81810360c0830152613d868184613cb6565b905098975050505050505050565b5f65ffffffffffff82169050919050565b613dae81613d94565b82525050565b5f602082019050613dc75f830184613da5565b92915050565b613dd681613b32565b8114613de0575f5ffd5b50565b5f81359050613df181613dcd565b92915050565b613e0081613b66565b8114613e0a575f5ffd5b50565b5f81359050613e1b81613df7565b92915050565b5f5f5f5f5f5f60c08789031215613e3b57613e3a613895565b5b5f613e4889828a016138df565b9650506020613e5989828a01613a00565b9550506040613e6a89828a01613a00565b9450506060613e7b89828a01613de3565b9350506080613e8c89828a01613e0d565b92505060a0613e9d89828a01613e0d565b9150509295509295509295565b5f5f5f5f5f5f5f60e0888a031215613ec557613ec4613895565b5b5f613ed28a828b016138df565b9750506020613ee38a828b016138df565b9650506040613ef48a828b01613a00565b9550506060613f058a828b01613a00565b9450506080613f168a828b01613de3565b93505060a0613f278a828b01613e0d565b92505060c0613f388a828b01613e0d565b91505092959891949750929550565b5f5f60408385031215613f5d57613f5c613895565b5b5f613f6a858286016138df565b9250506020613f7b858286016138df565b9150509250929050565b613f8e81613bea565b8114613f98575f5ffd5b50565b5f81359050613fa981613f85565b92915050565b5f5f60408385031215613fc557613fc4613895565b5b5f613fd2858286016138df565b9250506020613fe385828601613f9b565b9150509250929050565b613ff681613bea565b82525050565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff82169050919050565b61402c81613ffc565b82525050565b604082015f8201516140465f850182613fed565b5060208201516140596020850182614023565b50505050565b5f6040820190506140725f830184614032565b92915050565b5f819050919050565b5f61409b61409661409184613899565b614078565b613899565b9050919050565b5f6140ac82614081565b9050919050565b5f6140bd826140a2565b9050919050565b6140cd816140b3565b82525050565b5f6020820190506140e65f8301846140c4565b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f600282049050600182168061413057607f821691505b602082108103614143576141426140ec565b5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f614180826139e1565b915061418b836139e1565b92508282019050808211156141a3576141a2614149565b5b92915050565b7f4552433230566f7465733a20667574757265206c6f6f6b7570000000000000005f82015250565b5f6141dd60198361395b565b91506141e8826141a9565b602082019050919050565b5f6020820190508181035f83015261420a816141d1565b9050919050565b7f4261636b696e67456967656e2e6d696e743a2063616c6c6572206973206e6f745f8201527f2061206d696e7465720000000000000000000000000000000000000000000000602082015250565b5f61426b60298361395b565b915061427682614211565b604082019050919050565b5f6020820190508181035f8301526142988161425f565b9050919050565b7f4549503731323a20556e696e697469616c697a656400000000000000000000005f82015250565b5f6142d360158361395b565b91506142de8261429f565b602082019050919050565b5f6020820190508181035f830152614300816142c7565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f775f8201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b5f6143bb60258361395b565b91506143c682614361565b604082019050919050565b5f6020820190508181035f8301526143e8816143af565b9050919050565b7f4552433230566f7465733a207369676e617475726520657870697265640000005f82015250565b5f614423601d8361395b565b915061442e826143ef565b602082019050919050565b5f6020820190508181035f83015261445081614417565b9050919050565b5f60808201905061446a5f830187613b6f565b6144776020830186613bc2565b6144846040830185613a52565b6144916060830184613a52565b95945050505050565b7f4552433230566f7465733a20696e76616c6964206e6f6e6365000000000000005f82015250565b5f6144ce60198361395b565b91506144d98261449a565b602082019050919050565b5f6020820190508181035f8301526144fb816144c2565b9050919050565b7f496e697469616c697a61626c653a20636f6e747261637420697320616c7265615f8201527f647920696e697469616c697a6564000000000000000000000000000000000000602082015250565b5f61455c602e8361395b565b915061456782614502565b604082019050919050565b5f6020820190508181035f83015261458981614550565b9050919050565b5f819050919050565b5f6145b36145ae6145a984614590565b614078565b613b32565b9050919050565b6145c381614599565b82525050565b5f6020820190506145dc5f8301846145ba565b92915050565b7f45524332305065726d69743a206578706972656420646561646c696e650000005f82015250565b5f614616601d8361395b565b9150614621826145e2565b602082019050919050565b5f6020820190508181035f8301526146438161460a565b9050919050565b5f60c08201905061465d5f830189613b6f565b61466a6020830188613bc2565b6146776040830187613bc2565b6146846060830186613a52565b6146916080830185613a52565b61469e60a0830184613a52565b979650505050505050565b7f45524332305065726d69743a20696e76616c6964207369676e617475726500005f82015250565b5f6146dd601e8361395b565b91506146e8826146a9565b602082019050919050565b5f6020820190508181035f83015261470a816146d1565b9050919050565b7f4261636b696e67456967656e2e64697361626c655472616e73666572526573745f8201527f72696374696f6e733a207472616e73666572207265737472696374696f6e732060208201527f61726520616c72656164792064697361626c6564000000000000000000000000604082015250565b5f61479160548361395b565b915061479c82614711565b606082019050919050565b5f6020820190508181035f8301526147be81614785565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f20615f8201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b5f61481f60268361395b565b915061482a826147c5565b604082019050919050565b5f6020820190508181035f83015261484c81614813565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f206164645f8201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b5f6148ad60248361395b565b91506148b882614853565b604082019050919050565b5f6020820190508181035f8301526148da816148a1565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f2061646472655f8201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b5f61493b60228361395b565b9150614946826148e1565b604082019050919050565b5f6020820190508181035f8301526149688161492f565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65725f82015250565b5f6149a360208361395b565b91506149ae8261496f565b602082019050919050565b5f6020820190508181035f8301526149d081614997565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000005f82015250565b5f614a0b601d8361395b565b9150614a16826149d7565b602082019050919050565b5f6020820190508181035f830152614a38816149ff565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f2061645f8201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b5f614a9960258361395b565b9150614aa482614a3f565b604082019050919050565b5f6020820190508181035f830152614ac681614a8d565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f20616464725f8201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b5f614b2760238361395b565b9150614b3282614acd565b604082019050919050565b5f6020820190508181035f830152614b5481614b1b565b9050919050565b7f45524332303a207472616e7366657220616d6f756e74206578636565647320625f8201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b5f614bb560268361395b565b9150614bc082614b5b565b604082019050919050565b5f6020820190508181035f830152614be281614ba9565b9050919050565b5f614bf3826139e1565b9150614bfe836139e1565b9250828203905081811115614c1657614c15614149565b5b92915050565b7f4552433230566f7465733a20746f74616c20737570706c79207269736b73206f5f8201527f766572666c6f77696e6720766f74657300000000000000000000000000000000602082015250565b5f614c7660308361395b565b9150614c8182614c1c565b604082019050919050565b5f6020820190508181035f830152614ca381614c6a565b9050919050565b7f53616665436173743a2076616c756520646f65736e27742066697420696e20335f8201527f3220626974730000000000000000000000000000000000000000000000000000602082015250565b5f614d0460268361395b565b9150614d0f82614caa565b604082019050919050565b5f6020820190508181035f830152614d3181614cf8565b9050919050565b7f53616665436173743a2076616c756520646f65736e27742066697420696e20345f8201527f3820626974730000000000000000000000000000000000000000000000000000602082015250565b5f614d9260268361395b565b9150614d9d82614d38565b604082019050919050565b5f6020820190508181035f830152614dbf81614d86565b9050919050565b7f496e697469616c697a61626c653a20636f6e7472616374206973206e6f7420695f8201527f6e697469616c697a696e67000000000000000000000000000000000000000000602082015250565b5f614e20602b8361395b565b9150614e2b82614dc6565b604082019050919050565b5f6020820190508181035f830152614e4d81614e14565b9050919050565b7f4261636b696e67456967656e2e5f6265666f7265546f6b656e5472616e7366655f8201527f723a2066726f6d206f7220746f206d7573742062652077686974656c6973746560208201527f6400000000000000000000000000000000000000000000000000000000000000604082015250565b5f614ed460418361395b565b9150614edf82614e54565b606082019050919050565b5f6020820190508181035f830152614f0181614ec8565b9050919050565b5f60a082019050614f1b5f830188613b6f565b614f286020830187613b6f565b614f356040830186613b6f565b614f426060830185613a52565b614f4f6080830184613bc2565b9695505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f614f90826139e1565b9150614f9b836139e1565b925082614fab57614faa614f59565b5b828204905092915050565b7f45524332303a206d696e7420746f20746865207a65726f2061646472657373005f82015250565b5f614fea601f8361395b565b9150614ff582614fb6565b602082019050919050565b5f6020820190508181035f83015261501781614fde565b9050919050565b7f45524332303a206275726e2066726f6d20746865207a65726f206164647265735f8201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b5f61507860218361395b565b91506150838261501e565b604082019050919050565b5f6020820190508181035f8301526150a58161506c565b9050919050565b7f45524332303a206275726e20616d6f756e7420657863656564732062616c616e5f8201527f6365000000000000000000000000000000000000000000000000000000000000602082015250565b5f61510660228361395b565b9150615111826150ac565b604082019050919050565b5f6020820190508181035f830152615133816150fa565b9050919050565b5f60408201905061514d5f830185613a52565b61515a6020830184613a52565b9392505050565b5f6080820190506151745f830187613b6f565b6151816020830186613b3e565b61518e6040830185613b6f565b61519b6060830184613b6f565b95945050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b7f45434453413a20696e76616c6964207369676e617475726500000000000000005f82015250565b5f61520560188361395b565b9150615210826151d1565b602082019050919050565b5f6020820190508181035f830152615232816151f9565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265206c656e677468005f82015250565b5f61526d601f8361395b565b915061527882615239565b602082019050919050565b5f6020820190508181035f83015261529a81615261565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c5f8201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b5f6152fb60228361395b565b9150615306826152a1565b604082019050919050565b5f6020820190508181035f830152615328816152ef565b9050919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f6008830261538b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82615350565b6153958683615350565b95508019841693508086168417925050509392505050565b5f6153c76153c26153bd846139e1565b614078565b6139e1565b9050919050565b5f819050919050565b6153e0836153ad565b6153f46153ec826153ce565b84845461535c565b825550505050565b5f5f905090565b61540b6153fc565b6154168184846153d7565b505050565b5b818110156154395761542e5f82615403565b60018101905061541c565b5050565b601f82111561547e5761544f8161532f565b61545884615341565b81016020851015615467578190505b61547b61547385615341565b83018261541b565b50505b505050565b5f82821c905092915050565b5f61549e5f1984600802615483565b1980831691505092915050565b5f6154b6838361548f565b9150826002028217905092915050565b6154cf82613951565b67ffffffffffffffff8111156154e8576154e7614307565b5b6154f28254614119565b6154fd82828561543d565b5f60209050601f83116001811461552e575f841561551c578287015190505b61552685826154ab565b86555061558d565b601f19841661553c8661532f565b5f5b828110156155635784890151825560018201915060208501945060208101905061553e565b86831015615580578489015161557c601f89168261548f565b8355505b6001600288020188555050505b505050505050565b7f53616665436173743a2076616c756520646f65736e27742066697420696e20325f8201527f3234206269747300000000000000000000000000000000000000000000000000602082015250565b5f6155ef60278361395b565b91506155fa82615595565b604082019050919050565b5f6020820190508181035f83015261561c816155e3565b905091905056fea2646970667358221220a3bf83e8609c7520c6c9efc527a92aaaccd3e1ffbb422f73bb4e7a8832183d2d64736f6c634300081b0033", } // 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 3e48868c16..690fd7eba9 100644 --- a/pkg/bindings/BeaconChainProofs/binding.go +++ b/pkg/bindings/BeaconChainProofs/binding.go @@ -32,7 +32,7 @@ var ( // BeaconChainProofsMetaData contains all meta data concerning the BeaconChainProofs contract. var BeaconChainProofsMetaData = &bind.MetaData{ ABI: "[{\"type\":\"error\",\"name\":\"InvalidProof\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidProofLength\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidValidatorFieldsLength\",\"inputs\":[]}]", - Bin: "0x60556032600b8282823980515f1a607314602657634e487b7160e01b5f525f60045260245ffd5b305f52607381538281f3fe730000000000000000000000000000000000000000301460806040525f5ffdfea2646970667358221220b786d81c68c50488570935b357a548005dc46a3e40dcde8c9c3cfe80240891a564736f6c634300081b0033", + Bin: "0x6055604b600b8282823980515f1a607314603f577f4e487b71000000000000000000000000000000000000000000000000000000005f525f60045260245ffd5b305f52607381538281f3fe730000000000000000000000000000000000000000301460806040525f5ffdfea2646970667358221220e966fe1ac727cb856429c26261b13e331ed7734d558c3490b20722025f7323c164736f6c634300081b0033", } // 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 80d08fb9da..1364073886 100644 --- a/pkg/bindings/BytesLib/binding.go +++ b/pkg/bindings/BytesLib/binding.go @@ -32,7 +32,7 @@ var ( // BytesLibMetaData contains all meta data concerning the BytesLib contract. var BytesLibMetaData = &bind.MetaData{ ABI: "[{\"type\":\"error\",\"name\":\"OutOfBounds\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"Overflow\",\"inputs\":[]}]", - Bin: "0x60556032600b8282823980515f1a607314602657634e487b7160e01b5f525f60045260245ffd5b305f52607381538281f3fe730000000000000000000000000000000000000000301460806040525f5ffdfea2646970667358221220517c792f82001a69d55f8c03043251e3baff982c0b3c945ebf5259c111341b5664736f6c634300081b0033", + Bin: "0x6055604b600b8282823980515f1a607314603f577f4e487b71000000000000000000000000000000000000000000000000000000005f525f60045260245ffd5b305f52607381538281f3fe730000000000000000000000000000000000000000301460806040525f5ffdfea264697066735822122073605cc0bad4552fd220618caa14124a2265b033a5e934a861f6ad07be34c91c64736f6c634300081b0033", } // BytesLibABI is the input ABI used to generate the binding from. diff --git a/pkg/bindings/DelegationManager/binding.go b/pkg/bindings/DelegationManager/binding.go index 0471cea23f..905e4cb411 100644 --- a/pkg/bindings/DelegationManager/binding.go +++ b/pkg/bindings/DelegationManager/binding.go @@ -56,7 +56,7 @@ 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\":\"_eigenPodManager\",\"type\":\"address\",\"internalType\":\"contractIEigenPodManager\"},{\"name\":\"_allocationManager\",\"type\":\"address\",\"internalType\":\"contractIAllocationManager\"},{\"name\":\"_pauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"},{\"name\":\"_permissionController\",\"type\":\"address\",\"internalType\":\"contractIPermissionController\"},{\"name\":\"_MIN_WITHDRAWAL_DELAY\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"DELEGATION_APPROVAL_TYPEHASH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"allocationManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIAllocationManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"beaconChainETHStrategy\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"calculateDelegationApprovalDigestHash\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"approver\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"approverSalt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"calculateWithdrawalRoot\",\"inputs\":[{\"name\":\"withdrawal\",\"type\":\"tuple\",\"internalType\":\"structIDelegationManagerTypes.Withdrawal\",\"components\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"delegatedTo\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"withdrawer\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"nonce\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startBlock\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"scaledShares\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"completeQueuedWithdrawal\",\"inputs\":[{\"name\":\"withdrawal\",\"type\":\"tuple\",\"internalType\":\"structIDelegationManagerTypes.Withdrawal\",\"components\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"delegatedTo\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"withdrawer\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"nonce\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startBlock\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"scaledShares\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}]},{\"name\":\"tokens\",\"type\":\"address[]\",\"internalType\":\"contractIERC20[]\"},{\"name\":\"receiveAsTokens\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeQueuedWithdrawals\",\"inputs\":[{\"name\":\"withdrawals\",\"type\":\"tuple[]\",\"internalType\":\"structIDelegationManagerTypes.Withdrawal[]\",\"components\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"delegatedTo\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"withdrawer\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"nonce\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startBlock\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"scaledShares\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}]},{\"name\":\"tokens\",\"type\":\"address[][]\",\"internalType\":\"contractIERC20[][]\"},{\"name\":\"receiveAsTokens\",\"type\":\"bool[]\",\"internalType\":\"bool[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"convertToDepositShares\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"withdrawableShares\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"cumulativeWithdrawalsQueued\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"totalQueued\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"decreaseDelegatedShares\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"curDepositShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"beaconChainSlashingFactorDecrease\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"delegateTo\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"approverSignatureAndExpiry\",\"type\":\"tuple\",\"internalType\":\"structISignatureUtils.SignatureWithExpiry\",\"components\":[{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"approverSalt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"delegatedTo\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"delegationApprover\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"delegationApproverSaltIsSpent\",\"inputs\":[{\"name\":\"delegationApprover\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"spent\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"depositScalingFactor\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"domainSeparator\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"eigenPodManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIEigenPodManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getDepositedShares\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getOperatorShares\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getOperatorsShares\",\"inputs\":[{\"name\":\"operators\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256[][]\",\"internalType\":\"uint256[][]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getQueuedWithdrawal\",\"inputs\":[{\"name\":\"withdrawalRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIDelegationManagerTypes.Withdrawal\",\"components\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"delegatedTo\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"withdrawer\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"nonce\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startBlock\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"scaledShares\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getQueuedWithdrawalRoots\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32[]\",\"internalType\":\"bytes32[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getQueuedWithdrawals\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"withdrawals\",\"type\":\"tuple[]\",\"internalType\":\"structIDelegationManagerTypes.Withdrawal[]\",\"components\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"delegatedTo\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"withdrawer\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"nonce\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startBlock\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"scaledShares\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}]},{\"name\":\"shares\",\"type\":\"uint256[][]\",\"internalType\":\"uint256[][]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getSlashableSharesInQueue\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getWithdrawableShares\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"outputs\":[{\"name\":\"withdrawableShares\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"},{\"name\":\"depositShares\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"increaseDelegatedShares\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"prevDepositShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"addedShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"initialOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"initialPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"isDelegated\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isOperator\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"minWithdrawalDelayBlocks\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"modifyOperatorDetails\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"newDelegationApprover\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"operatorShares\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"shares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"pauseAll\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[{\"name\":\"index\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pauserRegistry\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pendingWithdrawals\",\"inputs\":[{\"name\":\"withdrawalRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"pending\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"permissionController\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIPermissionController\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"queueWithdrawals\",\"inputs\":[{\"name\":\"params\",\"type\":\"tuple[]\",\"internalType\":\"structIDelegationManagerTypes.QueuedWithdrawalParams[]\",\"components\":[{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"depositShares\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"},{\"name\":\"__deprecated_withdrawer\",\"type\":\"address\",\"internalType\":\"address\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32[]\",\"internalType\":\"bytes32[]\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"redelegate\",\"inputs\":[{\"name\":\"newOperator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"newOperatorApproverSig\",\"type\":\"tuple\",\"internalType\":\"structISignatureUtils.SignatureWithExpiry\",\"components\":[{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"approverSalt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"withdrawalRoots\",\"type\":\"bytes32[]\",\"internalType\":\"bytes32[]\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"registerAsOperator\",\"inputs\":[{\"name\":\"initDelegationApprover\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"allocationDelay\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"metadataURI\",\"type\":\"string\",\"internalType\":\"string\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"slashOperatorShares\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"prevMaxMagnitude\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"newMaxMagnitude\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"strategyManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategyManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"undelegate\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"withdrawalRoots\",\"type\":\"bytes32[]\",\"internalType\":\"bytes32[]\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"updateOperatorMetadataURI\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"metadataURI\",\"type\":\"string\",\"internalType\":\"string\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"DelegationApproverUpdated\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newDelegationApprover\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DepositScalingFactorUpdated\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"newDepositScalingFactor\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorMetadataURIUpdated\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"metadataURI\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorRegistered\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"delegationApprover\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorSharesDecreased\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"staker\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"shares\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorSharesIncreased\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"staker\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"shares\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"SlashingWithdrawalCompleted\",\"inputs\":[{\"name\":\"withdrawalRoot\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"SlashingWithdrawalQueued\",\"inputs\":[{\"name\":\"withdrawalRoot\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"},{\"name\":\"withdrawal\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIDelegationManagerTypes.Withdrawal\",\"components\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"delegatedTo\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"withdrawer\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"nonce\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startBlock\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"scaledShares\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}]},{\"name\":\"sharesToWithdraw\",\"type\":\"uint256[]\",\"indexed\":false,\"internalType\":\"uint256[]\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StakerDelegated\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StakerForceUndelegated\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StakerUndelegated\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"ActivelyDelegated\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"CallerCannotUndelegate\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"CurrentlyPaused\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"FullySlashed\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InputAddressZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InputArrayLengthMismatch\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InputArrayLengthZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidNewPausedStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidPermissions\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidSignature\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidSnapshotOrdering\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotActivelyDelegated\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyAllocationManager\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyEigenPodManager\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyPauser\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyStrategyManagerOrEigenPodManager\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyUnpauser\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OperatorNotRegistered\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OperatorsCannotUndelegate\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SaltSpent\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SignatureExpired\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"WithdrawalDelayNotElapsed\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"WithdrawalNotQueued\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"WithdrawerNotCaller\",\"inputs\":[]}]", - Bin: "0x610180604052348015610010575f5ffd5b50604051615dd6380380615dd683398101604081905261002f9161021c565b8186868684876001600160a01b03811661005c576040516339b190bb60e11b815260040160405180910390fd5b6001600160a01b0390811660805293841660a05291831660c05290911660e05263ffffffff16610100524661012052610125604080518082018252600a81526922b4b3b2b72630bcb2b960b11b60209182015281517f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a866818301527f71b625cfad44bac63b13dba07f2e1d6084ee04b6f8752101ece6126d584ee6ea81840152466060820152306080808301919091528351808303909101815260a0909101909252815191012090565b610140526001600160a01b03166101605261013e610149565b5050505050506102a7565b5f54610100900460ff16156101b45760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff90811614610203575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b0381168114610219575f5ffd5b50565b5f5f5f5f5f5f60c08789031215610231575f5ffd5b865161023c81610205565b602088015190965061024d81610205565b604088015190955061025e81610205565b606088015190945061026f81610205565b608088015190935061028081610205565b60a088015190925063ffffffff81168114610299575f5ffd5b809150509295509295509295565b60805160a05160c05160e05161010051610120516101405161016051615a3a61039c5f395f818161042c01526132fa01525f61271601525f61265601525f818161070001528181611504015281816134f5015261383101525f818161075001528181610da901528181610f5a0152818161169f0152818161185e01528181611cb2015281816128eb01526133b101525f818161045301528181610ee0015281816117c501528181611a23015281816130e3015261363b01525f818161038901528181610eae01528181611977015261361501525f81816105ee01528181610b410152818161107a015261273a0152615a3a5ff3fe608060405234801561000f575f5ffd5b50600436106102cb575f3560e01c8063715018a61161017b578063bfae3fd2116100e4578063e4cc3f901161009e578063f2fde38b11610079578063f2fde38b146107de578063f698da25146107f1578063fabc1cbc146107f9578063fd8aa88d1461080c575f5ffd5b8063e4cc3f9014610798578063eea9064b146107ab578063f0e0e676146107be575f5ffd5b8063bfae3fd2146106e3578063c448feb8146106f6578063c978f7ac1461072a578063ca8aa7c71461074b578063cd6dc68714610772578063da8be86414610785575f5ffd5b80639104c319116101355780639104c319146106345780639435bb431461064f578063a178848414610662578063a33a343314610681578063b7f06ebe14610694578063bb45fef2146106b6575f5ffd5b8063715018a6146105a4578063778e55f3146105ac57806378296ec5146105d6578063886f1195146105e95780638da5cb5b146106105780639004134714610621575f5ffd5b806354b7c96c116102375780635dd68579116101f157806365da1264116101cc57806365da12641461053557806366d5ba931461055d5780636d70f7ae1461057e5780636e17444814610591575f5ffd5b80635dd68579146104ee578063601bb36f1461050f57806360a0d1ce14610522575f5ffd5b806354b7c96c14610475578063595c6a6714610488578063597b36da146104905780635ac86ab7146104a35780635c975abb146104c65780635d975e88146104ce575f5ffd5b806339b70e381161028857806339b70e38146103845780633c651cf2146103c35780633cdeb5e0146103d65780633e28391d146104045780634657e26a146104275780634665bcda1461044e575f5ffd5b806304a4f979146102cf5780630b9f487a146103095780630dd8dd021461031c578063136439dd1461033c57806325df922e146103515780632aa6d88814610371575b5f5ffd5b6102f67f14bde674c9f64b2ad00eaaee4a8bed1fabef35c7507e3c5b9cfc9436909a2dad81565b6040519081526020015b60405180910390f35b6102f6610317366004614957565b61081f565b61032f61032a3660046149ee565b6108a7565b6040516103009190614a2c565b61034f61034a366004614a63565b610b2c565b005b61036461035f366004614bf8565b610c01565b6040516103009190614ca6565b61034f61037f366004614d08565b610d61565b6103ab7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610300565b61034f6103d1366004614d66565b610ea3565b6103ab6103e4366004614da9565b6001600160a01b039081165f908152609960205260409020600101541690565b610417610412366004614da9565b610fea565b6040519015158152602001610300565b6103ab7f000000000000000000000000000000000000000000000000000000000000000081565b6103ab7f000000000000000000000000000000000000000000000000000000000000000081565b61034f610483366004614dc4565b611009565b61034f611065565b6102f661049e366004614eb7565b611114565b6104176104b1366004614ee8565b606654600160ff9092169190911b9081161490565b6066546102f6565b6104e16104dc366004614a63565b611143565b6040516103009190614fbf565b6105016104fc366004614da9565b61125f565b60405161030092919061501f565b61034f61051d3660046150a0565b611694565b61034f6105303660046150f9565b6117ba565b6103ab610543366004614da9565b609a6020525f90815260409020546001600160a01b031681565b61057061056b366004614da9565b61194f565b604051610300929190615138565b61041761058c366004614da9565b611c4f565b6102f661059f366004614dc4565b611c87565b61034f611d31565b6102f66105ba366004614dc4565b609860209081525f928352604080842090915290825290205481565b61034f6105e436600461515c565b611d42565b6103ab7f000000000000000000000000000000000000000000000000000000000000000081565b6033546001600160a01b03166103ab565b61036461062f3660046151ac565b611dca565b6103ab73beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac081565b61034f61065d3660046151f8565b611ea0565b6102f6610670366004614da9565b609f6020525f908152604090205481565b61032f61068f366004615294565b611f70565b6104176106a2366004614a63565b609e6020525f908152604090205460ff1681565b6104176106c436600461537b565b609c60209081525f928352604080842090915290825290205460ff1681565b6102f66106f1366004614dc4565b611f88565b60405163ffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152602001610300565b61073d6107383660046151ac565b611fc4565b6040516103009291906153a5565b6103ab7f000000000000000000000000000000000000000000000000000000000000000081565b61034f61078036600461537b565b612251565b61032f610793366004614da9565b61236c565b61034f6107a63660046153c4565b61247c565b61034f6107b9366004615294565b6124d2565b6107d16107cc366004615437565b612535565b60405161030091906154e4565b61034f6107ec366004614da9565b6125da565b6102f6612653565b61034f610807366004614a63565b612738565b61032f61081a366004614da9565b61284f565b604080517f14bde674c9f64b2ad00eaaee4a8bed1fabef35c7507e3c5b9cfc9436909a2dad60208201526001600160a01b03808616928201929092528187166060820152908516608082015260a0810183905260c081018290525f9061089d9060e00160405160208183030381529060405280519060200120612872565b9695505050505050565b6066546060906001906002908116036108d35760405163840a48d560e01b815260040160405180910390fd5b5f836001600160401b038111156108ec576108ec614a7a565b604051908082528060200260200182016040528015610915578160200160208202803683370190505b50335f908152609a60205260408120549192506001600160a01b03909116905b85811015610b215786868281811061094f5761094f6154f6565b9050602002810190610961919061550a565b61096f906020810190615528565b9050878783818110610983576109836154f6565b9050602002810190610995919061550a565b61099f9080615528565b9050146109bf576040516343714afd60e01b815260040160405180910390fd5b5f610a2933848a8a868181106109d7576109d76154f6565b90506020028101906109e9919061550a565b6109f39080615528565b808060200260200160405190810160405280939291908181526020018383602002808284375f920191909152506128a092505050565b9050610afb33848a8a86818110610a4257610a426154f6565b9050602002810190610a54919061550a565b610a5e9080615528565b808060200260200160405190810160405280939291908181526020018383602002808284375f920191909152508e92508d9150889050818110610aa357610aa36154f6565b9050602002810190610ab5919061550a565b610ac3906020810190615528565b808060200260200160405190810160405280939291908181526020018383602002808284375f920191909152508892506129e7915050565b848381518110610b0d57610b0d6154f6565b602090810291909101015250600101610935565b509095945050505050565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa158015610b8e573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610bb2919061556d565b610bcf57604051631d77d47760e21b815260040160405180910390fd5b6066548181168114610bf45760405163c61dca5d60e01b815260040160405180910390fd5b610bfd82612edc565b5050565b6001600160a01b038084165f908152609a60205260408120546060921690610c2a8683876128a0565b90505f85516001600160401b03811115610c4657610c46614a7a565b604051908082528060200260200182016040528015610c6f578160200160208202803683370190505b5090505f5b8651811015610d54576001600160a01b0388165f90815260a260205260408120885182908a9085908110610caa57610caa6154f6565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020015f206040518060200160405290815f820154815250509050610d2e878381518110610cfc57610cfc6154f6565b6020026020010151858481518110610d1657610d166154f6565b602002602001015183612f199092919063ffffffff16565b838381518110610d4057610d406154f6565b602090810291909101015250600101610c74565b50925050505b9392505050565b610d6a33610fea565b15610d8857604051633bf2b50360e11b815260040160405180910390fd5b604051632b6241f360e11b815233600482015263ffffffff841660248201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906356c483e6906044015f604051808303815f87803b158015610df2575f5ffd5b505af1158015610e04573d5f5f3e3d5ffd5b50505050610e123385612f37565b610e1c3333612f99565b6040516001600160a01b038516815233907fa453db612af59e5521d6ab9284dc3e2d06af286eb1b1b7b771fce4716c19f2c19060200160405180910390a2336001600160a01b03167f02a919ed0e2acad1dd90f17ef2fa4ae5462ee1339170034a8531cca4b67080908383604051610e95929190615588565b60405180910390a250505050565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161480610f025750336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016145b610f1f5760405163045206a560e21b815260040160405180910390fd5b6001600160a01b038481165f908152609a602052604080822054905163152667d960e31b8152908316600482018190528684166024830152927f0000000000000000000000000000000000000000000000000000000000000000169063a9333ec890604401602060405180830381865afa158015610f9f573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610fc391906155b6565b90505f610fd187878461309c565b9050610fe183888888888661317e565b50505050505050565b6001600160a01b039081165f908152609a602052604090205416151590565b81611013816132bc565b6110305760405163932d94f760e01b815260040160405180910390fd5b61103983611c4f565b611056576040516325ec6c1f60e01b815260040160405180910390fd5b6110608383612f37565b505050565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa1580156110c7573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110eb919061556d565b61110857604051631d77d47760e21b815260040160405180910390fd5b6111125f19612edc565b565b5f816040516020016111269190614fbf565b604051602081830303815290604052805190602001209050919050565b61114b614813565b5f82815260a46020908152604091829020825160e08101845281546001600160a01b03908116825260018301548116828501526002830154168185015260038201546060820152600482015463ffffffff1660808201526005820180548551818602810186019096528086529194929360a086019392908301828280156111f957602002820191905f5260205f20905b81546001600160a01b031681526001909101906020018083116111db575b505050505081526020016006820180548060200260200160405190810160405280929190818152602001828054801561124f57602002820191905f5260205f20905b81548152602001906001019080831161123b575b5050505050815250509050919050565b6060805f61126c8461284f565b8051909150806001600160401b0381111561128957611289614a7a565b6040519080825280602002602001820160405280156112c257816020015b6112af614813565b8152602001906001900390816112a75790505b509350806001600160401b038111156112dd576112dd614a7a565b60405190808252806020026020018201604052801561131057816020015b60608152602001906001900390816112fb5790505b506001600160a01b038087165f908152609a60205260408120549295509116905b8281101561168b5760a45f85838151811061134e5761134e6154f6565b60209081029190910181015182528181019290925260409081015f20815160e08101835281546001600160a01b03908116825260018301548116828601526002830154168184015260038201546060820152600482015463ffffffff1660808201526005820180548451818702810187019095528085529194929360a086019390929083018282801561140857602002820191905f5260205f20905b81546001600160a01b031681526001909101906020018083116113ea575b505050505081526020016006820180548060200260200160405190810160405280929190818152602001828054801561145e57602002820191905f5260205f20905b81548152602001906001019080831161144a575b505050505081525050868281518110611479576114796154f6565b6020026020010181905250858181518110611496576114966154f6565b602002602001015160a00151516001600160401b038111156114ba576114ba614a7a565b6040519080825280602002602001820160405280156114e3578160200160208202803683370190505b508582815181106114f6576114f66154f6565b60200260200101819052505f7f0000000000000000000000000000000000000000000000000000000000000000878381518110611535576115356154f6565b60200260200101516080015161154b91906155e5565b905060604363ffffffff168263ffffffff1610156115935761158c89858a868151811061157a5761157a6154f6565b602002602001015160a0015185613366565b90506115be565b6115bb89858a86815181106115aa576115aa6154f6565b602002602001015160a001516128a0565b90505b5f5b8884815181106115d2576115d26154f6565b602002602001015160a001515181101561167d5761163f8985815181106115fb576115fb6154f6565b602002602001015160c001518281518110611618576116186154f6565b6020026020010151838381518110611632576116326154f6565b6020026020010151613494565b888581518110611651576116516154f6565b6020026020010151828151811061166a5761166a6154f6565b60209081029190910101526001016115c0565b505050806001019050611331565b50505050915091565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146116dd576040516323d871a560e01b815260040160405180910390fd5b6001600160a01b038085165f90815260986020908152604080832093871683529290529081205461171b906001600160401b0380861690851661349f565b90505f61172a868686866134b7565b90505f6117378284615601565b9050611745875f8886613574565b5f61174f876135ee565b60405163debe1eab60e01b81526001600160a01b038981166004830152602482018590529192509082169063debe1eab906044015f604051808303815f87803b15801561179a575f5ffd5b505af11580156117ac573d5f5f3e3d5ffd5b505050505050505050505050565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461180357604051633213a66160e21b815260040160405180910390fd5b61180c83610fea565b15611060576001600160a01b038381165f908152609a602052604080822054905163152667d960e31b81529083166004820181905273beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac06024830152927f0000000000000000000000000000000000000000000000000000000000000000169063a9333ec890604401602060405180830381865afa1580156118a3573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906118c791906155b6565b6001600160a01b0386165f90815260a26020908152604080832073beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac084528252808320815192830190915254815291925061192d866119256001600160401b03808716908916613660565b849190613674565b9050610fe1848873beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac084613574565b6040516394f649dd60e01b81526001600160a01b03828116600483015260609182915f9182917f000000000000000000000000000000000000000000000000000000000000000016906394f649dd906024015f60405180830381865afa1580156119bb573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526119e2919081019061566f565b60405163fe243a1760e01b81526001600160a01b03888116600483015273beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac060248301529294509092505f917f0000000000000000000000000000000000000000000000000000000000000000169063fe243a1790604401602060405180830381865afa158015611a68573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a8c919061572a565b9050805f03611aa057509094909350915050565b5f83516001611aaf9190615601565b6001600160401b03811115611ac657611ac6614a7a565b604051908082528060200260200182016040528015611aef578160200160208202803683370190505b5090505f84516001611b019190615601565b6001600160401b03811115611b1857611b18614a7a565b604051908082528060200260200182016040528015611b41578160200160208202803683370190505b50905073beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac082865181518110611b6c57611b6c6154f6565b60200260200101906001600160a01b031690816001600160a01b0316815250508281865181518110611ba057611ba06154f6565b60209081029190910101525f5b8551811015611c4157858181518110611bc857611bc86154f6565b6020026020010151838281518110611be257611be26154f6565b60200260200101906001600160a01b031690816001600160a01b031681525050848181518110611c1457611c146154f6565b6020026020010151828281518110611c2e57611c2e6154f6565b6020908102919091010152600101611bad565b509097909650945050505050565b5f6001600160a01b03821615801590611c8157506001600160a01b038083165f818152609a6020526040902054909116145b92915050565b60405163152667d960e31b81526001600160a01b03838116600483015282811660248301525f9182917f0000000000000000000000000000000000000000000000000000000000000000169063a9333ec890604401602060405180830381865afa158015611cf7573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611d1b91906155b6565b9050611d298484835f6134b7565b949350505050565b611d39613692565b6111125f6136ec565b82611d4c816132bc565b611d695760405163932d94f760e01b815260040160405180910390fd5b611d7284611c4f565b611d8f576040516325ec6c1f60e01b815260040160405180910390fd5b836001600160a01b03167f02a919ed0e2acad1dd90f17ef2fa4ae5462ee1339170034a8531cca4b67080908484604051610e95929190615588565b60605f82516001600160401b03811115611de657611de6614a7a565b604051908082528060200260200182016040528015611e0f578160200160208202803683370190505b5090505f5b8351811015611e98576001600160a01b0385165f9081526098602052604081208551909190869084908110611e4b57611e4b6154f6565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020015f2054828281518110611e8557611e856154f6565b6020908102919091010152600101611e14565b509392505050565b606654600290600490811603611ec95760405163840a48d560e01b815260040160405180910390fd5b611ed161373d565b855f5b81811015611f6457611f5c898983818110611ef157611ef16154f6565b9050602002810190611f039190615741565b611f0c90615755565b888884818110611f1e57611f1e6154f6565b9050602002810190611f309190615528565b888886818110611f4257611f426154f6565b9050602002016020810190611f579190615760565b613796565b600101611ed4565b5050610fe1600160c955565b6060611f7b3361236c565b9050610d5a8484846124d2565b6001600160a01b038083165f90815260a260209081526040808320938516835292815282822083519182019093529154825290610d5a90613bd8565b60608082516001600160401b03811115611fe057611fe0614a7a565b604051908082528060200260200182016040528015612009578160200160208202803683370190505b50915082516001600160401b0381111561202557612025614a7a565b60405190808252806020026020018201604052801561204e578160200160208202803683370190505b506001600160a01b038086165f908152609a60205260408120549293509116906120798683876128a0565b90505f5b8551811015612246575f6120a987838151811061209c5761209c6154f6565b60200260200101516135ee565b9050806001600160a01b031663fe243a17898985815181106120cd576120cd6154f6565b60200260200101516040518363ffffffff1660e01b81526004016121079291906001600160a01b0392831681529116602082015260400190565b602060405180830381865afa158015612122573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612146919061572a565b858381518110612158576121586154f6565b6020026020010181815250505f60a25f8a6001600160a01b03166001600160a01b031681526020019081526020015f205f89858151811061219b5761219b6154f6565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020015f206040518060200160405290815f82015481525050905061221f8684815181106121ed576121ed6154f6565b6020026020010151858581518110612207576122076154f6565b6020026020010151836136749092919063ffffffff16565b878481518110612231576122316154f6565b6020908102919091010152505060010161207d565b5050505b9250929050565b5f54610100900460ff161580801561226f57505f54600160ff909116105b806122885750303b15801561228857505f5460ff166001145b6122f05760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b5f805460ff191660011790558015612311575f805461ff0019166101001790555b61231a82612edc565b612323836136ec565b8015611060575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a1505050565b606061237782610fea565b6123945760405163a5c7c44560e01b815260040160405180910390fd5b61239d82611c4f565b156123bb576040516311ca333560e31b815260040160405180910390fd5b336001600160a01b03831614612473576001600160a01b038083165f908152609a6020526040902054166123ee816132bc565b8061241457506001600160a01b038181165f908152609960205260409020600101541633145b61243157604051631e499a2360e11b815260040160405180910390fd5b806001600160a01b0316836001600160a01b03167ff0eddf07e6ea14f388b47e1e94a0f464ecbd9eed4171130e0fc0e99fb4030a8a60405160405180910390a3505b611c8182613bf7565b6066546002906004908116036124a55760405163840a48d560e01b815260040160405180910390fd5b6124ad61373d565b6124c16124b986615755565b858585613796565b6124cb600160c955565b5050505050565b6124db33610fea565b156124f957604051633bf2b50360e11b815260040160405180910390fd5b61250283611c4f565b61251f576040516325ec6c1f60e01b815260040160405180910390fd5b61252b33848484613e56565b6110603384612f99565b60605f83516001600160401b0381111561255157612551614a7a565b60405190808252806020026020018201604052801561258457816020015b606081526020019060019003908161256f5790505b5090505f5b8451811015611e98576125b58582815181106125a7576125a76154f6565b602002602001015185611dca565b8282815181106125c7576125c76154f6565b6020908102919091010152600101612589565b6125e2613692565b6001600160a01b0381166126475760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016122e7565b612650816136ec565b50565b5f7f000000000000000000000000000000000000000000000000000000000000000046146127135750604080518082018252600a81526922b4b3b2b72630bcb2b960b11b60209182015281517f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a866818301527f71b625cfad44bac63b13dba07f2e1d6084ee04b6f8752101ece6126d584ee6ea81840152466060820152306080808301919091528351808303909101815260a0909101909252815191012090565b507f000000000000000000000000000000000000000000000000000000000000000090565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612794573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906127b8919061577b565b6001600160a01b0316336001600160a01b0316146127e95760405163794821ff60e01b815260040160405180910390fd5b606654801982198116146128105760405163c61dca5d60e01b815260040160405180910390fd5b606682905560405182815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c906020015b60405180910390a25050565b6001600160a01b0381165f90815260a360205260409020606090611c8190613f1b565b5f61287b612653565b60405161190160f01b6020820152602281019190915260428101839052606201611126565b60605f82516001600160401b038111156128bc576128bc614a7a565b6040519080825280602002602001820160405280156128e5578160200160208202803683370190505b5090505f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663547afb8786866040518363ffffffff1660e01b8152600401612937929190615796565b5f60405180830381865afa158015612951573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261297891908101906157b9565b90505f5b8451811015610b21576129c28786838151811061299b5761299b6154f6565b60200260200101518484815181106129b5576129b56154f6565b602002602001015161309c565b8382815181106129d4576129d46154f6565b602090810291909101015260010161297c565b5f6001600160a01b038616612a0f576040516339b190bb60e11b815260040160405180910390fd5b83515f03612a305760405163796cc52560e01b815260040160405180910390fd5b5f84516001600160401b03811115612a4a57612a4a614a7a565b604051908082528060200260200182016040528015612a73578160200160208202803683370190505b5090505f85516001600160401b03811115612a9057612a90614a7a565b604051908082528060200260200182016040528015612ab9578160200160208202803683370190505b5090505f5b8651811015612d0f575f612add88838151811061209c5761209c6154f6565b90505f60a25f8c6001600160a01b03166001600160a01b031681526020019081526020015f205f8a8581518110612b1657612b166154f6565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020015f206040518060200160405290815f820154815250509050612b82888481518110612b6857612b686154f6565b6020026020010151888581518110612207576122076154f6565b848481518110612b9457612b946154f6565b602002602001018181525050612bcc888481518110612bb557612bb56154f6565b602002602001015182613f2790919063ffffffff16565b858481518110612bde57612bde6154f6565b60209081029190910101526001600160a01b038a1615612c7357612c358a8a8581518110612c0e57612c0e6154f6565b6020026020010151878681518110612c2857612c286154f6565b6020026020010151613f3b565b612c738a8c8b8681518110612c4c57612c4c6154f6565b6020026020010151878781518110612c6657612c666154f6565b6020026020010151613574565b816001600160a01b031663724af4238c8b8681518110612c9557612c956154f6565b60200260200101518b8781518110612caf57612caf6154f6565b60200260200101516040518463ffffffff1660e01b8152600401612cd593929190615848565b5f604051808303815f87803b158015612cec575f5ffd5b505af1158015612cfe573d5f5f3e3d5ffd5b505050505050806001019050612abe565b506001600160a01b0388165f908152609f60205260408120805491829190612d368361586c565b91905055505f6040518060e001604052808b6001600160a01b031681526020018a6001600160a01b031681526020018b6001600160a01b031681526020018381526020014363ffffffff1681526020018981526020018581525090505f612d9c82611114565b5f818152609e602090815260408083208054600160ff19909116811790915560a4835292819020865181546001600160a01b03199081166001600160a01b039283161783558885015195830180548216968316969096179095559187015160028201805490951692169190911790925560608501516003830155608085015160048301805463ffffffff191663ffffffff90921691909117905560a085015180519394508593612e52926005850192019061486c565b5060c08201518051612e6e9160068401916020909101906148cf565b5050506001600160a01b038b165f90815260a360205260409020612e929082613fc9565b507f26b2aae26516e8719ef50ea2f6831a2efbd4e37dccdf0f6936b27bc08e793e30818386604051612ec693929190615884565b60405180910390a19a9950505050505050505050565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a250565b5f611d2982612f31612f2a87613bd8565b8690613fd4565b90613fd4565b6001600160a01b038281165f8181526099602090815260409182902060010180546001600160a01b0319169486169485179055905192835290917f773b54c04d756fcc5e678111f7d730de3be98192000799eee3d63716055a87c69101612843565b6066545f90600190811603612fc15760405163840a48d560e01b815260040160405180910390fd5b6001600160a01b038381165f818152609a602052604080822080546001600160a01b0319169487169485179055517fc3ee9f2e5fda98e8066a1f745b2df9285f416fe98cf2559cd21484b3d87433049190a35f5f61301e8561194f565b915091505f61302e8686856128a0565b90505f5b8351811015610fe1576130948688868481518110613052576130526154f6565b60200260200101515f87868151811061306d5761306d6154f6565b6020026020010151878781518110613087576130876154f6565b602002602001015161317e565b600101613032565b5f73beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeabf196001600160a01b0384160161316e5760405163a3d75e0960e01b81526001600160a01b0385811660048301525f917f00000000000000000000000000000000000000000000000000000000000000009091169063a3d75e0990602401602060405180830381865afa15801561312a573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061314e91906155b6565b90506131666001600160401b03848116908316613660565b915050610d5a565b506001600160401b031692915050565b805f0361319e57604051630a33bc6960e21b815260040160405180910390fd5b6001600160a01b038086165f90815260a2602090815260408083209388168352929052206131ce81858585613fe8565b6040805160208101909152815481527f8be932bac54561f27260f95463d9b8ab37e06b2842e5ee2404157cc13df6eb8f908790879061320c90613bd8565b60405161321b93929190615848565b60405180910390a161322c86610fea565b15610fe1576001600160a01b038088165f90815260986020908152604080832093891683529290529081208054859290613267908490615601565b92505081905550866001600160a01b03167f1ec042c965e2edd7107b51188ee0f383e22e76179041ab3a9d18ff151405166c8787866040516132ab93929190615848565b60405180910390a250505050505050565b604051631beb2b9760e31b81526001600160a01b0382811660048301523360248301523060448301525f80356001600160e01b0319166064840152917f00000000000000000000000000000000000000000000000000000000000000009091169063df595cb8906084016020604051808303815f875af1158015613342573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611c81919061556d565b60605f83516001600160401b0381111561338257613382614a7a565b6040519080825280602002602001820160405280156133ab578160200160208202803683370190505b5090505f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166394d7d00c8787876040518463ffffffff1660e01b81526004016133ff939291906158ae565b5f60405180830381865afa158015613419573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261344091908101906157b9565b90505f5b8551811015613488576134638887838151811061299b5761299b6154f6565b838281518110613475576134756154f6565b6020908102919091010152600101613444565b50909695505050505050565b5f610d5a8383613660565b5f6134ad8483856001614057565b611d2990856158e7565b6001600160a01b038085165f90815260a560209081526040808320938716835292905290812081906134e8906140b2565b90505f61354e600161351a7f0000000000000000000000000000000000000000000000000000000000000000436158fa565b61352491906158fa565b6001600160a01b03808a165f90815260a560209081526040808320938c16835292905220906140cc565b90505f61355b82846158e7565b90506135688187876140e8565b98975050505050505050565b6001600160a01b038085165f908152609860209081526040808320938616835292905290812080548392906135aa9084906158e7565b92505081905550836001600160a01b03167f6909600037b75d7b4733aedd815442b5ec018a827751c832aaff64eba5d6d2dd848484604051610e9593929190615848565b5f6001600160a01b03821673beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac014613639577f0000000000000000000000000000000000000000000000000000000000000000611c81565b7f000000000000000000000000000000000000000000000000000000000000000092915050565b5f610d5a8383670de0b6b3a7640000614106565b5f611d298261368c61368587613bd8565b8690613660565b90613660565b6033546001600160a01b031633146111125760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016122e7565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b600260c9540361378f5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016122e7565b600260c955565b60a08401515182146137bb576040516343714afd60e01b815260040160405180910390fd5b83604001516001600160a01b0316336001600160a01b0316146137f1576040516316110d3560e21b815260040160405180910390fd5b5f6137fb85611114565b5f818152609e602052604090205490915060ff1661382c576040516387c9d21960e01b815260040160405180910390fd5b60605f7f0000000000000000000000000000000000000000000000000000000000000000876080015161385f91906155e5565b90508063ffffffff164363ffffffff161161388d576040516378f67ae160e11b815260040160405180910390fd5b6138a4875f015188602001518960a0015184613366565b87516001600160a01b03165f90815260a3602052604090209092506138ca9150836141eb565b505f82815260a46020526040812080546001600160a01b031990811682556001820180548216905560028201805490911690556003810182905560048101805463ffffffff19169055906139216005830182614908565b61392e600683015f614908565b50505f828152609e602052604090819020805460ff19169055517f1f40400889274ed07b24845e5054a87a0cab969eb1277aafe61ae352e7c32a00906139779084815260200190565b60405180910390a185516001600160a01b039081165f908152609a6020526040812054885160a08a015191909316926139b19184906128a0565b90505f5b8860a0015151811015613bcd575f6139dc8a60a00151838151811061209c5761209c6154f6565b90505f613a128b60c0015184815181106139f8576139f86154f6565b6020026020010151878581518110611632576116326154f6565b9050805f03613a22575050613bc5565b8715613af057816001600160a01b0316632eae418c8c5f01518d60a001518681518110613a5157613a516154f6565b60200260200101518d8d88818110613a6b57613a6b6154f6565b9050602002016020810190613a809190614da9565b60405160e085901b6001600160e01b03191681526001600160a01b03938416600482015291831660248301529091166044820152606481018490526084015f604051808303815f87803b158015613ad5575f5ffd5b505af1158015613ae7573d5f5f3e3d5ffd5b50505050613bc2565b5f5f836001600160a01b03166350ff72258e5f01518f60a001518881518110613b1b57613b1b6154f6565b6020026020010151866040518463ffffffff1660e01b8152600401613b4293929190615848565b60408051808303815f875af1158015613b5d573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613b819190615916565b91509150613bbf878e5f01518f60a001518881518110613ba357613ba36154f6565b602002602001015185858b8b81518110613087576130876154f6565b50505b50505b6001016139b5565b505050505050505050565b80515f9015613be8578151611c81565b670de0b6b3a764000092915050565b606654606090600190600290811603613c235760405163840a48d560e01b815260040160405180910390fd5b6001600160a01b038084165f818152609a602052604080822080546001600160a01b0319811690915590519316928392917ffee30966a256b71e14bc0ebfc94315e28ef4a97a7131a9e2b7a310a73af4467691a35f5f613c828661194f565b9150915081515f03613c9657505050613e50565b81516001600160401b03811115613caf57613caf614a7a565b604051908082528060200260200182016040528015613cd8578160200160208202803683370190505b5094505f613ce78785856128a0565b90505f5b8351811015613e4a576040805160018082528183019092525f916020808301908036833750506040805160018082528183019092529293505f9291506020808301908036833750506040805160018082528183019092529293505f92915060208083019080368337019050509050868481518110613d6b57613d6b6154f6565b6020026020010151835f81518110613d8557613d856154f6565b60200260200101906001600160a01b031690816001600160a01b031681525050858481518110613db757613db76154f6565b6020026020010151825f81518110613dd157613dd16154f6565b602002602001018181525050848481518110613def57613def6154f6565b6020026020010151815f81518110613e0957613e096154f6565b602002602001018181525050613e228b898585856129e7565b8a8581518110613e3457613e346154f6565b6020908102919091010152505050600101613ceb565b50505050505b50919050565b6001600160a01b038084165f908152609960205260409020600101541680613e7e5750613f15565b6001600160a01b0381165f908152609c6020908152604080832085845290915290205460ff1615613ec257604051630d4c4c9160e21b815260040160405180910390fd5b6001600160a01b0381165f908152609c602090815260408083208584528252909120805460ff191660011790558301516124cb908290613f0990889088908490889061081f565b855160208701516141f6565b50505050565b60605f610d5a83614248565b5f610d5a613f3484613bd8565b8390613660565b6001600160a01b03821673beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac014611060576001600160a01b038084165f90815260a5602090815260408083209386168352929052908120613f8e906140b2565b9050613f1543613f9e8484615601565b6001600160a01b038088165f90815260a560209081526040808320938a1683529290522091906142a1565b5f610d5a83836142ac565b5f610d5a83670de0b6b3a764000084614106565b825f0361400857614001670de0b6b3a764000082613fd4565b8455613f15565b6040805160208101909152845481525f90614024908584613674565b90505f6140318483615601565b90505f61404c84612f31614045888a615601565b8590613fd4565b875550505050505050565b5f5f614064868686614106565b9050600183600281111561407a5761407a615938565b14801561409657505f84806140915761409161594c565b868809115b156140a9576140a6600182615601565b90505b95945050505050565b5f6140bd82826142f8565b6001600160e01b031692915050565b5f6140d883838361433d565b6001600160e01b03169392505050565b5f611d296140f68385615960565b85906001600160401b0316613660565b5f80805f19858709858702925082811083820303915050805f0361413d578382816141335761413361594c565b0492505050610d5a565b8084116141845760405162461bcd60e51b81526020600482015260156024820152744d6174683a206d756c446976206f766572666c6f7760581b60448201526064016122e7565b5f8486880960026001871981018816978890046003810283188082028403028082028403028082028403028082028403028082028403029081029092039091025f889003889004909101858311909403939093029303949094049190911702949350505050565b5f610d5a8383614386565b4281101561421757604051630819bdcd60e01b815260040160405180910390fd5b61422b6001600160a01b0385168484614469565b613f1557604051638baa579f60e01b815260040160405180910390fd5b6060815f0180548060200260200160405190810160405280929190818152602001828054801561429557602002820191905f5260205f20905b815481526020019060010190808311614281575b50505050509050919050565b6110608383836144bd565b5f8181526001830160205260408120546142f157508154600181810184555f848152602080822090930184905584548482528286019093526040902091909155611c81565b505f611c81565b81545f9080156143355761431e846143116001846158e7565b5f91825260209091200190565b5464010000000090046001600160e01b0316611d29565b509092915050565b82545f908161434e868683856145c3565b9050801561437c57614365866143116001846158e7565b5464010000000090046001600160e01b031661089d565b5091949350505050565b5f8181526001830160205260408120548015614460575f6143a86001836158e7565b85549091505f906143bb906001906158e7565b905081811461441a575f865f0182815481106143d9576143d96154f6565b905f5260205f200154905080875f0184815481106143f9576143f96154f6565b5f918252602080832090910192909255918252600188019052604090208390555b855486908061442b5761442b61597f565b600190038181905f5260205f20015f90559055856001015f8681526020019081526020015f205f905560019350505050611c81565b5f915050611c81565b5f5f5f6144768585614616565b90925090505f81600481111561448e5761448e615938565b1480156144ac5750856001600160a01b0316826001600160a01b0316145b8061089d575061089d868686614655565b82548015614575575f6144d5856143116001856158e7565b60408051808201909152905463ffffffff8082168084526401000000009092046001600160e01b0316602084015291925090851610156145285760405163151b8e3f60e11b815260040160405180910390fd5b805163ffffffff8086169116036145735782614549866143116001866158e7565b80546001600160e01b03929092166401000000000263ffffffff9092169190911790555050505050565b505b506040805180820190915263ffffffff92831681526001600160e01b03918216602080830191825285546001810187555f968752952091519051909216640100000000029190921617910155565b5f5b81831015611e98575f6145d8848461473c565b5f8781526020902090915063ffffffff86169082015463ffffffff16111561460257809250614610565b61460d816001615601565b93505b506145c5565b5f5f825160410361464a576020830151604084015160608501515f1a61463e87828585614756565b9450945050505061224a565b505f9050600261224a565b5f5f5f856001600160a01b0316631626ba7e60e01b868660405160240161467d929190615993565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b03199094169390931790925290516146bb91906159cf565b5f60405180830381855afa9150503d805f81146146f3576040519150601f19603f3d011682016040523d82523d5f602084013e6146f8565b606091505b509150915081801561470c57506020815110155b801561089d57508051630b135d3f60e11b90614731908301602090810190840161572a565b149695505050505050565b5f61474a60028484186159e5565b610d5a90848416615601565b5f807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a083111561478b57505f9050600361480a565b604080515f8082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa1580156147dc573d5f5f3e3d5ffd5b5050604051601f1901519150506001600160a01b038116614804575f6001925092505061480a565b91505f90505b94509492505050565b6040518060e001604052805f6001600160a01b031681526020015f6001600160a01b031681526020015f6001600160a01b031681526020015f81526020015f63ffffffff16815260200160608152602001606081525090565b828054828255905f5260205f209081019282156148bf579160200282015b828111156148bf57825182546001600160a01b0319166001600160a01b0390911617825560209092019160019091019061488a565b506148cb92915061491f565b5090565b828054828255905f5260205f209081019282156148bf579160200282015b828111156148bf5782518255916020019190600101906148ed565b5080545f8255905f5260205f209081019061265091905b5b808211156148cb575f8155600101614920565b6001600160a01b0381168114612650575f5ffd5b803561495281614933565b919050565b5f5f5f5f5f60a0868803121561496b575f5ffd5b853561497681614933565b9450602086013561498681614933565b9350604086013561499681614933565b94979396509394606081013594506080013592915050565b5f5f83601f8401126149be575f5ffd5b5081356001600160401b038111156149d4575f5ffd5b6020830191508360208260051b850101111561224a575f5ffd5b5f5f602083850312156149ff575f5ffd5b82356001600160401b03811115614a14575f5ffd5b614a20858286016149ae565b90969095509350505050565b602080825282518282018190525f918401906040840190835b81811015610b21578351835260209384019390920191600101614a45565b5f60208284031215614a73575f5ffd5b5035919050565b634e487b7160e01b5f52604160045260245ffd5b60405160e081016001600160401b0381118282101715614ab057614ab0614a7a565b60405290565b604080519081016001600160401b0381118282101715614ab057614ab0614a7a565b604051601f8201601f191681016001600160401b0381118282101715614b0057614b00614a7a565b604052919050565b5f6001600160401b03821115614b2057614b20614a7a565b5060051b60200190565b5f82601f830112614b39575f5ffd5b8135614b4c614b4782614b08565b614ad8565b8082825260208201915060208360051b860101925085831115614b6d575f5ffd5b602085015b83811015614b93578035614b8581614933565b835260209283019201614b72565b5095945050505050565b5f82601f830112614bac575f5ffd5b8135614bba614b4782614b08565b8082825260208201915060208360051b860101925085831115614bdb575f5ffd5b602085015b83811015614b93578035835260209283019201614be0565b5f5f5f60608486031215614c0a575f5ffd5b8335614c1581614933565b925060208401356001600160401b03811115614c2f575f5ffd5b614c3b86828701614b2a565b92505060408401356001600160401b03811115614c56575f5ffd5b614c6286828701614b9d565b9150509250925092565b5f8151808452602084019350602083015f5b82811015614c9c578151865260209586019590910190600101614c7e565b5093949350505050565b602081525f610d5a6020830184614c6c565b803563ffffffff81168114614952575f5ffd5b5f5f83601f840112614cdb575f5ffd5b5081356001600160401b03811115614cf1575f5ffd5b60208301915083602082850101111561224a575f5ffd5b5f5f5f5f60608587031215614d1b575f5ffd5b8435614d2681614933565b9350614d3460208601614cb8565b925060408501356001600160401b03811115614d4e575f5ffd5b614d5a87828801614ccb565b95989497509550505050565b5f5f5f5f60808587031215614d79575f5ffd5b8435614d8481614933565b93506020850135614d9481614933565b93969395505050506040820135916060013590565b5f60208284031215614db9575f5ffd5b8135610d5a81614933565b5f5f60408385031215614dd5575f5ffd5b8235614de081614933565b91506020830135614df081614933565b809150509250929050565b5f60e08284031215614e0b575f5ffd5b614e13614a8e565b9050614e1e82614947565b8152614e2c60208301614947565b6020820152614e3d60408301614947565b604082015260608281013590820152614e5860808301614cb8565b608082015260a08201356001600160401b03811115614e75575f5ffd5b614e8184828501614b2a565b60a08301525060c08201356001600160401b03811115614e9f575f5ffd5b614eab84828501614b9d565b60c08301525092915050565b5f60208284031215614ec7575f5ffd5b81356001600160401b03811115614edc575f5ffd5b611d2984828501614dfb565b5f60208284031215614ef8575f5ffd5b813560ff81168114610d5a575f5ffd5b5f8151808452602084019350602083015f5b82811015614c9c5781516001600160a01b0316865260209586019590910190600101614f1a565b80516001600160a01b03908116835260208083015182169084015260408083015190911690830152606080820151908301526080808201515f91614f8c9085018263ffffffff169052565b5060a082015160e060a0850152614fa660e0850182614f08565b905060c083015184820360c08601526140a98282614c6c565b602081525f610d5a6020830184614f41565b5f82825180855260208501945060208160051b830101602085015f5b8381101561348857601f19858403018852615009838351614c6c565b6020988901989093509190910190600101614fed565b5f604082016040835280855180835260608501915060608160051b8601019250602087015f5b8281101561507657605f19878603018452615061858351614f41565b94506020938401939190910190600101615045565b5050505082810360208401526140a98185614fd1565b6001600160401b0381168114612650575f5ffd5b5f5f5f5f608085870312156150b3575f5ffd5b84356150be81614933565b935060208501356150ce81614933565b925060408501356150de8161508c565b915060608501356150ee8161508c565b939692955090935050565b5f5f5f6060848603121561510b575f5ffd5b833561511681614933565b925060208401359150604084013561512d8161508c565b809150509250925092565b604081525f61514a6040830185614f08565b82810360208401526140a98185614c6c565b5f5f5f6040848603121561516e575f5ffd5b833561517981614933565b925060208401356001600160401b03811115615193575f5ffd5b61519f86828701614ccb565b9497909650939450505050565b5f5f604083850312156151bd575f5ffd5b82356151c881614933565b915060208301356001600160401b038111156151e2575f5ffd5b6151ee85828601614b2a565b9150509250929050565b5f5f5f5f5f5f6060878903121561520d575f5ffd5b86356001600160401b03811115615222575f5ffd5b61522e89828a016149ae565b90975095505060208701356001600160401b0381111561524c575f5ffd5b61525889828a016149ae565b90955093505060408701356001600160401b03811115615276575f5ffd5b61528289828a016149ae565b979a9699509497509295939492505050565b5f5f5f606084860312156152a6575f5ffd5b83356152b181614933565b925060208401356001600160401b038111156152cb575f5ffd5b8401604081870312156152dc575f5ffd5b6152e4614ab6565b81356001600160401b038111156152f9575f5ffd5b8201601f81018813615309575f5ffd5b80356001600160401b0381111561532257615322614a7a565b615335601f8201601f1916602001614ad8565b818152896020838501011115615349575f5ffd5b816020840160208301375f60209282018301528352928301359282019290925293969395505050506040919091013590565b5f5f6040838503121561538c575f5ffd5b823561539781614933565b946020939093013593505050565b604081525f61514a6040830185614c6c565b8015158114612650575f5ffd5b5f5f5f5f606085870312156153d7575f5ffd5b84356001600160401b038111156153ec575f5ffd5b850160e081880312156153fd575f5ffd5b935060208501356001600160401b03811115615417575f5ffd5b615423878288016149ae565b90945092505060408501356150ee816153b7565b5f5f60408385031215615448575f5ffd5b82356001600160401b0381111561545d575f5ffd5b8301601f8101851361546d575f5ffd5b803561547b614b4782614b08565b8082825260208201915060208360051b85010192508783111561549c575f5ffd5b6020840193505b828410156154c75783356154b681614933565b8252602093840193909101906154a3565b945050505060208301356001600160401b038111156151e2575f5ffd5b602081525f610d5a6020830184614fd1565b634e487b7160e01b5f52603260045260245ffd5b5f8235605e1983360301811261551e575f5ffd5b9190910192915050565b5f5f8335601e1984360301811261553d575f5ffd5b8301803591506001600160401b03821115615556575f5ffd5b6020019150600581901b360382131561224a575f5ffd5b5f6020828403121561557d575f5ffd5b8151610d5a816153b7565b60208152816020820152818360408301375f818301604090810191909152601f909201601f19160101919050565b5f602082840312156155c6575f5ffd5b8151610d5a8161508c565b634e487b7160e01b5f52601160045260245ffd5b63ffffffff8181168382160190811115611c8157611c816155d1565b80820180821115611c8157611c816155d1565b5f82601f830112615623575f5ffd5b8151615631614b4782614b08565b8082825260208201915060208360051b860101925085831115615652575f5ffd5b602085015b83811015614b93578051835260209283019201615657565b5f5f60408385031215615680575f5ffd5b82516001600160401b03811115615695575f5ffd5b8301601f810185136156a5575f5ffd5b80516156b3614b4782614b08565b8082825260208201915060208360051b8501019250878311156156d4575f5ffd5b6020840193505b828410156156ff5783516156ee81614933565b8252602093840193909101906156db565b8095505050505060208301516001600160401b0381111561571e575f5ffd5b6151ee85828601615614565b5f6020828403121561573a575f5ffd5b5051919050565b5f823560de1983360301811261551e575f5ffd5b5f611c813683614dfb565b5f60208284031215615770575f5ffd5b8135610d5a816153b7565b5f6020828403121561578b575f5ffd5b8151610d5a81614933565b6001600160a01b03831681526040602082018190525f90611d2990830184614f08565b5f602082840312156157c9575f5ffd5b81516001600160401b038111156157de575f5ffd5b8201601f810184136157ee575f5ffd5b80516157fc614b4782614b08565b8082825260208201915060208360051b85010192508683111561581d575f5ffd5b6020840193505b8284101561089d5783516158378161508c565b825260209384019390910190615824565b6001600160a01b039384168152919092166020820152604081019190915260600190565b5f6001820161587d5761587d6155d1565b5060010190565b838152606060208201525f61589c6060830185614f41565b828103604084015261089d8185614c6c565b6001600160a01b03841681526060602082018190525f906158d190830185614f08565b905063ffffffff83166040830152949350505050565b81810381811115611c8157611c816155d1565b63ffffffff8281168282160390811115611c8157611c816155d1565b5f5f60408385031215615927575f5ffd5b505080516020909101519092909150565b634e487b7160e01b5f52602160045260245ffd5b634e487b7160e01b5f52601260045260245ffd5b6001600160401b038281168282160390811115611c8157611c816155d1565b634e487b7160e01b5f52603160045260245ffd5b828152604060208201525f82518060408401528060208501606085015e5f606082850101526060601f19601f8301168401019150509392505050565b5f82518060208501845e5f920191825250919050565b5f826159ff57634e487b7160e01b5f52601260045260245ffd5b50049056fea26469706673582212202261ba25ed7767199d66f80a21de0e199fca23c154ebe34ff0abfd170c42ae9264736f6c634300081b0033", + Bin: "0x610180604052348015610010575f5ffd5b50604051615dd6380380615dd683398101604081905261002f9161021c565b8186868684876001600160a01b03811661005c576040516339b190bb60e11b815260040160405180910390fd5b6001600160a01b0390811660805293841660a05291831660c05290911660e05263ffffffff16610100524661012052610125604080518082018252600a81526922b4b3b2b72630bcb2b960b11b60209182015281517f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a866818301527f71b625cfad44bac63b13dba07f2e1d6084ee04b6f8752101ece6126d584ee6ea81840152466060820152306080808301919091528351808303909101815260a0909101909252815191012090565b610140526001600160a01b03166101605261013e610149565b5050505050506102a7565b5f54610100900460ff16156101b45760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff90811614610203575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b0381168114610219575f5ffd5b50565b5f5f5f5f5f5f60c08789031215610231575f5ffd5b865161023c81610205565b602088015190965061024d81610205565b604088015190955061025e81610205565b606088015190945061026f81610205565b608088015190935061028081610205565b60a088015190925063ffffffff81168114610299575f5ffd5b809150509295509295509295565b60805160a05160c05160e05161010051610120516101405161016051615a3a61039c5f395f818161042c01526132fa01525f61271601525f61265601525f818161070001528181611504015281816134f5015261383101525f818161075001528181610da901528181610f5a0152818161169f0152818161185e01528181611cb2015281816128eb01526133b101525f818161045301528181610ee0015281816117c501528181611a23015281816130e3015261363b01525f818161038901528181610eae01528181611977015261361501525f81816105ee01528181610b410152818161107a015261273a0152615a3a5ff3fe608060405234801561000f575f5ffd5b50600436106102cb575f3560e01c8063715018a61161017b578063bfae3fd2116100e4578063e4cc3f901161009e578063f2fde38b11610079578063f2fde38b146107de578063f698da25146107f1578063fabc1cbc146107f9578063fd8aa88d1461080c575f5ffd5b8063e4cc3f9014610798578063eea9064b146107ab578063f0e0e676146107be575f5ffd5b8063bfae3fd2146106e3578063c448feb8146106f6578063c978f7ac1461072a578063ca8aa7c71461074b578063cd6dc68714610772578063da8be86414610785575f5ffd5b80639104c319116101355780639104c319146106345780639435bb431461064f578063a178848414610662578063a33a343314610681578063b7f06ebe14610694578063bb45fef2146106b6575f5ffd5b8063715018a6146105a4578063778e55f3146105ac57806378296ec5146105d6578063886f1195146105e95780638da5cb5b146106105780639004134714610621575f5ffd5b806354b7c96c116102375780635dd68579116101f157806365da1264116101cc57806365da12641461053557806366d5ba931461055d5780636d70f7ae1461057e5780636e17444814610591575f5ffd5b80635dd68579146104ee578063601bb36f1461050f57806360a0d1ce14610522575f5ffd5b806354b7c96c14610475578063595c6a6714610488578063597b36da146104905780635ac86ab7146104a35780635c975abb146104c65780635d975e88146104ce575f5ffd5b806339b70e381161028857806339b70e38146103845780633c651cf2146103c35780633cdeb5e0146103d65780633e28391d146104045780634657e26a146104275780634665bcda1461044e575f5ffd5b806304a4f979146102cf5780630b9f487a146103095780630dd8dd021461031c578063136439dd1461033c57806325df922e146103515780632aa6d88814610371575b5f5ffd5b6102f67f14bde674c9f64b2ad00eaaee4a8bed1fabef35c7507e3c5b9cfc9436909a2dad81565b6040519081526020015b60405180910390f35b6102f6610317366004614957565b61081f565b61032f61032a3660046149ee565b6108a7565b6040516103009190614a2c565b61034f61034a366004614a63565b610b2c565b005b61036461035f366004614bf8565b610c01565b6040516103009190614ca6565b61034f61037f366004614d08565b610d61565b6103ab7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610300565b61034f6103d1366004614d66565b610ea3565b6103ab6103e4366004614da9565b6001600160a01b039081165f908152609960205260409020600101541690565b610417610412366004614da9565b610fea565b6040519015158152602001610300565b6103ab7f000000000000000000000000000000000000000000000000000000000000000081565b6103ab7f000000000000000000000000000000000000000000000000000000000000000081565b61034f610483366004614dc4565b611009565b61034f611065565b6102f661049e366004614eb7565b611114565b6104176104b1366004614ee8565b606654600160ff9092169190911b9081161490565b6066546102f6565b6104e16104dc366004614a63565b611143565b6040516103009190614fbf565b6105016104fc366004614da9565b61125f565b60405161030092919061501f565b61034f61051d3660046150a0565b611694565b61034f6105303660046150f9565b6117ba565b6103ab610543366004614da9565b609a6020525f90815260409020546001600160a01b031681565b61057061056b366004614da9565b61194f565b604051610300929190615138565b61041761058c366004614da9565b611c4f565b6102f661059f366004614dc4565b611c87565b61034f611d31565b6102f66105ba366004614dc4565b609860209081525f928352604080842090915290825290205481565b61034f6105e436600461515c565b611d42565b6103ab7f000000000000000000000000000000000000000000000000000000000000000081565b6033546001600160a01b03166103ab565b61036461062f3660046151ac565b611dca565b6103ab73beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac081565b61034f61065d3660046151f8565b611ea0565b6102f6610670366004614da9565b609f6020525f908152604090205481565b61032f61068f366004615294565b611f70565b6104176106a2366004614a63565b609e6020525f908152604090205460ff1681565b6104176106c436600461537b565b609c60209081525f928352604080842090915290825290205460ff1681565b6102f66106f1366004614dc4565b611f88565b60405163ffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152602001610300565b61073d6107383660046151ac565b611fc4565b6040516103009291906153a5565b6103ab7f000000000000000000000000000000000000000000000000000000000000000081565b61034f61078036600461537b565b612251565b61032f610793366004614da9565b61236c565b61034f6107a63660046153c4565b61247c565b61034f6107b9366004615294565b6124d2565b6107d16107cc366004615437565b612535565b60405161030091906154e4565b61034f6107ec366004614da9565b6125da565b6102f6612653565b61034f610807366004614a63565b612738565b61032f61081a366004614da9565b61284f565b604080517f14bde674c9f64b2ad00eaaee4a8bed1fabef35c7507e3c5b9cfc9436909a2dad60208201526001600160a01b03808616928201929092528187166060820152908516608082015260a0810183905260c081018290525f9061089d9060e00160405160208183030381529060405280519060200120612872565b9695505050505050565b6066546060906001906002908116036108d35760405163840a48d560e01b815260040160405180910390fd5b5f836001600160401b038111156108ec576108ec614a7a565b604051908082528060200260200182016040528015610915578160200160208202803683370190505b50335f908152609a60205260408120549192506001600160a01b03909116905b85811015610b215786868281811061094f5761094f6154f6565b9050602002810190610961919061550a565b61096f906020810190615528565b9050878783818110610983576109836154f6565b9050602002810190610995919061550a565b61099f9080615528565b9050146109bf576040516343714afd60e01b815260040160405180910390fd5b5f610a2933848a8a868181106109d7576109d76154f6565b90506020028101906109e9919061550a565b6109f39080615528565b808060200260200160405190810160405280939291908181526020018383602002808284375f920191909152506128a092505050565b9050610afb33848a8a86818110610a4257610a426154f6565b9050602002810190610a54919061550a565b610a5e9080615528565b808060200260200160405190810160405280939291908181526020018383602002808284375f920191909152508e92508d9150889050818110610aa357610aa36154f6565b9050602002810190610ab5919061550a565b610ac3906020810190615528565b808060200260200160405190810160405280939291908181526020018383602002808284375f920191909152508892506129e7915050565b848381518110610b0d57610b0d6154f6565b602090810291909101015250600101610935565b509095945050505050565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa158015610b8e573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610bb2919061556d565b610bcf57604051631d77d47760e21b815260040160405180910390fd5b6066548181168114610bf45760405163c61dca5d60e01b815260040160405180910390fd5b610bfd82612edc565b5050565b6001600160a01b038084165f908152609a60205260408120546060921690610c2a8683876128a0565b90505f85516001600160401b03811115610c4657610c46614a7a565b604051908082528060200260200182016040528015610c6f578160200160208202803683370190505b5090505f5b8651811015610d54576001600160a01b0388165f90815260a260205260408120885182908a9085908110610caa57610caa6154f6565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020015f206040518060200160405290815f820154815250509050610d2e878381518110610cfc57610cfc6154f6565b6020026020010151858481518110610d1657610d166154f6565b602002602001015183612f199092919063ffffffff16565b838381518110610d4057610d406154f6565b602090810291909101015250600101610c74565b50925050505b9392505050565b610d6a33610fea565b15610d8857604051633bf2b50360e11b815260040160405180910390fd5b604051632b6241f360e11b815233600482015263ffffffff841660248201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906356c483e6906044015f604051808303815f87803b158015610df2575f5ffd5b505af1158015610e04573d5f5f3e3d5ffd5b50505050610e123385612f37565b610e1c3333612f99565b6040516001600160a01b038516815233907fa453db612af59e5521d6ab9284dc3e2d06af286eb1b1b7b771fce4716c19f2c19060200160405180910390a2336001600160a01b03167f02a919ed0e2acad1dd90f17ef2fa4ae5462ee1339170034a8531cca4b67080908383604051610e95929190615588565b60405180910390a250505050565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161480610f025750336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016145b610f1f5760405163045206a560e21b815260040160405180910390fd5b6001600160a01b038481165f908152609a602052604080822054905163152667d960e31b8152908316600482018190528684166024830152927f0000000000000000000000000000000000000000000000000000000000000000169063a9333ec890604401602060405180830381865afa158015610f9f573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610fc391906155b6565b90505f610fd187878461309c565b9050610fe183888888888661317e565b50505050505050565b6001600160a01b039081165f908152609a602052604090205416151590565b81611013816132bc565b6110305760405163932d94f760e01b815260040160405180910390fd5b61103983611c4f565b611056576040516325ec6c1f60e01b815260040160405180910390fd5b6110608383612f37565b505050565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa1580156110c7573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110eb919061556d565b61110857604051631d77d47760e21b815260040160405180910390fd5b6111125f19612edc565b565b5f816040516020016111269190614fbf565b604051602081830303815290604052805190602001209050919050565b61114b614813565b5f82815260a46020908152604091829020825160e08101845281546001600160a01b03908116825260018301548116828501526002830154168185015260038201546060820152600482015463ffffffff1660808201526005820180548551818602810186019096528086529194929360a086019392908301828280156111f957602002820191905f5260205f20905b81546001600160a01b031681526001909101906020018083116111db575b505050505081526020016006820180548060200260200160405190810160405280929190818152602001828054801561124f57602002820191905f5260205f20905b81548152602001906001019080831161123b575b5050505050815250509050919050565b6060805f61126c8461284f565b8051909150806001600160401b0381111561128957611289614a7a565b6040519080825280602002602001820160405280156112c257816020015b6112af614813565b8152602001906001900390816112a75790505b509350806001600160401b038111156112dd576112dd614a7a565b60405190808252806020026020018201604052801561131057816020015b60608152602001906001900390816112fb5790505b506001600160a01b038087165f908152609a60205260408120549295509116905b8281101561168b5760a45f85838151811061134e5761134e6154f6565b60209081029190910181015182528181019290925260409081015f20815160e08101835281546001600160a01b03908116825260018301548116828601526002830154168184015260038201546060820152600482015463ffffffff1660808201526005820180548451818702810187019095528085529194929360a086019390929083018282801561140857602002820191905f5260205f20905b81546001600160a01b031681526001909101906020018083116113ea575b505050505081526020016006820180548060200260200160405190810160405280929190818152602001828054801561145e57602002820191905f5260205f20905b81548152602001906001019080831161144a575b505050505081525050868281518110611479576114796154f6565b6020026020010181905250858181518110611496576114966154f6565b602002602001015160a00151516001600160401b038111156114ba576114ba614a7a565b6040519080825280602002602001820160405280156114e3578160200160208202803683370190505b508582815181106114f6576114f66154f6565b60200260200101819052505f7f0000000000000000000000000000000000000000000000000000000000000000878381518110611535576115356154f6565b60200260200101516080015161154b91906155e5565b905060604363ffffffff168263ffffffff1610156115935761158c89858a868151811061157a5761157a6154f6565b602002602001015160a0015185613366565b90506115be565b6115bb89858a86815181106115aa576115aa6154f6565b602002602001015160a001516128a0565b90505b5f5b8884815181106115d2576115d26154f6565b602002602001015160a001515181101561167d5761163f8985815181106115fb576115fb6154f6565b602002602001015160c001518281518110611618576116186154f6565b6020026020010151838381518110611632576116326154f6565b6020026020010151613494565b888581518110611651576116516154f6565b6020026020010151828151811061166a5761166a6154f6565b60209081029190910101526001016115c0565b505050806001019050611331565b50505050915091565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146116dd576040516323d871a560e01b815260040160405180910390fd5b6001600160a01b038085165f90815260986020908152604080832093871683529290529081205461171b906001600160401b0380861690851661349f565b90505f61172a868686866134b7565b90505f6117378284615601565b9050611745875f8886613574565b5f61174f876135ee565b60405163debe1eab60e01b81526001600160a01b038981166004830152602482018590529192509082169063debe1eab906044015f604051808303815f87803b15801561179a575f5ffd5b505af11580156117ac573d5f5f3e3d5ffd5b505050505050505050505050565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461180357604051633213a66160e21b815260040160405180910390fd5b61180c83610fea565b15611060576001600160a01b038381165f908152609a602052604080822054905163152667d960e31b81529083166004820181905273beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac06024830152927f0000000000000000000000000000000000000000000000000000000000000000169063a9333ec890604401602060405180830381865afa1580156118a3573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906118c791906155b6565b6001600160a01b0386165f90815260a26020908152604080832073beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac084528252808320815192830190915254815291925061192d866119256001600160401b03808716908916613660565b849190613674565b9050610fe1848873beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac084613574565b6040516394f649dd60e01b81526001600160a01b03828116600483015260609182915f9182917f000000000000000000000000000000000000000000000000000000000000000016906394f649dd906024015f60405180830381865afa1580156119bb573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526119e2919081019061566f565b60405163fe243a1760e01b81526001600160a01b03888116600483015273beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac060248301529294509092505f917f0000000000000000000000000000000000000000000000000000000000000000169063fe243a1790604401602060405180830381865afa158015611a68573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a8c919061572a565b9050805f03611aa057509094909350915050565b5f83516001611aaf9190615601565b6001600160401b03811115611ac657611ac6614a7a565b604051908082528060200260200182016040528015611aef578160200160208202803683370190505b5090505f84516001611b019190615601565b6001600160401b03811115611b1857611b18614a7a565b604051908082528060200260200182016040528015611b41578160200160208202803683370190505b50905073beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac082865181518110611b6c57611b6c6154f6565b60200260200101906001600160a01b031690816001600160a01b0316815250508281865181518110611ba057611ba06154f6565b60209081029190910101525f5b8551811015611c4157858181518110611bc857611bc86154f6565b6020026020010151838281518110611be257611be26154f6565b60200260200101906001600160a01b031690816001600160a01b031681525050848181518110611c1457611c146154f6565b6020026020010151828281518110611c2e57611c2e6154f6565b6020908102919091010152600101611bad565b509097909650945050505050565b5f6001600160a01b03821615801590611c8157506001600160a01b038083165f818152609a6020526040902054909116145b92915050565b60405163152667d960e31b81526001600160a01b03838116600483015282811660248301525f9182917f0000000000000000000000000000000000000000000000000000000000000000169063a9333ec890604401602060405180830381865afa158015611cf7573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611d1b91906155b6565b9050611d298484835f6134b7565b949350505050565b611d39613692565b6111125f6136ec565b82611d4c816132bc565b611d695760405163932d94f760e01b815260040160405180910390fd5b611d7284611c4f565b611d8f576040516325ec6c1f60e01b815260040160405180910390fd5b836001600160a01b03167f02a919ed0e2acad1dd90f17ef2fa4ae5462ee1339170034a8531cca4b67080908484604051610e95929190615588565b60605f82516001600160401b03811115611de657611de6614a7a565b604051908082528060200260200182016040528015611e0f578160200160208202803683370190505b5090505f5b8351811015611e98576001600160a01b0385165f9081526098602052604081208551909190869084908110611e4b57611e4b6154f6565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020015f2054828281518110611e8557611e856154f6565b6020908102919091010152600101611e14565b509392505050565b606654600290600490811603611ec95760405163840a48d560e01b815260040160405180910390fd5b611ed161373d565b855f5b81811015611f6457611f5c898983818110611ef157611ef16154f6565b9050602002810190611f039190615741565b611f0c90615755565b888884818110611f1e57611f1e6154f6565b9050602002810190611f309190615528565b888886818110611f4257611f426154f6565b9050602002016020810190611f579190615760565b613796565b600101611ed4565b5050610fe1600160c955565b6060611f7b3361236c565b9050610d5a8484846124d2565b6001600160a01b038083165f90815260a260209081526040808320938516835292815282822083519182019093529154825290610d5a90613bd8565b60608082516001600160401b03811115611fe057611fe0614a7a565b604051908082528060200260200182016040528015612009578160200160208202803683370190505b50915082516001600160401b0381111561202557612025614a7a565b60405190808252806020026020018201604052801561204e578160200160208202803683370190505b506001600160a01b038086165f908152609a60205260408120549293509116906120798683876128a0565b90505f5b8551811015612246575f6120a987838151811061209c5761209c6154f6565b60200260200101516135ee565b9050806001600160a01b031663fe243a17898985815181106120cd576120cd6154f6565b60200260200101516040518363ffffffff1660e01b81526004016121079291906001600160a01b0392831681529116602082015260400190565b602060405180830381865afa158015612122573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612146919061572a565b858381518110612158576121586154f6565b6020026020010181815250505f60a25f8a6001600160a01b03166001600160a01b031681526020019081526020015f205f89858151811061219b5761219b6154f6565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020015f206040518060200160405290815f82015481525050905061221f8684815181106121ed576121ed6154f6565b6020026020010151858581518110612207576122076154f6565b6020026020010151836136749092919063ffffffff16565b878481518110612231576122316154f6565b6020908102919091010152505060010161207d565b5050505b9250929050565b5f54610100900460ff161580801561226f57505f54600160ff909116105b806122885750303b15801561228857505f5460ff166001145b6122f05760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b5f805460ff191660011790558015612311575f805461ff0019166101001790555b61231a82612edc565b612323836136ec565b8015611060575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a1505050565b606061237782610fea565b6123945760405163a5c7c44560e01b815260040160405180910390fd5b61239d82611c4f565b156123bb576040516311ca333560e31b815260040160405180910390fd5b336001600160a01b03831614612473576001600160a01b038083165f908152609a6020526040902054166123ee816132bc565b8061241457506001600160a01b038181165f908152609960205260409020600101541633145b61243157604051631e499a2360e11b815260040160405180910390fd5b806001600160a01b0316836001600160a01b03167ff0eddf07e6ea14f388b47e1e94a0f464ecbd9eed4171130e0fc0e99fb4030a8a60405160405180910390a3505b611c8182613bf7565b6066546002906004908116036124a55760405163840a48d560e01b815260040160405180910390fd5b6124ad61373d565b6124c16124b986615755565b858585613796565b6124cb600160c955565b5050505050565b6124db33610fea565b156124f957604051633bf2b50360e11b815260040160405180910390fd5b61250283611c4f565b61251f576040516325ec6c1f60e01b815260040160405180910390fd5b61252b33848484613e56565b6110603384612f99565b60605f83516001600160401b0381111561255157612551614a7a565b60405190808252806020026020018201604052801561258457816020015b606081526020019060019003908161256f5790505b5090505f5b8451811015611e98576125b58582815181106125a7576125a76154f6565b602002602001015185611dca565b8282815181106125c7576125c76154f6565b6020908102919091010152600101612589565b6125e2613692565b6001600160a01b0381166126475760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016122e7565b612650816136ec565b50565b5f7f000000000000000000000000000000000000000000000000000000000000000046146127135750604080518082018252600a81526922b4b3b2b72630bcb2b960b11b60209182015281517f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a866818301527f71b625cfad44bac63b13dba07f2e1d6084ee04b6f8752101ece6126d584ee6ea81840152466060820152306080808301919091528351808303909101815260a0909101909252815191012090565b507f000000000000000000000000000000000000000000000000000000000000000090565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612794573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906127b8919061577b565b6001600160a01b0316336001600160a01b0316146127e95760405163794821ff60e01b815260040160405180910390fd5b606654801982198116146128105760405163c61dca5d60e01b815260040160405180910390fd5b606682905560405182815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c906020015b60405180910390a25050565b6001600160a01b0381165f90815260a360205260409020606090611c8190613f1b565b5f61287b612653565b60405161190160f01b6020820152602281019190915260428101839052606201611126565b60605f82516001600160401b038111156128bc576128bc614a7a565b6040519080825280602002602001820160405280156128e5578160200160208202803683370190505b5090505f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663547afb8786866040518363ffffffff1660e01b8152600401612937929190615796565b5f60405180830381865afa158015612951573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261297891908101906157b9565b90505f5b8451811015610b21576129c28786838151811061299b5761299b6154f6565b60200260200101518484815181106129b5576129b56154f6565b602002602001015161309c565b8382815181106129d4576129d46154f6565b602090810291909101015260010161297c565b5f6001600160a01b038616612a0f576040516339b190bb60e11b815260040160405180910390fd5b83515f03612a305760405163796cc52560e01b815260040160405180910390fd5b5f84516001600160401b03811115612a4a57612a4a614a7a565b604051908082528060200260200182016040528015612a73578160200160208202803683370190505b5090505f85516001600160401b03811115612a9057612a90614a7a565b604051908082528060200260200182016040528015612ab9578160200160208202803683370190505b5090505f5b8651811015612d0f575f612add88838151811061209c5761209c6154f6565b90505f60a25f8c6001600160a01b03166001600160a01b031681526020019081526020015f205f8a8581518110612b1657612b166154f6565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020015f206040518060200160405290815f820154815250509050612b82888481518110612b6857612b686154f6565b6020026020010151888581518110612207576122076154f6565b848481518110612b9457612b946154f6565b602002602001018181525050612bcc888481518110612bb557612bb56154f6565b602002602001015182613f2790919063ffffffff16565b858481518110612bde57612bde6154f6565b60209081029190910101526001600160a01b038a1615612c7357612c358a8a8581518110612c0e57612c0e6154f6565b6020026020010151878681518110612c2857612c286154f6565b6020026020010151613f3b565b612c738a8c8b8681518110612c4c57612c4c6154f6565b6020026020010151878781518110612c6657612c666154f6565b6020026020010151613574565b816001600160a01b031663724af4238c8b8681518110612c9557612c956154f6565b60200260200101518b8781518110612caf57612caf6154f6565b60200260200101516040518463ffffffff1660e01b8152600401612cd593929190615848565b5f604051808303815f87803b158015612cec575f5ffd5b505af1158015612cfe573d5f5f3e3d5ffd5b505050505050806001019050612abe565b506001600160a01b0388165f908152609f60205260408120805491829190612d368361586c565b91905055505f6040518060e001604052808b6001600160a01b031681526020018a6001600160a01b031681526020018b6001600160a01b031681526020018381526020014363ffffffff1681526020018981526020018581525090505f612d9c82611114565b5f818152609e602090815260408083208054600160ff19909116811790915560a4835292819020865181546001600160a01b03199081166001600160a01b039283161783558885015195830180548216968316969096179095559187015160028201805490951692169190911790925560608501516003830155608085015160048301805463ffffffff191663ffffffff90921691909117905560a085015180519394508593612e52926005850192019061486c565b5060c08201518051612e6e9160068401916020909101906148cf565b5050506001600160a01b038b165f90815260a360205260409020612e929082613fc9565b507f26b2aae26516e8719ef50ea2f6831a2efbd4e37dccdf0f6936b27bc08e793e30818386604051612ec693929190615884565b60405180910390a19a9950505050505050505050565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a250565b5f611d2982612f31612f2a87613bd8565b8690613fd4565b90613fd4565b6001600160a01b038281165f8181526099602090815260409182902060010180546001600160a01b0319169486169485179055905192835290917f773b54c04d756fcc5e678111f7d730de3be98192000799eee3d63716055a87c69101612843565b6066545f90600190811603612fc15760405163840a48d560e01b815260040160405180910390fd5b6001600160a01b038381165f818152609a602052604080822080546001600160a01b0319169487169485179055517fc3ee9f2e5fda98e8066a1f745b2df9285f416fe98cf2559cd21484b3d87433049190a35f5f61301e8561194f565b915091505f61302e8686856128a0565b90505f5b8351811015610fe1576130948688868481518110613052576130526154f6565b60200260200101515f87868151811061306d5761306d6154f6565b6020026020010151878781518110613087576130876154f6565b602002602001015161317e565b600101613032565b5f73beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeabf196001600160a01b0384160161316e5760405163a3d75e0960e01b81526001600160a01b0385811660048301525f917f00000000000000000000000000000000000000000000000000000000000000009091169063a3d75e0990602401602060405180830381865afa15801561312a573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061314e91906155b6565b90506131666001600160401b03848116908316613660565b915050610d5a565b506001600160401b031692915050565b805f0361319e57604051630a33bc6960e21b815260040160405180910390fd5b6001600160a01b038086165f90815260a2602090815260408083209388168352929052206131ce81858585613fe8565b6040805160208101909152815481527f8be932bac54561f27260f95463d9b8ab37e06b2842e5ee2404157cc13df6eb8f908790879061320c90613bd8565b60405161321b93929190615848565b60405180910390a161322c86610fea565b15610fe1576001600160a01b038088165f90815260986020908152604080832093891683529290529081208054859290613267908490615601565b92505081905550866001600160a01b03167f1ec042c965e2edd7107b51188ee0f383e22e76179041ab3a9d18ff151405166c8787866040516132ab93929190615848565b60405180910390a250505050505050565b604051631beb2b9760e31b81526001600160a01b0382811660048301523360248301523060448301525f80356001600160e01b0319166064840152917f00000000000000000000000000000000000000000000000000000000000000009091169063df595cb8906084016020604051808303815f875af1158015613342573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611c81919061556d565b60605f83516001600160401b0381111561338257613382614a7a565b6040519080825280602002602001820160405280156133ab578160200160208202803683370190505b5090505f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166394d7d00c8787876040518463ffffffff1660e01b81526004016133ff939291906158ae565b5f60405180830381865afa158015613419573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261344091908101906157b9565b90505f5b8551811015613488576134638887838151811061299b5761299b6154f6565b838281518110613475576134756154f6565b6020908102919091010152600101613444565b50909695505050505050565b5f610d5a8383613660565b5f6134ad8483856001614057565b611d2990856158e7565b6001600160a01b038085165f90815260a560209081526040808320938716835292905290812081906134e8906140b2565b90505f61354e600161351a7f0000000000000000000000000000000000000000000000000000000000000000436158fa565b61352491906158fa565b6001600160a01b03808a165f90815260a560209081526040808320938c16835292905220906140cc565b90505f61355b82846158e7565b90506135688187876140e8565b98975050505050505050565b6001600160a01b038085165f908152609860209081526040808320938616835292905290812080548392906135aa9084906158e7565b92505081905550836001600160a01b03167f6909600037b75d7b4733aedd815442b5ec018a827751c832aaff64eba5d6d2dd848484604051610e9593929190615848565b5f6001600160a01b03821673beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac014613639577f0000000000000000000000000000000000000000000000000000000000000000611c81565b7f000000000000000000000000000000000000000000000000000000000000000092915050565b5f610d5a8383670de0b6b3a7640000614106565b5f611d298261368c61368587613bd8565b8690613660565b90613660565b6033546001600160a01b031633146111125760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016122e7565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b600260c9540361378f5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016122e7565b600260c955565b60a08401515182146137bb576040516343714afd60e01b815260040160405180910390fd5b83604001516001600160a01b0316336001600160a01b0316146137f1576040516316110d3560e21b815260040160405180910390fd5b5f6137fb85611114565b5f818152609e602052604090205490915060ff1661382c576040516387c9d21960e01b815260040160405180910390fd5b60605f7f0000000000000000000000000000000000000000000000000000000000000000876080015161385f91906155e5565b90508063ffffffff164363ffffffff161161388d576040516378f67ae160e11b815260040160405180910390fd5b6138a4875f015188602001518960a0015184613366565b87516001600160a01b03165f90815260a3602052604090209092506138ca9150836141eb565b505f82815260a46020526040812080546001600160a01b031990811682556001820180548216905560028201805490911690556003810182905560048101805463ffffffff19169055906139216005830182614908565b61392e600683015f614908565b50505f828152609e602052604090819020805460ff19169055517f1f40400889274ed07b24845e5054a87a0cab969eb1277aafe61ae352e7c32a00906139779084815260200190565b60405180910390a185516001600160a01b039081165f908152609a6020526040812054885160a08a015191909316926139b19184906128a0565b90505f5b8860a0015151811015613bcd575f6139dc8a60a00151838151811061209c5761209c6154f6565b90505f613a128b60c0015184815181106139f8576139f86154f6565b6020026020010151878581518110611632576116326154f6565b9050805f03613a22575050613bc5565b8715613af057816001600160a01b0316632eae418c8c5f01518d60a001518681518110613a5157613a516154f6565b60200260200101518d8d88818110613a6b57613a6b6154f6565b9050602002016020810190613a809190614da9565b60405160e085901b6001600160e01b03191681526001600160a01b03938416600482015291831660248301529091166044820152606481018490526084015f604051808303815f87803b158015613ad5575f5ffd5b505af1158015613ae7573d5f5f3e3d5ffd5b50505050613bc2565b5f5f836001600160a01b03166350ff72258e5f01518f60a001518881518110613b1b57613b1b6154f6565b6020026020010151866040518463ffffffff1660e01b8152600401613b4293929190615848565b60408051808303815f875af1158015613b5d573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613b819190615916565b91509150613bbf878e5f01518f60a001518881518110613ba357613ba36154f6565b602002602001015185858b8b81518110613087576130876154f6565b50505b50505b6001016139b5565b505050505050505050565b80515f9015613be8578151611c81565b670de0b6b3a764000092915050565b606654606090600190600290811603613c235760405163840a48d560e01b815260040160405180910390fd5b6001600160a01b038084165f818152609a602052604080822080546001600160a01b0319811690915590519316928392917ffee30966a256b71e14bc0ebfc94315e28ef4a97a7131a9e2b7a310a73af4467691a35f5f613c828661194f565b9150915081515f03613c9657505050613e50565b81516001600160401b03811115613caf57613caf614a7a565b604051908082528060200260200182016040528015613cd8578160200160208202803683370190505b5094505f613ce78785856128a0565b90505f5b8351811015613e4a576040805160018082528183019092525f916020808301908036833750506040805160018082528183019092529293505f9291506020808301908036833750506040805160018082528183019092529293505f92915060208083019080368337019050509050868481518110613d6b57613d6b6154f6565b6020026020010151835f81518110613d8557613d856154f6565b60200260200101906001600160a01b031690816001600160a01b031681525050858481518110613db757613db76154f6565b6020026020010151825f81518110613dd157613dd16154f6565b602002602001018181525050848481518110613def57613def6154f6565b6020026020010151815f81518110613e0957613e096154f6565b602002602001018181525050613e228b898585856129e7565b8a8581518110613e3457613e346154f6565b6020908102919091010152505050600101613ceb565b50505050505b50919050565b6001600160a01b038084165f908152609960205260409020600101541680613e7e5750613f15565b6001600160a01b0381165f908152609c6020908152604080832085845290915290205460ff1615613ec257604051630d4c4c9160e21b815260040160405180910390fd5b6001600160a01b0381165f908152609c602090815260408083208584528252909120805460ff191660011790558301516124cb908290613f0990889088908490889061081f565b855160208701516141f6565b50505050565b60605f610d5a83614248565b5f610d5a613f3484613bd8565b8390613660565b6001600160a01b03821673beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac014611060576001600160a01b038084165f90815260a5602090815260408083209386168352929052908120613f8e906140b2565b9050613f1543613f9e8484615601565b6001600160a01b038088165f90815260a560209081526040808320938a1683529290522091906142a1565b5f610d5a83836142ac565b5f610d5a83670de0b6b3a764000084614106565b825f0361400857614001670de0b6b3a764000082613fd4565b8455613f15565b6040805160208101909152845481525f90614024908584613674565b90505f6140318483615601565b90505f61404c84612f31614045888a615601565b8590613fd4565b875550505050505050565b5f5f614064868686614106565b9050600183600281111561407a5761407a615938565b14801561409657505f84806140915761409161594c565b868809115b156140a9576140a6600182615601565b90505b95945050505050565b5f6140bd82826142f8565b6001600160e01b031692915050565b5f6140d883838361433d565b6001600160e01b03169392505050565b5f611d296140f68385615960565b85906001600160401b0316613660565b5f80805f19858709858702925082811083820303915050805f0361413d578382816141335761413361594c565b0492505050610d5a565b8084116141845760405162461bcd60e51b81526020600482015260156024820152744d6174683a206d756c446976206f766572666c6f7760581b60448201526064016122e7565b5f8486880960026001871981018816978890046003810283188082028403028082028403028082028403028082028403028082028403029081029092039091025f889003889004909101858311909403939093029303949094049190911702949350505050565b5f610d5a8383614386565b4281101561421757604051630819bdcd60e01b815260040160405180910390fd5b61422b6001600160a01b0385168484614469565b613f1557604051638baa579f60e01b815260040160405180910390fd5b6060815f0180548060200260200160405190810160405280929190818152602001828054801561429557602002820191905f5260205f20905b815481526020019060010190808311614281575b50505050509050919050565b6110608383836144bd565b5f8181526001830160205260408120546142f157508154600181810184555f848152602080822090930184905584548482528286019093526040902091909155611c81565b505f611c81565b81545f9080156143355761431e846143116001846158e7565b5f91825260209091200190565b5464010000000090046001600160e01b0316611d29565b509092915050565b82545f908161434e868683856145c3565b9050801561437c57614365866143116001846158e7565b5464010000000090046001600160e01b031661089d565b5091949350505050565b5f8181526001830160205260408120548015614460575f6143a86001836158e7565b85549091505f906143bb906001906158e7565b905081811461441a575f865f0182815481106143d9576143d96154f6565b905f5260205f200154905080875f0184815481106143f9576143f96154f6565b5f918252602080832090910192909255918252600188019052604090208390555b855486908061442b5761442b61597f565b600190038181905f5260205f20015f90559055856001015f8681526020019081526020015f205f905560019350505050611c81565b5f915050611c81565b5f5f5f6144768585614616565b90925090505f81600481111561448e5761448e615938565b1480156144ac5750856001600160a01b0316826001600160a01b0316145b8061089d575061089d868686614655565b82548015614575575f6144d5856143116001856158e7565b60408051808201909152905463ffffffff8082168084526401000000009092046001600160e01b0316602084015291925090851610156145285760405163151b8e3f60e11b815260040160405180910390fd5b805163ffffffff8086169116036145735782614549866143116001866158e7565b80546001600160e01b03929092166401000000000263ffffffff9092169190911790555050505050565b505b506040805180820190915263ffffffff92831681526001600160e01b03918216602080830191825285546001810187555f968752952091519051909216640100000000029190921617910155565b5f5b81831015611e98575f6145d8848461473c565b5f8781526020902090915063ffffffff86169082015463ffffffff16111561460257809250614610565b61460d816001615601565b93505b506145c5565b5f5f825160410361464a576020830151604084015160608501515f1a61463e87828585614756565b9450945050505061224a565b505f9050600261224a565b5f5f5f856001600160a01b0316631626ba7e60e01b868660405160240161467d929190615993565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b03199094169390931790925290516146bb91906159cf565b5f60405180830381855afa9150503d805f81146146f3576040519150601f19603f3d011682016040523d82523d5f602084013e6146f8565b606091505b509150915081801561470c57506020815110155b801561089d57508051630b135d3f60e11b90614731908301602090810190840161572a565b149695505050505050565b5f61474a60028484186159e5565b610d5a90848416615601565b5f807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a083111561478b57505f9050600361480a565b604080515f8082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa1580156147dc573d5f5f3e3d5ffd5b5050604051601f1901519150506001600160a01b038116614804575f6001925092505061480a565b91505f90505b94509492505050565b6040518060e001604052805f6001600160a01b031681526020015f6001600160a01b031681526020015f6001600160a01b031681526020015f81526020015f63ffffffff16815260200160608152602001606081525090565b828054828255905f5260205f209081019282156148bf579160200282015b828111156148bf57825182546001600160a01b0319166001600160a01b0390911617825560209092019160019091019061488a565b506148cb92915061491f565b5090565b828054828255905f5260205f209081019282156148bf579160200282015b828111156148bf5782518255916020019190600101906148ed565b5080545f8255905f5260205f209081019061265091905b5b808211156148cb575f8155600101614920565b6001600160a01b0381168114612650575f5ffd5b803561495281614933565b919050565b5f5f5f5f5f60a0868803121561496b575f5ffd5b853561497681614933565b9450602086013561498681614933565b9350604086013561499681614933565b94979396509394606081013594506080013592915050565b5f5f83601f8401126149be575f5ffd5b5081356001600160401b038111156149d4575f5ffd5b6020830191508360208260051b850101111561224a575f5ffd5b5f5f602083850312156149ff575f5ffd5b82356001600160401b03811115614a14575f5ffd5b614a20858286016149ae565b90969095509350505050565b602080825282518282018190525f918401906040840190835b81811015610b21578351835260209384019390920191600101614a45565b5f60208284031215614a73575f5ffd5b5035919050565b634e487b7160e01b5f52604160045260245ffd5b60405160e081016001600160401b0381118282101715614ab057614ab0614a7a565b60405290565b604080519081016001600160401b0381118282101715614ab057614ab0614a7a565b604051601f8201601f191681016001600160401b0381118282101715614b0057614b00614a7a565b604052919050565b5f6001600160401b03821115614b2057614b20614a7a565b5060051b60200190565b5f82601f830112614b39575f5ffd5b8135614b4c614b4782614b08565b614ad8565b8082825260208201915060208360051b860101925085831115614b6d575f5ffd5b602085015b83811015614b93578035614b8581614933565b835260209283019201614b72565b5095945050505050565b5f82601f830112614bac575f5ffd5b8135614bba614b4782614b08565b8082825260208201915060208360051b860101925085831115614bdb575f5ffd5b602085015b83811015614b93578035835260209283019201614be0565b5f5f5f60608486031215614c0a575f5ffd5b8335614c1581614933565b925060208401356001600160401b03811115614c2f575f5ffd5b614c3b86828701614b2a565b92505060408401356001600160401b03811115614c56575f5ffd5b614c6286828701614b9d565b9150509250925092565b5f8151808452602084019350602083015f5b82811015614c9c578151865260209586019590910190600101614c7e565b5093949350505050565b602081525f610d5a6020830184614c6c565b803563ffffffff81168114614952575f5ffd5b5f5f83601f840112614cdb575f5ffd5b5081356001600160401b03811115614cf1575f5ffd5b60208301915083602082850101111561224a575f5ffd5b5f5f5f5f60608587031215614d1b575f5ffd5b8435614d2681614933565b9350614d3460208601614cb8565b925060408501356001600160401b03811115614d4e575f5ffd5b614d5a87828801614ccb565b95989497509550505050565b5f5f5f5f60808587031215614d79575f5ffd5b8435614d8481614933565b93506020850135614d9481614933565b93969395505050506040820135916060013590565b5f60208284031215614db9575f5ffd5b8135610d5a81614933565b5f5f60408385031215614dd5575f5ffd5b8235614de081614933565b91506020830135614df081614933565b809150509250929050565b5f60e08284031215614e0b575f5ffd5b614e13614a8e565b9050614e1e82614947565b8152614e2c60208301614947565b6020820152614e3d60408301614947565b604082015260608281013590820152614e5860808301614cb8565b608082015260a08201356001600160401b03811115614e75575f5ffd5b614e8184828501614b2a565b60a08301525060c08201356001600160401b03811115614e9f575f5ffd5b614eab84828501614b9d565b60c08301525092915050565b5f60208284031215614ec7575f5ffd5b81356001600160401b03811115614edc575f5ffd5b611d2984828501614dfb565b5f60208284031215614ef8575f5ffd5b813560ff81168114610d5a575f5ffd5b5f8151808452602084019350602083015f5b82811015614c9c5781516001600160a01b0316865260209586019590910190600101614f1a565b80516001600160a01b03908116835260208083015182169084015260408083015190911690830152606080820151908301526080808201515f91614f8c9085018263ffffffff169052565b5060a082015160e060a0850152614fa660e0850182614f08565b905060c083015184820360c08601526140a98282614c6c565b602081525f610d5a6020830184614f41565b5f82825180855260208501945060208160051b830101602085015f5b8381101561348857601f19858403018852615009838351614c6c565b6020988901989093509190910190600101614fed565b5f604082016040835280855180835260608501915060608160051b8601019250602087015f5b8281101561507657605f19878603018452615061858351614f41565b94506020938401939190910190600101615045565b5050505082810360208401526140a98185614fd1565b6001600160401b0381168114612650575f5ffd5b5f5f5f5f608085870312156150b3575f5ffd5b84356150be81614933565b935060208501356150ce81614933565b925060408501356150de8161508c565b915060608501356150ee8161508c565b939692955090935050565b5f5f5f6060848603121561510b575f5ffd5b833561511681614933565b925060208401359150604084013561512d8161508c565b809150509250925092565b604081525f61514a6040830185614f08565b82810360208401526140a98185614c6c565b5f5f5f6040848603121561516e575f5ffd5b833561517981614933565b925060208401356001600160401b03811115615193575f5ffd5b61519f86828701614ccb565b9497909650939450505050565b5f5f604083850312156151bd575f5ffd5b82356151c881614933565b915060208301356001600160401b038111156151e2575f5ffd5b6151ee85828601614b2a565b9150509250929050565b5f5f5f5f5f5f6060878903121561520d575f5ffd5b86356001600160401b03811115615222575f5ffd5b61522e89828a016149ae565b90975095505060208701356001600160401b0381111561524c575f5ffd5b61525889828a016149ae565b90955093505060408701356001600160401b03811115615276575f5ffd5b61528289828a016149ae565b979a9699509497509295939492505050565b5f5f5f606084860312156152a6575f5ffd5b83356152b181614933565b925060208401356001600160401b038111156152cb575f5ffd5b8401604081870312156152dc575f5ffd5b6152e4614ab6565b81356001600160401b038111156152f9575f5ffd5b8201601f81018813615309575f5ffd5b80356001600160401b0381111561532257615322614a7a565b615335601f8201601f1916602001614ad8565b818152896020838501011115615349575f5ffd5b816020840160208301375f60209282018301528352928301359282019290925293969395505050506040919091013590565b5f5f6040838503121561538c575f5ffd5b823561539781614933565b946020939093013593505050565b604081525f61514a6040830185614c6c565b8015158114612650575f5ffd5b5f5f5f5f606085870312156153d7575f5ffd5b84356001600160401b038111156153ec575f5ffd5b850160e081880312156153fd575f5ffd5b935060208501356001600160401b03811115615417575f5ffd5b615423878288016149ae565b90945092505060408501356150ee816153b7565b5f5f60408385031215615448575f5ffd5b82356001600160401b0381111561545d575f5ffd5b8301601f8101851361546d575f5ffd5b803561547b614b4782614b08565b8082825260208201915060208360051b85010192508783111561549c575f5ffd5b6020840193505b828410156154c75783356154b681614933565b8252602093840193909101906154a3565b945050505060208301356001600160401b038111156151e2575f5ffd5b602081525f610d5a6020830184614fd1565b634e487b7160e01b5f52603260045260245ffd5b5f8235605e1983360301811261551e575f5ffd5b9190910192915050565b5f5f8335601e1984360301811261553d575f5ffd5b8301803591506001600160401b03821115615556575f5ffd5b6020019150600581901b360382131561224a575f5ffd5b5f6020828403121561557d575f5ffd5b8151610d5a816153b7565b60208152816020820152818360408301375f818301604090810191909152601f909201601f19160101919050565b5f602082840312156155c6575f5ffd5b8151610d5a8161508c565b634e487b7160e01b5f52601160045260245ffd5b63ffffffff8181168382160190811115611c8157611c816155d1565b80820180821115611c8157611c816155d1565b5f82601f830112615623575f5ffd5b8151615631614b4782614b08565b8082825260208201915060208360051b860101925085831115615652575f5ffd5b602085015b83811015614b93578051835260209283019201615657565b5f5f60408385031215615680575f5ffd5b82516001600160401b03811115615695575f5ffd5b8301601f810185136156a5575f5ffd5b80516156b3614b4782614b08565b8082825260208201915060208360051b8501019250878311156156d4575f5ffd5b6020840193505b828410156156ff5783516156ee81614933565b8252602093840193909101906156db565b8095505050505060208301516001600160401b0381111561571e575f5ffd5b6151ee85828601615614565b5f6020828403121561573a575f5ffd5b5051919050565b5f823560de1983360301811261551e575f5ffd5b5f611c813683614dfb565b5f60208284031215615770575f5ffd5b8135610d5a816153b7565b5f6020828403121561578b575f5ffd5b8151610d5a81614933565b6001600160a01b03831681526040602082018190525f90611d2990830184614f08565b5f602082840312156157c9575f5ffd5b81516001600160401b038111156157de575f5ffd5b8201601f810184136157ee575f5ffd5b80516157fc614b4782614b08565b8082825260208201915060208360051b85010192508683111561581d575f5ffd5b6020840193505b8284101561089d5783516158378161508c565b825260209384019390910190615824565b6001600160a01b039384168152919092166020820152604081019190915260600190565b5f6001820161587d5761587d6155d1565b5060010190565b838152606060208201525f61589c6060830185614f41565b828103604084015261089d8185614c6c565b6001600160a01b03841681526060602082018190525f906158d190830185614f08565b905063ffffffff83166040830152949350505050565b81810381811115611c8157611c816155d1565b63ffffffff8281168282160390811115611c8157611c816155d1565b5f5f60408385031215615927575f5ffd5b505080516020909101519092909150565b634e487b7160e01b5f52602160045260245ffd5b634e487b7160e01b5f52601260045260245ffd5b6001600160401b038281168282160390811115611c8157611c816155d1565b634e487b7160e01b5f52603160045260245ffd5b828152604060208201525f82518060408401528060208501606085015e5f606082850101526060601f19601f8301168401019150509392505050565b5f82518060208501845e5f920191825250919050565b5f826159ff57634e487b7160e01b5f52601260045260245ffd5b50049056fea264697066735822122089f485a47f2f5b45a7d907f4f2e0da7f25b36f9a443f499224dc3ec452cbe8b764736f6c634300081b0033", } // DelegationManagerABI 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 5662a0b235..92480a12ae 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: "0x60a060405234801561000f575f5ffd5b5060405161352938038061352983398101604081905261002e91610105565b6001600160a01b038116608052610043610049565b50610132565b5f54610100900460ff16156100b45760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff90811614610103575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b5f60208284031215610115575f5ffd5b81516001600160a01b038116811461012b575f5ffd5b9392505050565b6080516133ca61015f5f395f81816103410152818161083e0152818161149e015261158a01526133ca5ff3fe608060405234801561000f575f5ffd5b5060043610610255575f3560e01c806381b9716111610140578063a9059cbb116100bf578063dd62ed3e11610084578063dd62ed3e146105b9578063de0e9a3e146105cc578063ea598cb0146105df578063eb415f45146105f2578063f1127ed8146105fa578063f2fde38b14610637575f5ffd5b8063a9059cbb1461055a578063aad41a411461056d578063b8c2559414610580578063c3cda52014610593578063d505accf146105a6575f5ffd5b806395d89b411161010557806395d89b411461050f5780639ab24eb0146105175780639aec4bae1461052a578063a457c2d714610534578063a7d1195d14610547575f5ffd5b806381b971611461049157806384b0196e146104b15780638da5cb5b146104cc5780638e539e8c146104dd57806391ddadf4146104f0575f5ffd5b80633a46b1a8116101d75780635c19a95c1161019c5780635c19a95c146103f05780636fcfff451461040357806370a082311461042b578063715018a61461045357806378aa33ba1461045b5780637ecebe001461047e575f5ffd5b80633a46b1a8146103295780633f4da4c61461033c5780634bf5d7e91461037b57806353957125146103a5578063587cde1e146103c5575f5ffd5b80631ffacdef1161021d5780631ffacdef146102d957806323b872dd146102ec578063313ce567146102ff5780633644e5151461030e5780633950935114610316575f5ffd5b80630455e6941461025957806306fdde0314610291578063095ea7b3146102a65780631249c58b146102b957806318160ddd146102c3575b5f5ffd5b61027c610267366004612c01565b6101336020525f908152604090205460ff1681565b60405190151581526020015b60405180910390f35b61029961064a565b6040516102889190612c48565b61027c6102b4366004612c5a565b6106da565b6102c16106f3565b005b6102cb61083b565b604051908152602001610288565b6102c16102e7366004612c8f565b6108c1565b61027c6102fa366004612cc4565b610929565b60405160128152602001610288565b6102cb61094c565b61027c610324366004612c5a565b610955565b6102cb610337366004612c5a565b610976565b6103637f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610288565b60408051808201909152600e81526d06d6f64653d74696d657374616d760941b6020820152610299565b6102cb6103b3366004612c01565b6101306020525f908152604090205481565b6103636103d3366004612c01565b6001600160a01b039081165f90815260fe60205260409020541690565b6102c16103fe366004612c01565b6109f9565b610416610411366004612c01565b610a06565b60405163ffffffff9091168152602001610288565b6102cb610439366004612c01565b6001600160a01b03165f9081526065602052604090205490565b6102c1610a27565b61027c610469366004612c01565b6101346020525f908152604090205460ff1681565b6102cb61048c366004612c01565b610a3a565b6102cb61049f366004612c01565b6101316020525f908152604090205481565b6104b9610a57565b6040516102889796959493929190612cfe565b6033546001600160a01b0316610363565b6102cb6104eb366004612d94565b610af0565b6104f8610b57565b60405165ffffffffffff9091168152602001610288565b610299610b61565b6102cb610525366004612c01565b610b70565b6102cb6101325481565b61027c610542366004612c5a565b610bed565b6102c1610555366004612e73565b610c67565b61027c610568366004612c5a565b61107b565b6102c161057b366004612fb8565b611088565b6102c161058e366004612c8f565b611158565b6102c16105a1366004613034565b6111b8565b6102c16105b4366004613088565b6112ed565b6102cb6105c73660046130ee565b61144e565b6102c16105da366004612d94565b611478565b6102c16105ed366004612d94565b611568565b6102c161165d565b61060d61060836600461311f565b611724565b60408051825163ffffffff1681526020928301516001600160e01b03169281019290925201610288565b6102c1610645366004612c01565b6117a5565b60606068805461065990613151565b80601f016020809104026020016040519081016040528092919081815260200182805461068590613151565b80156106d05780601f106106a7576101008083540402835291602001916106d0565b820191905f5260205f20905b8154815290600101906020018083116106b357829003601f168201915b5050505050905090565b5f336106e781858561181b565b60019150505b92915050565b335f908152610131602052604090205461076c5760405162461bcd60e51b815260206004820152602f60248201527f456967656e2e6d696e743a206d73672e73656e64657220686173206e6f206d6960448201526e6e74696e6720616c6c6f77616e636560881b60648201526084015b60405180910390fd5b335f908152610130602052604090205442116107e45760405162461bcd60e51b815260206004820152603160248201527f456967656e2e6d696e743a206d73672e73656e646572206973206e6f7420616c6044820152701b1bddd959081d1bc81b5a5b9d081e595d607a1b6064820152608401610763565b335f81815261013160205260408120805491905590610803908261193e565b60405181815233907f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d41213968859060200160405180910390a250565b5f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610898573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108bc9190613183565b905090565b6108c96119d4565b6001600160a01b0382165f8181526101336020908152604091829020805460ff191685151590811790915591519182527fcf20b1ecb604b0e8888d579c64e8a3b10e590d45c1c2dddb393bed284362227191015b60405180910390a25050565b5f33610936858285611a2e565b610941858585611aa0565b506001949350505050565b5f6108bc611c5a565b5f336106e7818585610967838361144e565b61097191906131ae565b61181b565b5f61097f610b57565b65ffffffffffff1682106109d15760405162461bcd60e51b815260206004820152601960248201527804552433230566f7465733a20667574757265206c6f6f6b757603c1b6044820152606401610763565b6001600160a01b0383165f90815260ff602052604090206109f29083611c63565b9392505050565b610a033382611d44565b50565b6001600160a01b0381165f90815260ff60205260408120546106ed90611dbd565b610a2f6119d4565b610a385f611e25565b565b6001600160a01b0381165f90815260cb60205260408120546106ed565b5f6060805f5f5f60606097545f5f1b148015610a735750609854155b610ab75760405162461bcd60e51b81526020600482015260156024820152741152540dcc4c8e88155b9a5b9a5d1a585b1a5e9959605a1b6044820152606401610763565b610abf611e76565b610ac7611e85565b604080515f80825260208201909252600f60f81b9b939a50919850469750309650945092509050565b5f610af9610b57565b65ffffffffffff168210610b4b5760405162461bcd60e51b815260206004820152601960248201527804552433230566f7465733a20667574757265206c6f6f6b757603c1b6044820152606401610763565b6106ed61010083611c63565b5f6108bc42611e94565b60606069805461065990613151565b6001600160a01b0381165f90815260ff60205260408120548015610bdb576001600160a01b0383165f90815260ff6020526040902080545f198301908110610bba57610bba6131c1565b5f9182526020909120015464010000000090046001600160e01b0316610bdd565b5f5b6001600160e01b03169392505050565b5f3381610bfa828661144e565b905083811015610c5a5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610763565b610941828686840361181b565b5f54610100900460ff1615808015610c8557505f54600160ff909116105b80610c9e5750303b158015610c9e57505f5460ff166001145b610d015760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610763565b5f805460ff191660011790558015610d22575f805461ff0019166101001790555b610d2a611efa565b610d6e6040518060400160405280600581526020016422b4b3b2b760d91b8152506040518060400160405280600581526020016422a4a3a2a760d91b815250611f28565b610d7785611e25565b610d9d6040518060400160405280600581526020016422a4a3a2a760d91b815250611f5c565b8251845114610e245760405162461bcd60e51b815260206004820152604760248201527f456967656e2e696e697469616c697a653a206d696e7465727320616e64206d6960448201527f6e74696e67416c6c6f77616e636573206d757374206265207468652073616d65606482015266040d8cadccee8d60cb1b608482015260a401610763565b8151845114610eab5760405162461bcd60e51b815260206004820152604760248201527f456967656e2e696e697469616c697a653a206d696e7465727320616e64206d6960448201527f6e74416c6c6f776564416674657273206d757374206265207468652073616d65606482015266040d8cadccee8d60cb1b608482015260a401610763565b5f5b845181101561102857838181518110610ec857610ec86131c1565b60200260200101516101315f878481518110610ee657610ee66131c1565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020015f2081905550828181518110610f2357610f236131c1565b60200260200101516101305f878481518110610f4157610f416131c1565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020015f208190555060016101335f878481518110610f8457610f846131c1565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020015f205f6101000a81548160ff021916908315150217905550848181518110610fd357610fd36131c1565b60200260200101516001600160a01b03167fcf20b1ecb604b0e8888d579c64e8a3b10e590d45c1c2dddb393bed28436222716001604051611018911515815260200190565b60405180910390a2600101610ead565b505f19610132558015611074575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050505050565b5f336106e7818585611aa0565b8281146110fd5760405162461bcd60e51b815260206004820152603e60248201527f456967656e2e6d756c746973656e643a2072656365697665727320616e64206160448201527f6d6f756e7473206d757374206265207468652073616d65206c656e67746800006064820152608401610763565b5f5b83811015611074576111503386868481811061111d5761111d6131c1565b90506020020160208101906111329190612c01565b858585818110611144576111446131c1565b90506020020135611aa0565b6001016110ff565b6111606119d4565b6001600160a01b0382165f8181526101346020908152604091829020805460ff191685151590811790915591519182527f72a561d1af7409467dae4f1e9fc52590a9335a1dda17727e2b6aa8c4db35109b910161091d565b834211156112085760405162461bcd60e51b815260206004820152601d60248201527f4552433230566f7465733a207369676e617475726520657870697265640000006044820152606401610763565b604080517fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf60208201526001600160a01b0388169181019190915260608101869052608081018590525f90611281906112799060a00160405160208183030381529060405280519060200120611fa5565b858585611fd1565b905061128c81611ff7565b86146112da5760405162461bcd60e51b815260206004820152601960248201527f4552433230566f7465733a20696e76616c6964206e6f6e6365000000000000006044820152606401610763565b6112e48188611d44565b50505050505050565b8342111561133d5760405162461bcd60e51b815260206004820152601d60248201527f45524332305065726d69743a206578706972656420646561646c696e650000006044820152606401610763565b5f7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c988888861136b8c611ff7565b6040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090505f6113c582611fa5565b90505f6113d482878787611fd1565b9050896001600160a01b0316816001600160a01b0316146114375760405162461bcd60e51b815260206004820152601e60248201527f45524332305065726d69743a20696e76616c6964207369676e617475726500006044820152606401610763565b6114428a8a8a61181b565b50505050505050505050565b6001600160a01b039182165f90815260666020908152604080832093909416825291909152205490565b611482338261201e565b60405163a9059cbb60e01b8152336004820152602481018290527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063a9059cbb906044016020604051808303815f875af11580156114ec573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061151091906131d5565b610a035760405162461bcd60e51b8152602060048201526024808201527f456967656e2e756e777261703a2062454947454e207472616e736665722066616044820152631a5b195960e21b6064820152608401610763565b6040516323b872dd60e01b8152336004820152306024820152604481018290527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906323b872dd906064016020604051808303815f875af11580156115d8573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115fc91906131d5565b6116535760405162461bcd60e51b815260206004820152602260248201527f456967656e2e777261703a2062454947454e207472616e73666572206661696c604482015261195960f21b6064820152608401610763565b610a03338261193e565b6116656119d4565b5f1961013254146116f45760405162461bcd60e51b815260206004820152604d60248201527f456967656e2e64697361626c655472616e736665725265737472696374696f6e60448201527f733a207472616e73666572207265737472696374696f6e732061726520616c7260648201526c1958591e48191a5cd8589b1959609a1b608482015260a401610763565b5f6101328190556040517f2b18986d3ba809db2f13a5d7bf17f60d357b37d9cbb55dd71cbbac8dc4060f649190a1565b604080518082019091525f80825260208201526001600160a01b0383165f90815260ff60205260409020805463ffffffff8416908110611766576117666131c1565b5f9182526020918290206040805180820190915291015463ffffffff8116825264010000000090046001600160e01b0316918101919091529392505050565b6117ad6119d4565b6001600160a01b0381166118125760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610763565b610a0381611e25565b6001600160a01b03831661187d5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610763565b6001600160a01b0382166118de5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610763565b6001600160a01b038381165f8181526066602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6119488282612037565b6001600160e01b0361195861083b565b11156119bf5760405162461bcd60e51b815260206004820152603060248201527f4552433230566f7465733a20746f74616c20737570706c79207269736b73206f60448201526f766572666c6f77696e6720766f74657360801b6064820152608401610763565b6119ce61010061210883612113565b50505050565b6033546001600160a01b03163314610a385760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610763565b5f611a39848461144e565b90505f1981146119ce5781811015611a935760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610763565b6119ce848484840361181b565b6001600160a01b038316611b045760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610763565b6001600160a01b038216611b665760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610763565b611b7183838361227f565b6001600160a01b0383165f9081526065602052604090205481811015611be85760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610763565b6001600160a01b038085165f8181526065602052604080822086860390559286168082529083902080548601905591517fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90611c479086815260200190565b60405180910390a36119ce848484612363565b5f6108bc612394565b81545f9081816005811115611cba575f611c7c84612407565b611c8690856131f0565b5f88815260209020909150869082015463ffffffff161115611caa57809150611cb8565b611cb58160016131ae565b92505b505b80821015611d05575f611ccd83836124eb565b5f88815260209020909150869082015463ffffffff161115611cf157809150611cff565b611cfc8160016131ae565b92505b50611cba565b8015611d2f575f8681526020902081015f19015464010000000090046001600160e01b0316611d31565b5f5b6001600160e01b03169695505050505050565b6001600160a01b038281165f81815260fe6020818152604080842080546065845282862054949093528787166001600160a01b03198416811790915590519190951694919391928592917f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f9190a46119ce828483612505565b5f63ffffffff821115611e215760405162461bcd60e51b815260206004820152602660248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203360448201526532206269747360d01b6064820152608401610763565b5090565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b60606099805461065990613151565b6060609a805461065990613151565b5f65ffffffffffff821115611e215760405162461bcd60e51b815260206004820152602660248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203460448201526538206269747360d01b6064820152608401610763565b5f54610100900460ff16611f205760405162461bcd60e51b815260040161076390613203565b610a3861263f565b5f54610100900460ff16611f4e5760405162461bcd60e51b815260040161076390613203565b611f58828261266e565b5050565b5f54610100900460ff16611f825760405162461bcd60e51b815260040161076390613203565b610a0381604051806040016040528060018152602001603160f81b8152506126ad565b5f6106ed611fb1611c5a565b8360405161190160f01b8152600281019290925260228201526042902090565b5f5f5f611fe0878787876126fa565b91509150611fed816127b7565b5095945050505050565b6001600160a01b0381165f90815260cb602052604090208054600181018255905b50919050565b6120288282612900565b6119ce610100612a4383612113565b6001600160a01b03821661208d5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610763565b6120985f838361227f565b8060675f8282546120a991906131ae565b90915550506001600160a01b0382165f818152606560209081526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3611f585f8383612363565b5f6109f282846131ae565b82545f90819081811561215d575f8781526020902082015f190160408051808201909152905463ffffffff8116825264010000000090046001600160e01b03166020820152612171565b604080518082019091525f80825260208201525b905080602001516001600160e01b0316935061219184868863ffffffff16565b92505f821180156121b957506121a5610b57565b65ffffffffffff16815f015163ffffffff16145b156121fc576121c783612a4e565b5f8881526020902083015f190180546001600160e01b03929092166401000000000263ffffffff909216919091179055612275565b866040518060400160405280612220612213610b57565b65ffffffffffff16611dbd565b63ffffffff16815260200161223486612a4e565b6001600160e01b0390811690915282546001810184555f938452602093849020835194909301519091166401000000000263ffffffff909316929092179101555b5050935093915050565b61013254421161235e576001600160a01b03831615806122a657506001600160a01b038216155b806122c957506001600160a01b0383165f908152610133602052604090205460ff165b806122ec57506001600160a01b0382165f908152610134602052604090205460ff165b61235e5760405162461bcd60e51b815260206004820152603a60248201527f456967656e2e5f6265666f7265546f6b656e5472616e736665723a2066726f6d60448201527f206f7220746f206d7573742062652077686974656c69737465640000000000006064820152608401610763565b505050565b6001600160a01b038381165f90815260fe602052604080822054858416835291205461235e92918216911683612505565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f6123be612ab6565b6123c6612b0e565b60408051602081019490945283019190915260608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b5f815f0361241657505f919050565b5f600161242284612b3e565b901c6001901b9050600181848161243b5761243b61324e565b048201901c905060018184816124535761245361324e565b048201901c9050600181848161246b5761246b61324e565b048201901c905060018184816124835761248361324e565b048201901c9050600181848161249b5761249b61324e565b048201901c905060018184816124b3576124b361324e565b048201901c905060018184816124cb576124cb61324e565b048201901c90506109f2818285816124e5576124e561324e565b04612bd1565b5f6124f96002848418613262565b6109f2908484166131ae565b816001600160a01b0316836001600160a01b03161415801561252657505f81115b1561235e576001600160a01b038316156125b3576001600160a01b0383165f90815260ff60205260408120819061256090612a4385612113565b91509150846001600160a01b03167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a72483836040516125a8929190918252602082015260400190565b60405180910390a250505b6001600160a01b0382161561235e576001600160a01b0382165f90815260ff6020526040812081906125e89061210885612113565b91509150836001600160a01b03167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a7248383604051612630929190918252602082015260400190565b60405180910390a25050505050565b5f54610100900460ff166126655760405162461bcd60e51b815260040161076390613203565b610a3833611e25565b5f54610100900460ff166126945760405162461bcd60e51b815260040161076390613203565b60686126a083826132c5565b50606961235e82826132c5565b5f54610100900460ff166126d35760405162461bcd60e51b815260040161076390613203565b60996126df83826132c5565b50609a6126ec82826132c5565b50505f609781905560985550565b5f807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a083111561272f57505f905060036127ae565b604080515f8082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015612780573d5f5f3e3d5ffd5b5050604051601f1901519150506001600160a01b0381166127a8575f600192509250506127ae565b91505f90505b94509492505050565b5f8160048111156127ca576127ca613380565b036127d25750565b60018160048111156127e6576127e6613380565b036128335760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610763565b600281600481111561284757612847613380565b036128945760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610763565b60038160048111156128a8576128a8613380565b03610a035760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401610763565b6001600160a01b0382166129605760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401610763565b61296b825f8361227f565b6001600160a01b0382165f90815260656020526040902054818110156129de5760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b6064820152608401610763565b6001600160a01b0383165f8181526065602090815260408083208686039055606780548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a361235e835f84612363565b5f6109f282846131f0565b5f6001600160e01b03821115611e215760405162461bcd60e51b815260206004820152602760248201527f53616665436173743a2076616c756520646f65736e27742066697420696e20326044820152663234206269747360c81b6064820152608401610763565b5f5f612ac0611e76565b805190915015612ad7578051602090910120919050565b6097548015612ae65792915050565b7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4709250505090565b5f5f612b18611e85565b805190915015612b2f578051602090910120919050565b6098548015612ae65792915050565b5f80608083901c15612b5257608092831c92015b604083901c15612b6457604092831c92015b602083901c15612b7657602092831c92015b601083901c15612b8857601092831c92015b600883901c15612b9a57600892831c92015b600483901c15612bac57600492831c92015b600283901c15612bbe57600292831c92015b600183901c156106ed5760010192915050565b5f818310612bdf57816109f2565b5090919050565b80356001600160a01b0381168114612bfc575f5ffd5b919050565b5f60208284031215612c11575f5ffd5b6109f282612be6565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f6109f26020830184612c1a565b5f5f60408385031215612c6b575f5ffd5b612c7483612be6565b946020939093013593505050565b8015158114610a03575f5ffd5b5f5f60408385031215612ca0575f5ffd5b612ca983612be6565b91506020830135612cb981612c82565b809150509250929050565b5f5f5f60608486031215612cd6575f5ffd5b612cdf84612be6565b9250612ced60208501612be6565b929592945050506040919091013590565b60ff60f81b8816815260e060208201525f612d1c60e0830189612c1a565b8281036040840152612d2e8189612c1a565b606084018890526001600160a01b038716608085015260a0840186905283810360c0850152845180825260208087019350909101905f5b81811015612d83578351835260209384019390920191600101612d65565b50909b9a5050505050505050505050565b5f60208284031215612da4575f5ffd5b5035919050565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f1916810167ffffffffffffffff81118282101715612de857612de8612dab565b604052919050565b5f67ffffffffffffffff821115612e0957612e09612dab565b5060051b60200190565b5f82601f830112612e22575f5ffd5b8135612e35612e3082612df0565b612dbf565b8082825260208201915060208360051b860101925085831115612e56575f5ffd5b602085015b83811015611fed578035835260209283019201612e5b565b5f5f5f5f60808587031215612e86575f5ffd5b612e8f85612be6565b9350602085013567ffffffffffffffff811115612eaa575f5ffd5b8501601f81018713612eba575f5ffd5b8035612ec8612e3082612df0565b8082825260208201915060208360051b850101925089831115612ee9575f5ffd5b6020840193505b82841015612f1257612f0184612be6565b825260209384019390910190612ef0565b9550505050604085013567ffffffffffffffff811115612f30575f5ffd5b612f3c87828801612e13565b925050606085013567ffffffffffffffff811115612f58575f5ffd5b612f6487828801612e13565b91505092959194509250565b5f5f83601f840112612f80575f5ffd5b50813567ffffffffffffffff811115612f97575f5ffd5b6020830191508360208260051b8501011115612fb1575f5ffd5b9250929050565b5f5f5f5f60408587031215612fcb575f5ffd5b843567ffffffffffffffff811115612fe1575f5ffd5b612fed87828801612f70565b909550935050602085013567ffffffffffffffff81111561300c575f5ffd5b61301887828801612f70565b95989497509550505050565b803560ff81168114612bfc575f5ffd5b5f5f5f5f5f5f60c08789031215613049575f5ffd5b61305287612be6565b9550602087013594506040870135935061306e60608801613024565b9598949750929560808101359460a0909101359350915050565b5f5f5f5f5f5f5f60e0888a03121561309e575f5ffd5b6130a788612be6565b96506130b560208901612be6565b955060408801359450606088013593506130d160808901613024565b9699959850939692959460a0840135945060c09093013592915050565b5f5f604083850312156130ff575f5ffd5b61310883612be6565b915061311660208401612be6565b90509250929050565b5f5f60408385031215613130575f5ffd5b61313983612be6565b9150602083013563ffffffff81168114612cb9575f5ffd5b600181811c9082168061316557607f821691505b60208210810361201857634e487b7160e01b5f52602260045260245ffd5b5f60208284031215613193575f5ffd5b5051919050565b634e487b7160e01b5f52601160045260245ffd5b808201808211156106ed576106ed61319a565b634e487b7160e01b5f52603260045260245ffd5b5f602082840312156131e5575f5ffd5b81516109f281612c82565b818103818111156106ed576106ed61319a565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b634e487b7160e01b5f52601260045260245ffd5b5f8261327c57634e487b7160e01b5f52601260045260245ffd5b500490565b601f82111561235e57805f5260205f20601f840160051c810160208510156132a65750805b601f840160051c820191505b81811015611074575f81556001016132b2565b815167ffffffffffffffff8111156132df576132df612dab565b6132f3816132ed8454613151565b84613281565b6020601f821160018114613325575f831561330e5750848201515b5f19600385901b1c1916600184901b178455611074565b5f84815260208120601f198516915b828110156133545787850151825560209485019460019092019101613334565b508482101561337157868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b634e487b7160e01b5f52602160045260245ffdfea264697066735822122087556507a13c767e1ac5fae7a99abc6e15a1498b1060ca1cde8c320d6d57627664736f6c634300081b0033", + Bin: "0x60a060405234801561000f575f5ffd5b50604051616705380380616705833981810160405281019061003191906101a6565b8073ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff168152505061007361007960201b60201c565b506102a3565b5f60019054906101000a900460ff16156100c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100bf90610251565b60405180910390fd5b60ff80165f5f9054906101000a900460ff1660ff16146101355760ff5f5f6101000a81548160ff021916908360ff1602179055507f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb384740249860ff60405161012c919061028a565b60405180910390a15b565b5f5ffd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6101648261013b565b9050919050565b5f6101758261015a565b9050919050565b6101858161016b565b811461018f575f5ffd5b50565b5f815190506101a08161017c565b92915050565b5f602082840312156101bb576101ba610137565b5b5f6101c884828501610192565b91505092915050565b5f82825260208201905092915050565b7f496e697469616c697a61626c653a20636f6e747261637420697320696e6974695f8201527f616c697a696e6700000000000000000000000000000000000000000000000000602082015250565b5f61023b6027836101d1565b9150610246826101e1565b604082019050919050565b5f6020820190508181035f8301526102688161022f565b9050919050565b5f60ff82169050919050565b6102848161026f565b82525050565b5f60208201905061029d5f83018461027b565b92915050565b6080516164356102d05f395f8181610af901528181610d5401528181611bf10152611cce01526164355ff3fe608060405234801561000f575f5ffd5b506004361061025c575f3560e01c806381b9716111610144578063a9059cbb116100c1578063dd62ed3e11610085578063dd62ed3e14610788578063de0e9a3e146107b8578063ea598cb0146107d4578063eb415f45146107f0578063f1127ed8146107fa578063f2fde38b1461082a5761025c565b8063a9059cbb146106e8578063aad41a4114610718578063b8c2559414610734578063c3cda52014610750578063d505accf1461076c5761025c565b806395d89b411161010857806395d89b41146106305780639ab24eb01461064e5780639aec4bae1461067e578063a457c2d71461069c578063a7d1195d146106cc5761025c565b806381b971611461057057806384b0196e146105a05780638da5cb5b146105c45780638e539e8c146105e257806391ddadf4146106125761025c565b80633a46b1a8116101dd5780635c19a95c116101a15780635c19a95c1461048a5780636fcfff45146104a657806370a08231146104d6578063715018a61461050657806378aa33ba146105105780637ecebe00146105405761025c565b80633a46b1a8146103be5780633f4da4c6146103ee5780634bf5d7e91461040c578063539571251461042a578063587cde1e1461045a5761025c565b80631ffacdef116102245780631ffacdef1461030657806323b872dd14610322578063313ce567146103525780633644e51514610370578063395093511461038e5761025c565b80630455e6941461026057806306fdde0314610290578063095ea7b3146102ae5780631249c58b146102de57806318160ddd146102e8575b5f5ffd5b61027a60048036038101906102759190613ec4565b610846565b6040516102879190613f09565b60405180910390f35b610298610864565b6040516102a59190613f92565b60405180910390f35b6102c860048036038101906102c39190613fe5565b6108f4565b6040516102d59190613f09565b60405180910390f35b6102e6610916565b005b6102f0610af6565b6040516102fd9190614032565b60405180910390f35b610320600480360381019061031b9190614075565b610b89565b005b61033c600480360381019061033791906140b3565b610c38565b6040516103499190613f09565b60405180910390f35b61035a610c66565b604051610367919061411e565b60405180910390f35b610378610c6e565b604051610385919061414f565b60405180910390f35b6103a860048036038101906103a39190613fe5565b610c7c565b6040516103b59190613f09565b60405180910390f35b6103d860048036038101906103d39190613fe5565b610cb2565b6040516103e59190614032565b60405180910390f35b6103f6610d52565b60405161040391906141c3565b60405180910390f35b610414610d76565b6040516104219190613f92565b60405180910390f35b610444600480360381019061043f9190613ec4565b610db3565b6040516104519190614032565b60405180910390f35b610474600480360381019061046f9190613ec4565b610dc9565b60405161048191906141eb565b60405180910390f35b6104a4600480360381019061049f9190613ec4565b610e2e565b005b6104c060048036038101906104bb9190613ec4565b610e42565b6040516104cd9190614222565b60405180910390f35b6104f060048036038101906104eb9190613ec4565b610e93565b6040516104fd9190614032565b60405180910390f35b61050e610ed9565b005b61052a60048036038101906105259190613ec4565b610eec565b6040516105379190613f09565b60405180910390f35b61055a60048036038101906105559190613ec4565b610f0a565b6040516105679190614032565b60405180910390f35b61058a60048036038101906105859190613ec4565b610f57565b6040516105979190614032565b60405180910390f35b6105a8610f6d565b6040516105bb979695949392919061432c565b60405180910390f35b6105cc611067565b6040516105d991906141eb565b60405180910390f35b6105fc60048036038101906105f791906143ae565b61108f565b6040516106099190614032565b60405180910390f35b61061a6110f4565b60405161062791906143f9565b60405180910390f35b610638611103565b6040516106459190613f92565b60405180910390f35b61066860048036038101906106639190613ec4565b611193565b6040516106759190614032565b60405180910390f35b610686611291565b6040516106939190614032565b60405180910390f35b6106b660048036038101906106b19190613fe5565b611298565b6040516106c39190613f09565b60405180910390f35b6106e660048036038101906106e19190614612565b61130d565b005b61070260048036038101906106fd9190613fe5565b611799565b60405161070f9190613f09565b60405180910390f35b610732600480360381019061072d9190614778565b6117bb565b005b61074e60048036038101906107499190614075565b611872565b005b61076a6004803603810190610765919061484a565b611921565b005b610786600480360381019061078191906148d3565b611a24565b005b6107a2600480360381019061079d9190614970565b611b63565b6040516107af9190614032565b60405180910390f35b6107d260048036038101906107cd91906143ae565b611be5565b005b6107ee60048036038101906107e991906143ae565b611ccc565b005b6107f8611db5565b005b610814600480360381019061080f91906149d8565b611e58565b6040516108219190614a88565b60405180910390f35b610844600480360381019061083f9190613ec4565b611f61565b005b610133602052805f5260405f205f915054906101000a900460ff1681565b60606068805461087390614ace565b80601f016020809104026020016040519081016040528092919081815260200182805461089f90614ace565b80156108ea5780601f106108c1576101008083540402835291602001916108ea565b820191905f5260205f20905b8154815290600101906020018083116108cd57829003601f168201915b5050505050905090565b5f5f6108fe611fe3565b905061090b818585611fea565b600191505092915050565b5f6101315f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205411610996576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161098d90614b6e565b60405180910390fd5b6101305f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20544211610a16576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a0d90614bfc565b60405180910390fd5b5f6101315f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205490505f6101315f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550610aa533826121ad565b3373ffffffffffffffffffffffffffffffffffffffff167f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d412139688582604051610aeb9190614032565b60405180910390a250565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b60573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b849190614c2e565b905090565b610b9161223b565b806101335f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff167fcf20b1ecb604b0e8888d579c64e8a3b10e590d45c1c2dddb393bed284362227182604051610c2c9190613f09565b60405180910390a25050565b5f5f610c42611fe3565b9050610c4f8582856122b9565b610c5a858585612344565b60019150509392505050565b5f6012905090565b5f610c776125b3565b905090565b5f5f610c86611fe3565b9050610ca7818585610c988589611b63565b610ca29190614c86565b611fea565b600191505092915050565b5f610cbb6110f4565b65ffffffffffff168210610d04576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cfb90614d03565b60405180910390fd5b610d4a60ff5f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20836125c1565b905092915050565b7f000000000000000000000000000000000000000000000000000000000000000081565b60606040518060400160405280600e81526020017f6d6f64653d74696d657374616d70000000000000000000000000000000000000815250905090565b610130602052805f5260405f205f915090505481565b5f60fe5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b610e3f610e39611fe3565b82612701565b50565b5f610e8c60ff5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2080549050612816565b9050919050565b5f60655f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b610ee161223b565b610eea5f612868565b565b610134602052805f5260405f205f915054906101000a900460ff1681565b5f610f5060cb5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2061292b565b9050919050565b610131602052805f5260405f205f915090505481565b5f6060805f5f5f60605f5f1b609754148015610f8c57505f5f1b609854145b610fcb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fc290614d6b565b60405180910390fd5b610fd3612937565b610fdb6129c7565b46305f5f1b5f67ffffffffffffffff811115610ffa57610ff9614416565b5b6040519080825280602002602001820160405280156110285781602001602082028036833780820191505090505b507f0f00000000000000000000000000000000000000000000000000000000000000959493929190965096509650965096509650965090919293949596565b5f60335f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b5f6110986110f4565b65ffffffffffff1682106110e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110d890614d03565b60405180910390fd5b6110ed610100836125c1565b9050919050565b5f6110fe42612a57565b905090565b60606069805461111290614ace565b80601f016020809104026020016040519081016040528092919081815260200182805461113e90614ace565b80156111895780601f1061116057610100808354040283529160200191611189565b820191905f5260205f20905b81548152906001019060200180831161116c57829003601f168201915b5050505050905090565b5f5f60ff5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f208054905090505f81146112695760ff5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20600182038154811061123157611230614d89565b5b905f5260205f20015f0160049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1661126b565b5f5b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16915050919050565b6101325481565b5f5f6112a2611fe3565b90505f6112af8286611b63565b9050838110156112f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112eb90614e26565b60405180910390fd5b6113018286868403611fea565b60019250505092915050565b5f5f60019054906101000a900460ff1615905080801561133d575060015f5f9054906101000a900460ff1660ff16105b8061136a575061134c30612aab565b158015611369575060015f5f9054906101000a900460ff1660ff16145b5b6113a9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113a090614eb4565b60405180910390fd5b60015f5f6101000a81548160ff021916908360ff16021790555080156113e45760015f60016101000a81548160ff0219169083151502179055505b6113ec612acd565b6114606040518060400160405280600581526020017f456967656e0000000000000000000000000000000000000000000000000000008152506040518060400160405280600581526020017f454947454e000000000000000000000000000000000000000000000000000000815250612b25565b61146985612868565b6114a76040518060400160405280600581526020017f454947454e000000000000000000000000000000000000000000000000000000815250612b81565b82518451146114eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114e290614f68565b60405180910390fd5b815184511461152f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115269061501c565b60405180910390fd5b5f5f90505b8451811015611711578381815181106115505761154f614d89565b5b60200260200101516101315f87848151811061156f5761156e614d89565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508281815181106115c7576115c6614d89565b5b60200260200101516101305f8784815181106115e6576115e5614d89565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f208190555060016101335f87848151811061164457611643614d89565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508481815181106116ae576116ad614d89565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff167fcf20b1ecb604b0e8888d579c64e8a3b10e590d45c1c2dddb393bed284362227160016040516116fc9190613f09565b60405180910390a28080600101915050611534565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff610132819055508015611792575f5f60016101000a81548160ff0219169083151502179055507f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb384740249860016040516117899190615073565b60405180910390a15b5050505050565b5f5f6117a3611fe3565b90506117b0818585612344565b600191505092915050565b818190508484905014611803576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117fa906150fc565b60405180910390fd5b5f5f90505b8484905081101561186b5761185e3386868481811061182a57611829614d89565b5b905060200201602081019061183f9190613ec4565b85858581811061185257611851614d89565b5b90506020020135612344565b8080600101915050611808565b5050505050565b61187a61223b565b806101345f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff167f72a561d1af7409467dae4f1e9fc52590a9335a1dda17727e2b6aa8c4db35109b826040516119159190613f09565b60405180910390a25050565b83421115611964576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161195b90615164565b60405180910390fd5b5f6119c56119bd7fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf8989896040516020016119a29493929190615182565b60405160208183030381529060405280519060200120612c11565b858585612c2a565b90506119d081612c53565b8614611a11576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a089061520f565b60405180910390fd5b611a1b8188612701565b50505050505050565b83421115611a67576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a5e90615277565b60405180910390fd5b5f7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9888888611a958c612c53565b89604051602001611aab96959493929190615295565b6040516020818303038152906040528051906020012090505f611acd82612c11565b90505f611adc82878787612c2a565b90508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611b4c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b439061533e565b60405180910390fd5b611b578a8a8a611fea565b50505050505050505050565b5f60665f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905092915050565b611bef3382612cae565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff1660e01b8152600401611c4a92919061535c565b6020604051808303815f875af1158015611c66573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611c8a9190615397565b611cc9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cc090615432565b60405180910390fd5b50565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166323b872dd3330846040518463ffffffff1660e01b8152600401611d2993929190615450565b6020604051808303815f875af1158015611d45573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611d699190615397565b611da8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d9f906154f5565b60405180910390fd5b611db233826121ad565b50565b611dbd61223b565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6101325414611e22576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e19906155a9565b60405180910390fd5b5f610132819055507f2b18986d3ba809db2f13a5d7bf17f60d357b37d9cbb55dd71cbbac8dc4060f6460405160405180910390a1565b611e60613e1d565b60ff5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f208263ffffffff1681548110611eb557611eb4614d89565b5b905f5260205f20016040518060400160405290815f82015f9054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020015f820160049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1681525050905092915050565b611f6961223b565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611fd7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fce90615637565b60405180910390fd5b611fe081612868565b50565b5f33905090565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612058576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161204f906156c5565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036120c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120bd90615753565b60405180910390fd5b8060665f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516121a09190614032565b60405180910390a3505050565b6121b78282612ccd565b6121bf612e1c565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff166121e5610af6565b1115612226576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161221d906157e1565b60405180910390fd5b612235610100612e3f83612e54565b50505050565b612243611fe3565b73ffffffffffffffffffffffffffffffffffffffff16612261611067565b73ffffffffffffffffffffffffffffffffffffffff16146122b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122ae90615849565b60405180910390fd5b565b5f6122c48484611b63565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811461233e5781811015612330576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612327906158b1565b60405180910390fd5b61233d8484848403611fea565b5b50505050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036123b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123a99061593f565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612420576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612417906159cd565b60405180910390fd5b61242b83838361311d565b5f60655f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050818110156124af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124a690615a5b565b60405180910390fd5b81810360655f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508160655f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161259a9190614032565b60405180910390a36125ad848484613280565b50505050565b5f6125bc6132ab565b905090565b5f5f838054905090505f5f90505f8290506005831115612635575f6125e58461330e565b846125f09190615a79565b9050856125fd8883613404565b5f015f9054906101000a900463ffffffff1663ffffffff16111561262357809150612633565b6001816126309190614c86565b92505b505b5b80821015612692575f6126498383613416565b9050856126568883613404565b5f015f9054906101000a900463ffffffff1663ffffffff16111561267c5780915061268c565b6001816126899190614c86565b92505b50612636565b5f81146126d6576126a68660018303613404565b5f0160049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff166126d8565b5f5b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16935050505092915050565b5f61270b83610dc9565b90505f61271784610e93565b90508260fe5f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f60405160405180910390a461281082848361343b565b50505050565b5f63ffffffff8016821115612860576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161285790615b1c565b60405180910390fd5b819050919050565b5f60335f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160335f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f815f01549050919050565b60606099805461294690614ace565b80601f016020809104026020016040519081016040528092919081815260200182805461297290614ace565b80156129bd5780601f10612994576101008083540402835291602001916129bd565b820191905f5260205f20905b8154815290600101906020018083116129a057829003601f168201915b5050505050905090565b6060609a80546129d690614ace565b80601f0160208091040260200160405190810160405280929190818152602001828054612a0290614ace565b8015612a4d5780601f10612a2457610100808354040283529160200191612a4d565b820191905f5260205f20905b815481529060010190602001808311612a3057829003601f168201915b5050505050905090565b5f65ffffffffffff8016821115612aa3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a9a90615baa565b60405180910390fd5b819050919050565b5f5f8273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b5f60019054906101000a900460ff16612b1b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b1290615c38565b60405180910390fd5b612b2361362b565b565b5f60019054906101000a900460ff16612b73576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b6a90615c38565b60405180910390fd5b612b7d828261368b565b5050565b5f60019054906101000a900460ff16612bcf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bc690615c38565b60405180910390fd5b612c0e816040518060400160405280600181526020017f31000000000000000000000000000000000000000000000000000000000000008152506136fd565b50565b5f612c23612c1d6125b3565b83613781565b9050919050565b5f5f5f612c39878787876137c1565b91509150612c4681613899565b8192505050949350505050565b5f5f60cb5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f209050612c9d8161292b565b9150612ca8816139fe565b50919050565b612cb88282613a12565b612cc7610100613bd783612e54565b50505050565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612d3b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d3290615ca0565b60405180910390fd5b612d465f838361311d565b8060675f828254612d579190614c86565b925050819055508060655f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055508173ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051612e059190614032565b60405180910390a3612e185f8383613280565b5050565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff905090565b5f8183612e4c9190614c86565b905092915050565b5f5f5f858054905090505f5f8214612f1457612e738760018403613404565b6040518060400160405290815f82015f9054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020015f820160049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1681525050612f4e565b60405180604001604052805f63ffffffff1681526020015f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff168152505b905080602001517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff169350612f8384868863ffffffff16565b92505f82118015612fab5750612f976110f4565b65ffffffffffff16815f015163ffffffff16145b1561301b57612fb983613bec565b612fc68860018503613404565b5f0160046101000a8154817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff02191690837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff160217905550613113565b86604051806040016040528061303f6130326110f4565b65ffffffffffff16612816565b63ffffffff16815260200161305386613bec565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16815250908060018154018082558091505060019003905f5260205f20015f909190919091505f820151815f015f6101000a81548163ffffffff021916908363ffffffff1602179055506020820151815f0160046101000a8154817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff02191690837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16021790555050505b5050935093915050565b610132544211613270575f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16148061318c57505f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b806131de57506101335f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff165b8061323057506101345f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff165b61326f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161326690615d2e565b60405180910390fd5b5b61327b838383613c56565b505050565b61328b838383613c5b565b6132a661329784610dc9565b6132a084610dc9565b8361343b565b505050565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f6132d5613c60565b6132dd613cc7565b46306040516020016132f3959493929190615d4c565b60405160208183030381529060405280519060200120905090565b5f5f820361331e575f90506133ff565b5f600161332a84613d2e565b901c6001901b9050600181848161334457613343615d9d565b5b048201901c9050600181848161335d5761335c615d9d565b5b048201901c9050600181848161337657613375615d9d565b5b048201901c9050600181848161338f5761338e615d9d565b5b048201901c905060018184816133a8576133a7615d9d565b5b048201901c905060018184816133c1576133c0615d9d565b5b048201901c905060018184816133da576133d9615d9d565b5b048201901c90506133fb818285816133f5576133f4615d9d565b5b04613e05565b9150505b919050565b5f825f528160205f2001905092915050565b5f60028284186134269190615dca565b8284166134339190614c86565b905092915050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415801561347657505f81115b15613626575f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614613550575f5f6134f960ff5f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20613bd785612e54565b915091508473ffffffffffffffffffffffffffffffffffffffff167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a7248383604051613545929190615dfa565b60405180910390a250505b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614613625575f5f6135ce60ff5f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20612e3f85612e54565b915091508373ffffffffffffffffffffffffffffffffffffffff167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a724838360405161361a929190615dfa565b60405180910390a250505b5b505050565b5f60019054906101000a900460ff16613679576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161367090615c38565b60405180910390fd5b613689613684611fe3565b612868565b565b5f60019054906101000a900460ff166136d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016136d090615c38565b60405180910390fd5b81606890816136e89190615fb8565b5080606990816136f89190615fb8565b505050565b5f60019054906101000a900460ff1661374b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161374290615c38565b60405180910390fd5b816099908161375a9190615fb8565b5080609a908161376a9190615fb8565b505f5f1b6097819055505f5f1b6098819055505050565b5f6040517f190100000000000000000000000000000000000000000000000000000000000081528360028201528260228201526042812091505092915050565b5f5f7f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0835f1c11156137f9575f600391509150613890565b5f6001878787876040515f815260200160405260405161381c9493929190616087565b6020604051602081039080840390855afa15801561383c573d5f5f3e3d5ffd5b5050506020604051035190505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603613888575f60019250925050613890565b805f92509250505b94509492505050565b5f60048111156138ac576138ab6160ca565b5b8160048111156138bf576138be6160ca565b5b03156139fb57600160048111156138d9576138d86160ca565b5b8160048111156138ec576138eb6160ca565b5b0361392c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161392390616141565b60405180910390fd5b600260048111156139405761393f6160ca565b5b816004811115613953576139526160ca565b5b03613993576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161398a906161a9565b60405180910390fd5b600360048111156139a7576139a66160ca565b5b8160048111156139ba576139b96160ca565b5b036139fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016139f190616237565b60405180910390fd5b5b50565b6001815f015f828254019250508190555050565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603613a80576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613a77906162c5565b60405180910390fd5b613a8b825f8361311d565b5f60655f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905081811015613b0f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613b0690616353565b60405180910390fd5b81810360655f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508160675f82825403925050819055505f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051613bbf9190614032565b60405180910390a3613bd2835f84613280565b505050565b5f8183613be49190615a79565b905092915050565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8016821115613c4e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613c45906163e1565b60405180910390fd5b819050919050565b505050565b505050565b5f5f613c6a612937565b90505f81511115613c85578080519060200120915050613cc4565b5f60975490505f5f1b8114613c9e578092505050613cc4565b7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470925050505b90565b5f5f613cd16129c7565b90505f81511115613cec578080519060200120915050613d2b565b5f60985490505f5f1b8114613d05578092505050613d2b565b7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470925050505b90565b5f5f5f90505f608084901c1115613d4d57608083901c92506080810190505b5f604084901c1115613d6757604083901c92506040810190505b5f602084901c1115613d8157602083901c92506020810190505b5f601084901c1115613d9b57601083901c92506010810190505b5f600884901c1115613db557600883901c92506008810190505b5f600484901c1115613dcf57600483901c92506004810190505b5f600284901c1115613de957600283901c92506002810190505b5f600184901c1115613dfc576001810190505b80915050919050565b5f818310613e135781613e15565b825b905092915050565b60405180604001604052805f63ffffffff1681526020015f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1681525090565b5f604051905090565b5f5ffd5b5f5ffd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f613e9382613e6a565b9050919050565b613ea381613e89565b8114613ead575f5ffd5b50565b5f81359050613ebe81613e9a565b92915050565b5f60208284031215613ed957613ed8613e62565b5b5f613ee684828501613eb0565b91505092915050565b5f8115159050919050565b613f0381613eef565b82525050565b5f602082019050613f1c5f830184613efa565b92915050565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f601f19601f8301169050919050565b5f613f6482613f22565b613f6e8185613f2c565b9350613f7e818560208601613f3c565b613f8781613f4a565b840191505092915050565b5f6020820190508181035f830152613faa8184613f5a565b905092915050565b5f819050919050565b613fc481613fb2565b8114613fce575f5ffd5b50565b5f81359050613fdf81613fbb565b92915050565b5f5f60408385031215613ffb57613ffa613e62565b5b5f61400885828601613eb0565b925050602061401985828601613fd1565b9150509250929050565b61402c81613fb2565b82525050565b5f6020820190506140455f830184614023565b92915050565b61405481613eef565b811461405e575f5ffd5b50565b5f8135905061406f8161404b565b92915050565b5f5f6040838503121561408b5761408a613e62565b5b5f61409885828601613eb0565b92505060206140a985828601614061565b9150509250929050565b5f5f5f606084860312156140ca576140c9613e62565b5b5f6140d786828701613eb0565b93505060206140e886828701613eb0565b92505060406140f986828701613fd1565b9150509250925092565b5f60ff82169050919050565b61411881614103565b82525050565b5f6020820190506141315f83018461410f565b92915050565b5f819050919050565b61414981614137565b82525050565b5f6020820190506141625f830184614140565b92915050565b5f819050919050565b5f61418b61418661418184613e6a565b614168565b613e6a565b9050919050565b5f61419c82614171565b9050919050565b5f6141ad82614192565b9050919050565b6141bd816141a3565b82525050565b5f6020820190506141d65f8301846141b4565b92915050565b6141e581613e89565b82525050565b5f6020820190506141fe5f8301846141dc565b92915050565b5f63ffffffff82169050919050565b61421c81614204565b82525050565b5f6020820190506142355f830184614213565b92915050565b5f7fff0000000000000000000000000000000000000000000000000000000000000082169050919050565b61426f8161423b565b82525050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b6142a781613fb2565b82525050565b5f6142b8838361429e565b60208301905092915050565b5f602082019050919050565b5f6142da82614275565b6142e4818561427f565b93506142ef8361428f565b805f5b8381101561431f57815161430688826142ad565b9750614311836142c4565b9250506001810190506142f2565b5085935050505092915050565b5f60e08201905061433f5f83018a614266565b81810360208301526143518189613f5a565b905081810360408301526143658188613f5a565b90506143746060830187614023565b61438160808301866141dc565b61438e60a0830185614140565b81810360c08301526143a081846142d0565b905098975050505050505050565b5f602082840312156143c3576143c2613e62565b5b5f6143d084828501613fd1565b91505092915050565b5f65ffffffffffff82169050919050565b6143f3816143d9565b82525050565b5f60208201905061440c5f8301846143ea565b92915050565b5f5ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b61444c82613f4a565b810181811067ffffffffffffffff8211171561446b5761446a614416565b5b80604052505050565b5f61447d613e59565b90506144898282614443565b919050565b5f67ffffffffffffffff8211156144a8576144a7614416565b5b602082029050602081019050919050565b5f5ffd5b5f6144cf6144ca8461448e565b614474565b905080838252602082019050602084028301858111156144f2576144f16144b9565b5b835b8181101561451b57806145078882613eb0565b8452602084019350506020810190506144f4565b5050509392505050565b5f82601f83011261453957614538614412565b5b81356145498482602086016144bd565b91505092915050565b5f67ffffffffffffffff82111561456c5761456b614416565b5b602082029050602081019050919050565b5f61458f61458a84614552565b614474565b905080838252602082019050602084028301858111156145b2576145b16144b9565b5b835b818110156145db57806145c78882613fd1565b8452602084019350506020810190506145b4565b5050509392505050565b5f82601f8301126145f9576145f8614412565b5b813561460984826020860161457d565b91505092915050565b5f5f5f5f6080858703121561462a57614629613e62565b5b5f61463787828801613eb0565b945050602085013567ffffffffffffffff81111561465857614657613e66565b5b61466487828801614525565b935050604085013567ffffffffffffffff81111561468557614684613e66565b5b614691878288016145e5565b925050606085013567ffffffffffffffff8111156146b2576146b1613e66565b5b6146be878288016145e5565b91505092959194509250565b5f5ffd5b5f5f83601f8401126146e3576146e2614412565b5b8235905067ffffffffffffffff811115614700576146ff6146ca565b5b60208301915083602082028301111561471c5761471b6144b9565b5b9250929050565b5f5f83601f84011261473857614737614412565b5b8235905067ffffffffffffffff811115614755576147546146ca565b5b602083019150836020820283011115614771576147706144b9565b5b9250929050565b5f5f5f5f604085870312156147905761478f613e62565b5b5f85013567ffffffffffffffff8111156147ad576147ac613e66565b5b6147b9878288016146ce565b9450945050602085013567ffffffffffffffff8111156147dc576147db613e66565b5b6147e887828801614723565b925092505092959194509250565b6147ff81614103565b8114614809575f5ffd5b50565b5f8135905061481a816147f6565b92915050565b61482981614137565b8114614833575f5ffd5b50565b5f8135905061484481614820565b92915050565b5f5f5f5f5f5f60c0878903121561486457614863613e62565b5b5f61487189828a01613eb0565b965050602061488289828a01613fd1565b955050604061489389828a01613fd1565b94505060606148a489828a0161480c565b93505060806148b589828a01614836565b92505060a06148c689828a01614836565b9150509295509295509295565b5f5f5f5f5f5f5f60e0888a0312156148ee576148ed613e62565b5b5f6148fb8a828b01613eb0565b975050602061490c8a828b01613eb0565b965050604061491d8a828b01613fd1565b955050606061492e8a828b01613fd1565b945050608061493f8a828b0161480c565b93505060a06149508a828b01614836565b92505060c06149618a828b01614836565b91505092959891949750929550565b5f5f6040838503121561498657614985613e62565b5b5f61499385828601613eb0565b92505060206149a485828601613eb0565b9150509250929050565b6149b781614204565b81146149c1575f5ffd5b50565b5f813590506149d2816149ae565b92915050565b5f5f604083850312156149ee576149ed613e62565b5b5f6149fb85828601613eb0565b9250506020614a0c858286016149c4565b9150509250929050565b614a1f81614204565b82525050565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff82169050919050565b614a5581614a25565b82525050565b604082015f820151614a6f5f850182614a16565b506020820151614a826020850182614a4c565b50505050565b5f604082019050614a9b5f830184614a5b565b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f6002820490506001821680614ae557607f821691505b602082108103614af857614af7614aa1565b5b50919050565b7f456967656e2e6d696e743a206d73672e73656e64657220686173206e6f206d695f8201527f6e74696e6720616c6c6f77616e63650000000000000000000000000000000000602082015250565b5f614b58602f83613f2c565b9150614b6382614afe565b604082019050919050565b5f6020820190508181035f830152614b8581614b4c565b9050919050565b7f456967656e2e6d696e743a206d73672e73656e646572206973206e6f7420616c5f8201527f6c6f77656420746f206d696e7420796574000000000000000000000000000000602082015250565b5f614be6603183613f2c565b9150614bf182614b8c565b604082019050919050565b5f6020820190508181035f830152614c1381614bda565b9050919050565b5f81519050614c2881613fbb565b92915050565b5f60208284031215614c4357614c42613e62565b5b5f614c5084828501614c1a565b91505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f614c9082613fb2565b9150614c9b83613fb2565b9250828201905080821115614cb357614cb2614c59565b5b92915050565b7f4552433230566f7465733a20667574757265206c6f6f6b7570000000000000005f82015250565b5f614ced601983613f2c565b9150614cf882614cb9565b602082019050919050565b5f6020820190508181035f830152614d1a81614ce1565b9050919050565b7f4549503731323a20556e696e697469616c697a656400000000000000000000005f82015250565b5f614d55601583613f2c565b9150614d6082614d21565b602082019050919050565b5f6020820190508181035f830152614d8281614d49565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f775f8201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b5f614e10602583613f2c565b9150614e1b82614db6565b604082019050919050565b5f6020820190508181035f830152614e3d81614e04565b9050919050565b7f496e697469616c697a61626c653a20636f6e747261637420697320616c7265615f8201527f647920696e697469616c697a6564000000000000000000000000000000000000602082015250565b5f614e9e602e83613f2c565b9150614ea982614e44565b604082019050919050565b5f6020820190508181035f830152614ecb81614e92565b9050919050565b7f456967656e2e696e697469616c697a653a206d696e7465727320616e64206d695f8201527f6e74696e67416c6c6f77616e636573206d757374206265207468652073616d6560208201527f206c656e67746800000000000000000000000000000000000000000000000000604082015250565b5f614f52604783613f2c565b9150614f5d82614ed2565b606082019050919050565b5f6020820190508181035f830152614f7f81614f46565b9050919050565b7f456967656e2e696e697469616c697a653a206d696e7465727320616e64206d695f8201527f6e74416c6c6f776564416674657273206d757374206265207468652073616d6560208201527f206c656e67746800000000000000000000000000000000000000000000000000604082015250565b5f615006604783613f2c565b915061501182614f86565b606082019050919050565b5f6020820190508181035f83015261503381614ffa565b9050919050565b5f819050919050565b5f61505d6150586150538461503a565b614168565b614103565b9050919050565b61506d81615043565b82525050565b5f6020820190506150865f830184615064565b92915050565b7f456967656e2e6d756c746973656e643a2072656365697665727320616e6420615f8201527f6d6f756e7473206d757374206265207468652073616d65206c656e6774680000602082015250565b5f6150e6603e83613f2c565b91506150f18261508c565b604082019050919050565b5f6020820190508181035f830152615113816150da565b9050919050565b7f4552433230566f7465733a207369676e617475726520657870697265640000005f82015250565b5f61514e601d83613f2c565b91506151598261511a565b602082019050919050565b5f6020820190508181035f83015261517b81615142565b9050919050565b5f6080820190506151955f830187614140565b6151a260208301866141dc565b6151af6040830185614023565b6151bc6060830184614023565b95945050505050565b7f4552433230566f7465733a20696e76616c6964206e6f6e6365000000000000005f82015250565b5f6151f9601983613f2c565b9150615204826151c5565b602082019050919050565b5f6020820190508181035f830152615226816151ed565b9050919050565b7f45524332305065726d69743a206578706972656420646561646c696e650000005f82015250565b5f615261601d83613f2c565b915061526c8261522d565b602082019050919050565b5f6020820190508181035f83015261528e81615255565b9050919050565b5f60c0820190506152a85f830189614140565b6152b560208301886141dc565b6152c260408301876141dc565b6152cf6060830186614023565b6152dc6080830185614023565b6152e960a0830184614023565b979650505050505050565b7f45524332305065726d69743a20696e76616c6964207369676e617475726500005f82015250565b5f615328601e83613f2c565b9150615333826152f4565b602082019050919050565b5f6020820190508181035f8301526153558161531c565b9050919050565b5f60408201905061536f5f8301856141dc565b61537c6020830184614023565b9392505050565b5f815190506153918161404b565b92915050565b5f602082840312156153ac576153ab613e62565b5b5f6153b984828501615383565b91505092915050565b7f456967656e2e756e777261703a2062454947454e207472616e736665722066615f8201527f696c656400000000000000000000000000000000000000000000000000000000602082015250565b5f61541c602483613f2c565b9150615427826153c2565b604082019050919050565b5f6020820190508181035f83015261544981615410565b9050919050565b5f6060820190506154635f8301866141dc565b61547060208301856141dc565b61547d6040830184614023565b949350505050565b7f456967656e2e777261703a2062454947454e207472616e73666572206661696c5f8201527f6564000000000000000000000000000000000000000000000000000000000000602082015250565b5f6154df602283613f2c565b91506154ea82615485565b604082019050919050565b5f6020820190508181035f83015261550c816154d3565b9050919050565b7f456967656e2e64697361626c655472616e736665725265737472696374696f6e5f8201527f733a207472616e73666572207265737472696374696f6e732061726520616c7260208201527f656164792064697361626c656400000000000000000000000000000000000000604082015250565b5f615593604d83613f2c565b915061559e82615513565b606082019050919050565b5f6020820190508181035f8301526155c081615587565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f20615f8201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b5f615621602683613f2c565b915061562c826155c7565b604082019050919050565b5f6020820190508181035f83015261564e81615615565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f206164645f8201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b5f6156af602483613f2c565b91506156ba82615655565b604082019050919050565b5f6020820190508181035f8301526156dc816156a3565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f2061646472655f8201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b5f61573d602283613f2c565b9150615748826156e3565b604082019050919050565b5f6020820190508181035f83015261576a81615731565b9050919050565b7f4552433230566f7465733a20746f74616c20737570706c79207269736b73206f5f8201527f766572666c6f77696e6720766f74657300000000000000000000000000000000602082015250565b5f6157cb603083613f2c565b91506157d682615771565b604082019050919050565b5f6020820190508181035f8301526157f8816157bf565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65725f82015250565b5f615833602083613f2c565b915061583e826157ff565b602082019050919050565b5f6020820190508181035f83015261586081615827565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000005f82015250565b5f61589b601d83613f2c565b91506158a682615867565b602082019050919050565b5f6020820190508181035f8301526158c88161588f565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f2061645f8201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b5f615929602583613f2c565b9150615934826158cf565b604082019050919050565b5f6020820190508181035f8301526159568161591d565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f20616464725f8201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b5f6159b7602383613f2c565b91506159c28261595d565b604082019050919050565b5f6020820190508181035f8301526159e4816159ab565b9050919050565b7f45524332303a207472616e7366657220616d6f756e74206578636565647320625f8201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b5f615a45602683613f2c565b9150615a50826159eb565b604082019050919050565b5f6020820190508181035f830152615a7281615a39565b9050919050565b5f615a8382613fb2565b9150615a8e83613fb2565b9250828203905081811115615aa657615aa5614c59565b5b92915050565b7f53616665436173743a2076616c756520646f65736e27742066697420696e20335f8201527f3220626974730000000000000000000000000000000000000000000000000000602082015250565b5f615b06602683613f2c565b9150615b1182615aac565b604082019050919050565b5f6020820190508181035f830152615b3381615afa565b9050919050565b7f53616665436173743a2076616c756520646f65736e27742066697420696e20345f8201527f3820626974730000000000000000000000000000000000000000000000000000602082015250565b5f615b94602683613f2c565b9150615b9f82615b3a565b604082019050919050565b5f6020820190508181035f830152615bc181615b88565b9050919050565b7f496e697469616c697a61626c653a20636f6e7472616374206973206e6f7420695f8201527f6e697469616c697a696e67000000000000000000000000000000000000000000602082015250565b5f615c22602b83613f2c565b9150615c2d82615bc8565b604082019050919050565b5f6020820190508181035f830152615c4f81615c16565b9050919050565b7f45524332303a206d696e7420746f20746865207a65726f2061646472657373005f82015250565b5f615c8a601f83613f2c565b9150615c9582615c56565b602082019050919050565b5f6020820190508181035f830152615cb781615c7e565b9050919050565b7f456967656e2e5f6265666f7265546f6b656e5472616e736665723a2066726f6d5f8201527f206f7220746f206d7573742062652077686974656c6973746564000000000000602082015250565b5f615d18603a83613f2c565b9150615d2382615cbe565b604082019050919050565b5f6020820190508181035f830152615d4581615d0c565b9050919050565b5f60a082019050615d5f5f830188614140565b615d6c6020830187614140565b615d796040830186614140565b615d866060830185614023565b615d9360808301846141dc565b9695505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f615dd482613fb2565b9150615ddf83613fb2565b925082615def57615dee615d9d565b5b828204905092915050565b5f604082019050615e0d5f830185614023565b615e1a6020830184614023565b9392505050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f60088302615e7d7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82615e42565b615e878683615e42565b95508019841693508086168417925050509392505050565b5f615eb9615eb4615eaf84613fb2565b614168565b613fb2565b9050919050565b5f819050919050565b615ed283615e9f565b615ee6615ede82615ec0565b848454615e4e565b825550505050565b5f5f905090565b615efd615eee565b615f08818484615ec9565b505050565b5b81811015615f2b57615f205f82615ef5565b600181019050615f0e565b5050565b601f821115615f7057615f4181615e21565b615f4a84615e33565b81016020851015615f59578190505b615f6d615f6585615e33565b830182615f0d565b50505b505050565b5f82821c905092915050565b5f615f905f1984600802615f75565b1980831691505092915050565b5f615fa88383615f81565b9150826002028217905092915050565b615fc182613f22565b67ffffffffffffffff811115615fda57615fd9614416565b5b615fe48254614ace565b615fef828285615f2f565b5f60209050601f831160018114616020575f841561600e578287015190505b6160188582615f9d565b86555061607f565b601f19841661602e86615e21565b5f5b8281101561605557848901518255600182019150602085019450602081019050616030565b86831015616072578489015161606e601f891682615f81565b8355505b6001600288020188555050505b505050505050565b5f60808201905061609a5f830187614140565b6160a7602083018661410f565b6160b46040830185614140565b6160c16060830184614140565b95945050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b7f45434453413a20696e76616c6964207369676e617475726500000000000000005f82015250565b5f61612b601883613f2c565b9150616136826160f7565b602082019050919050565b5f6020820190508181035f8301526161588161611f565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265206c656e677468005f82015250565b5f616193601f83613f2c565b915061619e8261615f565b602082019050919050565b5f6020820190508181035f8301526161c081616187565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c5f8201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b5f616221602283613f2c565b915061622c826161c7565b604082019050919050565b5f6020820190508181035f83015261624e81616215565b9050919050565b7f45524332303a206275726e2066726f6d20746865207a65726f206164647265735f8201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b5f6162af602183613f2c565b91506162ba82616255565b604082019050919050565b5f6020820190508181035f8301526162dc816162a3565b9050919050565b7f45524332303a206275726e20616d6f756e7420657863656564732062616c616e5f8201527f6365000000000000000000000000000000000000000000000000000000000000602082015250565b5f61633d602283613f2c565b9150616348826162e3565b604082019050919050565b5f6020820190508181035f83015261636a81616331565b9050919050565b7f53616665436173743a2076616c756520646f65736e27742066697420696e20325f8201527f3234206269747300000000000000000000000000000000000000000000000000602082015250565b5f6163cb602783613f2c565b91506163d682616371565b604082019050919050565b5f6020820190508181035f8301526163f8816163bf565b905091905056fea26469706673582212201ddb49dc1629c21a42d3991e171afbf28993260ae23b5f726f7391ccccb6b5d364736f6c634300081b0033", } // 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 6c63ed7fb0..ab79926845 100644 --- a/pkg/bindings/EigenPod/binding.go +++ b/pkg/bindings/EigenPod/binding.go @@ -74,7 +74,7 @@ type IEigenPodTypesValidatorInfo struct { // EigenPodMetaData contains all meta data concerning the EigenPod contract. var EigenPodMetaData = &bind.MetaData{ ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"_ethPOS\",\"type\":\"address\",\"internalType\":\"contractIETHPOSDeposit\"},{\"name\":\"_eigenPodManager\",\"type\":\"address\",\"internalType\":\"contractIEigenPodManager\"},{\"name\":\"_GENESIS_TIME\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"receive\",\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"GENESIS_TIME\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidatorCount\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"checkpointBalanceExitedGwei\",\"inputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"currentCheckpoint\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIEigenPodTypes.Checkpoint\",\"components\":[{\"name\":\"beaconBlockRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"proofsRemaining\",\"type\":\"uint24\",\"internalType\":\"uint24\"},{\"name\":\"podBalanceGwei\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"balanceDeltasGwei\",\"type\":\"int64\",\"internalType\":\"int64\"},{\"name\":\"prevBeaconBalanceGwei\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"currentCheckpointTimestamp\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"eigenPodManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIEigenPodManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"ethPOS\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIETHPOSDeposit\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getParentBlockRoot\",\"inputs\":[{\"name\":\"timestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"_podOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"lastCheckpointTimestamp\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"podOwner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"proofSubmitter\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"recoverTokens\",\"inputs\":[{\"name\":\"tokenList\",\"type\":\"address[]\",\"internalType\":\"contractIERC20[]\"},{\"name\":\"amountsToWithdraw\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"},{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setProofSubmitter\",\"inputs\":[{\"name\":\"newProofSubmitter\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"stake\",\"inputs\":[{\"name\":\"pubkey\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"depositDataRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"startCheckpoint\",\"inputs\":[{\"name\":\"revertIfNoBalance\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"validatorPubkeyHashToInfo\",\"inputs\":[{\"name\":\"validatorPubkeyHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIEigenPodTypes.ValidatorInfo\",\"components\":[{\"name\":\"validatorIndex\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"restakedBalanceGwei\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"lastCheckpointedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumIEigenPodTypes.VALIDATOR_STATUS\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"validatorPubkeyToInfo\",\"inputs\":[{\"name\":\"validatorPubkey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIEigenPodTypes.ValidatorInfo\",\"components\":[{\"name\":\"validatorIndex\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"restakedBalanceGwei\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"lastCheckpointedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumIEigenPodTypes.VALIDATOR_STATUS\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"validatorStatus\",\"inputs\":[{\"name\":\"validatorPubkey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"enumIEigenPodTypes.VALIDATOR_STATUS\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"validatorStatus\",\"inputs\":[{\"name\":\"pubkeyHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"enumIEigenPodTypes.VALIDATOR_STATUS\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"verifyCheckpointProofs\",\"inputs\":[{\"name\":\"balanceContainerProof\",\"type\":\"tuple\",\"internalType\":\"structBeaconChainProofs.BalanceContainerProof\",\"components\":[{\"name\":\"balanceContainerRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"proof\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"proofs\",\"type\":\"tuple[]\",\"internalType\":\"structBeaconChainProofs.BalanceProof[]\",\"components\":[{\"name\":\"pubkeyHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"balanceRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"proof\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"verifyStaleBalance\",\"inputs\":[{\"name\":\"beaconTimestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"stateRootProof\",\"type\":\"tuple\",\"internalType\":\"structBeaconChainProofs.StateRootProof\",\"components\":[{\"name\":\"beaconStateRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"proof\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"proof\",\"type\":\"tuple\",\"internalType\":\"structBeaconChainProofs.ValidatorProof\",\"components\":[{\"name\":\"validatorFields\",\"type\":\"bytes32[]\",\"internalType\":\"bytes32[]\"},{\"name\":\"proof\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"verifyWithdrawalCredentials\",\"inputs\":[{\"name\":\"beaconTimestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"stateRootProof\",\"type\":\"tuple\",\"internalType\":\"structBeaconChainProofs.StateRootProof\",\"components\":[{\"name\":\"beaconStateRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"proof\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"validatorIndices\",\"type\":\"uint40[]\",\"internalType\":\"uint40[]\"},{\"name\":\"validatorFieldsProofs\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"},{\"name\":\"validatorFields\",\"type\":\"bytes32[][]\",\"internalType\":\"bytes32[][]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"withdrawRestakedBeaconChainETH\",\"inputs\":[{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amountWei\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"withdrawableRestakedExecutionLayerGwei\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"event\",\"name\":\"CheckpointCreated\",\"inputs\":[{\"name\":\"checkpointTimestamp\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"beaconBlockRoot\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"validatorCount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"CheckpointFinalized\",\"inputs\":[{\"name\":\"checkpointTimestamp\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"totalShareDeltaWei\",\"type\":\"int256\",\"indexed\":false,\"internalType\":\"int256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"EigenPodStaked\",\"inputs\":[{\"name\":\"pubkey\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"NonBeaconChainETHReceived\",\"inputs\":[{\"name\":\"amountReceived\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ProofSubmitterUpdated\",\"inputs\":[{\"name\":\"prevProofSubmitter\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"newProofSubmitter\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RestakedBeaconChainETHWithdrawn\",\"inputs\":[{\"name\":\"recipient\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorBalanceUpdated\",\"inputs\":[{\"name\":\"validatorIndex\",\"type\":\"uint40\",\"indexed\":false,\"internalType\":\"uint40\"},{\"name\":\"balanceTimestamp\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"newValidatorBalanceGwei\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorCheckpointed\",\"inputs\":[{\"name\":\"checkpointTimestamp\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorIndex\",\"type\":\"uint40\",\"indexed\":true,\"internalType\":\"uint40\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorRestaked\",\"inputs\":[{\"name\":\"validatorIndex\",\"type\":\"uint40\",\"indexed\":false,\"internalType\":\"uint40\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorWithdrawn\",\"inputs\":[{\"name\":\"checkpointTimestamp\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorIndex\",\"type\":\"uint40\",\"indexed\":true,\"internalType\":\"uint40\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"BeaconTimestampTooFarInPast\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"CannotCheckpointTwiceInSingleBlock\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"CheckpointAlreadyActive\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"CredentialsAlreadyVerified\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"CurrentlyPaused\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InputAddressZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InputArrayLengthMismatch\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InsufficientWithdrawableBalance\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidEIP4788Response\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidProof\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidProofLength\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidProofLength\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidPubKeyLength\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidValidatorFieldsLength\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"MsgValueNot32ETH\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NoActiveCheckpoint\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NoBalanceToCheckpoint\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyEigenPodManager\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyEigenPodOwner\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyEigenPodOwnerOrProofSubmitter\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"TimestampOutOfRange\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ValidatorInactiveOnBeaconChain\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ValidatorIsExitingBeaconChain\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ValidatorNotActiveInPod\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ValidatorNotSlashedOnBeaconChain\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"WithdrawalCredentialsNotForEigenPod\",\"inputs\":[]}]", - Bin: "0x60e060405234801561000f575f5ffd5b50604051613c7c380380613c7c83398101604081905261002e91610131565b6001600160a01b03808416608052821660a0526001600160401b03811660c05261005661005e565b505050610186565b5f54610100900460ff16156100c95760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff90811614610118575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b038116811461012e575f5ffd5b50565b5f5f5f60608486031215610143575f5ffd5b835161014e8161011a565b602085015190935061015f8161011a565b60408501519092506001600160401b038116811461017b575f5ffd5b809150509250925092565b60805160a05160c051613a7f6101fd5f395f61060401525f81816102a90152818161063f015281816106e7015281816109ab01528181610b7501528181610e4e01528181610ef50152818161112b01528181611479015281816115ad01526127bb01525f81816104c60152610f5e0152613a7f5ff3fe608060405260043610610164575f3560e01c80636fcd0e53116100cd578063c490744211610087578063dda3346c11610062578063dda3346c14610596578063ee94d67c146105b5578063f074ba62146105d4578063f2882461146105f3575f5ffd5b8063c490744214610539578063c4d66de814610558578063d06d558714610577575f5ffd5b80636fcd0e53146104545780637439841f1461048057806374cdd798146104b557806388676cad146104e85780639b4e463414610507578063b522538a1461051a575f5ffd5b80634665bcda1161011e5780634665bcda1461029857806347d28372146102cb57806352396a59146103b657806358753357146103ea57806358eaee79146104095780636c0d2d5a14610435575f5ffd5b8063039157d2146101a25780630b18ff66146101c35780632340e8d3146101ff5780633474aa16146102225780633f65cf191461025357806342ecff2a14610272575f5ffd5b3661019e576040513481527f6fdd3dbdb173299608c0aa9f368735857c8842b581f8389238bf05bd04b3bf499060200160405180910390a1005b5f5ffd5b3480156101ad575f5ffd5b506101c16101bc366004612ff3565b610626565b005b3480156101ce575f5ffd5b506033546101e2906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b34801561020a575f5ffd5b5061021460395481565b6040519081526020016101f6565b34801561022d575f5ffd5b506034546001600160401b03165b6040516001600160401b0390911681526020016101f6565b34801561025e575f5ffd5b506101c161026d3660046130ac565b610952565b34801561027d575f5ffd5b50603a5461023b90600160401b90046001600160401b031681565b3480156102a3575f5ffd5b506101e27f000000000000000000000000000000000000000000000000000000000000000081565b3480156102d6575f5ffd5b5061035b6040805160a0810182525f80825260208201819052918101829052606081018290526080810191909152506040805160a081018252603c548152603d5462ffffff811660208301526001600160401b0363010000008204811693830193909352600160581b810460070b6060830152600160981b9004909116608082015290565b6040516101f691905f60a0820190508251825262ffffff60208401511660208301526001600160401b036040840151166040830152606083015160070b60608301526001600160401b03608084015116608083015292915050565b3480156103c1575f5ffd5b5061023b6103d0366004613181565b603b6020525f90815260409020546001600160401b031681565b3480156103f5575f5ffd5b50603e546101e2906001600160a01b031681565b348015610414575f5ffd5b506104286104233660046131de565b610bda565b6040516101f69190613250565b348015610440575f5ffd5b5061021461044f366004613181565b610c3c565b34801561045f575f5ffd5b5061047361046e36600461325e565b610d4a565b6040516101f69190613275565b34801561048b575f5ffd5b5061042861049a36600461325e565b5f90815260366020526040902054600160c01b900460ff1690565b3480156104c0575f5ffd5b506101e27f000000000000000000000000000000000000000000000000000000000000000081565b3480156104f3575f5ffd5b506101c16105023660046132d8565b610df5565b6101c16105153660046132f3565b610eea565b348015610525575f5ffd5b506104736105343660046131de565b611031565b348015610544575f5ffd5b506101c1610553366004613383565b611120565b348015610563575f5ffd5b506101c16105723660046133ad565b611257565b348015610582575f5ffd5b506101c16105913660046133ad565b6113a1565b3480156105a1575f5ffd5b506101c16105b0366004613498565b611435565b3480156105c0575f5ffd5b50603a5461023b906001600160401b031681565b3480156105df575f5ffd5b506101c16105ee36600461356a565b611594565b3480156105fe575f5ffd5b5061023b7f000000000000000000000000000000000000000000000000000000000000000081565b604051635ac86ab760e01b8152600660048201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635ac86ab790602401602060405180830381865afa15801561068c573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106b091906135d1565b156106ce5760405163840a48d560e01b815260040160405180910390fd5b604051635ac86ab760e01b8152600860048201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635ac86ab790602401602060405180830381865afa158015610734573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061075891906135d1565b156107765760405163840a48d560e01b815260040160405180910390fd5b5f6107ba61078485806135ec565b808060200260200160405190810160405280939291908181526020018383602002808284375f9201919091525061199192505050565b5f818152603660209081526040808320815160808101835281546001600160401b038082168352600160401b8204811695830195909552600160801b8104909416928101929092529394509192906060830190600160c01b900460ff1660028111156108285761082861321c565b60028111156108395761083961321c565b81525050905080604001516001600160401b0316876001600160401b031611610875576040516337e07ffd60e01b815260040160405180910390fd5b60018160600151600281111561088d5761088d61321c565b146108ab5760405163d49e19a760e01b815260040160405180910390fd5b6108ee6108b886806135ec565b808060200260200160405190810160405280939291908181526020018383602002808284375f920191909152506119b392505050565b61090b5760405163161ce5ed60e31b815260040160405180910390fd5b61091d61091788610c3c565b876119db565b610940863561092c87806135ec565b61093960208a018a613631565b8651611a80565b6109495f611ba7565b50505050505050565b6033546001600160a01b03163314806109755750603e546001600160a01b031633145b6109925760405163427a777960e01b815260040160405180910390fd5b604051635ac86ab760e01b8152600260048201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635ac86ab790602401602060405180830381865afa1580156109f8573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a1c91906135d1565b15610a3a5760405163840a48d560e01b815260040160405180910390fd5b8584148015610a4857508382145b610a65576040516343714afd60e01b815260040160405180910390fd5b603a546001600160401b03600160401b9091048116908a1611610a9b576040516337e07ffd60e01b815260040160405180910390fd5b610aad610aa78a610c3c565b896119db565b5f805b87811015610b4557610b318a358a8a84818110610acf57610acf613673565b9050602002016020810190610ae49190613687565b898985818110610af657610af6613673565b9050602002810190610b089190613631565b898987818110610b1a57610b1a613673565b9050602002810190610b2c91906135ec565b611d27565b610b3b90836136bf565b9150600101610ab0565b5060335460405163a1ca780b60e01b81526001600160a01b0391821660048201525f6024820152604481018390527f00000000000000000000000000000000000000000000000000000000000000009091169063a1ca780b906064015f604051808303815f87803b158015610bb8575f5ffd5b505af1158015610bca573d5f5f3e3d5ffd5b5050505050505050505050505050565b5f5f610c1a84848080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152506121dc92505050565b5f90815260366020526040902054600160c01b900460ff169150505b92915050565b5f610c4a611fff600c6136d2565b610c5d6001600160401b038416426136e9565b10610c7b57604051637944e66d60e11b815260040160405180910390fd5b604080516001600160401b03841660208201525f918291720f3df6d732807ef1319fb7b8bb8522d0beac02910160408051601f1981840301815290829052610cc291613713565b5f60405180830381855afa9150503d805f8114610cfa576040519150601f19603f3d011682016040523d82523d5f602084013e610cff565b606091505b5091509150818015610d1157505f8151115b610d2e5760405163558ad0a360e01b815260040160405180910390fd5b80806020019051810190610d42919061371e565b949350505050565b610d71604080516080810182525f8082526020820181905291810182905290606082015290565b5f82815260366020908152604091829020825160808101845281546001600160401b038082168352600160401b8204811694830194909452600160801b810490931693810193909352906060830190600160c01b900460ff166002811115610ddb57610ddb61321c565b6002811115610dec57610dec61321c565b90525092915050565b6033546001600160a01b0316331480610e185750603e546001600160a01b031633145b610e355760405163427a777960e01b815260040160405180910390fd5b604051635ac86ab760e01b8152600660048201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635ac86ab790602401602060405180830381865afa158015610e9b573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ebf91906135d1565b15610edd5760405163840a48d560e01b815260040160405180910390fd5b610ee682611ba7565b5050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610f3357604051633213a66160e21b815260040160405180910390fd5b346801bc16d674ec80000014610f5c5760405163049696b360e31b815260040160405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663228951186801bc16d674ec8000008787610f9f61226d565b8888886040518863ffffffff1660e01b8152600401610fc39695949392919061378b565b5f604051808303818588803b158015610fda575f5ffd5b505af1158015610fec573d5f5f3e3d5ffd5b50505050507f606865b7934a25d4aed43f6cdb426403353fa4b3009c4d228407474581b01e2385856040516110229291906137d9565b60405180910390a15050505050565b611058604080516080810182525f8082526020820181905291810182905290606082015290565b60365f61109985858080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152506121dc92505050565b815260208082019290925260409081015f20815160808101835281546001600160401b038082168352600160401b8204811695830195909552600160801b81049094169281019290925290916060830190600160c01b900460ff1660028111156111055761110561321c565b60028111156111165761111661321c565b9052509392505050565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461116957604051633213a66160e21b815260040160405180910390fd5b5f611178633b9aca0083613800565b9050611191633b9aca006001600160401b0383166136d2565b6034549092506001600160401b0390811690821611156111c4576040516302c6f54760e21b815260040160405180910390fd5b603480548291905f906111e19084906001600160401b0316613813565b92506101000a8154816001600160401b0302191690836001600160401b03160217905550826001600160a01b03167f8947fd2ce07ef9cc302c4e8f0461015615d91ce851564839e91cc804c2f49d8e8360405161124091815260200190565b60405180910390a261125283836122b1565b505050565b5f54610100900460ff161580801561127557505f54600160ff909116105b8061128e5750303b15801561128e57505f5460ff166001145b6112f65760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b5f805460ff191660011790558015611317575f805461ff0019166101001790555b6001600160a01b03821661133e576040516339b190bb60e11b815260040160405180910390fd5b603380546001600160a01b0319166001600160a01b0384161790558015610ee6575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15050565b6033546001600160a01b031633146113cc5760405163719f370360e11b815260040160405180910390fd5b603e54604080516001600160a01b03928316815291831660208301527ffb8129080a19d34dceac04ba253fc50304dc86c729bd63cdca4a969ad19a5eac910160405180910390a1603e80546001600160a01b0319166001600160a01b0392909216919091179055565b6033546001600160a01b031633146114605760405163719f370360e11b815260040160405180910390fd5b604051635ac86ab760e01b8152600560048201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635ac86ab790602401602060405180830381865afa1580156114c6573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114ea91906135d1565b156115085760405163840a48d560e01b815260040160405180910390fd5b825184511461152a576040516343714afd60e01b815260040160405180910390fd5b5f5b845181101561158d576115858385838151811061154b5761154b613673565b602002602001015187848151811061156557611565613673565b60200260200101516001600160a01b03166123c69092919063ffffffff16565b60010161152c565b5050505050565b604051635ac86ab760e01b8152600760048201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635ac86ab790602401602060405180830381865afa1580156115fa573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061161e91906135d1565b1561163c5760405163840a48d560e01b815260040160405180910390fd5b603a54600160401b90046001600160401b03165f81900361167057604051631a544f4960e01b815260040160405180910390fd5b6040805160a081018252603c54808252603d5462ffffff811660208401526001600160401b0363010000008204811694840194909452600160581b810460070b6060840152600160981b90049092166080820152906116cf9087612418565b5f805b8581101561193857368787838181106116ed576116ed613673565b90506020028101906116ff9190613832565b80355f908152603660209081526040808320815160808101835281546001600160401b038082168352600160401b8204811695830195909552600160801b8104909416928101929092529394509192906060830190600160c01b900460ff16600281111561176f5761176f61321c565b60028111156117805761178061321c565b905250905060018160600151600281111561179d5761179d61321c565b146117a9575050611930565b856001600160401b031681604001516001600160401b0316106117cd575050611930565b5f80806117dd848a8f35886124c9565b60208b01805193965091945092506117f482613850565b62ffffff1690525060808801805184919061181090839061386d565b6001600160401b031690525060608801805183919061183090839061388c565b60070b905250611840818861386d565b85355f908152603660209081526040918290208751815492890151938901516001600160401b03908116600160801b0267ffffffffffffffff60801b19958216600160401b026001600160801b0319909516919092161792909217928316821781556060880151939a50879390929091839160ff60c01b1990911668ffffffffffffffffff60801b1990911617600160c01b8360028111156118e4576118e461321c565b021790555050845160405164ffffffffff90911691506001600160401b038b16907fa91c59033c3423e18b54d0acecebb4972f9ea95aedf5f4cae3b677b02eaf3a3f905f90a350505050505b6001016116d2565b506001600160401b038084165f908152603b60205260408120805484939192916119649185911661386d565b92506101000a8154816001600160401b0302191690836001600160401b03160217905550610949826125ec565b5f815f815181106119a4576119a4613673565b60200260200101519050919050565b5f816003815181106119c7576119c7613673565b60200260200101515f5f1b14159050919050565b6119e7600360206136d2565b6119f46020830183613631565b905014611a14576040516313717da960e21b815260040160405180910390fd5b611a63611a246020830183613631565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152508692505084359050600361281b565b610ee6576040516309bde33960e01b815260040160405180910390fd5b60088414611aa15760405163200591bd60e01b815260040160405180910390fd5b6005611aaf602860016136bf565b611ab991906136bf565b611ac49060206136d2565b8214611ae3576040516313717da960e21b815260040160405180910390fd5b5f611b1f8686808060200260200160405190810160405280939291908181526020018383602002808284375f9201919091525061283292505050565b90505f64ffffffffff8316611b36602860016136bf565b600b901b179050611b8085858080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152508c925086915085905061281b565b611b9d576040516309bde33960e01b815260040160405180910390fd5b5050505050505050565b603a54600160401b90046001600160401b031615611bd75760405162be9bc360e81b815260040160405180910390fd5b603a546001600160401b03428116911603611c05576040516367db5b8b60e01b815260040160405180910390fd5b6034545f906001600160401b0316611c21633b9aca0047613800565b611c2b9190613813565b9050818015611c4157506001600160401b038116155b15611c5f576040516332dea95960e21b815260040160405180910390fd5b5f6040518060a00160405280611c7442610c3c565b815260395462ffffff1660208201526001600160401b0380851660408301525f60608301819052608090920191909152603a805442909216600160401b026fffffffffffffffff0000000000000000199092169190911790559050611cd8816125ec565b805160208083015160405162ffffff90911681526001600160401b034216917f575796133bbed337e5b39aa49a30dc2556a91e0c6c2af4b7b886ae77ebef1076910160405180910390a3505050565b5f5f611d648484808060200260200160405190810160405280939291908181526020018383602002808284375f9201919091525061199192505050565b5f818152603660209081526040808320815160808101835281546001600160401b038082168352600160401b8204811695830195909552600160801b8104909416928101929092529394509192906060830190600160c01b900460ff166002811115611dd257611dd261321c565b6002811115611de357611de361321c565b90525090505f81606001516002811115611dff57611dff61321c565b14611e1d576040516335e09e9d60e01b815260040160405180910390fd5b6001600160401b038016611e628686808060200260200160405190810160405280939291908181526020018383602002808284375f92019190915250612ac292505050565b6001600160401b031603611e8957604051631958236d60e21b815260040160405180910390fd5b6001600160401b038016611ece8686808060200260200160405190810160405280939291908181526020018383602002808284375f92019190915250612ae692505050565b6001600160401b031614611ef557604051632eade63760e01b815260040160405180910390fd5b611efd61226d565b611f06906138bb565b611f418686808060200260200160405190810160405280939291908181526020018383602002808284375f92019190915250612afd92505050565b14611f5f57604051633772dd5360e11b815260040160405180910390fd5b5f611f9b8686808060200260200160405190810160405280939291908181526020018383602002808284375f92019190915250612b1192505050565b9050611fab8a87878b8b8e611a80565b60398054905f611fba836138de565b9091555050603a545f90600160401b90046001600160401b031615611ff157603a54600160401b90046001600160401b0316611ffe565b603a546001600160401b03165b6040805160808101825264ffffffffff8d1681526001600160401b03858116602083015283169181019190915290915060608101600190525f858152603660209081526040918290208351815492850151938501516001600160401b03908116600160801b0267ffffffffffffffff60801b19958216600160401b026001600160801b031990951691909216179290921792831682178155606084015190929091839160ff60c01b1990911668ffffffffffffffffff60801b1990911617600160c01b8360028111156120d3576120d361321c565b021790555050603d80548492506013906120fe908490600160981b90046001600160401b031661386d565b92506101000a8154816001600160401b0302191690836001600160401b031602179055507f2d0800bbc377ea54a08c5db6a87aafff5e3e9c8fead0eda110e40e0c104414498a60405161215e919064ffffffffff91909116815260200190565b60405180910390a16040805164ffffffffff8c1681526001600160401b03838116602083015284168183015290517f0e5fac175b83177cc047381e030d8fb3b42b37bd1c025e22c280facad62c32df9181900360600190a16121cd633b9aca006001600160401b0384166136d2565b9b9a5050505050505050505050565b5f81516030146121ff57604051634f88323960e11b815260040160405180910390fd5b6040516002906122159084905f906020016138f6565b60408051601f198184030181529082905261222f91613713565b602060405180830381855afa15801561224a573d5f5f3e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610c36919061371e565b60408051600160f81b60208201525f602182015230606090811b6bffffffffffffffffffffffff1916602c8301529101604051602081830303815290604052905090565b804710156123015760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e636500000060448201526064016112ed565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f811461234a576040519150601f19603f3d011682016040523d82523d5f602084013e61234f565b606091505b50509050806112525760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d6179206861766520726576657274656400000000000060648201526084016112ed565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052611252908490612b28565b612424600560036136bf565b61242f9060206136d2565b61243c6020830183613631565b90501461245c576040516313717da960e21b815260040160405180910390fd5b606c6124ac61246e6020840184613631565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525087925050853590508461281b565b611252576040516309bde33960e01b815260040160405180910390fd5b83516020850151905f908190816124e1878388612bfb565b9050846001600160401b0316816001600160401b03161461255b57612506858261391a565b6040805164ffffffffff851681526001600160401b038b8116602083015284168183015290519195507f0e5fac175b83177cc047381e030d8fb3b42b37bd1c025e22c280facad62c32df919081900360600190a15b6001600160401b0380821660208b0181905290891660408b01525f036125e05760398054905f61258a83613949565b9091555050600260608a015261259f8461395e565b92508164ffffffffff16886001600160401b03167f2a02361ffa66cf2c2da4682c2355a6adcaa9f6c227b6e6563e68480f9587626a60405160405180910390a35b50509450945094915050565b602081015162ffffff161561268c578051603c556020810151603d80546040840151606085015160809095015162ffffff9094166affffffffffffffffffffff199092169190911763010000006001600160401b0392831602176fffffffffffffffffffffffffffffffff60581b1916600160581b9482169490940267ffffffffffffffff60981b191693909317600160981b9390921692909202179055565b60808101516034545f916126a8916001600160401b031661386d565b90505f826060015183604001516126bf919061388c565b60408401516034805492935090915f906126e39084906001600160401b031661386d565b82546101009290920a6001600160401b03818102199093169183160217909155603a8054600160401b810483166001600160801b03199091161790555f915061273390633b9aca009085166136d2565b90505f612748633b9aca00600785900b613983565b603a546040518281529192506001600160401b0316907f525408c201bc1576eb44116f6478f1c2a54775b19a043bcfdc708364f74f8e449060200160405180910390a260335460405163a1ca780b60e01b81526001600160a01b03918216600482015260248101849052604481018390527f00000000000000000000000000000000000000000000000000000000000000009091169063a1ca780b906064015f604051808303815f87803b1580156127fe575f5ffd5b505af1158015612810573d5f5f3e3d5ffd5b505050505050505050565b5f83612828868585612cd9565b1495945050505050565b5f5f600283516128429190613800565b90505f816001600160401b0381111561285d5761285d6133c8565b604051908082528060200260200182016040528015612886578160200160208202803683370190505b5090505f5b82811015612980576002856128a083836136d2565b815181106128b0576128b0613673565b6020026020010151868360026128c691906136d2565b6128d19060016136bf565b815181106128e1576128e1613673565b6020026020010151604051602001612903929190918252602082015260400190565b60408051601f198184030181529082905261291d91613713565b602060405180830381855afa158015612938573d5f5f3e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061295b919061371e565b82828151811061296d5761296d613673565b602090810291909101015260010161288b565b5061298c600283613800565b91505b8115612a9f575f5b82811015612a8c576002826129ac83836136d2565b815181106129bc576129bc613673565b6020026020010151838360026129d291906136d2565b6129dd9060016136bf565b815181106129ed576129ed613673565b6020026020010151604051602001612a0f929190918252602082015260400190565b60408051601f1981840301815290829052612a2991613713565b602060405180830381855afa158015612a44573d5f5f3e3d5ffd5b5050506040513d601f19601f82011682018060405250810190612a67919061371e565b828281518110612a7957612a79613673565b6020908102919091010152600101612997565b50612a98600283613800565b915061298f565b805f81518110612ab157612ab1613673565b602002602001015192505050919050565b5f610c3682600581518110612ad957612ad9613673565b6020026020010151612dad565b5f610c3682600681518110612ad957612ad9613673565b5f816001815181106119a4576119a4613673565b5f610c3682600281518110612ad957612ad9613673565b5f612b7c826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316612e149092919063ffffffff16565b905080515f1480612b9c575080806020019051810190612b9c91906135d1565b6112525760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016112ed565b5f612c08602660016136bf565b612c139060206136d2565b612c206040840184613631565b905014612c40576040516313717da960e21b815260040160405180910390fd5b5f612c4c6004856139b2565b64ffffffffff169050612ca5612c656040850185613631565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250899250505060208601358461281b565b612cc2576040516309bde33960e01b815260040160405180910390fd5b612cd0836020013585612e22565b95945050505050565b5f83515f14158015612cf6575060208451612cf491906139db565b155b612d13576040516313717da960e21b815260040160405180910390fd5b604080516020808201909252848152905b85518111612da357612d376002856139db565b5f03612d695781515f528086015160205260208260405f60026107d05a03fa612d5e575f5ffd5b600284049350612d91565b808601515f52815160205260208260405f60026107d05a03fa612d8a575f5ffd5b6002840493505b612d9c6020826136bf565b9050612d24565b5051949350505050565b60f881901c60e882901c61ff00161760d882901c62ff0000161760c882901c63ff000000161764ff0000000060b883901c161765ff000000000060a883901c161766ff000000000000609883901c161767ff0000000000000060889290921c919091161790565b6060610d4284845f85612e4e565b5f80612e2f6004846139ee565b612e3a906040613a17565b64ffffffffff169050610d4284821b612dad565b606082471015612eaf5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b60648201526084016112ed565b5f5f866001600160a01b03168587604051612eca9190613713565b5f6040518083038185875af1925050503d805f8114612f04576040519150601f19603f3d011682016040523d82523d5f602084013e612f09565b606091505b5091509150612f1a87838387612f25565b979650505050505050565b60608315612f935782515f03612f8c576001600160a01b0385163b612f8c5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016112ed565b5081610d42565b610d428383815115612fa85781518083602001fd5b8060405162461bcd60e51b81526004016112ed9190613a37565b80356001600160401b0381168114612fd8575f5ffd5b919050565b5f60408284031215612fed575f5ffd5b50919050565b5f5f5f60608486031215613005575f5ffd5b61300e84612fc2565b925060208401356001600160401b03811115613028575f5ffd5b61303486828701612fdd565b92505060408401356001600160401b0381111561304f575f5ffd5b61305b86828701612fdd565b9150509250925092565b5f5f83601f840112613075575f5ffd5b5081356001600160401b0381111561308b575f5ffd5b6020830191508360208260051b85010111156130a5575f5ffd5b9250929050565b5f5f5f5f5f5f5f5f60a0898b0312156130c3575f5ffd5b6130cc89612fc2565b975060208901356001600160401b038111156130e6575f5ffd5b6130f28b828c01612fdd565b97505060408901356001600160401b0381111561310d575f5ffd5b6131198b828c01613065565b90975095505060608901356001600160401b03811115613137575f5ffd5b6131438b828c01613065565b90955093505060808901356001600160401b03811115613161575f5ffd5b61316d8b828c01613065565b999c989b5096995094979396929594505050565b5f60208284031215613191575f5ffd5b61319a82612fc2565b9392505050565b5f5f83601f8401126131b1575f5ffd5b5081356001600160401b038111156131c7575f5ffd5b6020830191508360208285010111156130a5575f5ffd5b5f5f602083850312156131ef575f5ffd5b82356001600160401b03811115613204575f5ffd5b613210858286016131a1565b90969095509350505050565b634e487b7160e01b5f52602160045260245ffd5b6003811061324c57634e487b7160e01b5f52602160045260245ffd5b9052565b60208101610c368284613230565b5f6020828403121561326e575f5ffd5b5035919050565b5f6080820190506001600160401b0383511682526001600160401b0360208401511660208301526001600160401b03604084015116604083015260608301516132c16060840182613230565b5092915050565b80151581146132d5575f5ffd5b50565b5f602082840312156132e8575f5ffd5b813561319a816132c8565b5f5f5f5f5f60608688031215613307575f5ffd5b85356001600160401b0381111561331c575f5ffd5b613328888289016131a1565b90965094505060208601356001600160401b03811115613346575f5ffd5b613352888289016131a1565b96999598509660400135949350505050565b6001600160a01b03811681146132d5575f5ffd5b8035612fd881613364565b5f5f60408385031215613394575f5ffd5b823561339f81613364565b946020939093013593505050565b5f602082840312156133bd575f5ffd5b813561319a81613364565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f191681016001600160401b0381118282101715613404576134046133c8565b604052919050565b5f6001600160401b03821115613424576134246133c8565b5060051b60200190565b5f82601f83011261343d575f5ffd5b813561345061344b8261340c565b6133dc565b8082825260208201915060208360051b860101925085831115613471575f5ffd5b602085015b8381101561348e578035835260209283019201613476565b5095945050505050565b5f5f5f606084860312156134aa575f5ffd5b83356001600160401b038111156134bf575f5ffd5b8401601f810186136134cf575f5ffd5b80356134dd61344b8261340c565b8082825260208201915060208360051b8501019250888311156134fe575f5ffd5b6020840193505b8284101561352957833561351881613364565b825260209384019390910190613505565b955050505060208401356001600160401b03811115613546575f5ffd5b6135528682870161342e565b92505061356160408501613378565b90509250925092565b5f5f5f6040848603121561357c575f5ffd5b83356001600160401b03811115613591575f5ffd5b61359d86828701612fdd565b93505060208401356001600160401b038111156135b8575f5ffd5b6135c486828701613065565b9497909650939450505050565b5f602082840312156135e1575f5ffd5b815161319a816132c8565b5f5f8335601e19843603018112613601575f5ffd5b8301803591506001600160401b0382111561361a575f5ffd5b6020019150600581901b36038213156130a5575f5ffd5b5f5f8335601e19843603018112613646575f5ffd5b8301803591506001600160401b0382111561365f575f5ffd5b6020019150368190038213156130a5575f5ffd5b634e487b7160e01b5f52603260045260245ffd5b5f60208284031215613697575f5ffd5b813564ffffffffff8116811461319a575f5ffd5b634e487b7160e01b5f52601160045260245ffd5b80820180821115610c3657610c366136ab565b8082028115828204841417610c3657610c366136ab565b81810381811115610c3657610c366136ab565b5f81518060208401855e5f93019283525090919050565b5f61319a82846136fc565b5f6020828403121561372e575f5ffd5b5051919050565b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b608081525f61379e60808301888a613735565b82810360208401526137b0818861375d565b905082810360408401526137c5818688613735565b915050826060830152979650505050505050565b602081525f610d42602083018486613735565b634e487b7160e01b5f52601260045260245ffd5b5f8261380e5761380e6137ec565b500490565b6001600160401b038281168282160390811115610c3657610c366136ab565b5f8235605e19833603018112613846575f5ffd5b9190910192915050565b5f62ffffff821680613864576138646136ab565b5f190192915050565b6001600160401b038181168382160190811115610c3657610c366136ab565b600781810b9083900b01677fffffffffffffff8113677fffffffffffffff1982121715610c3657610c366136ab565b80516020808301519190811015612fed575f1960209190910360031b1b16919050565b5f600182016138ef576138ef6136ab565b5060010190565b5f61390182856136fc565b6001600160801b03199390931683525050601001919050565b600782810b9082900b03677fffffffffffffff198112677fffffffffffffff82131715610c3657610c366136ab565b5f81613957576139576136ab565b505f190190565b5f8160070b677fffffffffffffff19810361397b5761397b6136ab565b5f0392915050565b8082025f8212600160ff1b8414161561399e5761399e6136ab565b8181058314821517610c3657610c366136ab565b5f64ffffffffff8316806139c8576139c86137ec565b8064ffffffffff84160491505092915050565b5f826139e9576139e96137ec565b500690565b5f64ffffffffff831680613a0457613a046137ec565b8064ffffffffff84160691505092915050565b64ffffffffff81811683821602908116908181146132c1576132c16136ab565b602081525f61319a602083018461375d56fea2646970667358221220bc08464078b4dc2757c605598b1714abf94d9ed2c9749983c6342fd09cc5b87364736f6c634300081b0033", + Bin: "0x60e060405234801561000f575f5ffd5b50604051613c7c380380613c7c83398101604081905261002e91610131565b6001600160a01b03808416608052821660a0526001600160401b03811660c05261005661005e565b505050610186565b5f54610100900460ff16156100c95760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff90811614610118575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b038116811461012e575f5ffd5b50565b5f5f5f60608486031215610143575f5ffd5b835161014e8161011a565b602085015190935061015f8161011a565b60408501519092506001600160401b038116811461017b575f5ffd5b809150509250925092565b60805160a05160c051613a7f6101fd5f395f61060401525f81816102a90152818161063f015281816106e7015281816109ab01528181610b7501528181610e4e01528181610ef50152818161112b01528181611479015281816115ad01526127bb01525f81816104c60152610f5e0152613a7f5ff3fe608060405260043610610164575f3560e01c80636fcd0e53116100cd578063c490744211610087578063dda3346c11610062578063dda3346c14610596578063ee94d67c146105b5578063f074ba62146105d4578063f2882461146105f3575f5ffd5b8063c490744214610539578063c4d66de814610558578063d06d558714610577575f5ffd5b80636fcd0e53146104545780637439841f1461048057806374cdd798146104b557806388676cad146104e85780639b4e463414610507578063b522538a1461051a575f5ffd5b80634665bcda1161011e5780634665bcda1461029857806347d28372146102cb57806352396a59146103b657806358753357146103ea57806358eaee79146104095780636c0d2d5a14610435575f5ffd5b8063039157d2146101a25780630b18ff66146101c35780632340e8d3146101ff5780633474aa16146102225780633f65cf191461025357806342ecff2a14610272575f5ffd5b3661019e576040513481527f6fdd3dbdb173299608c0aa9f368735857c8842b581f8389238bf05bd04b3bf499060200160405180910390a1005b5f5ffd5b3480156101ad575f5ffd5b506101c16101bc366004612ff3565b610626565b005b3480156101ce575f5ffd5b506033546101e2906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b34801561020a575f5ffd5b5061021460395481565b6040519081526020016101f6565b34801561022d575f5ffd5b506034546001600160401b03165b6040516001600160401b0390911681526020016101f6565b34801561025e575f5ffd5b506101c161026d3660046130ac565b610952565b34801561027d575f5ffd5b50603a5461023b90600160401b90046001600160401b031681565b3480156102a3575f5ffd5b506101e27f000000000000000000000000000000000000000000000000000000000000000081565b3480156102d6575f5ffd5b5061035b6040805160a0810182525f80825260208201819052918101829052606081018290526080810191909152506040805160a081018252603c548152603d5462ffffff811660208301526001600160401b0363010000008204811693830193909352600160581b810460070b6060830152600160981b9004909116608082015290565b6040516101f691905f60a0820190508251825262ffffff60208401511660208301526001600160401b036040840151166040830152606083015160070b60608301526001600160401b03608084015116608083015292915050565b3480156103c1575f5ffd5b5061023b6103d0366004613181565b603b6020525f90815260409020546001600160401b031681565b3480156103f5575f5ffd5b50603e546101e2906001600160a01b031681565b348015610414575f5ffd5b506104286104233660046131de565b610bda565b6040516101f69190613250565b348015610440575f5ffd5b5061021461044f366004613181565b610c3c565b34801561045f575f5ffd5b5061047361046e36600461325e565b610d4a565b6040516101f69190613275565b34801561048b575f5ffd5b5061042861049a36600461325e565b5f90815260366020526040902054600160c01b900460ff1690565b3480156104c0575f5ffd5b506101e27f000000000000000000000000000000000000000000000000000000000000000081565b3480156104f3575f5ffd5b506101c16105023660046132d8565b610df5565b6101c16105153660046132f3565b610eea565b348015610525575f5ffd5b506104736105343660046131de565b611031565b348015610544575f5ffd5b506101c1610553366004613383565b611120565b348015610563575f5ffd5b506101c16105723660046133ad565b611257565b348015610582575f5ffd5b506101c16105913660046133ad565b6113a1565b3480156105a1575f5ffd5b506101c16105b0366004613498565b611435565b3480156105c0575f5ffd5b50603a5461023b906001600160401b031681565b3480156105df575f5ffd5b506101c16105ee36600461356a565b611594565b3480156105fe575f5ffd5b5061023b7f000000000000000000000000000000000000000000000000000000000000000081565b604051635ac86ab760e01b8152600660048201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635ac86ab790602401602060405180830381865afa15801561068c573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106b091906135d1565b156106ce5760405163840a48d560e01b815260040160405180910390fd5b604051635ac86ab760e01b8152600860048201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635ac86ab790602401602060405180830381865afa158015610734573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061075891906135d1565b156107765760405163840a48d560e01b815260040160405180910390fd5b5f6107ba61078485806135ec565b808060200260200160405190810160405280939291908181526020018383602002808284375f9201919091525061199192505050565b5f818152603660209081526040808320815160808101835281546001600160401b038082168352600160401b8204811695830195909552600160801b8104909416928101929092529394509192906060830190600160c01b900460ff1660028111156108285761082861321c565b60028111156108395761083961321c565b81525050905080604001516001600160401b0316876001600160401b031611610875576040516337e07ffd60e01b815260040160405180910390fd5b60018160600151600281111561088d5761088d61321c565b146108ab5760405163d49e19a760e01b815260040160405180910390fd5b6108ee6108b886806135ec565b808060200260200160405190810160405280939291908181526020018383602002808284375f920191909152506119b392505050565b61090b5760405163161ce5ed60e31b815260040160405180910390fd5b61091d61091788610c3c565b876119db565b610940863561092c87806135ec565b61093960208a018a613631565b8651611a80565b6109495f611ba7565b50505050505050565b6033546001600160a01b03163314806109755750603e546001600160a01b031633145b6109925760405163427a777960e01b815260040160405180910390fd5b604051635ac86ab760e01b8152600260048201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635ac86ab790602401602060405180830381865afa1580156109f8573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a1c91906135d1565b15610a3a5760405163840a48d560e01b815260040160405180910390fd5b8584148015610a4857508382145b610a65576040516343714afd60e01b815260040160405180910390fd5b603a546001600160401b03600160401b9091048116908a1611610a9b576040516337e07ffd60e01b815260040160405180910390fd5b610aad610aa78a610c3c565b896119db565b5f805b87811015610b4557610b318a358a8a84818110610acf57610acf613673565b9050602002016020810190610ae49190613687565b898985818110610af657610af6613673565b9050602002810190610b089190613631565b898987818110610b1a57610b1a613673565b9050602002810190610b2c91906135ec565b611d27565b610b3b90836136bf565b9150600101610ab0565b5060335460405163a1ca780b60e01b81526001600160a01b0391821660048201525f6024820152604481018390527f00000000000000000000000000000000000000000000000000000000000000009091169063a1ca780b906064015f604051808303815f87803b158015610bb8575f5ffd5b505af1158015610bca573d5f5f3e3d5ffd5b5050505050505050505050505050565b5f5f610c1a84848080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152506121dc92505050565b5f90815260366020526040902054600160c01b900460ff169150505b92915050565b5f610c4a611fff600c6136d2565b610c5d6001600160401b038416426136e9565b10610c7b57604051637944e66d60e11b815260040160405180910390fd5b604080516001600160401b03841660208201525f918291720f3df6d732807ef1319fb7b8bb8522d0beac02910160408051601f1981840301815290829052610cc291613713565b5f60405180830381855afa9150503d805f8114610cfa576040519150601f19603f3d011682016040523d82523d5f602084013e610cff565b606091505b5091509150818015610d1157505f8151115b610d2e5760405163558ad0a360e01b815260040160405180910390fd5b80806020019051810190610d42919061371e565b949350505050565b610d71604080516080810182525f8082526020820181905291810182905290606082015290565b5f82815260366020908152604091829020825160808101845281546001600160401b038082168352600160401b8204811694830194909452600160801b810490931693810193909352906060830190600160c01b900460ff166002811115610ddb57610ddb61321c565b6002811115610dec57610dec61321c565b90525092915050565b6033546001600160a01b0316331480610e185750603e546001600160a01b031633145b610e355760405163427a777960e01b815260040160405180910390fd5b604051635ac86ab760e01b8152600660048201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635ac86ab790602401602060405180830381865afa158015610e9b573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ebf91906135d1565b15610edd5760405163840a48d560e01b815260040160405180910390fd5b610ee682611ba7565b5050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610f3357604051633213a66160e21b815260040160405180910390fd5b346801bc16d674ec80000014610f5c5760405163049696b360e31b815260040160405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663228951186801bc16d674ec8000008787610f9f61226d565b8888886040518863ffffffff1660e01b8152600401610fc39695949392919061378b565b5f604051808303818588803b158015610fda575f5ffd5b505af1158015610fec573d5f5f3e3d5ffd5b50505050507f606865b7934a25d4aed43f6cdb426403353fa4b3009c4d228407474581b01e2385856040516110229291906137d9565b60405180910390a15050505050565b611058604080516080810182525f8082526020820181905291810182905290606082015290565b60365f61109985858080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152506121dc92505050565b815260208082019290925260409081015f20815160808101835281546001600160401b038082168352600160401b8204811695830195909552600160801b81049094169281019290925290916060830190600160c01b900460ff1660028111156111055761110561321c565b60028111156111165761111661321c565b9052509392505050565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461116957604051633213a66160e21b815260040160405180910390fd5b5f611178633b9aca0083613800565b9050611191633b9aca006001600160401b0383166136d2565b6034549092506001600160401b0390811690821611156111c4576040516302c6f54760e21b815260040160405180910390fd5b603480548291905f906111e19084906001600160401b0316613813565b92506101000a8154816001600160401b0302191690836001600160401b03160217905550826001600160a01b03167f8947fd2ce07ef9cc302c4e8f0461015615d91ce851564839e91cc804c2f49d8e8360405161124091815260200190565b60405180910390a261125283836122b1565b505050565b5f54610100900460ff161580801561127557505f54600160ff909116105b8061128e5750303b15801561128e57505f5460ff166001145b6112f65760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b5f805460ff191660011790558015611317575f805461ff0019166101001790555b6001600160a01b03821661133e576040516339b190bb60e11b815260040160405180910390fd5b603380546001600160a01b0319166001600160a01b0384161790558015610ee6575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15050565b6033546001600160a01b031633146113cc5760405163719f370360e11b815260040160405180910390fd5b603e54604080516001600160a01b03928316815291831660208301527ffb8129080a19d34dceac04ba253fc50304dc86c729bd63cdca4a969ad19a5eac910160405180910390a1603e80546001600160a01b0319166001600160a01b0392909216919091179055565b6033546001600160a01b031633146114605760405163719f370360e11b815260040160405180910390fd5b604051635ac86ab760e01b8152600560048201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635ac86ab790602401602060405180830381865afa1580156114c6573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114ea91906135d1565b156115085760405163840a48d560e01b815260040160405180910390fd5b825184511461152a576040516343714afd60e01b815260040160405180910390fd5b5f5b845181101561158d576115858385838151811061154b5761154b613673565b602002602001015187848151811061156557611565613673565b60200260200101516001600160a01b03166123c69092919063ffffffff16565b60010161152c565b5050505050565b604051635ac86ab760e01b8152600760048201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635ac86ab790602401602060405180830381865afa1580156115fa573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061161e91906135d1565b1561163c5760405163840a48d560e01b815260040160405180910390fd5b603a54600160401b90046001600160401b03165f81900361167057604051631a544f4960e01b815260040160405180910390fd5b6040805160a081018252603c54808252603d5462ffffff811660208401526001600160401b0363010000008204811694840194909452600160581b810460070b6060840152600160981b90049092166080820152906116cf9087612418565b5f805b8581101561193857368787838181106116ed576116ed613673565b90506020028101906116ff9190613832565b80355f908152603660209081526040808320815160808101835281546001600160401b038082168352600160401b8204811695830195909552600160801b8104909416928101929092529394509192906060830190600160c01b900460ff16600281111561176f5761176f61321c565b60028111156117805761178061321c565b905250905060018160600151600281111561179d5761179d61321c565b146117a9575050611930565b856001600160401b031681604001516001600160401b0316106117cd575050611930565b5f80806117dd848a8f35886124c9565b60208b01805193965091945092506117f482613850565b62ffffff1690525060808801805184919061181090839061386d565b6001600160401b031690525060608801805183919061183090839061388c565b60070b905250611840818861386d565b85355f908152603660209081526040918290208751815492890151938901516001600160401b03908116600160801b0267ffffffffffffffff60801b19958216600160401b026001600160801b0319909516919092161792909217928316821781556060880151939a50879390929091839160ff60c01b1990911668ffffffffffffffffff60801b1990911617600160c01b8360028111156118e4576118e461321c565b021790555050845160405164ffffffffff90911691506001600160401b038b16907fa91c59033c3423e18b54d0acecebb4972f9ea95aedf5f4cae3b677b02eaf3a3f905f90a350505050505b6001016116d2565b506001600160401b038084165f908152603b60205260408120805484939192916119649185911661386d565b92506101000a8154816001600160401b0302191690836001600160401b03160217905550610949826125ec565b5f815f815181106119a4576119a4613673565b60200260200101519050919050565b5f816003815181106119c7576119c7613673565b60200260200101515f5f1b14159050919050565b6119e7600360206136d2565b6119f46020830183613631565b905014611a14576040516313717da960e21b815260040160405180910390fd5b611a63611a246020830183613631565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152508692505084359050600361281b565b610ee6576040516309bde33960e01b815260040160405180910390fd5b60088414611aa15760405163200591bd60e01b815260040160405180910390fd5b6005611aaf602860016136bf565b611ab991906136bf565b611ac49060206136d2565b8214611ae3576040516313717da960e21b815260040160405180910390fd5b5f611b1f8686808060200260200160405190810160405280939291908181526020018383602002808284375f9201919091525061283292505050565b90505f64ffffffffff8316611b36602860016136bf565b600b901b179050611b8085858080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152508c925086915085905061281b565b611b9d576040516309bde33960e01b815260040160405180910390fd5b5050505050505050565b603a54600160401b90046001600160401b031615611bd75760405162be9bc360e81b815260040160405180910390fd5b603a546001600160401b03428116911603611c05576040516367db5b8b60e01b815260040160405180910390fd5b6034545f906001600160401b0316611c21633b9aca0047613800565b611c2b9190613813565b9050818015611c4157506001600160401b038116155b15611c5f576040516332dea95960e21b815260040160405180910390fd5b5f6040518060a00160405280611c7442610c3c565b815260395462ffffff1660208201526001600160401b0380851660408301525f60608301819052608090920191909152603a805442909216600160401b026fffffffffffffffff0000000000000000199092169190911790559050611cd8816125ec565b805160208083015160405162ffffff90911681526001600160401b034216917f575796133bbed337e5b39aa49a30dc2556a91e0c6c2af4b7b886ae77ebef1076910160405180910390a3505050565b5f5f611d648484808060200260200160405190810160405280939291908181526020018383602002808284375f9201919091525061199192505050565b5f818152603660209081526040808320815160808101835281546001600160401b038082168352600160401b8204811695830195909552600160801b8104909416928101929092529394509192906060830190600160c01b900460ff166002811115611dd257611dd261321c565b6002811115611de357611de361321c565b90525090505f81606001516002811115611dff57611dff61321c565b14611e1d576040516335e09e9d60e01b815260040160405180910390fd5b6001600160401b038016611e628686808060200260200160405190810160405280939291908181526020018383602002808284375f92019190915250612ac292505050565b6001600160401b031603611e8957604051631958236d60e21b815260040160405180910390fd5b6001600160401b038016611ece8686808060200260200160405190810160405280939291908181526020018383602002808284375f92019190915250612ae692505050565b6001600160401b031614611ef557604051632eade63760e01b815260040160405180910390fd5b611efd61226d565b611f06906138bb565b611f418686808060200260200160405190810160405280939291908181526020018383602002808284375f92019190915250612afd92505050565b14611f5f57604051633772dd5360e11b815260040160405180910390fd5b5f611f9b8686808060200260200160405190810160405280939291908181526020018383602002808284375f92019190915250612b1192505050565b9050611fab8a87878b8b8e611a80565b60398054905f611fba836138de565b9091555050603a545f90600160401b90046001600160401b031615611ff157603a54600160401b90046001600160401b0316611ffe565b603a546001600160401b03165b6040805160808101825264ffffffffff8d1681526001600160401b03858116602083015283169181019190915290915060608101600190525f858152603660209081526040918290208351815492850151938501516001600160401b03908116600160801b0267ffffffffffffffff60801b19958216600160401b026001600160801b031990951691909216179290921792831682178155606084015190929091839160ff60c01b1990911668ffffffffffffffffff60801b1990911617600160c01b8360028111156120d3576120d361321c565b021790555050603d80548492506013906120fe908490600160981b90046001600160401b031661386d565b92506101000a8154816001600160401b0302191690836001600160401b031602179055507f2d0800bbc377ea54a08c5db6a87aafff5e3e9c8fead0eda110e40e0c104414498a60405161215e919064ffffffffff91909116815260200190565b60405180910390a16040805164ffffffffff8c1681526001600160401b03838116602083015284168183015290517f0e5fac175b83177cc047381e030d8fb3b42b37bd1c025e22c280facad62c32df9181900360600190a16121cd633b9aca006001600160401b0384166136d2565b9b9a5050505050505050505050565b5f81516030146121ff57604051634f88323960e11b815260040160405180910390fd5b6040516002906122159084905f906020016138f6565b60408051601f198184030181529082905261222f91613713565b602060405180830381855afa15801561224a573d5f5f3e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610c36919061371e565b60408051600160f81b60208201525f602182015230606090811b6bffffffffffffffffffffffff1916602c8301529101604051602081830303815290604052905090565b804710156123015760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e636500000060448201526064016112ed565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f811461234a576040519150601f19603f3d011682016040523d82523d5f602084013e61234f565b606091505b50509050806112525760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d6179206861766520726576657274656400000000000060648201526084016112ed565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052611252908490612b28565b612424600560036136bf565b61242f9060206136d2565b61243c6020830183613631565b90501461245c576040516313717da960e21b815260040160405180910390fd5b606c6124ac61246e6020840184613631565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525087925050853590508461281b565b611252576040516309bde33960e01b815260040160405180910390fd5b83516020850151905f908190816124e1878388612bfb565b9050846001600160401b0316816001600160401b03161461255b57612506858261391a565b6040805164ffffffffff851681526001600160401b038b8116602083015284168183015290519195507f0e5fac175b83177cc047381e030d8fb3b42b37bd1c025e22c280facad62c32df919081900360600190a15b6001600160401b0380821660208b0181905290891660408b01525f036125e05760398054905f61258a83613949565b9091555050600260608a015261259f8461395e565b92508164ffffffffff16886001600160401b03167f2a02361ffa66cf2c2da4682c2355a6adcaa9f6c227b6e6563e68480f9587626a60405160405180910390a35b50509450945094915050565b602081015162ffffff161561268c578051603c556020810151603d80546040840151606085015160809095015162ffffff9094166affffffffffffffffffffff199092169190911763010000006001600160401b0392831602176fffffffffffffffffffffffffffffffff60581b1916600160581b9482169490940267ffffffffffffffff60981b191693909317600160981b9390921692909202179055565b60808101516034545f916126a8916001600160401b031661386d565b90505f826060015183604001516126bf919061388c565b60408401516034805492935090915f906126e39084906001600160401b031661386d565b82546101009290920a6001600160401b03818102199093169183160217909155603a8054600160401b810483166001600160801b03199091161790555f915061273390633b9aca009085166136d2565b90505f612748633b9aca00600785900b613983565b603a546040518281529192506001600160401b0316907f525408c201bc1576eb44116f6478f1c2a54775b19a043bcfdc708364f74f8e449060200160405180910390a260335460405163a1ca780b60e01b81526001600160a01b03918216600482015260248101849052604481018390527f00000000000000000000000000000000000000000000000000000000000000009091169063a1ca780b906064015f604051808303815f87803b1580156127fe575f5ffd5b505af1158015612810573d5f5f3e3d5ffd5b505050505050505050565b5f83612828868585612cd9565b1495945050505050565b5f5f600283516128429190613800565b90505f816001600160401b0381111561285d5761285d6133c8565b604051908082528060200260200182016040528015612886578160200160208202803683370190505b5090505f5b82811015612980576002856128a083836136d2565b815181106128b0576128b0613673565b6020026020010151868360026128c691906136d2565b6128d19060016136bf565b815181106128e1576128e1613673565b6020026020010151604051602001612903929190918252602082015260400190565b60408051601f198184030181529082905261291d91613713565b602060405180830381855afa158015612938573d5f5f3e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061295b919061371e565b82828151811061296d5761296d613673565b602090810291909101015260010161288b565b5061298c600283613800565b91505b8115612a9f575f5b82811015612a8c576002826129ac83836136d2565b815181106129bc576129bc613673565b6020026020010151838360026129d291906136d2565b6129dd9060016136bf565b815181106129ed576129ed613673565b6020026020010151604051602001612a0f929190918252602082015260400190565b60408051601f1981840301815290829052612a2991613713565b602060405180830381855afa158015612a44573d5f5f3e3d5ffd5b5050506040513d601f19601f82011682018060405250810190612a67919061371e565b828281518110612a7957612a79613673565b6020908102919091010152600101612997565b50612a98600283613800565b915061298f565b805f81518110612ab157612ab1613673565b602002602001015192505050919050565b5f610c3682600581518110612ad957612ad9613673565b6020026020010151612dad565b5f610c3682600681518110612ad957612ad9613673565b5f816001815181106119a4576119a4613673565b5f610c3682600281518110612ad957612ad9613673565b5f612b7c826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316612e149092919063ffffffff16565b905080515f1480612b9c575080806020019051810190612b9c91906135d1565b6112525760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016112ed565b5f612c08602660016136bf565b612c139060206136d2565b612c206040840184613631565b905014612c40576040516313717da960e21b815260040160405180910390fd5b5f612c4c6004856139b2565b64ffffffffff169050612ca5612c656040850185613631565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250899250505060208601358461281b565b612cc2576040516309bde33960e01b815260040160405180910390fd5b612cd0836020013585612e22565b95945050505050565b5f83515f14158015612cf6575060208451612cf491906139db565b155b612d13576040516313717da960e21b815260040160405180910390fd5b604080516020808201909252848152905b85518111612da357612d376002856139db565b5f03612d695781515f528086015160205260208260405f60026107d05a03fa612d5e575f5ffd5b600284049350612d91565b808601515f52815160205260208260405f60026107d05a03fa612d8a575f5ffd5b6002840493505b612d9c6020826136bf565b9050612d24565b5051949350505050565b60f881901c60e882901c61ff00161760d882901c62ff0000161760c882901c63ff000000161764ff0000000060b883901c161765ff000000000060a883901c161766ff000000000000609883901c161767ff0000000000000060889290921c919091161790565b6060610d4284845f85612e4e565b5f80612e2f6004846139ee565b612e3a906040613a17565b64ffffffffff169050610d4284821b612dad565b606082471015612eaf5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b60648201526084016112ed565b5f5f866001600160a01b03168587604051612eca9190613713565b5f6040518083038185875af1925050503d805f8114612f04576040519150601f19603f3d011682016040523d82523d5f602084013e612f09565b606091505b5091509150612f1a87838387612f25565b979650505050505050565b60608315612f935782515f03612f8c576001600160a01b0385163b612f8c5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016112ed565b5081610d42565b610d428383815115612fa85781518083602001fd5b8060405162461bcd60e51b81526004016112ed9190613a37565b80356001600160401b0381168114612fd8575f5ffd5b919050565b5f60408284031215612fed575f5ffd5b50919050565b5f5f5f60608486031215613005575f5ffd5b61300e84612fc2565b925060208401356001600160401b03811115613028575f5ffd5b61303486828701612fdd565b92505060408401356001600160401b0381111561304f575f5ffd5b61305b86828701612fdd565b9150509250925092565b5f5f83601f840112613075575f5ffd5b5081356001600160401b0381111561308b575f5ffd5b6020830191508360208260051b85010111156130a5575f5ffd5b9250929050565b5f5f5f5f5f5f5f5f60a0898b0312156130c3575f5ffd5b6130cc89612fc2565b975060208901356001600160401b038111156130e6575f5ffd5b6130f28b828c01612fdd565b97505060408901356001600160401b0381111561310d575f5ffd5b6131198b828c01613065565b90975095505060608901356001600160401b03811115613137575f5ffd5b6131438b828c01613065565b90955093505060808901356001600160401b03811115613161575f5ffd5b61316d8b828c01613065565b999c989b5096995094979396929594505050565b5f60208284031215613191575f5ffd5b61319a82612fc2565b9392505050565b5f5f83601f8401126131b1575f5ffd5b5081356001600160401b038111156131c7575f5ffd5b6020830191508360208285010111156130a5575f5ffd5b5f5f602083850312156131ef575f5ffd5b82356001600160401b03811115613204575f5ffd5b613210858286016131a1565b90969095509350505050565b634e487b7160e01b5f52602160045260245ffd5b6003811061324c57634e487b7160e01b5f52602160045260245ffd5b9052565b60208101610c368284613230565b5f6020828403121561326e575f5ffd5b5035919050565b5f6080820190506001600160401b0383511682526001600160401b0360208401511660208301526001600160401b03604084015116604083015260608301516132c16060840182613230565b5092915050565b80151581146132d5575f5ffd5b50565b5f602082840312156132e8575f5ffd5b813561319a816132c8565b5f5f5f5f5f60608688031215613307575f5ffd5b85356001600160401b0381111561331c575f5ffd5b613328888289016131a1565b90965094505060208601356001600160401b03811115613346575f5ffd5b613352888289016131a1565b96999598509660400135949350505050565b6001600160a01b03811681146132d5575f5ffd5b8035612fd881613364565b5f5f60408385031215613394575f5ffd5b823561339f81613364565b946020939093013593505050565b5f602082840312156133bd575f5ffd5b813561319a81613364565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f191681016001600160401b0381118282101715613404576134046133c8565b604052919050565b5f6001600160401b03821115613424576134246133c8565b5060051b60200190565b5f82601f83011261343d575f5ffd5b813561345061344b8261340c565b6133dc565b8082825260208201915060208360051b860101925085831115613471575f5ffd5b602085015b8381101561348e578035835260209283019201613476565b5095945050505050565b5f5f5f606084860312156134aa575f5ffd5b83356001600160401b038111156134bf575f5ffd5b8401601f810186136134cf575f5ffd5b80356134dd61344b8261340c565b8082825260208201915060208360051b8501019250888311156134fe575f5ffd5b6020840193505b8284101561352957833561351881613364565b825260209384019390910190613505565b955050505060208401356001600160401b03811115613546575f5ffd5b6135528682870161342e565b92505061356160408501613378565b90509250925092565b5f5f5f6040848603121561357c575f5ffd5b83356001600160401b03811115613591575f5ffd5b61359d86828701612fdd565b93505060208401356001600160401b038111156135b8575f5ffd5b6135c486828701613065565b9497909650939450505050565b5f602082840312156135e1575f5ffd5b815161319a816132c8565b5f5f8335601e19843603018112613601575f5ffd5b8301803591506001600160401b0382111561361a575f5ffd5b6020019150600581901b36038213156130a5575f5ffd5b5f5f8335601e19843603018112613646575f5ffd5b8301803591506001600160401b0382111561365f575f5ffd5b6020019150368190038213156130a5575f5ffd5b634e487b7160e01b5f52603260045260245ffd5b5f60208284031215613697575f5ffd5b813564ffffffffff8116811461319a575f5ffd5b634e487b7160e01b5f52601160045260245ffd5b80820180821115610c3657610c366136ab565b8082028115828204841417610c3657610c366136ab565b81810381811115610c3657610c366136ab565b5f81518060208401855e5f93019283525090919050565b5f61319a82846136fc565b5f6020828403121561372e575f5ffd5b5051919050565b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b608081525f61379e60808301888a613735565b82810360208401526137b0818861375d565b905082810360408401526137c5818688613735565b915050826060830152979650505050505050565b602081525f610d42602083018486613735565b634e487b7160e01b5f52601260045260245ffd5b5f8261380e5761380e6137ec565b500490565b6001600160401b038281168282160390811115610c3657610c366136ab565b5f8235605e19833603018112613846575f5ffd5b9190910192915050565b5f62ffffff821680613864576138646136ab565b5f190192915050565b6001600160401b038181168382160190811115610c3657610c366136ab565b600781810b9083900b01677fffffffffffffff8113677fffffffffffffff1982121715610c3657610c366136ab565b80516020808301519190811015612fed575f1960209190910360031b1b16919050565b5f600182016138ef576138ef6136ab565b5060010190565b5f61390182856136fc565b6001600160801b03199390931683525050601001919050565b600782810b9082900b03677fffffffffffffff198112677fffffffffffffff82131715610c3657610c366136ab565b5f81613957576139576136ab565b505f190190565b5f8160070b677fffffffffffffff19810361397b5761397b6136ab565b5f0392915050565b8082025f8212600160ff1b8414161561399e5761399e6136ab565b8181058314821517610c3657610c366136ab565b5f64ffffffffff8316806139c8576139c86137ec565b8064ffffffffff84160491505092915050565b5f826139e9576139e96137ec565b500690565b5f64ffffffffff831680613a0457613a046137ec565b8064ffffffffff84160691505092915050565b64ffffffffff81811683821602908116908181146132c1576132c16136ab565b602081525f61319a602083018461375d56fea2646970667358221220e0bd062ebd23c46fb6b2fc3f9c259882aac254262e5eea0343761357f4d9595264736f6c634300081b0033", } // 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 7f33610521..8af51abafd 100644 --- a/pkg/bindings/EigenPodManager/binding.go +++ b/pkg/bindings/EigenPodManager/binding.go @@ -32,7 +32,7 @@ var ( // EigenPodManagerMetaData contains all meta data concerning the EigenPodManager contract. var EigenPodManagerMetaData = &bind.MetaData{ ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"_ethPOS\",\"type\":\"address\",\"internalType\":\"contractIETHPOSDeposit\"},{\"name\":\"_eigenPodBeacon\",\"type\":\"address\",\"internalType\":\"contractIBeacon\"},{\"name\":\"_delegationManager\",\"type\":\"address\",\"internalType\":\"contractIDelegationManager\"},{\"name\":\"_pauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"addShares\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"shares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"beaconChainETHStrategy\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"beaconChainSlashingFactor\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"burnableETHShares\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"createPod\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"delegationManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIDelegationManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"eigenPodBeacon\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIBeacon\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"ethPOS\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIETHPOSDeposit\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getPod\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIEigenPod\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"hasPod\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"increaseBurnableShares\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"addedSharesToBurn\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"initialOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_initPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"numPods\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"ownerToPod\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIEigenPod\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"pauseAll\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[{\"name\":\"index\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pauserRegistry\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"podOwnerDepositShares\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"shares\",\"type\":\"int256\",\"internalType\":\"int256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"recordBeaconChainETHBalanceUpdate\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"prevRestakedBalanceWei\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"balanceDeltaWei\",\"type\":\"int256\",\"internalType\":\"int256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"removeDepositShares\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"depositSharesToRemove\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"stake\",\"inputs\":[{\"name\":\"pubkey\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"depositDataRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"stakerDepositShares\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"depositShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"withdrawSharesAsTokens\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"shares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"BeaconChainETHDeposited\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BeaconChainETHWithdrawalCompleted\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"shares\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"nonce\",\"type\":\"uint96\",\"indexed\":false,\"internalType\":\"uint96\"},{\"name\":\"delegatedAddress\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"withdrawer\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"withdrawalRoot\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BeaconChainSlashingFactorDecreased\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"prevBeaconChainSlashingFactor\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"newBeaconChainSlashingFactor\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BurnableETHSharesIncreased\",\"inputs\":[{\"name\":\"shares\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"NewTotalShares\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newTotalShares\",\"type\":\"int256\",\"indexed\":false,\"internalType\":\"int256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"PodDeployed\",\"inputs\":[{\"name\":\"eigenPod\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"podOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"PodSharesUpdated\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"sharesDelta\",\"type\":\"int256\",\"indexed\":false,\"internalType\":\"int256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"CurrentlyPaused\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"EigenPodAlreadyExists\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InputAddressZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidNewPausedStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidStrategy\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"LegacyWithdrawalsNotCompleted\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyDelegationManager\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyEigenPod\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyPauser\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyUnpauser\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SharesNegative\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SharesNotMultipleOfGwei\",\"inputs\":[]}]", - Bin: "0x610100604052348015610010575f5ffd5b50604051612a80380380612a8083398101604081905261002f9161015c565b838383836001600160a01b03811661005a576040516339b190bb60e11b815260040160405180910390fd5b6001600160a01b0390811660805292831660a05290821660c0521660e052610080610089565b505050506101b8565b5f54610100900460ff16156100f45760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff90811614610143575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b0381168114610159575f5ffd5b50565b5f5f5f5f6080858703121561016f575f5ffd5b845161017a81610145565b602086015190945061018b81610145565b604086015190935061019c81610145565b60608601519092506101ad81610145565b939692955090935050565b60805160a05160c05160e0516128486102385f395f8181610530015281816106dd0152818161092501528181610a8101528181610df801528181610ea5015261116c01525f81816101f001528181610f6b015261167001525f61033701525f818161037e01528181610612015281816109cb015261127201526128485ff3fe6080604052600436106101ba575f3560e01c80639b4e4634116100f2578063d48e889411610092578063f5d4fed311610062578063f5d4fed314610571578063f6848d2414610586578063fabc1cbc146105bf578063fe243a17146105de575f5ffd5b8063d48e8894146104d5578063debe1eab14610500578063ea4d3c9b1461051f578063f2fde38b14610552575f5ffd5b8063a38406a3116100cd578063a38406a31461044a578063a3d75e0914610469578063a6a509be146104a1578063cd6dc687146104b6575f5ffd5b80639b4e4634146103e45780639ba06275146103f7578063a1ca780b1461042b575f5ffd5b8063715018a61161015d57806384d810621161013857806384d8106214610359578063886f11951461036d5780638da5cb5b146103a05780639104c319146103bd575f5ffd5b8063715018a6146102f3578063724af4231461030757806374cdd79814610326575f5ffd5b806350ff72251161019857806350ff72251461024e578063595c6a67146102825780635ac86ab7146102965780635c975abb146102d5575f5ffd5b8063136439dd146101be578063292b7b2b146101df5780632eae418c1461022f575b5f5ffd5b3480156101c9575f5ffd5b506101dd6101d8366004611af4565b6105fd565b005b3480156101ea575f5ffd5b506102127f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020015b60405180910390f35b34801561023a575f5ffd5b506101dd610249366004611b1f565b6106d2565b348015610259575f5ffd5b5061026d610268366004611b6d565b610918565b60408051928352602083019190915201610226565b34801561028d575f5ffd5b506101dd6109b6565b3480156102a1575f5ffd5b506102c56102b0366004611bab565b606654600160ff9092169190911b9081161490565b6040519015158152602001610226565b3480156102e0575f5ffd5b506066545b604051908152602001610226565b3480156102fe575f5ffd5b506101dd610a65565b348015610312575f5ffd5b506101dd610321366004611b6d565b610a76565b348015610331575f5ffd5b506102127f000000000000000000000000000000000000000000000000000000000000000081565b348015610364575f5ffd5b50610212610b9c565b348015610378575f5ffd5b506102127f000000000000000000000000000000000000000000000000000000000000000081565b3480156103ab575f5ffd5b506033546001600160a01b0316610212565b3480156103c8575f5ffd5b5061021273beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac081565b6101dd6103f2366004611c09565b610c0c565b348015610402575f5ffd5b50610212610411366004611c7c565b60986020525f90815260409020546001600160a01b031681565b348015610436575f5ffd5b506101dd610445366004611c97565b610cc9565b348015610455575f5ffd5b50610212610464366004611c7c565b610f11565b348015610474575f5ffd5b50610488610483366004611c7c565b610fe2565b60405167ffffffffffffffff9091168152602001610226565b3480156104ac575f5ffd5b506102e560995481565b3480156104c1575f5ffd5b506101dd6104d0366004611cc9565b611045565b3480156104e0575f5ffd5b506102e56104ef366004611c7c565b609b6020525f908152604090205481565b34801561050b575f5ffd5b506101dd61051a366004611cc9565b611161565b34801561052a575f5ffd5b506102127f000000000000000000000000000000000000000000000000000000000000000081565b34801561055d575f5ffd5b506101dd61056c366004611c7c565b6111f7565b34801561057c575f5ffd5b506102e5609e5481565b348015610591575f5ffd5b506102c56105a0366004611c7c565b6001600160a01b039081165f9081526098602052604090205416151590565b3480156105ca575f5ffd5b506101dd6105d9366004611af4565b611270565b3480156105e9575f5ffd5b506102e56105f8366004611cf3565b611386565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa15801561065f573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106839190611d2a565b6106a057604051631d77d47760e21b815260040160405180910390fd5b60665481811681146106c55760405163c61dca5d60e01b815260040160405180910390fd5b6106ce82611406565b5050565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461071b5760405163f739589b60e01b815260040160405180910390fd5b6001600160a01b03831673beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac01461075857604051632711b74d60e11b815260040160405180910390fd5b6001600160a01b03841661077f576040516339b190bb60e11b815260040160405180910390fd5b5f811361079f5760405163ef147de160e01b815260040160405180910390fd5b6001600160a01b0384165f908152609b6020526040812054908290821215610899575f6107cb83611d5d565b90505f818511156107e95750806107e28186611d77565b92506107ef565b505f9150835b5f6107fa8286611d8a565b6001600160a01b038a165f818152609b60205260409081902083905551919250907f4e2b791dedccd9fb30141b088cabf5c14a8912b52f59375c95c010700b8c61939061084a9085815260200190565b60405180910390a2886001600160a01b03167fd4def76d6d2bed6f14d5cd9af73cc2913d618d00edde42432e81c09bfe0770988260405161088d91815260200190565b60405180910390a25050505b8015610910576001600160a01b038681165f81815260986020526040908190205490516362483a2160e11b81526004810192909252602482018490529091169063c4907442906044015f604051808303815f87803b1580156108f9575f5ffd5b505af115801561090b573d5f5f3e3d5ffd5b505050505b505050505050565b5f80336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146109635760405163f739589b60e01b815260040160405180910390fd5b6001600160a01b03841673beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac0146109a057604051632711b74d60e11b815260040160405180910390fd5b6109aa8584611443565b91509150935093915050565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa158015610a18573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a3c9190611d2a565b610a5957604051631d77d47760e21b815260040160405180910390fd5b610a635f19611406565b565b610a6d611580565b610a635f6115da565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610abf5760405163f739589b60e01b815260040160405180910390fd5b6001600160a01b03821673beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac014610afc57604051632711b74d60e11b815260040160405180910390fd5b6001600160a01b0383165f908152609b6020526040812054610b1f908390611db1565b90505f811215610b425760405163ef147de160e01b815260040160405180910390fd5b6001600160a01b0384165f818152609b602052604090819020839055517fd4def76d6d2bed6f14d5cd9af73cc2913d618d00edde42432e81c09bfe07709890610b8e9084815260200190565b60405180910390a250505050565b6066545f908190600190811603610bc65760405163840a48d560e01b815260040160405180910390fd5b335f908152609860205260409020546001600160a01b031615610bfc5760405163031a852160e21b815260040160405180910390fd5b5f610c0561162b565b9250505090565b6066545f90600190811603610c345760405163840a48d560e01b815260040160405180910390fd5b335f908152609860205260409020546001600160a01b031680610c5c57610c5961162b565b90505b6040516326d3918d60e21b81526001600160a01b03821690639b4e4634903490610c92908b908b908b908b908b90600401611dff565b5f604051808303818588803b158015610ca9575f5ffd5b505af1158015610cbb573d5f5f3e3d5ffd5b505050505050505050505050565b6001600160a01b038084165f908152609860205260409020548491163314610d04576040516312e16d7160e11b815260040160405180910390fd5b610d0c611786565b6001600160a01b038416610d33576040516339b190bb60e11b815260040160405180910390fd5b610d41633b9aca0083611e4c565b15610d5f576040516347d072bb60e11b815260040160405180910390fd5b6001600160a01b0384165f908152609b602052604081205490811215610d9857604051634b692bcf60e01b815260040160405180910390fd5b5f8312610e58575f5f610dab8786611443565b604051631e328e7960e11b81526001600160a01b038a8116600483015273beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac0602483015260448201849052606482018390529294509092507f000000000000000000000000000000000000000000000000000000000000000090911690633c651cf2906084015f604051808303815f87803b158015610e3b575f5ffd5b505af1158015610e4d573d5f5f3e3d5ffd5b505050505050610f00565b5f610e6c8686610e6787611d5d565b6117df565b60405163305068e760e11b81526001600160a01b0388811660048301526024820185905267ffffffffffffffff831660448301529192507f0000000000000000000000000000000000000000000000000000000000000000909116906360a0d1ce906064015f604051808303815f87803b158015610ee8575f5ffd5b505af1158015610efa573d5f5f3e3d5ffd5b50505050505b50610f0b600160c955565b50505050565b6001600160a01b038082165f9081526098602052604081205490911680610fdc57610fd9836001600160a01b03165f1b60405180610940016040528061090e8152602001611f0561090e9139604080516001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000166020820152808201919091525f606082015260800160408051601f1981840301815290829052610fbe9291602001611e82565b604051602081830303815290604052805190602001206118d8565b90505b92915050565b6001600160a01b0381165f908152609d6020908152604080832081518083019092525460ff8116151580835261010090910467ffffffffffffffff16928201929092529061103857670de0b6b3a764000061103e565b80602001515b9392505050565b5f54610100900460ff161580801561106357505f54600160ff909116105b8061107c5750303b15801561107c57505f5460ff166001145b6110e45760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b5f805460ff191660011790558015611105575f805461ff0019166101001790555b61110e836115da565b61111782611406565b801561115c575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146111aa5760405163f739589b60e01b815260040160405180910390fd5b80609e5f8282546111bb9190611e9e565b90915550506040518181527f1ed04b7fd262c0d9e50fa02957f32a81a151f03baaa367faeedc7521b001c4a49060200160405180910390a15050565b6111ff611580565b6001600160a01b0381166112645760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016110db565b61126d816115da565b50565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156112cc573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906112f09190611eb1565b6001600160a01b0316336001600160a01b0316146113215760405163794821ff60e01b815260040160405180910390fd5b606654801982198116146113485760405163c61dca5d60e01b815260040160405180910390fd5b606682905560405182815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c9060200160405180910390a25050565b5f6001600160a01b03821673beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac0146113c457604051632711b74d60e11b815260040160405180910390fd5b6001600160a01b0383165f908152609b6020526040812054126113fe576001600160a01b0383165f908152609b6020526040902054610fd9565b505f92915050565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a250565b5f806001600160a01b03841661146c576040516339b190bb60e11b815260040160405180910390fd5b5f83121561148d5760405163ef147de160e01b815260040160405180910390fd5b6001600160a01b0384165f908152609b602052604081205484916114b18383611d8a565b6001600160a01b0388165f818152609b60205260409081902083905551919250907f4e2b791dedccd9fb30141b088cabf5c14a8912b52f59375c95c010700b8c6193906115019086815260200190565b60405180910390a2866001600160a01b03167fd4def76d6d2bed6f14d5cd9af73cc2913d618d00edde42432e81c09bfe0770988260405161154491815260200190565b60405180910390a25f8113611561575f5f94509450505050611579565b5f821261156e5781611570565b5f5b86945094505050505b9250929050565b6033546001600160a01b03163314610a635760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016110db565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b5f60995f815461163a90611ecc565b9091555060408051610940810190915261090e8082525f916116d79183913391611f056020830139604080516001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000166020820152808201919091525f606082015260800160408051601f19818403018152908290526116c39291602001611e82565b6040516020818303038152906040526118e4565b60405163189acdbd60e31b81523360048201529091506001600160a01b0382169063c4d66de8906024015f604051808303815f87803b158015611718575f5ffd5b505af115801561172a573d5f5f3e3d5ffd5b5050335f8181526098602052604080822080546001600160a01b0319166001600160a01b038816908117909155905192945092507f21c99d0db02213c32fff5b05cf0a718ab5f858802b91498f80d82270289d856a91a3919050565b600260c954036117d85760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016110db565b600260c955565b5f806117eb8385611d77565b90505f6117f786610fe2565b90505f61180f67ffffffffffffffff831684886119e6565b90505f61181c8284611ee4565b6040805180820182526001815267ffffffffffffffff85811660208084018281526001600160a01b038f165f818152609d845287902095518654925168ffffffffffffffffff1990931690151568ffffffffffffffff001916176101009286169290920291909117909455845193845291881691830191909152918101919091529091507fb160ab8589bf47dc04ea11b50d46678d21590cea2ed3e454e7bd3e41510f98cf9060600160405180910390a1979650505050505050565b5f610fd9838330611acb565b5f834710156119355760405162461bcd60e51b815260206004820152601d60248201527f437265617465323a20696e73756666696369656e742062616c616e636500000060448201526064016110db565b81515f036119855760405162461bcd60e51b815260206004820181905260248201527f437265617465323a2062797465636f6465206c656e677468206973207a65726f60448201526064016110db565b8282516020840186f590506001600160a01b03811661103e5760405162461bcd60e51b815260206004820152601960248201527f437265617465323a204661696c6564206f6e206465706c6f790000000000000060448201526064016110db565b5f80805f19858709858702925082811083820303915050805f03611a1d57838281611a1357611a13611e38565b049250505061103e565b808411611a645760405162461bcd60e51b81526020600482015260156024820152744d6174683a206d756c446976206f766572666c6f7760581b60448201526064016110db565b5f8486880960026001871981018816978890046003810283188082028403028082028403028082028403028082028403028082028403029081029092039091025f889003889004909101858311909403939093029303949094049190911702949350505050565b5f604051836040820152846020820152828152600b8101905060ff815360559020949350505050565b5f60208284031215611b04575f5ffd5b5035919050565b6001600160a01b038116811461126d575f5ffd5b5f5f5f5f60808587031215611b32575f5ffd5b8435611b3d81611b0b565b93506020850135611b4d81611b0b565b92506040850135611b5d81611b0b565b9396929550929360600135925050565b5f5f5f60608486031215611b7f575f5ffd5b8335611b8a81611b0b565b92506020840135611b9a81611b0b565b929592945050506040919091013590565b5f60208284031215611bbb575f5ffd5b813560ff8116811461103e575f5ffd5b5f5f83601f840112611bdb575f5ffd5b50813567ffffffffffffffff811115611bf2575f5ffd5b602083019150836020828501011115611579575f5ffd5b5f5f5f5f5f60608688031215611c1d575f5ffd5b853567ffffffffffffffff811115611c33575f5ffd5b611c3f88828901611bcb565b909650945050602086013567ffffffffffffffff811115611c5e575f5ffd5b611c6a88828901611bcb565b96999598509660400135949350505050565b5f60208284031215611c8c575f5ffd5b813561103e81611b0b565b5f5f5f60608486031215611ca9575f5ffd5b8335611cb481611b0b565b95602085013595506040909401359392505050565b5f5f60408385031215611cda575f5ffd5b8235611ce581611b0b565b946020939093013593505050565b5f5f60408385031215611d04575f5ffd5b8235611d0f81611b0b565b91506020830135611d1f81611b0b565b809150509250929050565b5f60208284031215611d3a575f5ffd5b8151801515811461103e575f5ffd5b634e487b7160e01b5f52601160045260245ffd5b5f600160ff1b8201611d7157611d71611d49565b505f0390565b81810381811115610fdc57610fdc611d49565b8082018281125f831280158216821582161715611da957611da9611d49565b505092915050565b8181035f831280158383131683831282161715611dd057611dd0611d49565b5092915050565b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b606081525f611e12606083018789611dd7565b8281036020840152611e25818688611dd7565b9150508260408301529695505050505050565b634e487b7160e01b5f52601260045260245ffd5b5f82611e6657634e487b7160e01b5f52601260045260245ffd5b500790565b5f81518060208401855e5f93019283525090919050565b5f611e96611e908386611e6b565b84611e6b565b949350505050565b80820180821115610fdc57610fdc611d49565b5f60208284031215611ec1575f5ffd5b815161103e81611b0b565b5f60018201611edd57611edd611d49565b5060010190565b67ffffffffffffffff8281168282160390811115610fdc57610fdc611d4956fe608060405260405161090e38038061090e83398101604081905261002291610460565b61002e82826000610035565b505061058a565b61003e83610100565b6040516001600160a01b038416907f1cf3b03a6cf19fa2baba4df148e9dcabedea7f8a5c07840e207e5c089be95d3e90600090a260008251118061007f5750805b156100fb576100f9836001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156100c5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906100e99190610520565b836102a360201b6100291760201c565b505b505050565b610113816102cf60201b6100551760201c565b6101725760405162461bcd60e51b815260206004820152602560248201527f455243313936373a206e657720626561636f6e206973206e6f74206120636f6e6044820152641d1c9858dd60da1b60648201526084015b60405180910390fd5b6101e6816001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156101b3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101d79190610520565b6102cf60201b6100551760201c565b61024b5760405162461bcd60e51b815260206004820152603060248201527f455243313936373a20626561636f6e20696d706c656d656e746174696f6e206960448201526f1cc81b9bdd08184818dbdb9d1c9858dd60821b6064820152608401610169565b806102827fa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d5060001b6102de60201b6100641760201c565b80546001600160a01b0319166001600160a01b039290921691909117905550565b60606102c883836040518060600160405280602781526020016108e7602791396102e1565b9392505050565b6001600160a01b03163b151590565b90565b6060600080856001600160a01b0316856040516102fe919061053b565b600060405180830381855af49150503d8060008114610339576040519150601f19603f3d011682016040523d82523d6000602084013e61033e565b606091505b5090925090506103508683838761035a565b9695505050505050565b606083156103c65782516103bf576001600160a01b0385163b6103bf5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610169565b50816103d0565b6103d083836103d8565b949350505050565b8151156103e85781518083602001fd5b8060405162461bcd60e51b81526004016101699190610557565b80516001600160a01b038116811461041957600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b60005b8381101561044f578181015183820152602001610437565b838111156100f95750506000910152565b6000806040838503121561047357600080fd5b61047c83610402565b60208401519092506001600160401b038082111561049957600080fd5b818501915085601f8301126104ad57600080fd5b8151818111156104bf576104bf61041e565b604051601f8201601f19908116603f011681019083821181831017156104e7576104e761041e565b8160405282815288602084870101111561050057600080fd5b610511836020830160208801610434565b80955050505050509250929050565b60006020828403121561053257600080fd5b6102c882610402565b6000825161054d818460208701610434565b9190910192915050565b6020815260008251806020840152610576816040850160208701610434565b601f01601f19169190910160400192915050565b61034e806105996000396000f3fe60806040523661001357610011610017565b005b6100115b610027610022610067565b610100565b565b606061004e83836040518060600160405280602781526020016102f260279139610124565b9392505050565b6001600160a01b03163b151590565b90565b600061009a7fa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50546001600160a01b031690565b6001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156100d7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906100fb9190610249565b905090565b3660008037600080366000845af43d6000803e80801561011f573d6000f35b3d6000fd5b6060600080856001600160a01b03168560405161014191906102a2565b600060405180830381855af49150503d806000811461017c576040519150601f19603f3d011682016040523d82523d6000602084013e610181565b606091505b50915091506101928683838761019c565b9695505050505050565b6060831561020d578251610206576001600160a01b0385163b6102065760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064015b60405180910390fd5b5081610217565b610217838361021f565b949350505050565b81511561022f5781518083602001fd5b8060405162461bcd60e51b81526004016101fd91906102be565b60006020828403121561025b57600080fd5b81516001600160a01b038116811461004e57600080fd5b60005b8381101561028d578181015183820152602001610275565b8381111561029c576000848401525b50505050565b600082516102b4818460208701610272565b9190910192915050565b60208152600082518060208401526102dd816040850160208701610272565b601f01601f1916919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220d51e81d3bc5ed20a26aeb05dce7e825c503b2061aa78628027300c8d65b9d89a64736f6c634300080c0033416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a26469706673582212207ccf2a4e7a06c56699b867e6865f6ae21b22c97125b77c5385239c53c6b4be7c64736f6c634300081b0033", + Bin: "0x610100604052348015610010575f5ffd5b50604051612a80380380612a8083398101604081905261002f9161015c565b838383836001600160a01b03811661005a576040516339b190bb60e11b815260040160405180910390fd5b6001600160a01b0390811660805292831660a05290821660c0521660e052610080610089565b505050506101b8565b5f54610100900460ff16156100f45760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff90811614610143575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b0381168114610159575f5ffd5b50565b5f5f5f5f6080858703121561016f575f5ffd5b845161017a81610145565b602086015190945061018b81610145565b604086015190935061019c81610145565b60608601519092506101ad81610145565b939692955090935050565b60805160a05160c05160e0516128486102385f395f8181610530015281816106dd0152818161092501528181610a8101528181610df801528181610ea5015261116c01525f81816101f001528181610f6b015261167001525f61033701525f818161037e01528181610612015281816109cb015261127201526128485ff3fe6080604052600436106101ba575f3560e01c80639b4e4634116100f2578063d48e889411610092578063f5d4fed311610062578063f5d4fed314610571578063f6848d2414610586578063fabc1cbc146105bf578063fe243a17146105de575f5ffd5b8063d48e8894146104d5578063debe1eab14610500578063ea4d3c9b1461051f578063f2fde38b14610552575f5ffd5b8063a38406a3116100cd578063a38406a31461044a578063a3d75e0914610469578063a6a509be146104a1578063cd6dc687146104b6575f5ffd5b80639b4e4634146103e45780639ba06275146103f7578063a1ca780b1461042b575f5ffd5b8063715018a61161015d57806384d810621161013857806384d8106214610359578063886f11951461036d5780638da5cb5b146103a05780639104c319146103bd575f5ffd5b8063715018a6146102f3578063724af4231461030757806374cdd79814610326575f5ffd5b806350ff72251161019857806350ff72251461024e578063595c6a67146102825780635ac86ab7146102965780635c975abb146102d5575f5ffd5b8063136439dd146101be578063292b7b2b146101df5780632eae418c1461022f575b5f5ffd5b3480156101c9575f5ffd5b506101dd6101d8366004611af4565b6105fd565b005b3480156101ea575f5ffd5b506102127f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020015b60405180910390f35b34801561023a575f5ffd5b506101dd610249366004611b1f565b6106d2565b348015610259575f5ffd5b5061026d610268366004611b6d565b610918565b60408051928352602083019190915201610226565b34801561028d575f5ffd5b506101dd6109b6565b3480156102a1575f5ffd5b506102c56102b0366004611bab565b606654600160ff9092169190911b9081161490565b6040519015158152602001610226565b3480156102e0575f5ffd5b506066545b604051908152602001610226565b3480156102fe575f5ffd5b506101dd610a65565b348015610312575f5ffd5b506101dd610321366004611b6d565b610a76565b348015610331575f5ffd5b506102127f000000000000000000000000000000000000000000000000000000000000000081565b348015610364575f5ffd5b50610212610b9c565b348015610378575f5ffd5b506102127f000000000000000000000000000000000000000000000000000000000000000081565b3480156103ab575f5ffd5b506033546001600160a01b0316610212565b3480156103c8575f5ffd5b5061021273beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac081565b6101dd6103f2366004611c09565b610c0c565b348015610402575f5ffd5b50610212610411366004611c7c565b60986020525f90815260409020546001600160a01b031681565b348015610436575f5ffd5b506101dd610445366004611c97565b610cc9565b348015610455575f5ffd5b50610212610464366004611c7c565b610f11565b348015610474575f5ffd5b50610488610483366004611c7c565b610fe2565b60405167ffffffffffffffff9091168152602001610226565b3480156104ac575f5ffd5b506102e560995481565b3480156104c1575f5ffd5b506101dd6104d0366004611cc9565b611045565b3480156104e0575f5ffd5b506102e56104ef366004611c7c565b609b6020525f908152604090205481565b34801561050b575f5ffd5b506101dd61051a366004611cc9565b611161565b34801561052a575f5ffd5b506102127f000000000000000000000000000000000000000000000000000000000000000081565b34801561055d575f5ffd5b506101dd61056c366004611c7c565b6111f7565b34801561057c575f5ffd5b506102e5609e5481565b348015610591575f5ffd5b506102c56105a0366004611c7c565b6001600160a01b039081165f9081526098602052604090205416151590565b3480156105ca575f5ffd5b506101dd6105d9366004611af4565b611270565b3480156105e9575f5ffd5b506102e56105f8366004611cf3565b611386565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa15801561065f573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106839190611d2a565b6106a057604051631d77d47760e21b815260040160405180910390fd5b60665481811681146106c55760405163c61dca5d60e01b815260040160405180910390fd5b6106ce82611406565b5050565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461071b5760405163f739589b60e01b815260040160405180910390fd5b6001600160a01b03831673beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac01461075857604051632711b74d60e11b815260040160405180910390fd5b6001600160a01b03841661077f576040516339b190bb60e11b815260040160405180910390fd5b5f811361079f5760405163ef147de160e01b815260040160405180910390fd5b6001600160a01b0384165f908152609b6020526040812054908290821215610899575f6107cb83611d5d565b90505f818511156107e95750806107e28186611d77565b92506107ef565b505f9150835b5f6107fa8286611d8a565b6001600160a01b038a165f818152609b60205260409081902083905551919250907f4e2b791dedccd9fb30141b088cabf5c14a8912b52f59375c95c010700b8c61939061084a9085815260200190565b60405180910390a2886001600160a01b03167fd4def76d6d2bed6f14d5cd9af73cc2913d618d00edde42432e81c09bfe0770988260405161088d91815260200190565b60405180910390a25050505b8015610910576001600160a01b038681165f81815260986020526040908190205490516362483a2160e11b81526004810192909252602482018490529091169063c4907442906044015f604051808303815f87803b1580156108f9575f5ffd5b505af115801561090b573d5f5f3e3d5ffd5b505050505b505050505050565b5f80336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146109635760405163f739589b60e01b815260040160405180910390fd5b6001600160a01b03841673beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac0146109a057604051632711b74d60e11b815260040160405180910390fd5b6109aa8584611443565b91509150935093915050565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa158015610a18573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a3c9190611d2a565b610a5957604051631d77d47760e21b815260040160405180910390fd5b610a635f19611406565b565b610a6d611580565b610a635f6115da565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610abf5760405163f739589b60e01b815260040160405180910390fd5b6001600160a01b03821673beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac014610afc57604051632711b74d60e11b815260040160405180910390fd5b6001600160a01b0383165f908152609b6020526040812054610b1f908390611db1565b90505f811215610b425760405163ef147de160e01b815260040160405180910390fd5b6001600160a01b0384165f818152609b602052604090819020839055517fd4def76d6d2bed6f14d5cd9af73cc2913d618d00edde42432e81c09bfe07709890610b8e9084815260200190565b60405180910390a250505050565b6066545f908190600190811603610bc65760405163840a48d560e01b815260040160405180910390fd5b335f908152609860205260409020546001600160a01b031615610bfc5760405163031a852160e21b815260040160405180910390fd5b5f610c0561162b565b9250505090565b6066545f90600190811603610c345760405163840a48d560e01b815260040160405180910390fd5b335f908152609860205260409020546001600160a01b031680610c5c57610c5961162b565b90505b6040516326d3918d60e21b81526001600160a01b03821690639b4e4634903490610c92908b908b908b908b908b90600401611dff565b5f604051808303818588803b158015610ca9575f5ffd5b505af1158015610cbb573d5f5f3e3d5ffd5b505050505050505050505050565b6001600160a01b038084165f908152609860205260409020548491163314610d04576040516312e16d7160e11b815260040160405180910390fd5b610d0c611786565b6001600160a01b038416610d33576040516339b190bb60e11b815260040160405180910390fd5b610d41633b9aca0083611e4c565b15610d5f576040516347d072bb60e11b815260040160405180910390fd5b6001600160a01b0384165f908152609b602052604081205490811215610d9857604051634b692bcf60e01b815260040160405180910390fd5b5f8312610e58575f5f610dab8786611443565b604051631e328e7960e11b81526001600160a01b038a8116600483015273beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac0602483015260448201849052606482018390529294509092507f000000000000000000000000000000000000000000000000000000000000000090911690633c651cf2906084015f604051808303815f87803b158015610e3b575f5ffd5b505af1158015610e4d573d5f5f3e3d5ffd5b505050505050610f00565b5f610e6c8686610e6787611d5d565b6117df565b60405163305068e760e11b81526001600160a01b0388811660048301526024820185905267ffffffffffffffff831660448301529192507f0000000000000000000000000000000000000000000000000000000000000000909116906360a0d1ce906064015f604051808303815f87803b158015610ee8575f5ffd5b505af1158015610efa573d5f5f3e3d5ffd5b50505050505b50610f0b600160c955565b50505050565b6001600160a01b038082165f9081526098602052604081205490911680610fdc57610fd9836001600160a01b03165f1b60405180610940016040528061090e8152602001611f0561090e9139604080516001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000166020820152808201919091525f606082015260800160408051601f1981840301815290829052610fbe9291602001611e82565b604051602081830303815290604052805190602001206118d8565b90505b92915050565b6001600160a01b0381165f908152609d6020908152604080832081518083019092525460ff8116151580835261010090910467ffffffffffffffff16928201929092529061103857670de0b6b3a764000061103e565b80602001515b9392505050565b5f54610100900460ff161580801561106357505f54600160ff909116105b8061107c5750303b15801561107c57505f5460ff166001145b6110e45760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b5f805460ff191660011790558015611105575f805461ff0019166101001790555b61110e836115da565b61111782611406565b801561115c575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146111aa5760405163f739589b60e01b815260040160405180910390fd5b80609e5f8282546111bb9190611e9e565b90915550506040518181527f1ed04b7fd262c0d9e50fa02957f32a81a151f03baaa367faeedc7521b001c4a49060200160405180910390a15050565b6111ff611580565b6001600160a01b0381166112645760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016110db565b61126d816115da565b50565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156112cc573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906112f09190611eb1565b6001600160a01b0316336001600160a01b0316146113215760405163794821ff60e01b815260040160405180910390fd5b606654801982198116146113485760405163c61dca5d60e01b815260040160405180910390fd5b606682905560405182815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c9060200160405180910390a25050565b5f6001600160a01b03821673beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac0146113c457604051632711b74d60e11b815260040160405180910390fd5b6001600160a01b0383165f908152609b6020526040812054126113fe576001600160a01b0383165f908152609b6020526040902054610fd9565b505f92915050565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a250565b5f806001600160a01b03841661146c576040516339b190bb60e11b815260040160405180910390fd5b5f83121561148d5760405163ef147de160e01b815260040160405180910390fd5b6001600160a01b0384165f908152609b602052604081205484916114b18383611d8a565b6001600160a01b0388165f818152609b60205260409081902083905551919250907f4e2b791dedccd9fb30141b088cabf5c14a8912b52f59375c95c010700b8c6193906115019086815260200190565b60405180910390a2866001600160a01b03167fd4def76d6d2bed6f14d5cd9af73cc2913d618d00edde42432e81c09bfe0770988260405161154491815260200190565b60405180910390a25f8113611561575f5f94509450505050611579565b5f821261156e5781611570565b5f5b86945094505050505b9250929050565b6033546001600160a01b03163314610a635760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016110db565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b5f60995f815461163a90611ecc565b9091555060408051610940810190915261090e8082525f916116d79183913391611f056020830139604080516001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000166020820152808201919091525f606082015260800160408051601f19818403018152908290526116c39291602001611e82565b6040516020818303038152906040526118e4565b60405163189acdbd60e31b81523360048201529091506001600160a01b0382169063c4d66de8906024015f604051808303815f87803b158015611718575f5ffd5b505af115801561172a573d5f5f3e3d5ffd5b5050335f8181526098602052604080822080546001600160a01b0319166001600160a01b038816908117909155905192945092507f21c99d0db02213c32fff5b05cf0a718ab5f858802b91498f80d82270289d856a91a3919050565b600260c954036117d85760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016110db565b600260c955565b5f806117eb8385611d77565b90505f6117f786610fe2565b90505f61180f67ffffffffffffffff831684886119e6565b90505f61181c8284611ee4565b6040805180820182526001815267ffffffffffffffff85811660208084018281526001600160a01b038f165f818152609d845287902095518654925168ffffffffffffffffff1990931690151568ffffffffffffffff001916176101009286169290920291909117909455845193845291881691830191909152918101919091529091507fb160ab8589bf47dc04ea11b50d46678d21590cea2ed3e454e7bd3e41510f98cf9060600160405180910390a1979650505050505050565b5f610fd9838330611acb565b5f834710156119355760405162461bcd60e51b815260206004820152601d60248201527f437265617465323a20696e73756666696369656e742062616c616e636500000060448201526064016110db565b81515f036119855760405162461bcd60e51b815260206004820181905260248201527f437265617465323a2062797465636f6465206c656e677468206973207a65726f60448201526064016110db565b8282516020840186f590506001600160a01b03811661103e5760405162461bcd60e51b815260206004820152601960248201527f437265617465323a204661696c6564206f6e206465706c6f790000000000000060448201526064016110db565b5f80805f19858709858702925082811083820303915050805f03611a1d57838281611a1357611a13611e38565b049250505061103e565b808411611a645760405162461bcd60e51b81526020600482015260156024820152744d6174683a206d756c446976206f766572666c6f7760581b60448201526064016110db565b5f8486880960026001871981018816978890046003810283188082028403028082028403028082028403028082028403028082028403029081029092039091025f889003889004909101858311909403939093029303949094049190911702949350505050565b5f604051836040820152846020820152828152600b8101905060ff815360559020949350505050565b5f60208284031215611b04575f5ffd5b5035919050565b6001600160a01b038116811461126d575f5ffd5b5f5f5f5f60808587031215611b32575f5ffd5b8435611b3d81611b0b565b93506020850135611b4d81611b0b565b92506040850135611b5d81611b0b565b9396929550929360600135925050565b5f5f5f60608486031215611b7f575f5ffd5b8335611b8a81611b0b565b92506020840135611b9a81611b0b565b929592945050506040919091013590565b5f60208284031215611bbb575f5ffd5b813560ff8116811461103e575f5ffd5b5f5f83601f840112611bdb575f5ffd5b50813567ffffffffffffffff811115611bf2575f5ffd5b602083019150836020828501011115611579575f5ffd5b5f5f5f5f5f60608688031215611c1d575f5ffd5b853567ffffffffffffffff811115611c33575f5ffd5b611c3f88828901611bcb565b909650945050602086013567ffffffffffffffff811115611c5e575f5ffd5b611c6a88828901611bcb565b96999598509660400135949350505050565b5f60208284031215611c8c575f5ffd5b813561103e81611b0b565b5f5f5f60608486031215611ca9575f5ffd5b8335611cb481611b0b565b95602085013595506040909401359392505050565b5f5f60408385031215611cda575f5ffd5b8235611ce581611b0b565b946020939093013593505050565b5f5f60408385031215611d04575f5ffd5b8235611d0f81611b0b565b91506020830135611d1f81611b0b565b809150509250929050565b5f60208284031215611d3a575f5ffd5b8151801515811461103e575f5ffd5b634e487b7160e01b5f52601160045260245ffd5b5f600160ff1b8201611d7157611d71611d49565b505f0390565b81810381811115610fdc57610fdc611d49565b8082018281125f831280158216821582161715611da957611da9611d49565b505092915050565b8181035f831280158383131683831282161715611dd057611dd0611d49565b5092915050565b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b606081525f611e12606083018789611dd7565b8281036020840152611e25818688611dd7565b9150508260408301529695505050505050565b634e487b7160e01b5f52601260045260245ffd5b5f82611e6657634e487b7160e01b5f52601260045260245ffd5b500790565b5f81518060208401855e5f93019283525090919050565b5f611e96611e908386611e6b565b84611e6b565b949350505050565b80820180821115610fdc57610fdc611d49565b5f60208284031215611ec1575f5ffd5b815161103e81611b0b565b5f60018201611edd57611edd611d49565b5060010190565b67ffffffffffffffff8281168282160390811115610fdc57610fdc611d4956fe608060405260405161090e38038061090e83398101604081905261002291610460565b61002e82826000610035565b505061058a565b61003e83610100565b6040516001600160a01b038416907f1cf3b03a6cf19fa2baba4df148e9dcabedea7f8a5c07840e207e5c089be95d3e90600090a260008251118061007f5750805b156100fb576100f9836001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156100c5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906100e99190610520565b836102a360201b6100291760201c565b505b505050565b610113816102cf60201b6100551760201c565b6101725760405162461bcd60e51b815260206004820152602560248201527f455243313936373a206e657720626561636f6e206973206e6f74206120636f6e6044820152641d1c9858dd60da1b60648201526084015b60405180910390fd5b6101e6816001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156101b3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101d79190610520565b6102cf60201b6100551760201c565b61024b5760405162461bcd60e51b815260206004820152603060248201527f455243313936373a20626561636f6e20696d706c656d656e746174696f6e206960448201526f1cc81b9bdd08184818dbdb9d1c9858dd60821b6064820152608401610169565b806102827fa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d5060001b6102de60201b6100641760201c565b80546001600160a01b0319166001600160a01b039290921691909117905550565b60606102c883836040518060600160405280602781526020016108e7602791396102e1565b9392505050565b6001600160a01b03163b151590565b90565b6060600080856001600160a01b0316856040516102fe919061053b565b600060405180830381855af49150503d8060008114610339576040519150601f19603f3d011682016040523d82523d6000602084013e61033e565b606091505b5090925090506103508683838761035a565b9695505050505050565b606083156103c65782516103bf576001600160a01b0385163b6103bf5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610169565b50816103d0565b6103d083836103d8565b949350505050565b8151156103e85781518083602001fd5b8060405162461bcd60e51b81526004016101699190610557565b80516001600160a01b038116811461041957600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b60005b8381101561044f578181015183820152602001610437565b838111156100f95750506000910152565b6000806040838503121561047357600080fd5b61047c83610402565b60208401519092506001600160401b038082111561049957600080fd5b818501915085601f8301126104ad57600080fd5b8151818111156104bf576104bf61041e565b604051601f8201601f19908116603f011681019083821181831017156104e7576104e761041e565b8160405282815288602084870101111561050057600080fd5b610511836020830160208801610434565b80955050505050509250929050565b60006020828403121561053257600080fd5b6102c882610402565b6000825161054d818460208701610434565b9190910192915050565b6020815260008251806020840152610576816040850160208701610434565b601f01601f19169190910160400192915050565b61034e806105996000396000f3fe60806040523661001357610011610017565b005b6100115b610027610022610067565b610100565b565b606061004e83836040518060600160405280602781526020016102f260279139610124565b9392505050565b6001600160a01b03163b151590565b90565b600061009a7fa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50546001600160a01b031690565b6001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156100d7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906100fb9190610249565b905090565b3660008037600080366000845af43d6000803e80801561011f573d6000f35b3d6000fd5b6060600080856001600160a01b03168560405161014191906102a2565b600060405180830381855af49150503d806000811461017c576040519150601f19603f3d011682016040523d82523d6000602084013e610181565b606091505b50915091506101928683838761019c565b9695505050505050565b6060831561020d578251610206576001600160a01b0385163b6102065760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064015b60405180910390fd5b5081610217565b610217838361021f565b949350505050565b81511561022f5781518083602001fd5b8060405162461bcd60e51b81526004016101fd91906102be565b60006020828403121561025b57600080fd5b81516001600160a01b038116811461004e57600080fd5b60005b8381101561028d578181015183820152602001610275565b8381111561029c576000848401525b50505050565b600082516102b4818460208701610272565b9190910192915050565b60208152600082518060208401526102dd816040850160208701610272565b601f01601f1916919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220d51e81d3bc5ed20a26aeb05dce7e825c503b2061aa78628027300c8d65b9d89a64736f6c634300080c0033416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220c10753c1588e150a208dc7d0ab8d62bffcd4a69283e4546798037820234d43be64736f6c634300081b0033", } // EigenPodManagerABI is the input ABI used to generate the binding from. diff --git a/pkg/bindings/EigenStrategy/binding.go b/pkg/bindings/EigenStrategy/binding.go index 7fc19a2748..db85d6297b 100644 --- a/pkg/bindings/EigenStrategy/binding.go +++ b/pkg/bindings/EigenStrategy/binding.go @@ -32,7 +32,7 @@ var ( // EigenStrategyMetaData contains all meta data concerning the EigenStrategy contract. var EigenStrategyMetaData = &bind.MetaData{ ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"_strategyManager\",\"type\":\"address\",\"internalType\":\"contractIStrategyManager\"},{\"name\":\"_pauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"EIGEN\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIEigen\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"deposit\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"newShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"explanation\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"_EIGEN\",\"type\":\"address\",\"internalType\":\"contractIEigen\"},{\"name\":\"_bEIGEN\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"_underlyingToken\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"pauseAll\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[{\"name\":\"index\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pauserRegistry\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"shares\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"sharesToUnderlying\",\"inputs\":[{\"name\":\"amountShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"sharesToUnderlyingView\",\"inputs\":[{\"name\":\"amountShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"strategyManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategyManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"totalShares\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"underlyingToShares\",\"inputs\":[{\"name\":\"amountUnderlying\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"underlyingToSharesView\",\"inputs\":[{\"name\":\"amountUnderlying\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"underlyingToken\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"userUnderlying\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"userUnderlyingView\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"withdraw\",\"inputs\":[{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amountShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"ExchangeRateEmitted\",\"inputs\":[{\"name\":\"rate\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StrategyTokenSet\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIERC20\"},{\"name\":\"decimals\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"BalanceExceedsMaxTotalDeposits\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"CurrentlyPaused\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InputAddressZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidNewPausedStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"MaxPerDepositExceedsMax\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NewSharesZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyPauser\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyStrategyManager\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyUnderlyingToken\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyUnpauser\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"TotalSharesExceedsMax\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"WithdrawalAmountExceedsTotalDeposits\",\"inputs\":[]}]", - Bin: "0x60c060405234801561000f575f5ffd5b5060405161168d38038061168d83398101604081905261002e9161014f565b8181806001600160a01b038116610058576040516339b190bb60e11b815260040160405180910390fd5b6001600160a01b03908116608052821660a05261007361007c565b50505050610187565b5f54610100900460ff16156100e75760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff90811614610136575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b038116811461014c575f5ffd5b50565b5f5f60408385031215610160575f5ffd5b825161016b81610138565b602084015190925061017c81610138565b809150509250929050565b60805160a0516114bb6101d25f395f818161018b0152818161043e01528181610871015261090e01525f81816102540152818161034b0152818161066a0152610a3c01526114bb5ff3fe608060405234801561000f575f5ffd5b506004361061013d575f3560e01c8063886f1195116100b4578063ce7c2ac211610079578063ce7c2ac2146102c4578063d9caed12146102d7578063e3dae51c146102ea578063f3e73875146102fd578063fabc1cbc14610310578063fdc371ce14610323575f5ffd5b8063886f11951461024f5780638c871019146102765780638f6a624014610289578063ab5921e11461029c578063c4d66de8146102b1575f5ffd5b8063485cc95511610105578063485cc955146101d7578063553ca5f8146101ea578063595c6a67146101fd5780635ac86ab7146102055780635c975abb146102345780637a8b26371461023c575f5ffd5b8063136439dd146101415780632495a5991461015657806339b70e38146101865780633a98ef39146101ad57806347e7ef24146101c4575b5f5ffd5b61015461014f3660046111ab565b610336565b005b603254610169906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b6101697f000000000000000000000000000000000000000000000000000000000000000081565b6101b660335481565b60405190815260200161017d565b6101b66101d23660046111d9565b61040b565b6101546101e5366004611203565b610557565b6101b66101f836600461123a565b610642565b610154610655565b61022461021336600461126a565b6001805460ff9092161b9081161490565b604051901515815260200161017d565b6001546101b6565b6101b661024a3660046111ab565b610704565b6101697f000000000000000000000000000000000000000000000000000000000000000081565b6101b66102843660046111ab565b61074d565b6101b661029736600461123a565b610757565b6102a4610764565b60405161017d9190611285565b6101546102bf36600461123a565b610784565b6101b66102d236600461123a565b61084a565b6101546102e53660046112ba565b6108dc565b6101b66102f83660046111ab565b6109f9565b6101b661030b3660046111ab565b610a30565b61015461031e3660046111ab565b610a3a565b606454610169906001600160a01b031681565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa158015610398573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103bc91906112f8565b6103d957604051631d77d47760e21b815260040160405180910390fd5b60015481811681146103fe5760405163c61dca5d60e01b815260040160405180910390fd5b61040782610b50565b5050565b600180545f9182918116036104335760405163840a48d560e01b815260040160405180910390fd5b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461047c576040516348da714f60e01b815260040160405180910390fd5b6104868484610b8d565b6033545f6104966103e88361132b565b90505f6103e86104a4610c46565b6104ae919061132b565b90505f6104bb878361133e565b9050806104c88489611351565b6104d29190611368565b9550855f036104f457604051630c392ed360e11b815260040160405180910390fd5b6104fe868561132b565b60338190556f4b3b4ca85a86c47a098a223fffffffff101561053357604051632f14e8a360e11b815260040160405180910390fd5b61054c826103e8603354610547919061132b565b610cb5565b505050505092915050565b5f54610100900460ff161580801561057557505f54600160ff909116105b8061058e5750303b15801561058e57505f5460ff166001145b6105b35760405162461bcd60e51b81526004016105aa90611387565b60405180910390fd5b5f805460ff1916600117905580156105d4575f805461ff0019166101001790555b606480546001600160a01b0319166001600160a01b0385161790556105f882610d01565b801561063d575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050565b5f61064f61024a8361084a565b92915050565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa1580156106b7573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106db91906112f8565b6106f857604051631d77d47760e21b815260040160405180910390fd5b6107025f19610b50565b565b5f5f6103e8603354610716919061132b565b90505f6103e8610724610c46565b61072e919061132b565b90508161073b8583611351565b6107459190611368565b949350505050565b5f61064f826109f9565b5f61064f61030b8361084a565b60606040518060800160405280604d8152602001611439604d9139905090565b5f54610100900460ff16158080156107a257505f54600160ff909116105b806107bb5750303b1580156107bb57505f5460ff166001145b6107d75760405162461bcd60e51b81526004016105aa90611387565b5f805460ff1916600117905580156107f8575f805461ff0019166101001790555b61080182610d01565b8015610407575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498906020015b60405180910390a15050565b60405163fe243a1760e01b81526001600160a01b0382811660048301523060248301525f917f00000000000000000000000000000000000000000000000000000000000000009091169063fe243a1790604401602060405180830381865afa1580156108b8573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061064f91906113d5565b600180546002908116036109035760405163840a48d560e01b815260040160405180910390fd5b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461094c576040516348da714f60e01b815260040160405180910390fd5b610957848484610e4c565b6033548083111561097b57604051630b469df360e41b815260040160405180910390fd5b5f6109886103e88361132b565b90505f6103e8610996610c46565b6109a0919061132b565b90505f826109ae8784611351565b6109b89190611368565b90506109c4868561133e565b6033556109e46109d4828461133e565b6103e8603354610547919061132b565b6109ef888883610e92565b5050505050505050565b5f5f6103e8603354610a0b919061132b565b90505f6103e8610a19610c46565b610a23919061132b565b90508061073b8386611351565b5f61064f82610704565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610a96573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610aba91906113ec565b6001600160a01b0316336001600160a01b031614610aeb5760405163794821ff60e01b815260040160405180910390fd5b60015480198219811614610b125760405163c61dca5d60e01b815260040160405180910390fd5b600182905560405182815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c9060200160405180910390a25050565b600181905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a250565b6032546001600160a01b0383811691161480610bb657506064546001600160a01b038381169116145b610bd357604051630312abdd60e61b815260040160405180910390fd5b6064546001600160a01b039081169083160361040757606454604051636f074d1f60e11b8152600481018390526001600160a01b039091169063de0e9a3e906024015f604051808303815f87803b158015610c2c575f5ffd5b505af1158015610c3e573d5f5f3e3d5ffd5b505050505050565b6032546040516370a0823160e01b81523060048201525f916001600160a01b0316906370a0823190602401602060405180830381865afa158015610c8c573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610cb091906113d5565b905090565b7fd2494f3479e5da49d386657c292c610b5b01df313d07c62eb0cfa49924a31be881610ce984670de0b6b3a7640000611351565b610cf39190611368565b60405190815260200161083e565b5f54610100900460ff16610d6b5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b60648201526084016105aa565b603280546001600160a01b0319166001600160a01b038316179055610d8f5f610b50565b7f1c540707b00eb5427b6b774fc799d756516a54aee108b64b327acc55af55750760325f9054906101000a90046001600160a01b0316826001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e01573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e259190611407565b604080516001600160a01b03909316835260ff90911660208301520160405180910390a150565b6032546001600160a01b0383811691161480610e7557506064546001600160a01b038381169116145b61063d57604051630312abdd60e61b815260040160405180910390fd5b6064546001600160a01b0390811690831603610f775760325460405163095ea7b360e01b81526001600160a01b038481166004830152602482018490529091169063095ea7b3906044016020604051808303815f875af1158015610ef8573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f1c91906112f8565b50606454604051630ea598cb60e41b8152600481018390526001600160a01b039091169063ea598cb0906024015f604051808303815f87803b158015610f60575f5ffd5b505af1158015610f72573d5f5f3e3d5ffd5b505050505b604080516001600160a01b03858116602483015260448083018590528351808403909101815260649092018352602080830180516001600160e01b031663a9059cbb60e01b17905283518085019094528084527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65649084015261063d92908516918691859185918591905f9061100f908490849061108e565b905080515f148061102f57508080602001905181019061102f91906112f8565b61063d5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016105aa565b606061074584845f85855f5f866001600160a01b031685876040516110b39190611422565b5f6040518083038185875af1925050503d805f81146110ed576040519150601f19603f3d011682016040523d82523d5f602084013e6110f2565b606091505b50915091506111038783838761110e565b979650505050505050565b6060831561117c5782515f03611175576001600160a01b0385163b6111755760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016105aa565b5081610745565b61074583838151156111915781518083602001fd5b8060405162461bcd60e51b81526004016105aa9190611285565b5f602082840312156111bb575f5ffd5b5035919050565b6001600160a01b03811681146111d6575f5ffd5b50565b5f5f604083850312156111ea575f5ffd5b82356111f5816111c2565b946020939093013593505050565b5f5f60408385031215611214575f5ffd5b823561121f816111c2565b9150602083013561122f816111c2565b809150509250929050565b5f6020828403121561124a575f5ffd5b8135611255816111c2565b9392505050565b60ff811681146111d6575f5ffd5b5f6020828403121561127a575f5ffd5b81356112558161125c565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b5f5f5f606084860312156112cc575f5ffd5b83356112d7816111c2565b925060208401356112e7816111c2565b929592945050506040919091013590565b5f60208284031215611308575f5ffd5b81518015158114611255575f5ffd5b634e487b7160e01b5f52601160045260245ffd5b8082018082111561064f5761064f611317565b8181038181111561064f5761064f611317565b808202811582820484141761064f5761064f611317565b5f8261138257634e487b7160e01b5f52601260045260245ffd5b500490565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b5f602082840312156113e5575f5ffd5b5051919050565b5f602082840312156113fc575f5ffd5b8151611255816111c2565b5f60208284031215611417575f5ffd5b81516112558161125c565b5f82518060208501845e5f92019182525091905056fe4261736520537472617465677920696d706c656d656e746174696f6e20746f20696e68657269742066726f6d20666f72206d6f726520636f6d706c657820696d706c656d656e746174696f6e73a264697066735822122000790fa222dbfedc984b61c80aaac572fd4b3300a33b9d925158b9d571ec4ddd64736f6c634300081b0033", + Bin: "0x60c060405234801561000f575f5ffd5b5060405161168d38038061168d83398101604081905261002e9161014f565b8181806001600160a01b038116610058576040516339b190bb60e11b815260040160405180910390fd5b6001600160a01b03908116608052821660a05261007361007c565b50505050610187565b5f54610100900460ff16156100e75760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff90811614610136575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b038116811461014c575f5ffd5b50565b5f5f60408385031215610160575f5ffd5b825161016b81610138565b602084015190925061017c81610138565b809150509250929050565b60805160a0516114bb6101d25f395f818161018b0152818161043e01528181610871015261090e01525f81816102540152818161034b0152818161066a0152610a3c01526114bb5ff3fe608060405234801561000f575f5ffd5b506004361061013d575f3560e01c8063886f1195116100b4578063ce7c2ac211610079578063ce7c2ac2146102c4578063d9caed12146102d7578063e3dae51c146102ea578063f3e73875146102fd578063fabc1cbc14610310578063fdc371ce14610323575f5ffd5b8063886f11951461024f5780638c871019146102765780638f6a624014610289578063ab5921e11461029c578063c4d66de8146102b1575f5ffd5b8063485cc95511610105578063485cc955146101d7578063553ca5f8146101ea578063595c6a67146101fd5780635ac86ab7146102055780635c975abb146102345780637a8b26371461023c575f5ffd5b8063136439dd146101415780632495a5991461015657806339b70e38146101865780633a98ef39146101ad57806347e7ef24146101c4575b5f5ffd5b61015461014f3660046111ab565b610336565b005b603254610169906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b6101697f000000000000000000000000000000000000000000000000000000000000000081565b6101b660335481565b60405190815260200161017d565b6101b66101d23660046111d9565b61040b565b6101546101e5366004611203565b610557565b6101b66101f836600461123a565b610642565b610154610655565b61022461021336600461126a565b6001805460ff9092161b9081161490565b604051901515815260200161017d565b6001546101b6565b6101b661024a3660046111ab565b610704565b6101697f000000000000000000000000000000000000000000000000000000000000000081565b6101b66102843660046111ab565b61074d565b6101b661029736600461123a565b610757565b6102a4610764565b60405161017d9190611285565b6101546102bf36600461123a565b610784565b6101b66102d236600461123a565b61084a565b6101546102e53660046112ba565b6108dc565b6101b66102f83660046111ab565b6109f9565b6101b661030b3660046111ab565b610a30565b61015461031e3660046111ab565b610a3a565b606454610169906001600160a01b031681565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa158015610398573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103bc91906112f8565b6103d957604051631d77d47760e21b815260040160405180910390fd5b60015481811681146103fe5760405163c61dca5d60e01b815260040160405180910390fd5b61040782610b50565b5050565b600180545f9182918116036104335760405163840a48d560e01b815260040160405180910390fd5b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461047c576040516348da714f60e01b815260040160405180910390fd5b6104868484610b8d565b6033545f6104966103e88361132b565b90505f6103e86104a4610c46565b6104ae919061132b565b90505f6104bb878361133e565b9050806104c88489611351565b6104d29190611368565b9550855f036104f457604051630c392ed360e11b815260040160405180910390fd5b6104fe868561132b565b60338190556f4b3b4ca85a86c47a098a223fffffffff101561053357604051632f14e8a360e11b815260040160405180910390fd5b61054c826103e8603354610547919061132b565b610cb5565b505050505092915050565b5f54610100900460ff161580801561057557505f54600160ff909116105b8061058e5750303b15801561058e57505f5460ff166001145b6105b35760405162461bcd60e51b81526004016105aa90611387565b60405180910390fd5b5f805460ff1916600117905580156105d4575f805461ff0019166101001790555b606480546001600160a01b0319166001600160a01b0385161790556105f882610d01565b801561063d575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050565b5f61064f61024a8361084a565b92915050565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa1580156106b7573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106db91906112f8565b6106f857604051631d77d47760e21b815260040160405180910390fd5b6107025f19610b50565b565b5f5f6103e8603354610716919061132b565b90505f6103e8610724610c46565b61072e919061132b565b90508161073b8583611351565b6107459190611368565b949350505050565b5f61064f826109f9565b5f61064f61030b8361084a565b60606040518060800160405280604d8152602001611439604d9139905090565b5f54610100900460ff16158080156107a257505f54600160ff909116105b806107bb5750303b1580156107bb57505f5460ff166001145b6107d75760405162461bcd60e51b81526004016105aa90611387565b5f805460ff1916600117905580156107f8575f805461ff0019166101001790555b61080182610d01565b8015610407575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498906020015b60405180910390a15050565b60405163fe243a1760e01b81526001600160a01b0382811660048301523060248301525f917f00000000000000000000000000000000000000000000000000000000000000009091169063fe243a1790604401602060405180830381865afa1580156108b8573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061064f91906113d5565b600180546002908116036109035760405163840a48d560e01b815260040160405180910390fd5b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461094c576040516348da714f60e01b815260040160405180910390fd5b610957848484610e4c565b6033548083111561097b57604051630b469df360e41b815260040160405180910390fd5b5f6109886103e88361132b565b90505f6103e8610996610c46565b6109a0919061132b565b90505f826109ae8784611351565b6109b89190611368565b90506109c4868561133e565b6033556109e46109d4828461133e565b6103e8603354610547919061132b565b6109ef888883610e92565b5050505050505050565b5f5f6103e8603354610a0b919061132b565b90505f6103e8610a19610c46565b610a23919061132b565b90508061073b8386611351565b5f61064f82610704565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610a96573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610aba91906113ec565b6001600160a01b0316336001600160a01b031614610aeb5760405163794821ff60e01b815260040160405180910390fd5b60015480198219811614610b125760405163c61dca5d60e01b815260040160405180910390fd5b600182905560405182815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c9060200160405180910390a25050565b600181905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a250565b6032546001600160a01b0383811691161480610bb657506064546001600160a01b038381169116145b610bd357604051630312abdd60e61b815260040160405180910390fd5b6064546001600160a01b039081169083160361040757606454604051636f074d1f60e11b8152600481018390526001600160a01b039091169063de0e9a3e906024015f604051808303815f87803b158015610c2c575f5ffd5b505af1158015610c3e573d5f5f3e3d5ffd5b505050505050565b6032546040516370a0823160e01b81523060048201525f916001600160a01b0316906370a0823190602401602060405180830381865afa158015610c8c573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610cb091906113d5565b905090565b7fd2494f3479e5da49d386657c292c610b5b01df313d07c62eb0cfa49924a31be881610ce984670de0b6b3a7640000611351565b610cf39190611368565b60405190815260200161083e565b5f54610100900460ff16610d6b5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b60648201526084016105aa565b603280546001600160a01b0319166001600160a01b038316179055610d8f5f610b50565b7f1c540707b00eb5427b6b774fc799d756516a54aee108b64b327acc55af55750760325f9054906101000a90046001600160a01b0316826001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e01573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e259190611407565b604080516001600160a01b03909316835260ff90911660208301520160405180910390a150565b6032546001600160a01b0383811691161480610e7557506064546001600160a01b038381169116145b61063d57604051630312abdd60e61b815260040160405180910390fd5b6064546001600160a01b0390811690831603610f775760325460405163095ea7b360e01b81526001600160a01b038481166004830152602482018490529091169063095ea7b3906044016020604051808303815f875af1158015610ef8573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f1c91906112f8565b50606454604051630ea598cb60e41b8152600481018390526001600160a01b039091169063ea598cb0906024015f604051808303815f87803b158015610f60575f5ffd5b505af1158015610f72573d5f5f3e3d5ffd5b505050505b604080516001600160a01b03858116602483015260448083018590528351808403909101815260649092018352602080830180516001600160e01b031663a9059cbb60e01b17905283518085019094528084527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65649084015261063d92908516918691859185918591905f9061100f908490849061108e565b905080515f148061102f57508080602001905181019061102f91906112f8565b61063d5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016105aa565b606061074584845f85855f5f866001600160a01b031685876040516110b39190611422565b5f6040518083038185875af1925050503d805f81146110ed576040519150601f19603f3d011682016040523d82523d5f602084013e6110f2565b606091505b50915091506111038783838761110e565b979650505050505050565b6060831561117c5782515f03611175576001600160a01b0385163b6111755760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016105aa565b5081610745565b61074583838151156111915781518083602001fd5b8060405162461bcd60e51b81526004016105aa9190611285565b5f602082840312156111bb575f5ffd5b5035919050565b6001600160a01b03811681146111d6575f5ffd5b50565b5f5f604083850312156111ea575f5ffd5b82356111f5816111c2565b946020939093013593505050565b5f5f60408385031215611214575f5ffd5b823561121f816111c2565b9150602083013561122f816111c2565b809150509250929050565b5f6020828403121561124a575f5ffd5b8135611255816111c2565b9392505050565b60ff811681146111d6575f5ffd5b5f6020828403121561127a575f5ffd5b81356112558161125c565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b5f5f5f606084860312156112cc575f5ffd5b83356112d7816111c2565b925060208401356112e7816111c2565b929592945050506040919091013590565b5f60208284031215611308575f5ffd5b81518015158114611255575f5ffd5b634e487b7160e01b5f52601160045260245ffd5b8082018082111561064f5761064f611317565b8181038181111561064f5761064f611317565b808202811582820484141761064f5761064f611317565b5f8261138257634e487b7160e01b5f52601260045260245ffd5b500490565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b5f602082840312156113e5575f5ffd5b5051919050565b5f602082840312156113fc575f5ffd5b8151611255816111c2565b5f60208284031215611417575f5ffd5b81516112558161125c565b5f82518060208501845e5f92019182525091905056fe4261736520537472617465677920696d706c656d656e746174696f6e20746f20696e68657269742066726f6d20666f72206d6f726520636f6d706c657820696d706c656d656e746174696f6e73a26469706673582212203edc3fd87868d09c295783bf240f3e101b46de41ff8da366fe440e78926982ad64736f6c634300081b0033", } // 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 e2995571cc..3783c512c8 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: "0x60556032600b8282823980515f1a607314602657634e487b7160e01b5f525f60045260245ffd5b305f52607381538281f3fe730000000000000000000000000000000000000000301460806040525f5ffdfea264697066735822122065de58e62fc0153ec81e59074101ab95f4a50a4dc9b195d91698d58ec6e19dcb64736f6c634300081b0033", + Bin: "0x6055604b600b8282823980515f1a607314603f577f4e487b71000000000000000000000000000000000000000000000000000000005f525f60045260245ffd5b305f52607381538281f3fe730000000000000000000000000000000000000000301460806040525f5ffdfea2646970667358221220f0e2b6d8f51c7ffaab5e2ad771893da2e6df099524d52b9ed8e5f46dccb9d26e64736f6c634300081b0033", } // EndianABI is the input ABI used to generate the binding from. diff --git a/pkg/bindings/Merkle/binding.go b/pkg/bindings/Merkle/binding.go index d1795f6605..1ae6fbf85f 100644 --- a/pkg/bindings/Merkle/binding.go +++ b/pkg/bindings/Merkle/binding.go @@ -32,7 +32,7 @@ var ( // MerkleMetaData contains all meta data concerning the Merkle contract. var MerkleMetaData = &bind.MetaData{ ABI: "[{\"type\":\"error\",\"name\":\"InvalidProofLength\",\"inputs\":[]}]", - Bin: "0x60556032600b8282823980515f1a607314602657634e487b7160e01b5f525f60045260245ffd5b305f52607381538281f3fe730000000000000000000000000000000000000000301460806040525f5ffdfea26469706673582212208de82ea7f1a22cc126cdf4c3791b57f420fcc4ed980bdbddf119e15f4a112e8964736f6c634300081b0033", + Bin: "0x6055604b600b8282823980515f1a607314603f577f4e487b71000000000000000000000000000000000000000000000000000000005f525f60045260245ffd5b305f52607381538281f3fe730000000000000000000000000000000000000000301460806040525f5ffdfea2646970667358221220c42c36c4a77d17b2eaba81f883518752b5335ef110f10184a7f75e0c3c1ca2e364736f6c634300081b0033", } // MerkleABI is the input ABI used to generate the binding from. diff --git a/pkg/bindings/OperatorSetLib/binding.go b/pkg/bindings/OperatorSetLib/binding.go index a48c2cefdd..638122dc72 100644 --- a/pkg/bindings/OperatorSetLib/binding.go +++ b/pkg/bindings/OperatorSetLib/binding.go @@ -32,7 +32,7 @@ var ( // OperatorSetLibMetaData contains all meta data concerning the OperatorSetLib contract. var OperatorSetLibMetaData = &bind.MetaData{ ABI: "[]", - Bin: "0x60556032600b8282823980515f1a607314602657634e487b7160e01b5f525f60045260245ffd5b305f52607381538281f3fe730000000000000000000000000000000000000000301460806040525f5ffdfea264697066735822122023e8e6cb91eee2d3c43ff6cfc219a624b12892e20fd5158ca2b4e1484806bb9c64736f6c634300081b0033", + Bin: "0x6055604b600b8282823980515f1a607314603f577f4e487b71000000000000000000000000000000000000000000000000000000005f525f60045260245ffd5b305f52607381538281f3fe730000000000000000000000000000000000000000301460806040525f5ffdfea264697066735822122024731478a4329a39d9f783a1f71c24d64037cecf0ac3467dbc721be4400a463d64736f6c634300081b0033", } // OperatorSetLibABI is the input ABI used to generate the binding from. diff --git a/pkg/bindings/PauserRegistry/binding.go b/pkg/bindings/PauserRegistry/binding.go index a77ccb9e9d..784be9c258 100644 --- a/pkg/bindings/PauserRegistry/binding.go +++ b/pkg/bindings/PauserRegistry/binding.go @@ -32,7 +32,7 @@ var ( // PauserRegistryMetaData contains all meta data concerning the PauserRegistry contract. var PauserRegistryMetaData = &bind.MetaData{ ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"_pausers\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"_unpauser\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"isPauser\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"setIsPauser\",\"inputs\":[{\"name\":\"newPauser\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"canPause\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setUnpauser\",\"inputs\":[{\"name\":\"newUnpauser\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unpauser\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"event\",\"name\":\"PauserStatusChanged\",\"inputs\":[{\"name\":\"pauser\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"canPause\",\"type\":\"bool\",\"indexed\":false,\"internalType\":\"bool\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"UnpauserChanged\",\"inputs\":[{\"name\":\"previousUnpauser\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"newUnpauser\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"InputAddressZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyUnpauser\",\"inputs\":[]}]", - Bin: "0x608060405234801561000f575f5ffd5b506040516105c83803806105c883398101604081905261002e916101c2565b5f5b825181101561006b5761006383828151811061004e5761004e61029e565b6020026020010151600161007c60201b60201c565b600101610030565b5061007581610103565b50506102b2565b6001600160a01b0382166100a3576040516339b190bb60e11b815260040160405180910390fd5b6001600160a01b0382165f8181526020818152604091829020805460ff19168515159081179091558251938452908301527f65d3a1fd4c13f05cba164f80d03ce90fb4b5e21946bfc3ab7dbd434c2d0b9152910160405180910390a15050565b6001600160a01b03811661012a576040516339b190bb60e11b815260040160405180910390fd5b600154604080516001600160a01b03928316815291831660208301527f06b4167a2528887a1e97a366eefe8549bfbf1ea3e6ac81cb2564a934d20e8892910160405180910390a1600180546001600160a01b0319166001600160a01b0392909216919091179055565b634e487b7160e01b5f52604160045260245ffd5b80516001600160a01b03811681146101bd575f5ffd5b919050565b5f5f604083850312156101d3575f5ffd5b82516001600160401b038111156101e8575f5ffd5b8301601f810185136101f8575f5ffd5b80516001600160401b0381111561021157610211610193565b604051600582901b90603f8201601f191681016001600160401b038111828210171561023f5761023f610193565b60405291825260208184018101929081018884111561025c575f5ffd5b6020850194505b8385101561028257610274856101a7565b815260209485019401610263565b50945061029592505050602084016101a7565b90509250929050565b634e487b7160e01b5f52603260045260245ffd5b610309806102bf5f395ff3fe608060405234801561000f575f5ffd5b506004361061004a575f3560e01c806346fbf68e1461004e5780638568520614610085578063ce5484281461009a578063eab66d7a146100ad575b5f5ffd5b61007061005c36600461027a565b5f6020819052908152604090205460ff1681565b60405190151581526020015b60405180910390f35b61009861009336600461029a565b6100d8565b005b6100986100a836600461027a565b610111565b6001546100c0906001600160a01b031681565b6040516001600160a01b03909116815260200161007c565b6001546001600160a01b031633146101035760405163794821ff60e01b815260040160405180910390fd5b61010d8282610148565b5050565b6001546001600160a01b0316331461013c5760405163794821ff60e01b815260040160405180910390fd5b610145816101cf565b50565b6001600160a01b03821661016f576040516339b190bb60e11b815260040160405180910390fd5b6001600160a01b0382165f8181526020818152604091829020805460ff19168515159081179091558251938452908301527f65d3a1fd4c13f05cba164f80d03ce90fb4b5e21946bfc3ab7dbd434c2d0b9152910160405180910390a15050565b6001600160a01b0381166101f6576040516339b190bb60e11b815260040160405180910390fd5b600154604080516001600160a01b03928316815291831660208301527f06b4167a2528887a1e97a366eefe8549bfbf1ea3e6ac81cb2564a934d20e8892910160405180910390a1600180546001600160a01b0319166001600160a01b0392909216919091179055565b80356001600160a01b0381168114610275575f5ffd5b919050565b5f6020828403121561028a575f5ffd5b6102938261025f565b9392505050565b5f5f604083850312156102ab575f5ffd5b6102b48361025f565b9150602083013580151581146102c8575f5ffd5b80915050925092905056fea264697066735822122009d8ba5b235f31c96a07127caff39f4f0438590d75b714b9d6de67448091f19864736f6c634300081b0033", + Bin: "0x608060405234801561000f575f5ffd5b50604051610b4d380380610b4d83398181016040528101906100319190610440565b5f5f90505b82518110156100775761006a8382815181106100555761005461049a565b5b6020026020010151600161008e60201b60201c565b8080600101915050610036565b506100878161018360201b60201c565b505061053e565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036100f3576040517f7363217600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805f5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055507f65d3a1fd4c13f05cba164f80d03ce90fb4b5e21946bfc3ab7dbd434c2d0b915282826040516101779291906104f0565b60405180910390a15050565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036101e8576040517f7363217600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f06b4167a2528887a1e97a366eefe8549bfbf1ea3e6ac81cb2564a934d20e889260015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff168260405161023a929190610517565b60405180910390a18060015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b5f604051905090565b5f5ffd5b5f5ffd5b5f5ffd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6102e08261029a565b810181811067ffffffffffffffff821117156102ff576102fe6102aa565b5b80604052505050565b5f610311610285565b905061031d82826102d7565b919050565b5f67ffffffffffffffff82111561033c5761033b6102aa565b5b602082029050602081019050919050565b5f5ffd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f61037a82610351565b9050919050565b61038a81610370565b8114610394575f5ffd5b50565b5f815190506103a581610381565b92915050565b5f6103bd6103b884610322565b610308565b905080838252602082019050602084028301858111156103e0576103df61034d565b5b835b8181101561040957806103f58882610397565b8452602084019350506020810190506103e2565b5050509392505050565b5f82601f83011261042757610426610296565b5b81516104378482602086016103ab565b91505092915050565b5f5f604083850312156104565761045561028e565b5b5f83015167ffffffffffffffff81111561047357610472610292565b5b61047f85828601610413565b925050602061049085828601610397565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b6104d081610370565b82525050565b5f8115159050919050565b6104ea816104d6565b82525050565b5f6040820190506105035f8301856104c7565b61051060208301846104e1565b9392505050565b5f60408201905061052a5f8301856104c7565b61053760208301846104c7565b9392505050565b6106028061054b5f395ff3fe608060405234801561000f575f5ffd5b506004361061004a575f3560e01c806346fbf68e1461004e578063856852061461007e578063ce5484281461009a578063eab66d7a146100b6575b5f5ffd5b61006860048036038101906100639190610490565b6100d4565b60405161007591906104d5565b60405180910390f35b61009860048036038101906100939190610518565b6100f0565b005b6100b460048036038101906100af9190610490565b610184565b005b6100be610216565b6040516100cb9190610565565b60405180910390f35b5f602052805f5260405f205f915054906101000a900460ff1681565b60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610176576040517f794821ff00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610180828261023b565b5050565b60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461020a576040517f794821ff00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61021381610330565b50565b60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036102a0576040517f7363217600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805f5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055507f65d3a1fd4c13f05cba164f80d03ce90fb4b5e21946bfc3ab7dbd434c2d0b9152828260405161032492919061057e565b60405180910390a15050565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610395576040517f7363217600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f06b4167a2528887a1e97a366eefe8549bfbf1ea3e6ac81cb2564a934d20e889260015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16826040516103e79291906105a5565b60405180910390a18060015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b5f5ffd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f61045f82610436565b9050919050565b61046f81610455565b8114610479575f5ffd5b50565b5f8135905061048a81610466565b92915050565b5f602082840312156104a5576104a4610432565b5b5f6104b28482850161047c565b91505092915050565b5f8115159050919050565b6104cf816104bb565b82525050565b5f6020820190506104e85f8301846104c6565b92915050565b6104f7816104bb565b8114610501575f5ffd5b50565b5f81359050610512816104ee565b92915050565b5f5f6040838503121561052e5761052d610432565b5b5f61053b8582860161047c565b925050602061054c85828601610504565b9150509250929050565b61055f81610455565b82525050565b5f6020820190506105785f830184610556565b92915050565b5f6040820190506105915f830185610556565b61059e60208301846104c6565b9392505050565b5f6040820190506105b85f830185610556565b6105c56020830184610556565b939250505056fea26469706673582212208eb48f096bf58e6151bd2afec5787523e61c66bb95654d16b49aeed459f3377e64736f6c634300081b0033", } // PauserRegistryABI is the input ABI used to generate the binding from. diff --git a/pkg/bindings/PermissionController/binding.go b/pkg/bindings/PermissionController/binding.go index 21f037d593..3fa5899427 100644 --- a/pkg/bindings/PermissionController/binding.go +++ b/pkg/bindings/PermissionController/binding.go @@ -32,7 +32,7 @@ var ( // PermissionControllerMetaData contains all meta data concerning the PermissionController contract. var PermissionControllerMetaData = &bind.MetaData{ ABI: "[{\"type\":\"constructor\",\"inputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"acceptAdmin\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"addPendingAdmin\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"admin\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"canCall\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"caller\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"target\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"selector\",\"type\":\"bytes4\",\"internalType\":\"bytes4\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAdmins\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAppointeePermissions\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"appointee\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"\",\"type\":\"bytes4[]\",\"internalType\":\"bytes4[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAppointees\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"target\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"selector\",\"type\":\"bytes4\",\"internalType\":\"bytes4\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getPendingAdmins\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isAdmin\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"caller\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isPendingAdmin\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"pendingAdmin\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"removeAdmin\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"admin\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"removeAppointee\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"appointee\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"target\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"selector\",\"type\":\"bytes4\",\"internalType\":\"bytes4\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"removePendingAdmin\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"admin\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setAppointee\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"appointee\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"target\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"selector\",\"type\":\"bytes4\",\"internalType\":\"bytes4\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"AdminRemoved\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"admin\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"AdminSet\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"admin\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"AppointeeRemoved\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"appointee\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"target\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"selector\",\"type\":\"bytes4\",\"indexed\":false,\"internalType\":\"bytes4\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"AppointeeSet\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"appointee\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"target\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"selector\",\"type\":\"bytes4\",\"indexed\":false,\"internalType\":\"bytes4\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"PendingAdminAdded\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"admin\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"PendingAdminRemoved\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"admin\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"AdminAlreadyPending\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"AdminAlreadySet\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"AdminNotPending\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"AdminNotSet\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"AppointeeAlreadySet\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"AppointeeNotSet\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"CannotHaveZeroAdmins\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotAdmin\",\"inputs\":[]}]", - Bin: "0x6080604052348015600e575f5ffd5b5060156019565b60d3565b5f54610100900460ff161560835760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff9081161460d1575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b610f40806100e05f395ff3fe608060405234801561000f575f5ffd5b50600436106100cb575f3560e01c80639100674511610088578063ad8aca7711610063578063ad8aca77146101b0578063df595cb8146101c3578063eb5a4e87146101d6578063fddbdefd146101e9575f5ffd5b80639100674514610167578063950d806e1461018a578063ad5f22101461019d575f5ffd5b806306641201146100cf578063268959e5146100e45780634f906cf9146100f7578063628806ef1461010a5780636bddfa1f1461011d578063882a3b3814610146575b5f5ffd5b6100e26100dd366004610cfa565b6101fc565b005b6100e26100f2366004610d4b565b61031d565b6100e2610105366004610d4b565b6103f8565b6100e2610118366004610d7c565b61049b565b61013061012b366004610d7c565b610529565b60405161013d9190610dd8565b60405180910390f35b610159610154366004610d4b565b610552565b60405161013d929190610dea565b61017a610175366004610d4b565b6106b3565b604051901515815260200161013d565b6100e2610198366004610cfa565b610723565b6101306101ab366004610d7c565b610834565b61017a6101be366004610d4b565b6108da565b61017a6101d1366004610cfa565b6108fb565b6100e26101e4366004610d4b565b610950565b6101306101f7366004610e4c565b610a1e565b8361020781336106b3565b61022457604051637bfa4b9f60e01b815260040160405180910390fd5b6001600160a01b0385165f908152600160205260408120906102468585610a5c565b6001600160a01b0387165f908152600484016020526040902090915061026c9082610a89565b6102895760405163262118cd60e01b815260040160405180910390fd5b6001600160a01b0386165f90815260048301602052604090206102ac9082610aa0565b505f81815260058301602052604090206102c69087610aab565b50856001600160a01b0316876001600160a01b03167f18242326b6b862126970679759169f01f646bd55ec5bfcab85ba9f337a74e0c6878760405161030c929190610e8c565b60405180910390a350505050505050565b8161032881336106b3565b61034557604051637bfa4b9f60e01b815260040160405180910390fd5b6001600160a01b0383165f9081526001602081905260409091206002019061036c82610abf565b1161038a576040516310ce892b60e31b815260040160405180910390fd5b6103948184610aab565b6103b157604051630716d81b60e51b815260040160405180910390fd5b6040516001600160a01b0384811682528516907fdb9d5d31320daf5bc7181d565b6da4d12e30f0f4d5aa324a992426c14a1d19ce906020015b60405180910390a250505050565b8161040381336106b3565b61042057604051637bfa4b9f60e01b815260040160405180910390fd5b6001600160a01b0383165f9081526001602052604090206104418184610aab565b61045e5760405163bed8295f60e01b815260040160405180910390fd5b6040516001600160a01b0384811682528516907fd706ed7ae044d795b49e54c9f519f663053951011985f663a862cd9ee72a9ac7906020016103ea565b6001600160a01b0381165f9081526001602052604090206104bc8133610aab565b6104d95760405163bed8295f60e01b815260040160405180910390fd5b6104e66002820133610ac8565b506040513381526001600160a01b038316907fbf265e8326285a2747e33e54d5945f7111f2b5edb826eb8c08d4677779b3ff979060200160405180910390a25050565b6001600160a01b0381165f90815260016020526040902060609061054c90610adc565b92915050565b6001600160a01b038083165f90815260016020908152604080832093851683526004909301905290812060609182919061058b82610abf565b90505f8167ffffffffffffffff8111156105a7576105a7610eaf565b6040519080825280602002602001820160405280156105d0578160200160208202803683370190505b5090505f8267ffffffffffffffff8111156105ed576105ed610eaf565b604051908082528060200260200182016040528015610616578160200160208202803683370190505b5090505f5b838110156106a5576106496106308683610ae8565b606081901c9160a09190911b6001600160e01b03191690565b84838151811061065b5761065b610ec3565b6020026020010184848151811061067457610674610ec3565b6001600160e01b0319909316602093840291909101909201919091526001600160a01b03909116905260010161061b565b509097909650945050505050565b6001600160a01b0382165f9081526001602052604081206106d690600201610abf565b5f036106f857816001600160a01b0316836001600160a01b031614905061054c565b6001600160a01b0383165f90815260016020526040902061071c9060020183610af3565b9392505050565b8361072e81336106b3565b61074b57604051637bfa4b9f60e01b815260040160405180910390fd5b6001600160a01b0385165f9081526001602052604081209061076d8585610a5c565b6001600160a01b0387165f90815260048401602052604090209091506107939082610a89565b156107b15760405163ad8efeb760e01b815260040160405180910390fd5b6001600160a01b0386165f90815260048301602052604090206107d49082610b14565b505f81815260058301602052604090206107ee9087610ac8565b50856001600160a01b0316876001600160a01b03167f037f03a2ad6b967df4a01779b6d2b4c85950df83925d9e31362b519422fc0169878760405161030c929190610e8c565b6001600160a01b0381165f90815260016020526040902060609061085a90600201610abf565b5f036108b2576040805160018082528183019092525f916020808301908036833701905050905082815f8151811061089457610894610ec3565b6001600160a01b039092166020928302919091019091015292915050565b6001600160a01b0382165f90815260016020526040902061054c90600201610adc565b919050565b6001600160a01b0382165f90815260016020526040812061071c9083610af3565b5f61090685856106b3565b8061094757506109476109198484610a5c565b6001600160a01b038088165f908152600160209081526040808320938a168352600490930190522090610a89565b95945050505050565b8161095b81336106b3565b61097857604051637bfa4b9f60e01b815260040160405180910390fd5b6001600160a01b0383165f90815260016020526040902061099c6002820184610af3565b156109ba5760405163130160e560e31b815260040160405180910390fd5b6109c48184610ac8565b6109e1576040516319abede360e11b815260040160405180910390fd5b6040516001600160a01b0384811682528516907fb14b9a3d448c5b04f0e5b087b6f5193390db7955482a6ffb841e7b3ba61a460c906020016103ea565b60605f610a2b8484610a5c565b6001600160a01b0386165f908152600160209081526040808320848452600501909152902090915061094790610adc565b60609190911b6bffffffffffffffffffffffff191660a09190911c6bffffffff0000000000000000161790565b5f818152600183016020526040812054151561071c565b5f61071c8383610b1f565b5f61071c836001600160a01b038416610b1f565b5f61054c825490565b5f61071c836001600160a01b038416610c02565b60605f61071c83610c4e565b5f61071c8383610ca7565b6001600160a01b0381165f908152600183016020526040812054151561071c565b5f61071c8383610c02565b5f8181526001830160205260408120548015610bf9575f610b41600183610ed7565b85549091505f90610b5490600190610ed7565b9050818114610bb3575f865f018281548110610b7257610b72610ec3565b905f5260205f200154905080875f018481548110610b9257610b92610ec3565b5f918252602080832090910192909255918252600188019052604090208390555b8554869080610bc457610bc4610ef6565b600190038181905f5260205f20015f90559055856001015f8681526020019081526020015f205f90556001935050505061054c565b5f91505061054c565b5f818152600183016020526040812054610c4757508154600181810184555f84815260208082209093018490558454848252828601909352604090209190915561054c565b505f61054c565b6060815f01805480602002602001604051908101604052809291908181526020018280548015610c9b57602002820191905f5260205f20905b815481526020019060010190808311610c87575b50505050509050919050565b5f825f018281548110610cbc57610cbc610ec3565b905f5260205f200154905092915050565b80356001600160a01b03811681146108d5575f5ffd5b80356001600160e01b0319811681146108d5575f5ffd5b5f5f5f5f60808587031215610d0d575f5ffd5b610d1685610ccd565b9350610d2460208601610ccd565b9250610d3260408601610ccd565b9150610d4060608601610ce3565b905092959194509250565b5f5f60408385031215610d5c575f5ffd5b610d6583610ccd565b9150610d7360208401610ccd565b90509250929050565b5f60208284031215610d8c575f5ffd5b61071c82610ccd565b5f8151808452602084019350602083015f5b82811015610dce5781516001600160a01b0316865260209586019590910190600101610da7565b5093949350505050565b602081525f61071c6020830184610d95565b604081525f610dfc6040830185610d95565b82810360208401528084518083526020830191506020860192505f5b81811015610e405783516001600160e01b031916835260209384019390920191600101610e18565b50909695505050505050565b5f5f5f60608486031215610e5e575f5ffd5b610e6784610ccd565b9250610e7560208501610ccd565b9150610e8360408501610ce3565b90509250925092565b6001600160a01b039290921682526001600160e01b031916602082015260400190565b634e487b7160e01b5f52604160045260245ffd5b634e487b7160e01b5f52603260045260245ffd5b8181038181111561054c57634e487b7160e01b5f52601160045260245ffd5b634e487b7160e01b5f52603160045260245ffdfea2646970667358221220b63ce7fd361f505a43fbbc1e192d669b57efb369c86636afa2dd2f0c28075a1264736f6c634300081b0033", + Bin: "0x608060405234801561000f575f5ffd5b5061001e61002360201b60201c565b6101b3565b5f60019054906101000a900460ff1615610072576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161006990610161565b60405180910390fd5b60ff80165f5f9054906101000a900460ff1660ff16146100df5760ff5f5f6101000a81548160ff021916908360ff1602179055507f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb384740249860ff6040516100d6919061019a565b60405180910390a15b565b5f82825260208201905092915050565b7f496e697469616c697a61626c653a20636f6e747261637420697320696e6974695f8201527f616c697a696e6700000000000000000000000000000000000000000000000000602082015250565b5f61014b6027836100e1565b9150610156826100f1565b604082019050919050565b5f6020820190508181035f8301526101788161013f565b9050919050565b5f60ff82169050919050565b6101948161017f565b82525050565b5f6020820190506101ad5f83018461018b565b92915050565b611a8c806101c05f395ff3fe608060405234801561000f575f5ffd5b50600436106100cd575f3560e01c8063910067451161008a578063ad8aca7711610064578063ad8aca771461021e578063df595cb81461024e578063eb5a4e871461027e578063fddbdefd1461029a576100cd565b806391006745146101a2578063950d806e146101d2578063ad5f2210146101ee576100cd565b806306641201146100d1578063268959e5146100ed5780634f906cf914610109578063628806ef146101255780636bddfa1f14610141578063882a3b3814610171575b5f5ffd5b6100eb60048036038101906100e691906115f5565b6102ca565b005b61010760048036038101906101029190611659565b6104c7565b005b610123600480360381019061011e9190611659565b61062a565b005b61013f600480360381019061013a9190611697565b61074a565b005b61015b60048036038101906101569190611697565b61083e565b6040516101689190611779565b60405180910390f35b61018b60048036038101906101869190611659565b61088e565b604051610199929190611850565b60405180910390f35b6101bc60048036038101906101b79190611659565b610aa0565b6040516101c9919061189f565b60405180910390f35b6101ec60048036038101906101e791906115f5565b610b80565b005b61020860048036038101906102039190611697565b610d7e565b6040516102159190611779565b60405180910390f35b61023860048036038101906102339190611659565b610ec2565b604051610245919061189f565b60405180910390f35b610268600480360381019061026391906115f5565b610f1c565b604051610275919061189f565b60405180910390f35b61029860048036038101906102939190611659565b610fce565b005b6102b460048036038101906102af91906118b8565b61113b565b6040516102c19190611779565b60405180910390f35b836102d58133610aa0565b61030b576040517f7bfa4b9f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f60015f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2090505f61035685856111ab565b90506103a981836004015f8973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206111ea90919063ffffffff16565b6103df576040517f262118cd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61043081836004015f8973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206111ff90919063ffffffff16565b5061045686836005015f8481526020019081526020015f2061121490919063ffffffff16565b508573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167f18242326b6b862126970679759169f01f646bd55ec5bfcab85ba9f337a74e0c687876040516104b6929190611926565b60405180910390a350505050505050565b816104d28133610aa0565b610508576040517f7bfa4b9f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f60015f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206002019050600161055682611241565b1161058d576040517f8674495800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6105a0838261121490919063ffffffff16565b6105d6576040517fe2db036000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8373ffffffffffffffffffffffffffffffffffffffff167fdb9d5d31320daf5bc7181d565b6da4d12e30f0f4d5aa324a992426c14a1d19ce8460405161061c919061194d565b60405180910390a250505050565b816106358133610aa0565b61066b576040517f7bfa4b9f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f60015f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f0190506106c0838261121490919063ffffffff16565b6106f6576040517fbed8295f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8373ffffffffffffffffffffffffffffffffffffffff167fd706ed7ae044d795b49e54c9f519f663053951011985f663a862cd9ee72a9ac78460405161073c919061194d565b60405180910390a250505050565b5f60015f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20905061079f33825f0161121490919063ffffffff16565b6107d5576040517fbed8295f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6107eb338260020161125490919063ffffffff16565b508173ffffffffffffffffffffffffffffffffffffffff167fbf265e8326285a2747e33e54d5945f7111f2b5edb826eb8c08d4677779b3ff9733604051610832919061194d565b60405180910390a25050565b606061088760015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f01611281565b9050919050565b6060805f60015f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206004015f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2090505f610919826112a0565b90505f8167ffffffffffffffff81111561093657610935611966565b5b6040519080825280602002602001820160405280156109645781602001602082028036833780820191505090505b5090505f8267ffffffffffffffff81111561098257610981611966565b5b6040519080825280602002602001820160405280156109b05781602001602082028036833780820191505090505b5090505f5f90505b83811015610a8e576109db6109d682876112b390919063ffffffff16565b6112c8565b8483815181106109ee576109ed611993565b5b60200260200101848481518110610a0857610a07611993565b5b60200260200101827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168152508273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681525050508060010190506109b8565b50818195509550505050509250929050565b5f5f610aea60015f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20600201611241565b03610b25578173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16149050610b7a565b610b778260015f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206002016112ee90919063ffffffff16565b90505b92915050565b83610b8b8133610aa0565b610bc1576040517f7bfa4b9f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f60015f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2090505f610c0c85856111ab565b9050610c5f81836004015f8973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206111ea90919063ffffffff16565b15610c96576040517fad8efeb700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610ce781836004015f8973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2061131b90919063ffffffff16565b50610d0d86836005015f8481526020019081526020015f2061125490919063ffffffff16565b508573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167f037f03a2ad6b967df4a01779b6d2b4c85950df83925d9e31362b519422fc01698787604051610d6d929190611926565b60405180910390a350505050505050565b60605f610dc960015f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20600201611241565b03610e72575f600167ffffffffffffffff811115610dea57610de9611966565b5b604051908082528060200260200182016040528015610e185781602001602082028036833780820191505090505b50905082815f81518110610e2f57610e2e611993565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505080915050610ebd565b610eba60015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20600201611281565b90505b919050565b5f610f148260015f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f016112ee90919063ffffffff16565b905092915050565b5f610f278585610aa0565b80610fc45750610fc3610f3a84846111ab565b60015f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206004015f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206111ea90919063ffffffff16565b5b9050949350505050565b81610fd98133610aa0565b61100f576040517f7bfa4b9f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f60015f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20905061106583826002016112ee90919063ffffffff16565b1561109c576040517f980b072800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6110b183825f0161125490919063ffffffff16565b6110e7576040517f3357dbc600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8373ffffffffffffffffffffffffffffffffffffffff167fb14b9a3d448c5b04f0e5b087b6f5193390db7955482a6ffb841e7b3ba61a460c8460405161112d919061194d565b60405180910390a250505050565b60605f61114884846111ab565b90506111a160015f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206005015f8381526020019081526020015f20611281565b9150509392505050565b5f5f60608473ffffffffffffffffffffffffffffffffffffffff16901b90505f60408460e01c63ffffffff16901b90508082175f1b9250505092915050565b5f6111f7835f0183611330565b905092915050565b5f61120c835f0183611350565b905092915050565b5f611239835f018373ffffffffffffffffffffffffffffffffffffffff165f1b611350565b905092915050565b5f61124d825f0161144c565b9050919050565b5f611279835f018373ffffffffffffffffffffffffffffffffffffffff165f1b61145b565b905092915050565b60605f61128f835f016114c2565b905060608190508092505050919050565b5f6112ac825f0161144c565b9050919050565b5f6112c0835f018361151b565b905092915050565b5f5f5f6060845f1c901c90505f6040855f1c901c60e01b90508181935093505050915091565b5f611313835f018373ffffffffffffffffffffffffffffffffffffffff165f1b611330565b905092915050565b5f611328835f018361145b565b905092915050565b5f5f836001015f8481526020019081526020015f20541415905092915050565b5f5f836001015f8481526020019081526020015f205490505f8114611441575f60018261137d91906119f6565b90505f6001865f018054905061139391906119f6565b90508181146113f9575f865f0182815481106113b2576113b1611993565b5b905f5260205f200154905080875f0184815481106113d3576113d2611993565b5b905f5260205f20018190555083876001015f8381526020019081526020015f2081905550505b855f0180548061140c5761140b611a29565b5b600190038181905f5260205f20015f90559055856001015f8681526020019081526020015f205f905560019350505050611446565b5f9150505b92915050565b5f815f01805490509050919050565b5f6114668383611330565b6114b857825f0182908060018154018082558091505060019003905f5260205f20015f9091909190915055825f0180549050836001015f8481526020019081526020015f2081905550600190506114bc565b5f90505b92915050565b6060815f0180548060200260200160405190810160405280929190818152602001828054801561150f57602002820191905f5260205f20905b8154815260200190600101908083116114fb575b50505050509050919050565b5f825f01828154811061153157611530611993565b5b905f5260205f200154905092915050565b5f5ffd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f61156f82611546565b9050919050565b61157f81611565565b8114611589575f5ffd5b50565b5f8135905061159a81611576565b92915050565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6115d4816115a0565b81146115de575f5ffd5b50565b5f813590506115ef816115cb565b92915050565b5f5f5f5f6080858703121561160d5761160c611542565b5b5f61161a8782880161158c565b945050602061162b8782880161158c565b935050604061163c8782880161158c565b925050606061164d878288016115e1565b91505092959194509250565b5f5f6040838503121561166f5761166e611542565b5b5f61167c8582860161158c565b925050602061168d8582860161158c565b9150509250929050565b5f602082840312156116ac576116ab611542565b5b5f6116b98482850161158c565b91505092915050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b6116f481611565565b82525050565b5f61170583836116eb565b60208301905092915050565b5f602082019050919050565b5f611727826116c2565b61173181856116cc565b935061173c836116dc565b805f5b8381101561176c57815161175388826116fa565b975061175e83611711565b92505060018101905061173f565b5085935050505092915050565b5f6020820190508181035f830152611791818461171d565b905092915050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b6117cb816115a0565b82525050565b5f6117dc83836117c2565b60208301905092915050565b5f602082019050919050565b5f6117fe82611799565b61180881856117a3565b9350611813836117b3565b805f5b8381101561184357815161182a88826117d1565b9750611835836117e8565b925050600181019050611816565b5085935050505092915050565b5f6040820190508181035f830152611868818561171d565b9050818103602083015261187c81846117f4565b90509392505050565b5f8115159050919050565b61189981611885565b82525050565b5f6020820190506118b25f830184611890565b92915050565b5f5f5f606084860312156118cf576118ce611542565b5b5f6118dc8682870161158c565b93505060206118ed8682870161158c565b92505060406118fe868287016115e1565b9150509250925092565b61191181611565565b82525050565b611920816115a0565b82525050565b5f6040820190506119395f830185611908565b6119466020830184611917565b9392505050565b5f6020820190506119605f830184611908565b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f819050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f611a00826119c0565b9150611a0b836119c0565b9250828203905081811115611a2357611a226119c9565b5b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603160045260245ffdfea26469706673582212204d34614385038f370eaea1f99b8449ed39bdab47f6b52761b1136c9f7bb7b1d664736f6c634300081b0033", } // PermissionControllerABI 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 5d9b1ef6a6..4718bdccd5 100644 --- a/pkg/bindings/RewardsCoordinator/binding.go +++ b/pkg/bindings/RewardsCoordinator/binding.go @@ -104,8 +104,12 @@ var RewardsCoordinatorMetaData = &bind.MetaData{ Bin: "0x6101c0604052348015610010575f5ffd5b50604051614a90380380614a9083398101604081905261002f91610211565b858a8a8a88888888888f6001600160a01b038116610060576040516339b190bb60e11b815260040160405180910390fd5b6001600160a01b031660805261007685826102d3565b63ffffffff161561009a57604051630e06bd3160e01b815260040160405180910390fd5b6100a762015180866102d3565b63ffffffff16156100cb5760405163223c7b3960e11b815260040160405180910390fd5b6001600160a01b0397881660a05295871660c05293861660e05263ffffffff9283166101005290821661012052811661014052908116610160521661018052166101a052610117610126565b50505050505050505050610306565b5f54610100900460ff16156101915760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff908116146101e0575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b03811681146101f6575f5ffd5b50565b805163ffffffff8116811461020c575f5ffd5b919050565b5f5f5f5f5f5f5f5f5f5f6101408b8d03121561022b575f5ffd5b8a51610236816101e2565b60208c0151909a50610247816101e2565b60408c0151909950610258816101e2565b60608c0151909850610269816101e2565b60808c015190975061027a816101e2565b955061028860a08c016101f9565b945061029660c08c016101f9565b93506102a460e08c016101f9565b92506102b36101008c016101f9565b91506102c26101208c016101f9565b90509295989b9194979a5092959850565b5f63ffffffff8316806102f457634e487b7160e01b5f52601260045260245ffd5b8063ffffffff84160691505092915050565b60805160a05160c05160e05161010051610120516101405161016051610180516101a0516146b26103de5f395f81816105e5015261278101525f8181610499015261352801525f81816103e80152612bc301525f818161054701526134e601525f818161085e01526133f601525f818161079f01528181613446015261349401525f81816108b201528181610adb01528181611dd6015261208201525f818161056e01526135c301525f81816109250152611d4601525f818161073101528181610eb9015281816114bb015261236101526146b25ff3fe608060405234801561000f575f5ffd5b50600436106103a8575f3560e01c80638da5cb5b116101ea578063de02e50311610114578063f6efbb59116100a9578063fabc1cbc11610079578063fabc1cbc14610a13578063fbf1e2c114610a26578063fce36c7d14610a39578063ff9f6cce14610a4c575f5ffd5b8063f6efbb59146109c7578063f74e8eac146109da578063f8cd8448146109ed578063f96abf2e14610a00575f5ffd5b8063ed71e6a2116100e4578063ed71e6a214610947578063f22cef8514610974578063f2f07ab414610987578063f2fde38b146109b4575f5ffd5b8063de02e503146108e7578063e063f81f146108fa578063e810ce211461090d578063ea4d3c9b14610920575f5ffd5b8063a50a1d9c1161018a578063bf21a8aa1161015a578063bf21a8aa14610859578063c46db60614610880578063ca8aa7c7146108ad578063dcbb03b3146108d4575f5ffd5b8063a50a1d9c146107e7578063aebd8bae146107fa578063b3dbb0e014610827578063bb7e451f1461083a575f5ffd5b80639cb9a5fa116101c55780639cb9a5fa146107875780639d45c2811461079a5780639de4b35f146107c1578063a0169ddd146107d4575f5ffd5b80638da5cb5b146107535780639104c319146107645780639be3d4e41461077f575f5ffd5b80634596021c116102d65780635e9d83481161026b5780637b8f8b051161023b5780637b8f8b05146106e7578063863cb9a9146106ef578063865c695314610702578063886f11951461072c575f5ffd5b80635e9d83481461068a57806363f6a7981461069d5780636d21117e146106b2578063715018a6146106df575f5ffd5b806358baaa3e116102a657806358baaa3e14610644578063595c6a67146106575780635ac86ab71461065f5780635c975abb14610682575f5ffd5b80634596021c146105cd5780634657e26a146105e05780634b943960146106075780634d18cc351461062d575f5ffd5b8063149bc8721161034c57806339b70e381161031c57806339b70e38146105695780633a8c0786146105905780633ccc861d146105a75780633efe1db6146105ba575f5ffd5b8063149bc872146104ce5780632b9f64a4146104ef57806336af41fa1461052f57806337838ed014610542575f5ffd5b80630e9a53cf116103875780630e9a53cf146104345780630eb3834514610481578063131433b414610494578063136439dd146104bb575f5ffd5b806218572c146103ac57806304a0c502146103e35780630ca298991461041f575b5f5ffd5b6103ce6103ba366004613adf565b60d16020525f908152604090205460ff1681565b60405190151581526020015b60405180910390f35b61040a7f000000000000000000000000000000000000000000000000000000000000000081565b60405163ffffffff90911681526020016103da565b61043261042d366004613b57565b610a5f565b005b61043c610d24565b6040516103da91905f6080820190508251825263ffffffff602084015116602083015263ffffffff604084015116604083015260608301511515606083015292915050565b61043261048f366004613bb3565b610e24565b61040a7f000000000000000000000000000000000000000000000000000000000000000081565b6104326104c9366004613bea565b610ea4565b6104e16104dc366004613c01565b610f79565b6040519081526020016103da565b6105176104fd366004613adf565b60cc6020525f90815260409020546001600160a01b031681565b6040516001600160a01b0390911681526020016103da565b61043261053d366004613c1b565b610fee565b61040a7f000000000000000000000000000000000000000000000000000000000000000081565b6105177f000000000000000000000000000000000000000000000000000000000000000081565b60cb5461040a90600160a01b900463ffffffff1681565b6104326105b5366004613c6a565b61117d565b6104326105c8366004613cc0565b6111c2565b6104326105db366004613cea565b6113b6565b6105177f000000000000000000000000000000000000000000000000000000000000000081565b61061a610615366004613adf565b611437565b60405161ffff90911681526020016103da565b60cb5461040a90600160c01b900463ffffffff1681565b610432610652366004613d3c565b611492565b6104326114a6565b6103ce61066d366004613d55565b606654600160ff9092169190911b9081161490565b6066546104e1565b6103ce610698366004613d75565b611555565b60cb5461061a90600160e01b900461ffff1681565b6103ce6106c0366004613da6565b60cf60209081525f928352604080842090915290825290205460ff1681565b6104326115e0565b60ca546104e1565b6104326106fd366004613adf565b6115f1565b6104e1610710366004613dd0565b60cd60209081525f928352604080842090915290825290205481565b6105177f000000000000000000000000000000000000000000000000000000000000000081565b6033546001600160a01b0316610517565b61051773beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac081565b61043c611602565b610432610795366004613dfc565b61169e565b61040a7f000000000000000000000000000000000000000000000000000000000000000081565b61061a6107cf366004613e33565b611837565b6104326107e2366004613adf565b6118ba565b6104326107f5366004613e6f565b6118c5565b6103ce610808366004613da6565b60d260209081525f928352604080842090915290825290205460ff1681565b610432610835366004613e88565b6118d6565b6104e1610848366004613adf565b60ce6020525f908152604090205481565b61040a7f000000000000000000000000000000000000000000000000000000000000000081565b6103ce61088e366004613da6565b60d060209081525f928352604080842090915290825290205460ff1681565b6105177f000000000000000000000000000000000000000000000000000000000000000081565b6104326108e2366004613eb2565b611a1f565b61043c6108f5366004613bea565b611b8a565b61061a610908366004613dd0565b611c1a565b61040a61091b366004613bea565b611c7f565b6105177f000000000000000000000000000000000000000000000000000000000000000081565b6103ce610955366004613da6565b60d360209081525f928352604080842090915290825290205460ff1681565b610432610982366004613dd0565b611d00565b6103ce610995366004613da6565b60d760209081525f928352604080842090915290825290205460ff1681565b6104326109c2366004613adf565b611e6a565b6104326109d5366004613ef6565b611ee5565b6104326109e8366004613f54565b61201a565b6104e16109fb366004613c01565b612200565b610432610a0e366004613d3c565b612210565b610432610a21366004613bea565b61235f565b60cb54610517906001600160a01b031681565b610432610a47366004613c1b565b612475565b610432610a5a366004613c1b565b6125c4565b60665460099061020090811603610a895760405163840a48d560e01b815260040160405180910390fd5b610a966020850185613adf565b610a9f81612743565b610abc5760405163932d94f760e01b815260040160405180910390fd5b610ac46127ed565b6040516304c1b8eb60e31b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063260dc75890610b10908890600401613fbf565b602060405180830381865afa158015610b2b573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b4f9190613fcd565b610b6c57604051631fb1705560e21b815260040160405180910390fd5b5f5b83811015610d125736858583818110610b8957610b89613fe8565b9050602002810190610b9b9190613ffc565b90505f60ce81610bae60208b018b613adf565b6001600160a01b031681526020808201929092526040015f90812054925090610bd9908a018a613adf565b8284604051602001610bed93929190614224565b6040516020818303038152906040528051906020012090505f610c0f84612846565b9050600160d75f610c2360208e018e613adf565b6001600160a01b0316815260208082019290925260409081015f9081208682529092529020805460ff1916911515919091179055610c62836001614267565b60ce5f610c7260208e018e613adf565b6001600160a01b03166001600160a01b031681526020019081526020015f208190555081336001600160a01b03167ffff0759ccb371dfb5691798724e70b4fa61cb3bfe730a33ac19fb86a48efc7568c8688604051610cd39392919061427a565b60405180910390a3610d02333083610cf16040890160208a01613adf565b6001600160a01b0316929190612a31565b505060019092019150610b6e9050565b50610d1d6001609755565b5050505050565b604080516080810182525f80825260208201819052918101829052606081019190915260ca545b8015610dfc575f60ca610d5f60018461429f565b81548110610d6f57610d6f613fe8565b5f91825260209182902060408051608081018252600293909302909101805483526001015463ffffffff80821694840194909452600160201b810490931690820152600160401b90910460ff161580156060830181905291925090610dde5750806040015163ffffffff164210155b15610de95792915050565b5080610df4816142b2565b915050610d4b565b5050604080516080810182525f80825260208201819052918101829052606081019190915290565b610e2c612a9c565b6001600160a01b0382165f81815260d1602052604080822054905160ff9091169284151592841515927f4de6293e668df1398422e1def12118052c1539a03cbfedc145895d48d7685f1c9190a4506001600160a01b03919091165f90815260d160205260409020805460ff1916911515919091179055565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa158015610f06573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f2a9190613fcd565b610f4757604051631d77d47760e21b815260040160405180910390fd5b6066548181168114610f6c5760405163c61dca5d60e01b815260040160405180910390fd5b610f7582612af6565b5050565b5f80610f886020840184613adf565b8360200135604051602001610fd19392919060f89390931b6001600160f81b031916835260609190911b6bffffffffffffffffffffffff19166001830152601582015260350190565b604051602081830303815290604052805190602001209050919050565b6066546001906002908116036110175760405163840a48d560e01b815260040160405180910390fd5b335f90815260d1602052604090205460ff1661104657604051635c427cd960e01b815260040160405180910390fd5b61104e6127ed565b5f5b8281101561116d573684848381811061106b5761106b613fe8565b905060200281019061107d91906142c7565b335f81815260ce602090815260408083205490519495509391926110a79290918591879101614359565b6040516020818303038152906040528051906020012090506110c883612b33565b335f90815260d0602090815260408083208484529091529020805460ff191660019081179091556110fa908390614267565b335f81815260ce602052604090819020929092559051829184917f51088b8c89628df3a8174002c2a034d0152fce6af8415d651b2a4734bf2704829061114190889061437f565b60405180910390a4611162333060408601803590610cf19060208901613adf565b505050600101611050565b506111786001609755565b505050565b6066546002906004908116036111a65760405163840a48d560e01b815260040160405180910390fd5b6111ae6127ed565b6111b88383612c1e565b6111786001609755565b6066546003906008908116036111eb5760405163840a48d560e01b815260040160405180910390fd5b60cb546001600160a01b0316331461121657604051635c427cd960e01b815260040160405180910390fd5b60cb5463ffffffff600160c01b90910481169083161161124957604051631ca7e50b60e21b815260040160405180910390fd5b428263ffffffff161061126f576040516306957c9160e11b815260040160405180910390fd5b60ca5460cb545f9061128e90600160a01b900463ffffffff1642614391565b6040805160808101825287815263ffffffff87811660208084018281528684168587018181525f6060880181815260ca8054600181018255925297517f42d72674974f694b5f5159593243114d38a5c39c89d6b62fee061ff523240ee160029092029182015592517f42d72674974f694b5f5159593243114d38a5c39c89d6b62fee061ff523240ee290930180549151975193871667ffffffffffffffff1990921691909117600160201b978716979097029690961760ff60401b1916600160401b921515929092029190911790945560cb805463ffffffff60c01b1916600160c01b840217905593519283529394508892908616917fecd866c3c158fa00bf34d803d5f6023000b57080bcb48af004c2b4b46b3afd08910160405180910390a45050505050565b6066546002906004908116036113df5760405163840a48d560e01b815260040160405180910390fd5b6113e76127ed565b5f5b838110156114265761141e85858381811061140657611406613fe8565b905060200281019061141891906143ad565b84612c1e565b6001016113e9565b506114316001609755565b50505050565b6001600160a01b0381165f90815260d5602090815260408083208151606081018352905461ffff80821683526201000082041693820193909352600160201b90920463ffffffff169082015261148c90612ea6565b92915050565b61149a612a9c565b6114a381612f16565b50565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa158015611508573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061152c9190613fcd565b61154957604051631d77d47760e21b815260040160405180910390fd5b6115535f19612af6565b565b5f6115d88260ca6115696020830183613d3c565b63ffffffff168154811061157f5761157f613fe8565b5f91825260209182902060408051608081018252600293909302909101805483526001015463ffffffff80821694840194909452600160201b810490931690820152600160401b90910460ff1615156060820152612f87565b506001919050565b6115e8612a9c565b6115535f61312a565b6115f9612a9c565b6114a38161317b565b604080516080810182525f80825260208201819052918101829052606081019190915260ca80546116359060019061429f565b8154811061164557611645613fe8565b5f91825260209182902060408051608081018252600293909302909101805483526001015463ffffffff80821694840194909452600160201b810490931690820152600160401b90910460ff1615156060820152919050565b6066546005906020908116036116c75760405163840a48d560e01b815260040160405180910390fd5b836116d181612743565b6116ee5760405163932d94f760e01b815260040160405180910390fd5b6116f66127ed565b5f5b83811015610d12573685858381811061171357611713613fe8565b90506020028101906117259190613ffc565b6001600160a01b0388165f90815260ce6020908152604080832054905193945092611756918b918591879101614224565b6040516020818303038152906040528051906020012090505f61177884612846565b6001600160a01b038b165f90815260d3602090815260408083208684529091529020805460ff191660019081179091559091506117b6908490614267565b6001600160a01b038b165f81815260ce60205260409081902092909255905183919033907ffc8888bffd711da60bc5092b33f677d81896fe80ecc677b84cfab8184462b6e0906118099088908a906143c1565b60405180910390a4611827333083610cf16040890160208a01613adf565b5050600190920191506116f89050565b6001600160a01b0382165f90815260d6602052604081206118b3908261186a611865368790038701876143d9565b6131d6565b815260208082019290925260409081015f208151606081018352905461ffff80821683526201000082041693820193909352600160201b90920463ffffffff1690820152612ea6565b9392505050565b33610f758183613239565b6118cd612a9c565b6114a38161329c565b6066546007906080908116036118ff5760405163840a48d560e01b815260040160405180910390fd5b8261190981612743565b6119265760405163932d94f760e01b815260040160405180910390fd5b60cb545f9061194290600160a01b900463ffffffff1642614391565b6001600160a01b0386165f90815260d5602090815260408083208151606081018352905461ffff80821683526201000082041693820193909352600160201b90920463ffffffff16908201529192509061199b90612ea6565b6001600160a01b0387165f90815260d5602052604090209091506119c0908684613307565b6040805163ffffffff8416815261ffff838116602083015287168183015290516001600160a01b0388169133917fd1e028bd664486a46ad26040e999cd2d22e1e9a094ee6afe19fcf64678f16f749181900360600190a3505050505050565b606654600690604090811603611a485760405163840a48d560e01b815260040160405180910390fd5b83611a5281612743565b611a6f5760405163932d94f760e01b815260040160405180910390fd5b60cb545f90611a8b90600160a01b900463ffffffff1642614391565b6001600160a01b038781165f90815260d460209081526040808320938a1683529281528282208351606081018552905461ffff80821683526201000082041692820192909252600160201b90910463ffffffff1692810192909252919250611af290612ea6565b6001600160a01b038089165f90815260d460209081526040808320938b16835292905220909150611b24908684613307565b6040805163ffffffff8416815261ffff838116602083015287168183015290516001600160a01b0388811692908a169133917f48e198b6ae357e529204ee53a8e514c470ff77d9cc8e4f7207f8b5d490ae6934919081900360600190a450505050505050565b604080516080810182525f80825260208201819052918101829052606081019190915260ca8281548110611bc057611bc0613fe8565b5f91825260209182902060408051608081018252600293909302909101805483526001015463ffffffff80821694840194909452600160201b810490931690820152600160401b90910460ff161515606082015292915050565b6001600160a01b038281165f90815260d46020908152604080832093851683529281528282208351606081018552905461ffff80821683526201000082041692820192909252600160201b90910463ffffffff1692810192909252906118b390612ea6565b60ca545f905b63ffffffff811615611ce6578260ca611c9f600184614441565b63ffffffff1681548110611cb557611cb5613fe8565b905f5260205f2090600202015f015403611cd4576118b3600182614441565b80611cde8161445d565b915050611c85565b5060405163504570e360e01b815260040160405180910390fd5b81611d0a81612743565b611d275760405163932d94f760e01b815260040160405180910390fd5b6040516336b87bd760e11b81526001600160a01b0384811660048301527f00000000000000000000000000000000000000000000000000000000000000001690636d70f7ae90602401602060405180830381865afa158015611d8b573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611daf9190613fcd565b80611e43575060405163ba1a84e560e01b81526001600160a01b0384811660048301525f917f00000000000000000000000000000000000000000000000000000000000000009091169063ba1a84e590602401602060405180830381865afa158015611e1d573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611e41919061447b565b115b611e605760405163fb494ea160e01b815260040160405180910390fd5b6111788383613239565b611e72612a9c565b6001600160a01b038116611edc5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084015b60405180910390fd5b6114a38161312a565b5f54610100900460ff1615808015611f0357505f54600160ff909116105b80611f1c5750303b158015611f1c57505f5460ff166001145b611f7f5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401611ed3565b5f805460ff191660011790558015611fa0575f805461ff0019166101001790555b611fa985612af6565b611fb28661312a565b611fbb8461317b565b611fc483612f16565b611fcd8261329c565b8015612012575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050505050565b606654600890610100908116036120445760405163840a48d560e01b815260040160405180910390fd5b8361204e81612743565b61206b5760405163932d94f760e01b815260040160405180910390fd5b6040516304c1b8eb60e31b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063260dc758906120b7908790600401613fbf565b602060405180830381865afa1580156120d2573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906120f69190613fcd565b61211357604051631fb1705560e21b815260040160405180910390fd5b60cb545f9061212f90600160a01b900463ffffffff1642614391565b6001600160a01b0387165f90815260d66020526040812091925090612161908261186a611865368b90038b018b6143d9565b6001600160a01b0388165f90815260d6602052604081209192506121a69190612192611865368b90038b018b6143d9565b81526020019081526020015f208684613307565b866001600160a01b0316336001600160a01b03167f14918b3834ab6752eb2e1b489b6663a67810efb5f56f3944a97ede8ecf1fd9f18885858a6040516121ef9493929190614492565b60405180910390a350505050505050565b5f6001610f886020840184613adf565b6066546003906008908116036122395760405163840a48d560e01b815260040160405180910390fd5b60cb546001600160a01b0316331461226457604051635c427cd960e01b815260040160405180910390fd5b60ca5463ffffffff83161061228c576040516394a8d38960e01b815260040160405180910390fd5b5f60ca8363ffffffff16815481106122a6576122a6613fe8565b905f5260205f20906002020190508060010160089054906101000a900460ff16156122e457604051631b14174b60e01b815260040160405180910390fd5b6001810154600160201b900463ffffffff16421061231557604051630c36f66560e21b815260040160405180910390fd5b60018101805460ff60401b1916600160401b17905560405163ffffffff8416907fd850e6e5dfa497b72661fa73df2923464eaed9dc2ff1d3cb82bccbfeabe5c41e905f90a2505050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156123bb573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906123df91906144c6565b6001600160a01b0316336001600160a01b0316146124105760405163794821ff60e01b815260040160405180910390fd5b606654801982198116146124375760405163c61dca5d60e01b815260040160405180910390fd5b606682905560405182815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c9060200160405180910390a25050565b6066545f9060019081160361249d5760405163840a48d560e01b815260040160405180910390fd5b6124a56127ed565b5f5b8281101561116d57368484838181106124c2576124c2613fe8565b90506020028101906124d491906142c7565b335f81815260ce602090815260408083205490519495509391926124fe9290918591879101614359565b60405160208183030381529060405280519060200120905061251f83612b33565b335f90815260cf602090815260408083208484529091529020805460ff19166001908117909155612551908390614267565b335f81815260ce602052604090819020929092559051829184917f450a367a380c4e339e5ae7340c8464ef27af7781ad9945cfe8abd828f89e62819061259890889061437f565b60405180910390a46125b9333060408601803590610cf19060208901613adf565b5050506001016124a7565b6066546004906010908116036125ed5760405163840a48d560e01b815260040160405180910390fd5b335f90815260d1602052604090205460ff1661261c57604051635c427cd960e01b815260040160405180910390fd5b6126246127ed565b5f5b8281101561116d573684848381811061264157612641613fe8565b905060200281019061265391906142c7565b335f81815260ce6020908152604080832054905194955093919261267d9290918591879101614359565b60405160208183030381529060405280519060200120905061269e83612b33565b335f90815260d2602090815260408083208484529091529020805460ff191660019081179091556126d0908390614267565b335f81815260ce602052604090819020929092559051829184917f5251b6fdefcb5d81144e735f69ea4c695fd43b0289ca53dc075033f5fc80068b9061271790889061437f565b60405180910390a4612738333060408601803590610cf19060208901613adf565b505050600101612626565b604051631beb2b9760e31b81526001600160a01b0382811660048301523360248301523060448301525f80356001600160e01b0319166064840152917f00000000000000000000000000000000000000000000000000000000000000009091169063df595cb8906084016020604051808303815f875af11580156127c9573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061148c9190613fcd565b60026097540361283f5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401611ed3565b6002609755565b5f61287961285483806144e1565b6128646080860160608701613d3c565b61287460a0870160808801613d3c565b6133d6565b5f61288760408401846144e1565b9050116128a75760405163796cc52560e01b815260040160405180910390fd5b426128b860a0840160808501613d3c565b6128c86080850160608601613d3c565b6128d29190614391565b63ffffffff16106128f65760405163150358a160e21b815260040160405180910390fd5b5f80805b61290760408601866144e1565b90508110156129f8573661291e60408701876144e1565b8381811061292e5761292e613fe8565b6040029190910191505f90506129476020830183613adf565b6001600160a01b03160361296e57604051630863a45360e11b815260040160405180910390fd5b61297b6020820182613adf565b6001600160a01b0316836001600160a01b0316106129ac576040516310fb47f160e31b815260040160405180910390fd5b5f8160200135116129d0576040516310eb483f60e21b815260040160405180910390fd5b6129dd6020820182613adf565b92506129ed602082013585614267565b9350506001016128fa565b506f4b3b4ca85a86c47a098a223fffffffff821115612a2a5760405163070b5a6f60e21b815260040160405180910390fd5b5092915050565b6040516001600160a01b03808516602483015283166044820152606481018290526114319085906323b872dd60e01b906084015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b0319909316929092179091526136ae565b6033546001600160a01b031633146115535760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401611ed3565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a250565b612b60612b4082806144e1565b612b506080850160608601613d3c565b61287460a0860160808701613d3c565b5f816040013511612b84576040516310eb483f60e21b815260040160405180910390fd5b6f4b3b4ca85a86c47a098a223fffffffff81604001351115612bb95760405163070b5a6f60e21b815260040160405180910390fd5b612be963ffffffff7f00000000000000000000000000000000000000000000000000000000000000001642614267565b612bf96080830160608401613d3c565b63ffffffff1611156114a357604051637ee2b44360e01b815260040160405180910390fd5b5f60ca612c2e6020850185613d3c565b63ffffffff1681548110612c4457612c44613fe8565b5f91825260209182902060408051608081018252600293909302909101805483526001015463ffffffff80821694840194909452600160201b810490931690820152600160401b90910460ff16151560608201529050612ca48382612f87565b5f612cb56080850160608601613adf565b6001600160a01b038082165f90815260cc60205260409020549192501680612cda5750805b336001600160a01b03821614612d0357604051635c427cd960e01b815260040160405180910390fd5b5f5b612d1260a0870187614526565b90508110156120125736612d2960e08801886144e1565b83818110612d3957612d39613fe8565b6001600160a01b0387165f90815260cd602090815260408083209302949094019450929091508290612d6d90850185613adf565b6001600160a01b03166001600160a01b031681526020019081526020015f2054905080826020013511612db35760405163aa385e8160e01b815260040160405180910390fd5b5f612dc282602085013561429f565b6001600160a01b0387165f90815260cd60209081526040822092935085018035929190612def9087613adf565b6001600160a01b031681526020808201929092526040015f2091909155612e309089908390612e2090870187613adf565b6001600160a01b03169190613781565b86516001600160a01b03808a1691878216918916907f9543dbd55580842586a951f0386e24d68a5df99ae29e3b216588b45fd684ce3190612e746020890189613adf565b604080519283526001600160a01b039091166020830152810186905260600160405180910390a4505050600101612d05565b5f816040015163ffffffff165f1480612ed85750815161ffff908116148015612ed85750816040015163ffffffff1642105b15612ef057505060cb54600160e01b900461ffff1690565b816040015163ffffffff16421015612f0957815161148c565b506020015190565b919050565b60cb546040805163ffffffff600160a01b9093048316815291831660208301527faf557c6c02c208794817a705609cfa935f827312a1adfdd26494b6b95dd2b4b3910160405180910390a160cb805463ffffffff909216600160a01b0263ffffffff60a01b19909216919091179055565b806060015115612faa57604051631b14174b60e01b815260040160405180910390fd5b806040015163ffffffff16421015612fd557604051631437a2bb60e31b815260040160405180910390fd5b612fe260c0830183614526565b9050612ff160a0840184614526565b905014613011576040516343714afd60e01b815260040160405180910390fd5b61301e60e08301836144e1565b905061302d60c0840184614526565b90501461304d576040516343714afd60e01b815260040160405180910390fd5b8051613079906130636040850160208601613d3c565b613070604086018661456b565b866060016137b1565b5f5b61308860a0840184614526565b90508110156111785761312260808401356130a660a0860186614526565b848181106130b6576130b6613fe8565b90506020020160208101906130cb9190613d3c565b6130d860c0870187614526565b858181106130e8576130e8613fe8565b90506020028101906130fa919061456b565b61310760e08901896144e1565b8781811061311757613117613fe8565b905060400201613855565b60010161307b565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b60cb546040516001600160a01b038084169216907f237b82f438d75fc568ebab484b75b01d9287b9e98b490b7c23221623b6705dbb905f90a360cb80546001600160a01b0319166001600160a01b0392909216919091179055565b5f815f0151826020015163ffffffff1660405160200161322192919060609290921b6bffffffffffffffffffffffff1916825260a01b6001600160a01b031916601482015260200190565b60405160208183030381529060405261148c906145ad565b6001600160a01b038083165f81815260cc602052604080822080548686166001600160a01b0319821681179092559151919094169392849290917fbab947934d42e0ad206f25c9cab18b5bb6ae144acfb00f40b4e3aa59590ca3129190a4505050565b60cb546040805161ffff600160e01b9093048316815291831660208301527fe6cd4edfdcc1f6d130ab35f73d72378f3a642944fb4ee5bd84b7807a81ea1c4e910160405180910390a160cb805461ffff909216600160e01b0261ffff60e01b19909216919091179055565b61271061ffff8316111561332e5760405163891c63df60e01b815260040160405180910390fd5b8254600160201b900463ffffffff16421161335c57604051637b1e25c560e01b815260040160405180910390fd5b8254600160201b900463ffffffff165f0361338357825461ffff191661ffff17835561339a565b825462010000810461ffff1661ffff199091161783555b825463ffffffff909116600160201b0267ffffffff000000001961ffff90931662010000029290921667ffffffffffff00001990911617179055565b826133f45760405163796cc52560e01b815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000063ffffffff168163ffffffff16111561344157604051630dd0b9f560e21b815260040160405180910390fd5b61346b7f0000000000000000000000000000000000000000000000000000000000000000826145e4565b63ffffffff161561348f5760405163ee66470560e01b815260040160405180910390fd5b6134b97f0000000000000000000000000000000000000000000000000000000000000000836145e4565b63ffffffff16156134dd57604051633c1a94f160e21b815260040160405180910390fd5b8163ffffffff167f000000000000000000000000000000000000000000000000000000000000000063ffffffff1642613516919061429f565b1115801561355057508163ffffffff167f000000000000000000000000000000000000000000000000000000000000000063ffffffff1611155b61356d5760405163041aa75760e11b815260040160405180910390fd5b5f805b84811015612012575f86868381811061358b5761358b613fe8565b6135a19260206040909202019081019150613adf565b60405163198f077960e21b81526001600160a01b0380831660048301529192507f00000000000000000000000000000000000000000000000000000000000000009091169063663c1de490602401602060405180830381865afa15801561360a573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061362e9190613fcd565b8061365557506001600160a01b03811673beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac0145b61367257604051632efd965160e11b815260040160405180910390fd5b806001600160a01b0316836001600160a01b0316106136a45760405163dfad9ca160e01b815260040160405180910390fd5b9150600101613570565b5f613702826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166138939092919063ffffffff16565b905080515f14806137225750808060200190518101906137229190613fcd565b6111785760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401611ed3565b6040516001600160a01b03831660248201526044810182905261117890849063a9059cbb60e01b90606401612a65565b6137bc60208361460b565b6001901b8463ffffffff16106137e45760405162c6c39d60e71b815260040160405180910390fd5b5f6137ee82610f79565b905061383884848080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152508a92508591505063ffffffff89166138a9565b612012576040516369ca16c960e01b815260040160405180910390fd5b61386060208361460b565b6001901b8463ffffffff16106138895760405163054ff4df60e51b815260040160405180910390fd5b5f6137ee82612200565b60606138a184845f856138c0565b949350505050565b5f836138b6868585613997565b1495945050505050565b6060824710156139215760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401611ed3565b5f5f866001600160a01b0316858760405161393c919061461e565b5f6040518083038185875af1925050503d805f8114613976576040519150601f19603f3d011682016040523d82523d5f602084013e61397b565b606091505b509150915061398c87838387613a2e565b979650505050505050565b5f602084516139a69190614634565b156139c4576040516313717da960e21b815260040160405180910390fd5b8260205b85518111613a25576139db600285614634565b5f036139fc57815f528086015160205260405f209150600284049350613a13565b808601515f528160205260405f2091506002840493505b613a1e602082614267565b90506139c8565b50949350505050565b60608315613a9c5782515f03613a95576001600160a01b0385163b613a955760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401611ed3565b50816138a1565b6138a18383815115613ab15781518083602001fd5b8060405162461bcd60e51b8152600401611ed39190614647565b6001600160a01b03811681146114a3575f5ffd5b5f60208284031215613aef575f5ffd5b81356118b381613acb565b5f60408284031215613b0a575f5ffd5b50919050565b5f5f83601f840112613b20575f5ffd5b5081356001600160401b03811115613b36575f5ffd5b6020830191508360208260051b8501011115613b50575f5ffd5b9250929050565b5f5f5f60608486031215613b69575f5ffd5b613b738585613afa565b925060408401356001600160401b03811115613b8d575f5ffd5b613b9986828701613b10565b9497909650939450505050565b80151581146114a3575f5ffd5b5f5f60408385031215613bc4575f5ffd5b8235613bcf81613acb565b91506020830135613bdf81613ba6565b809150509250929050565b5f60208284031215613bfa575f5ffd5b5035919050565b5f60408284031215613c11575f5ffd5b6118b38383613afa565b5f5f60208385031215613c2c575f5ffd5b82356001600160401b03811115613c41575f5ffd5b613c4d85828601613b10565b90969095509350505050565b5f6101008284031215613b0a575f5ffd5b5f5f60408385031215613c7b575f5ffd5b82356001600160401b03811115613c90575f5ffd5b613c9c85828601613c59565b9250506020830135613bdf81613acb565b803563ffffffff81168114612f11575f5ffd5b5f5f60408385031215613cd1575f5ffd5b82359150613ce160208401613cad565b90509250929050565b5f5f5f60408486031215613cfc575f5ffd5b83356001600160401b03811115613d11575f5ffd5b613d1d86828701613b10565b9094509250506020840135613d3181613acb565b809150509250925092565b5f60208284031215613d4c575f5ffd5b6118b382613cad565b5f60208284031215613d65575f5ffd5b813560ff811681146118b3575f5ffd5b5f60208284031215613d85575f5ffd5b81356001600160401b03811115613d9a575f5ffd5b6138a184828501613c59565b5f5f60408385031215613db7575f5ffd5b8235613dc281613acb565b946020939093013593505050565b5f5f60408385031215613de1575f5ffd5b8235613dec81613acb565b91506020830135613bdf81613acb565b5f5f5f60408486031215613e0e575f5ffd5b8335613e1981613acb565b925060208401356001600160401b03811115613b8d575f5ffd5b5f5f60608385031215613e44575f5ffd5b8235613e4f81613acb565b9150613ce18460208501613afa565b803561ffff81168114612f11575f5ffd5b5f60208284031215613e7f575f5ffd5b6118b382613e5e565b5f5f60408385031215613e99575f5ffd5b8235613ea481613acb565b9150613ce160208401613e5e565b5f5f5f60608486031215613ec4575f5ffd5b8335613ecf81613acb565b92506020840135613edf81613acb565b9150613eed60408501613e5e565b90509250925092565b5f5f5f5f5f60a08688031215613f0a575f5ffd5b8535613f1581613acb565b9450602086013593506040860135613f2c81613acb565b9250613f3a60608701613cad565b9150613f4860808701613e5e565b90509295509295909350565b5f5f5f60808486031215613f66575f5ffd5b8335613f7181613acb565b9250613f808560208601613afa565b9150613eed60608501613e5e565b8035613f9981613acb565b6001600160a01b0316825263ffffffff613fb560208301613cad565b1660208301525050565b6040810161148c8284613f8e565b5f60208284031215613fdd575f5ffd5b81516118b381613ba6565b634e487b7160e01b5f52603260045260245ffd5b5f823560be19833603018112614010575f5ffd5b9190910192915050565b5f5f8335601e1984360301811261402f575f5ffd5b83016020810192503590506001600160401b0381111561404d575f5ffd5b8060061b3603821315613b50575f5ffd5b8183526020830192505f815f5b848110156140c157813561407e81613acb565b6001600160a01b0316865260208201356bffffffffffffffffffffffff81168082146140a8575f5ffd5b602088015250604095860195919091019060010161406b565b5093949350505050565b5f5f8335601e198436030181126140e0575f5ffd5b83016020810192503590506001600160401b038111156140fe575f5ffd5b803603821315613b50575f5ffd5b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b5f61413f828361401a565b60c0855261415160c08601828461405e565b915050602083013561416281613acb565b6001600160a01b0316602085015261417d604084018461401a565b858303604087015280835290915f91906020015b818310156141cc5783356141a481613acb565b6001600160a01b03168152602084810135908201526040938401936001939093019201614191565b6141d860608701613cad565b63ffffffff8116606089015293506141f260808701613cad565b63ffffffff81166080890152935061420d60a08701876140cb565b9450925086810360a088015261398c81858561410c565b60018060a01b0384168152826020820152606060408201525f61424a6060830184614134565b95945050505050565b634e487b7160e01b5f52601160045260245ffd5b8082018082111561148c5761148c614253565b6142848185613f8e565b826040820152608060608201525f61424a6080830184614134565b8181038181111561148c5761148c614253565b5f816142c0576142c0614253565b505f190190565b5f8235609e19833603018112614010575f5ffd5b5f6142e6828361401a565b60a085526142f860a08601828461405e565b915050602083013561430981613acb565b6001600160a01b031660208501526040838101359085015263ffffffff61433260608501613cad565b16606085015263ffffffff61434960808501613cad565b1660808501528091505092915050565b60018060a01b0384168152826020820152606060408201525f61424a60608301846142db565b602081525f6118b360208301846142db565b63ffffffff818116838216019081111561148c5761148c614253565b5f823560fe19833603018112614010575f5ffd5b828152604060208201525f6138a16040830184614134565b5f60408284031280156143ea575f5ffd5b50604080519081016001600160401b038111828210171561441957634e487b7160e01b5f52604160045260245ffd5b604052823561442781613acb565b815261443560208401613cad565b60208201529392505050565b63ffffffff828116828216039081111561148c5761148c614253565b5f63ffffffff82168061447257614472614253565b5f190192915050565b5f6020828403121561448b575f5ffd5b5051919050565b60a081016144a08287613f8e565b63ffffffff94909416604082015261ffff92831660608201529116608090910152919050565b5f602082840312156144d6575f5ffd5b81516118b381613acb565b5f5f8335601e198436030181126144f6575f5ffd5b8301803591506001600160401b0382111561450f575f5ffd5b6020019150600681901b3603821315613b50575f5ffd5b5f5f8335601e1984360301811261453b575f5ffd5b8301803591506001600160401b03821115614554575f5ffd5b6020019150600581901b3603821315613b50575f5ffd5b5f5f8335601e19843603018112614580575f5ffd5b8301803591506001600160401b03821115614599575f5ffd5b602001915036819003821315613b50575f5ffd5b80516020808301519190811015613b0a575f1960209190910360031b1b16919050565b634e487b7160e01b5f52601260045260245ffd5b5f63ffffffff8316806145f9576145f96145d0565b8063ffffffff84160691505092915050565b5f82614619576146196145d0565b500490565b5f82518060208501845e5f920191825250919050565b5f82614642576146426145d0565b500690565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f8301168401019150509291505056fea26469706673582212207c67616836c6a7c795552d9e8dfc776d40881dc1498dda9812cc4c094c4ad5f464736f6c634300081b0033", ======= ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"_delegationManager\",\"type\":\"address\",\"internalType\":\"contractIDelegationManager\"},{\"name\":\"_strategyManager\",\"type\":\"address\",\"internalType\":\"contractIStrategyManager\"},{\"name\":\"_allocationManager\",\"type\":\"address\",\"internalType\":\"contractIAllocationManager\"},{\"name\":\"_pauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"},{\"name\":\"_permissionController\",\"type\":\"address\",\"internalType\":\"contractIPermissionController\"},{\"name\":\"_CALCULATION_INTERVAL_SECONDS\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"_MAX_REWARDS_DURATION\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"_MAX_RETROACTIVE_LENGTH\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"_MAX_FUTURE_LENGTH\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"_GENESIS_REWARDS_TIMESTAMP\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"CALCULATION_INTERVAL_SECONDS\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"GENESIS_REWARDS_TIMESTAMP\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAX_FUTURE_LENGTH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAX_RETROACTIVE_LENGTH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAX_REWARDS_DURATION\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activationDelay\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"allocationManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIAllocationManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"beaconChainETHStrategy\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"calculateEarnerLeafHash\",\"inputs\":[{\"name\":\"leaf\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinatorTypes.EarnerTreeMerkleLeaf\",\"components\":[{\"name\":\"earner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"earnerTokenRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"calculateTokenLeafHash\",\"inputs\":[{\"name\":\"leaf\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinatorTypes.TokenTreeMerkleLeaf\",\"components\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"cumulativeEarnings\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"checkClaim\",\"inputs\":[{\"name\":\"claim\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinatorTypes.RewardsMerkleClaim\",\"components\":[{\"name\":\"rootIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"earnerIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"earnerTreeProof\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"earnerLeaf\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinatorTypes.EarnerTreeMerkleLeaf\",\"components\":[{\"name\":\"earner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"earnerTokenRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"tokenIndices\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"},{\"name\":\"tokenTreeProofs\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"},{\"name\":\"tokenLeaves\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.TokenTreeMerkleLeaf[]\",\"components\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"cumulativeEarnings\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"claimerFor\",\"inputs\":[{\"name\":\"earner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"claimer\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"createAVSRewardsSubmission\",\"inputs\":[{\"name\":\"rewardsSubmissions\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.RewardsSubmission[]\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.StrategyAndMultiplier[]\",\"components\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"multiplier\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"duration\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"createOperatorDirectedAVSRewardsSubmission\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorDirectedRewardsSubmissions\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.OperatorDirectedRewardsSubmission[]\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.StrategyAndMultiplier[]\",\"components\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"multiplier\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"operatorRewards\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.OperatorReward[]\",\"components\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"startTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"duration\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"description\",\"type\":\"string\",\"internalType\":\"string\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"createRewardsForAllEarners\",\"inputs\":[{\"name\":\"rewardsSubmissions\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.RewardsSubmission[]\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.StrategyAndMultiplier[]\",\"components\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"multiplier\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"duration\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"createRewardsForAllSubmission\",\"inputs\":[{\"name\":\"rewardsSubmissions\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.RewardsSubmission[]\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.StrategyAndMultiplier[]\",\"components\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"multiplier\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"duration\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"cumulativeClaimed\",\"inputs\":[{\"name\":\"earner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"outputs\":[{\"name\":\"totalClaimed\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"currRewardsCalculationEndTimestamp\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"defaultOperatorSplitBips\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"delegationManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIDelegationManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"disableRoot\",\"inputs\":[{\"name\":\"rootIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"getCurrentClaimableDistributionRoot\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinatorTypes.DistributionRoot\",\"components\":[{\"name\":\"root\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"rewardsCalculationEndTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"activatedAt\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"disabled\",\"type\":\"bool\",\"internalType\":\"bool\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getCurrentDistributionRoot\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinatorTypes.DistributionRoot\",\"components\":[{\"name\":\"root\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"rewardsCalculationEndTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"activatedAt\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"disabled\",\"type\":\"bool\",\"internalType\":\"bool\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getDistributionRootAtIndex\",\"inputs\":[{\"name\":\"index\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinatorTypes.DistributionRoot\",\"components\":[{\"name\":\"root\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"rewardsCalculationEndTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"activatedAt\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"disabled\",\"type\":\"bool\",\"internalType\":\"bool\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getDistributionRootsLength\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getOperatorAVSSplit\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getOperatorPISplit\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getRootIndexFromHash\",\"inputs\":[{\"name\":\"rootHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"initialOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"initialPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_rewardsUpdater\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_activationDelay\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"_defaultSplitBips\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"isAVSRewardsSubmissionHash\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"hash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"valid\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isOperatorDirectedAVSRewardsSubmissionHash\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isRewardsForAllSubmitter\",\"inputs\":[{\"name\":\"submitter\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"valid\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isRewardsSubmissionForAllEarnersHash\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"hash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"valid\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isRewardsSubmissionForAllHash\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"hash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"valid\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"pauseAll\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[{\"name\":\"index\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pauserRegistry\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"permissionController\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIPermissionController\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"processClaim\",\"inputs\":[{\"name\":\"claim\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinatorTypes.RewardsMerkleClaim\",\"components\":[{\"name\":\"rootIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"earnerIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"earnerTreeProof\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"earnerLeaf\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinatorTypes.EarnerTreeMerkleLeaf\",\"components\":[{\"name\":\"earner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"earnerTokenRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"tokenIndices\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"},{\"name\":\"tokenTreeProofs\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"},{\"name\":\"tokenLeaves\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.TokenTreeMerkleLeaf[]\",\"components\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"cumulativeEarnings\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}]},{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"processClaims\",\"inputs\":[{\"name\":\"claims\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.RewardsMerkleClaim[]\",\"components\":[{\"name\":\"rootIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"earnerIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"earnerTreeProof\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"earnerLeaf\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinatorTypes.EarnerTreeMerkleLeaf\",\"components\":[{\"name\":\"earner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"earnerTokenRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"tokenIndices\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"},{\"name\":\"tokenTreeProofs\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"},{\"name\":\"tokenLeaves\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.TokenTreeMerkleLeaf[]\",\"components\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"cumulativeEarnings\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}]},{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"rewardsUpdater\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"setActivationDelay\",\"inputs\":[{\"name\":\"_activationDelay\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setClaimerFor\",\"inputs\":[{\"name\":\"claimer\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setClaimerFor\",\"inputs\":[{\"name\":\"earner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"claimer\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setDefaultOperatorSplit\",\"inputs\":[{\"name\":\"split\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setOperatorAVSSplit\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"split\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setOperatorPISplit\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"split\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setRewardsForAllSubmitter\",\"inputs\":[{\"name\":\"_submitter\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_newValue\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setRewardsUpdater\",\"inputs\":[{\"name\":\"_rewardsUpdater\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"strategyManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategyManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"submissionNonce\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"nonce\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"submitRoot\",\"inputs\":[{\"name\":\"root\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"rewardsCalculationEndTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"AVSRewardsSubmissionCreated\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"submissionNonce\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"rewardsSubmissionHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"rewardsSubmission\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIRewardsCoordinatorTypes.RewardsSubmission\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.StrategyAndMultiplier[]\",\"components\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"multiplier\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"duration\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ActivationDelaySet\",\"inputs\":[{\"name\":\"oldActivationDelay\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"},{\"name\":\"newActivationDelay\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ClaimerForSet\",\"inputs\":[{\"name\":\"earner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"oldClaimer\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"claimer\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DefaultOperatorSplitBipsSet\",\"inputs\":[{\"name\":\"oldDefaultOperatorSplitBips\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"},{\"name\":\"newDefaultOperatorSplitBips\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DistributionRootDisabled\",\"inputs\":[{\"name\":\"rootIndex\",\"type\":\"uint32\",\"indexed\":true,\"internalType\":\"uint32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DistributionRootSubmitted\",\"inputs\":[{\"name\":\"rootIndex\",\"type\":\"uint32\",\"indexed\":true,\"internalType\":\"uint32\"},{\"name\":\"root\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"rewardsCalculationEndTimestamp\",\"type\":\"uint32\",\"indexed\":true,\"internalType\":\"uint32\"},{\"name\":\"activatedAt\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorAVSSplitBipsSet\",\"inputs\":[{\"name\":\"caller\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"avs\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"activatedAt\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"},{\"name\":\"oldOperatorAVSSplitBips\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"},{\"name\":\"newOperatorAVSSplitBips\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorDirectedAVSRewardsSubmissionCreated\",\"inputs\":[{\"name\":\"caller\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"avs\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"operatorDirectedRewardsSubmissionHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"submissionNonce\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"operatorDirectedRewardsSubmission\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIRewardsCoordinatorTypes.OperatorDirectedRewardsSubmission\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.StrategyAndMultiplier[]\",\"components\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"multiplier\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"operatorRewards\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.OperatorReward[]\",\"components\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"startTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"duration\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"description\",\"type\":\"string\",\"internalType\":\"string\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorPISplitBipsSet\",\"inputs\":[{\"name\":\"caller\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"activatedAt\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"},{\"name\":\"oldOperatorPISplitBips\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"},{\"name\":\"newOperatorPISplitBips\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RewardsClaimed\",\"inputs\":[{\"name\":\"root\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"},{\"name\":\"earner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"claimer\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"recipient\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"token\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIERC20\"},{\"name\":\"claimedAmount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RewardsForAllSubmitterSet\",\"inputs\":[{\"name\":\"rewardsForAllSubmitter\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"oldValue\",\"type\":\"bool\",\"indexed\":true,\"internalType\":\"bool\"},{\"name\":\"newValue\",\"type\":\"bool\",\"indexed\":true,\"internalType\":\"bool\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RewardsSubmissionForAllCreated\",\"inputs\":[{\"name\":\"submitter\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"submissionNonce\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"rewardsSubmissionHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"rewardsSubmission\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIRewardsCoordinatorTypes.RewardsSubmission\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.StrategyAndMultiplier[]\",\"components\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"multiplier\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"duration\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RewardsSubmissionForAllEarnersCreated\",\"inputs\":[{\"name\":\"tokenHopper\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"submissionNonce\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"rewardsSubmissionHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"rewardsSubmission\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIRewardsCoordinatorTypes.RewardsSubmission\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.StrategyAndMultiplier[]\",\"components\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"multiplier\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"duration\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RewardsUpdaterSet\",\"inputs\":[{\"name\":\"oldRewardsUpdater\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newRewardsUpdater\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"AmountExceedsMax\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"AmountIsZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"CurrentlyPaused\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"DurationExceedsMax\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"EarningsNotGreaterThanClaimed\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InputAddressZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InputArrayLengthMismatch\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InputArrayLengthZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidAddressZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidCalculationIntervalSecondsRemainder\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidClaimProof\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidDurationRemainder\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidEarner\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidEarnerLeafIndex\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidGenesisRewardsTimestampRemainder\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidNewPausedStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidPermissions\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidProofLength\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidRoot\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidRootIndex\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidStartTimestampRemainder\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidTokenLeafIndex\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NewRootMustBeForNewCalculatedPeriod\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyPauser\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyUnpauser\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OperatorsNotInAscendingOrder\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"PreviousSplitPending\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RewardsEndTimestampNotElapsed\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RootAlreadyActivated\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RootDisabled\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RootNotActivated\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SplitExceedsMax\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StartTimestampTooFarInFuture\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StartTimestampTooFarInPast\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StrategiesNotInAscendingOrder\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StrategyNotWhitelisted\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SubmissionNotRetroactive\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"UnauthorizedCaller\",\"inputs\":[]}]", +<<<<<<< HEAD Bin: "0x6101c0604052348015610010575f5ffd5b506040516142d63803806142d683398101604081905261002f91610211565b858a8a8a88888888888f6001600160a01b038116610060576040516339b190bb60e11b815260040160405180910390fd5b6001600160a01b031660805261007685826102d3565b63ffffffff161561009a57604051630e06bd3160e01b815260040160405180910390fd5b6100a762015180866102d3565b63ffffffff16156100cb5760405163223c7b3960e11b815260040160405180910390fd5b6001600160a01b0397881660a05295871660c05293861660e05263ffffffff9283166101005290821661012052811661014052908116610160521661018052166101a052610117610126565b50505050505050505050610306565b5f54610100900460ff16156101915760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff908116146101e0575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b03811681146101f6575f5ffd5b50565b805163ffffffff8116811461020c575f5ffd5b919050565b5f5f5f5f5f5f5f5f5f5f6101408b8d03121561022b575f5ffd5b8a51610236816101e2565b60208c0151909a50610247816101e2565b60408c0151909950610258816101e2565b60608c0151909850610269816101e2565b60808c015190975061027a816101e2565b955061028860a08c016101f9565b945061029660c08c016101f9565b93506102a460e08c016101f9565b92506102b36101008c016101f9565b91506102c26101208c016101f9565b90509295989b9194979a5092959850565b5f63ffffffff8316806102f457634e487b7160e01b5f52601260045260245ffd5b8063ffffffff84160691505092915050565b60805160a05160c05160e05161010051610120516101405161016051610180516101a051613f066103d05f395f81816105a601526129ee01525f818161045a0152612f2f01525f81816103bc015261233201525f81816105080152612eed01525f818161080c0152612dfd01525f818161076001528181612e4d0152612e9b01525f81816108600152611a2601525f818161052f0152612fca01525f81816108d3015261199601525f81816106f201528181610b62015281816111750152611dcb0152613f065ff3fe608060405234801561000f575f5ffd5b506004361061037c575f3560e01c8063886f1195116101d4578063dcbb03b311610109578063f2fde38b116100a9578063fabc1cbc11610079578063fabc1cbc14610981578063fbf1e2c114610994578063fce36c7d146109a7578063ff9f6cce146109ba575f5ffd5b8063f2fde38b14610935578063f6efbb5914610948578063f8cd84481461095b578063f96abf2e1461096e575f5ffd5b8063e810ce21116100e4578063e810ce21146108bb578063ea4d3c9b146108ce578063ed71e6a2146108f5578063f22cef8514610922575f5ffd5b8063dcbb03b314610882578063de02e50314610895578063e063f81f146108a8575f5ffd5b8063a50a1d9c11610174578063bb7e451f1161014f578063bb7e451f146107e8578063bf21a8aa14610807578063c46db6061461082e578063ca8aa7c71461085b575f5ffd5b8063a50a1d9c14610795578063aebd8bae146107a8578063b3dbb0e0146107d5575f5ffd5b80639be3d4e4116101af5780639be3d4e4146107405780639cb9a5fa146107485780639d45c2811461075b578063a0169ddd14610782575f5ffd5b8063886f1195146106ed5780638da5cb5b146107145780639104c31914610725575f5ffd5b80634596021c116102b55780635c975abb11610255578063715018a611610225578063715018a6146106a05780637b8f8b05146106a8578063863cb9a9146106b0578063865c6953146106c3575f5ffd5b80635c975abb146106435780635e9d83481461064b57806363f6a7981461065e5780636d21117e14610673575f5ffd5b80634d18cc35116102905780634d18cc35146105ee57806358baaa3e14610605578063595c6a67146106185780635ac86ab714610620575f5ffd5b80634596021c1461058e5780634657e26a146105a15780634b943960146105c8575f5ffd5b80632b9f64a41161032057806339b70e38116102fb57806339b70e381461052a5780633a8c0786146105515780633ccc861d146105685780633efe1db61461057b575f5ffd5b80632b9f64a4146104b057806336af41fa146104f057806337838ed014610503575f5ffd5b80630eb383451161035b5780630eb3834514610440578063131433b414610455578063136439dd1461047c578063149bc8721461048f575f5ffd5b806218572c1461038057806304a0c502146103b75780630e9a53cf146103f3575b5f5ffd5b6103a261038e3660046134e6565b60d16020525f908152604090205460ff1681565b60405190151581526020015b60405180910390f35b6103de7f000000000000000000000000000000000000000000000000000000000000000081565b60405163ffffffff90911681526020016103ae565b6103fb6109cd565b6040516103ae91905f6080820190508251825263ffffffff602084015116602083015263ffffffff604084015116604083015260608301511515606083015292915050565b61045361044e36600461350e565b610acd565b005b6103de7f000000000000000000000000000000000000000000000000000000000000000081565b61045361048a366004613545565b610b4d565b6104a261049d366004613572565b610c22565b6040519081526020016103ae565b6104d86104be3660046134e6565b60cc6020525f90815260409020546001600160a01b031681565b6040516001600160a01b0390911681526020016103ae565b6104536104fe3660046135d4565b610c97565b6103de7f000000000000000000000000000000000000000000000000000000000000000081565b6104d87f000000000000000000000000000000000000000000000000000000000000000081565b60cb546103de90600160a01b900463ffffffff1681565b610453610576366004613624565b610e37565b61045361058936600461367b565b610e7c565b61045361059c3660046136a5565b611070565b6104d87f000000000000000000000000000000000000000000000000000000000000000081565b6105db6105d63660046134e6565b6110f1565b60405161ffff90911681526020016103ae565b60cb546103de90600160c01b900463ffffffff1681565b6104536106133660046136f8565b61114c565b610453611160565b6103a261062e366004613711565b606654600160ff9092169190911b9081161490565b6066546104a2565b6103a2610659366004613731565b61120f565b60cb546105db90600160e01b900461ffff1681565b6103a2610681366004613763565b60cf60209081525f928352604080842090915290825290205460ff1681565b61045361129a565b60ca546104a2565b6104536106be3660046134e6565b6112ab565b6104a26106d136600461378d565b60cd60209081525f928352604080842090915290825290205481565b6104d87f000000000000000000000000000000000000000000000000000000000000000081565b6033546001600160a01b03166104d8565b6104d873beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac081565b6103fb6112bc565b6104536107563660046137b9565b611358565b6103de7f000000000000000000000000000000000000000000000000000000000000000081565b6104536107903660046134e6565b611503565b6104536107a336600461381b565b61150e565b6103a26107b6366004613763565b60d260209081525f928352604080842090915290825290205460ff1681565b6104536107e3366004613834565b61151f565b6104a26107f63660046134e6565b60ce6020525f908152604090205481565b6103de7f000000000000000000000000000000000000000000000000000000000000000081565b6103a261083c366004613763565b60d060209081525f928352604080842090915290825290205460ff1681565b6104d87f000000000000000000000000000000000000000000000000000000000000000081565b61045361089036600461385e565b611668565b6103fb6108a3366004613545565b6117d3565b6105db6108b636600461378d565b611863565b6103de6108c9366004613545565b6118cf565b6104d87f000000000000000000000000000000000000000000000000000000000000000081565b6103a2610903366004613763565b60d360209081525f928352604080842090915290825290205460ff1681565b61045361093036600461378d565b611950565b6104536109433660046134e6565b611aba565b6104536109563660046138a2565b611b35565b6104a2610969366004613572565b611c6a565b61045361097c3660046136f8565b611c7a565b61045361098f366004613545565b611dc9565b60cb546104d8906001600160a01b031681565b6104536109b53660046135d4565b611edf565b6104536109c83660046135d4565b61202e565b604080516080810182525f80825260208201819052918101829052606081019190915260ca545b8015610aa5575f60ca610a08600184613914565b81548110610a1857610a18613927565b5f91825260209182902060408051608081018252600293909302909101805483526001015463ffffffff80821694840194909452600160201b810490931690820152600160401b90910460ff161580156060830181905291925090610a875750806040015163ffffffff164210155b15610a925792915050565b5080610a9d8161393b565b9150506109f4565b5050604080516080810182525f80825260208201819052918101829052606081019190915290565b610ad56121ad565b6001600160a01b0382165f81815260d1602052604080822054905160ff9091169284151592841515927f4de6293e668df1398422e1def12118052c1539a03cbfedc145895d48d7685f1c9190a4506001600160a01b03919091165f90815260d160205260409020805460ff1916911515919091179055565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa158015610baf573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610bd39190613950565b610bf057604051631d77d47760e21b815260040160405180910390fd5b6066548181168114610c155760405163c61dca5d60e01b815260040160405180910390fd5b610c1e82612207565b5050565b5f80610c3160208401846134e6565b8360200135604051602001610c7a9392919060f89390931b6001600160f81b031916835260609190911b6bffffffffffffffffffffffff19166001830152601582015260350190565b604051602081830303815290604052805190602001209050919050565b606654600190600290811603610cc05760405163840a48d560e01b815260040160405180910390fd5b335f90815260d1602052604090205460ff16610cef57604051635c427cd960e01b815260040160405180910390fd5b610cf7612244565b5f5b82811015610e275736848483818110610d1457610d14613927565b9050602002810190610d26919061396b565b335f81815260ce60209081526040808320549051949550939192610d509290918591879101613ab9565b604051602081830303815290604052805190602001209050610d718361229d565b335f90815260d0602090815260408083208484529091529020805460ff19166001908117909155610da3908390613ae8565b335f81815260ce602052604090819020929092559051829184917f51088b8c89628df3a8174002c2a034d0152fce6af8415d651b2a4734bf27048290610dea908890613afb565b60405180910390a4610e1c333060408601803590610e0b90602089016134e6565b6001600160a01b031692919061238d565b505050600101610cf9565b50610e326001609755565b505050565b606654600290600490811603610e605760405163840a48d560e01b815260040160405180910390fd5b610e68612244565b610e7283836123f8565b610e326001609755565b606654600390600890811603610ea55760405163840a48d560e01b815260040160405180910390fd5b60cb546001600160a01b03163314610ed057604051635c427cd960e01b815260040160405180910390fd5b60cb5463ffffffff600160c01b909104811690831611610f0357604051631ca7e50b60e21b815260040160405180910390fd5b428263ffffffff1610610f29576040516306957c9160e11b815260040160405180910390fd5b60ca5460cb545f90610f4890600160a01b900463ffffffff1642613b0d565b6040805160808101825287815263ffffffff87811660208084018281528684168587018181525f6060880181815260ca8054600181018255925297517f42d72674974f694b5f5159593243114d38a5c39c89d6b62fee061ff523240ee160029092029182015592517f42d72674974f694b5f5159593243114d38a5c39c89d6b62fee061ff523240ee290930180549151975193871667ffffffffffffffff1990921691909117600160201b978716979097029690961760ff60401b1916600160401b921515929092029190911790945560cb805463ffffffff60c01b1916600160c01b840217905593519283529394508892908616917fecd866c3c158fa00bf34d803d5f6023000b57080bcb48af004c2b4b46b3afd08910160405180910390a45050505050565b6066546002906004908116036110995760405163840a48d560e01b815260040160405180910390fd5b6110a1612244565b5f5b838110156110e0576110d88585838181106110c0576110c0613927565b90506020028101906110d29190613b29565b846123f8565b6001016110a3565b506110eb6001609755565b50505050565b6001600160a01b0381165f90815260d5602090815260408083208151606081018352905461ffff80821683526201000082041693820193909352600160201b90920463ffffffff169082015261114690612680565b92915050565b6111546121ad565b61115d816126f0565b50565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa1580156111c2573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111e69190613950565b61120357604051631d77d47760e21b815260040160405180910390fd5b61120d5f19612207565b565b5f6112928260ca61122360208301836136f8565b63ffffffff168154811061123957611239613927565b5f91825260209182902060408051608081018252600293909302909101805483526001015463ffffffff80821694840194909452600160201b810490931690820152600160401b90910460ff1615156060820152612761565b506001919050565b6112a26121ad565b61120d5f612904565b6112b36121ad565b61115d81612955565b604080516080810182525f80825260208201819052918101829052606081019190915260ca80546112ef90600190613914565b815481106112ff576112ff613927565b5f91825260209182902060408051608081018252600293909302909101805483526001015463ffffffff80821694840194909452600160201b810490931690820152600160401b90910460ff1615156060820152919050565b6066546005906020908116036113815760405163840a48d560e01b815260040160405180910390fd5b8361138b816129b0565b6113a85760405163932d94f760e01b815260040160405180910390fd5b6113b0612244565b5f5b838110156114f157368585838181106113cd576113cd613927565b90506020028101906113df9190613b3d565b6001600160a01b0388165f90815260ce6020908152604080832054905193945092611410918b918591879101613cab565b6040516020818303038152906040528051906020012090505f61143284612a5a565b6001600160a01b038b165f90815260d3602090815260408083208684529091529020805460ff19166001908117909155909150611470908490613ae8565b6001600160a01b038b165f81815260ce60205260409081902092909255905183919033907ffc8888bffd711da60bc5092b33f677d81896fe80ecc677b84cfab8184462b6e0906114c39088908a90613cd1565b60405180910390a46114e1333083610e0b6040890160208a016134e6565b5050600190920191506113b29050565b506114fc6001609755565b5050505050565b33610c1e8183612c40565b6115166121ad565b61115d81612ca3565b6066546007906080908116036115485760405163840a48d560e01b815260040160405180910390fd5b82611552816129b0565b61156f5760405163932d94f760e01b815260040160405180910390fd5b60cb545f9061158b90600160a01b900463ffffffff1642613b0d565b6001600160a01b0386165f90815260d5602090815260408083208151606081018352905461ffff80821683526201000082041693820193909352600160201b90920463ffffffff1690820152919250906115e490612680565b6001600160a01b0387165f90815260d560205260409020909150611609908684612d0e565b6040805163ffffffff8416815261ffff838116602083015287168183015290516001600160a01b0388169133917fd1e028bd664486a46ad26040e999cd2d22e1e9a094ee6afe19fcf64678f16f749181900360600190a3505050505050565b6066546006906040908116036116915760405163840a48d560e01b815260040160405180910390fd5b8361169b816129b0565b6116b85760405163932d94f760e01b815260040160405180910390fd5b60cb545f906116d490600160a01b900463ffffffff1642613b0d565b6001600160a01b038781165f90815260d460209081526040808320938a1683529281528282208351606081018552905461ffff80821683526201000082041692820192909252600160201b90910463ffffffff169281019290925291925061173b90612680565b6001600160a01b038089165f90815260d460209081526040808320938b1683529290522090915061176d908684612d0e565b6040805163ffffffff8416815261ffff838116602083015287168183015290516001600160a01b0388811692908a169133917f48e198b6ae357e529204ee53a8e514c470ff77d9cc8e4f7207f8b5d490ae6934919081900360600190a450505050505050565b604080516080810182525f80825260208201819052918101829052606081019190915260ca828154811061180957611809613927565b5f91825260209182902060408051608081018252600293909302909101805483526001015463ffffffff80821694840194909452600160201b810490931690820152600160401b90910460ff161515606082015292915050565b6001600160a01b038281165f90815260d46020908152604080832093851683529281528282208351606081018552905461ffff80821683526201000082041692820192909252600160201b90910463ffffffff1692810192909252906118c890612680565b9392505050565b60ca545f905b63ffffffff811615611936578260ca6118ef600184613ce9565b63ffffffff168154811061190557611905613927565b905f5260205f2090600202015f015403611924576118c8600182613ce9565b8061192e81613d05565b9150506118d5565b5060405163504570e360e01b815260040160405180910390fd5b8161195a816129b0565b6119775760405163932d94f760e01b815260040160405180910390fd5b6040516336b87bd760e11b81526001600160a01b0384811660048301527f00000000000000000000000000000000000000000000000000000000000000001690636d70f7ae90602401602060405180830381865afa1580156119db573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906119ff9190613950565b80611a93575060405163ba1a84e560e01b81526001600160a01b0384811660048301525f917f00000000000000000000000000000000000000000000000000000000000000009091169063ba1a84e590602401602060405180830381865afa158015611a6d573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a919190613d23565b115b611ab05760405163fb494ea160e01b815260040160405180910390fd5b610e328383612c40565b611ac26121ad565b6001600160a01b038116611b2c5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084015b60405180910390fd5b61115d81612904565b5f54610100900460ff1615808015611b5357505f54600160ff909116105b80611b6c5750303b158015611b6c57505f5460ff166001145b611bcf5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401611b23565b5f805460ff191660011790558015611bf0575f805461ff0019166101001790555b611bf985612207565b611c0286612904565b611c0b84612955565b611c14836126f0565b611c1d82612ca3565b8015611c62575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050505050565b5f6001610c3160208401846134e6565b606654600390600890811603611ca35760405163840a48d560e01b815260040160405180910390fd5b60cb546001600160a01b03163314611cce57604051635c427cd960e01b815260040160405180910390fd5b60ca5463ffffffff831610611cf6576040516394a8d38960e01b815260040160405180910390fd5b5f60ca8363ffffffff1681548110611d1057611d10613927565b905f5260205f20906002020190508060010160089054906101000a900460ff1615611d4e57604051631b14174b60e01b815260040160405180910390fd5b6001810154600160201b900463ffffffff164210611d7f57604051630c36f66560e21b815260040160405180910390fd5b60018101805460ff60401b1916600160401b17905560405163ffffffff8416907fd850e6e5dfa497b72661fa73df2923464eaed9dc2ff1d3cb82bccbfeabe5c41e905f90a2505050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611e25573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611e499190613d3a565b6001600160a01b0316336001600160a01b031614611e7a5760405163794821ff60e01b815260040160405180910390fd5b60665480198219811614611ea15760405163c61dca5d60e01b815260040160405180910390fd5b606682905560405182815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c9060200160405180910390a25050565b6066545f90600190811603611f075760405163840a48d560e01b815260040160405180910390fd5b611f0f612244565b5f5b82811015610e275736848483818110611f2c57611f2c613927565b9050602002810190611f3e919061396b565b335f81815260ce60209081526040808320549051949550939192611f689290918591879101613ab9565b604051602081830303815290604052805190602001209050611f898361229d565b335f90815260cf602090815260408083208484529091529020805460ff19166001908117909155611fbb908390613ae8565b335f81815260ce602052604090819020929092559051829184917f450a367a380c4e339e5ae7340c8464ef27af7781ad9945cfe8abd828f89e628190612002908890613afb565b60405180910390a4612023333060408601803590610e0b90602089016134e6565b505050600101611f11565b6066546004906010908116036120575760405163840a48d560e01b815260040160405180910390fd5b335f90815260d1602052604090205460ff1661208657604051635c427cd960e01b815260040160405180910390fd5b61208e612244565b5f5b82811015610e2757368484838181106120ab576120ab613927565b90506020028101906120bd919061396b565b335f81815260ce602090815260408083205490519495509391926120e79290918591879101613ab9565b6040516020818303038152906040528051906020012090506121088361229d565b335f90815260d2602090815260408083208484529091529020805460ff1916600190811790915561213a908390613ae8565b335f81815260ce602052604090819020929092559051829184917f5251b6fdefcb5d81144e735f69ea4c695fd43b0289ca53dc075033f5fc80068b90612181908890613afb565b60405180910390a46121a2333060408601803590610e0b90602089016134e6565b505050600101612090565b6033546001600160a01b0316331461120d5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401611b23565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a250565b6002609754036122965760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401611b23565b6002609755565b6122cf6122aa8280613d55565b6122ba60808501606086016136f8565b6122ca60a08601608087016136f8565b612ddd565b5f8160400135116122f3576040516310eb483f60e21b815260040160405180910390fd5b6f4b3b4ca85a86c47a098a223fffffffff816040013511156123285760405163070b5a6f60e21b815260040160405180910390fd5b61235863ffffffff7f00000000000000000000000000000000000000000000000000000000000000001642613ae8565b61236860808301606084016136f8565b63ffffffff16111561115d57604051637ee2b44360e01b815260040160405180910390fd5b6040516001600160a01b03808516602483015283166044820152606481018290526110eb9085906323b872dd60e01b906084015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b0319909316929092179091526130b5565b5f60ca61240860208501856136f8565b63ffffffff168154811061241e5761241e613927565b5f91825260209182902060408051608081018252600293909302909101805483526001015463ffffffff80821694840194909452600160201b810490931690820152600160401b90910460ff1615156060820152905061247e8382612761565b5f61248f60808501606086016134e6565b6001600160a01b038082165f90815260cc602052604090205491925016806124b45750805b336001600160a01b038216146124dd57604051635c427cd960e01b815260040160405180910390fd5b5f5b6124ec60a0870187613d9b565b9050811015611c62573661250360e0880188613d55565b8381811061251357612513613927565b6001600160a01b0387165f90815260cd602090815260408083209302949094019450929091508290612547908501856134e6565b6001600160a01b03166001600160a01b031681526020019081526020015f205490508082602001351161258d5760405163aa385e8160e01b815260040160405180910390fd5b5f61259c826020850135613914565b6001600160a01b0387165f90815260cd602090815260408220929350850180359291906125c990876134e6565b6001600160a01b031681526020808201929092526040015f209190915561260a90899083906125fa908701876134e6565b6001600160a01b03169190613188565b86516001600160a01b03808a1691878216918916907f9543dbd55580842586a951f0386e24d68a5df99ae29e3b216588b45fd684ce319061264e60208901896134e6565b604080519283526001600160a01b039091166020830152810186905260600160405180910390a45050506001016124df565b5f816040015163ffffffff165f14806126b25750815161ffff9081161480156126b25750816040015163ffffffff1642105b156126ca57505060cb54600160e01b900461ffff1690565b816040015163ffffffff164210156126e3578151611146565b506020015190565b919050565b60cb546040805163ffffffff600160a01b9093048316815291831660208301527faf557c6c02c208794817a705609cfa935f827312a1adfdd26494b6b95dd2b4b3910160405180910390a160cb805463ffffffff909216600160a01b0263ffffffff60a01b19909216919091179055565b80606001511561278457604051631b14174b60e01b815260040160405180910390fd5b806040015163ffffffff164210156127af57604051631437a2bb60e31b815260040160405180910390fd5b6127bc60c0830183613d9b565b90506127cb60a0840184613d9b565b9050146127eb576040516343714afd60e01b815260040160405180910390fd5b6127f860e0830183613d55565b905061280760c0840184613d9b565b905014612827576040516343714afd60e01b815260040160405180910390fd5b80516128539061283d60408501602086016136f8565b61284a6040860186613de1565b866060016131b8565b5f5b61286260a0840184613d9b565b9050811015610e32576128fc608084013561288060a0860186613d9b565b8481811061289057612890613927565b90506020020160208101906128a591906136f8565b6128b260c0870187613d9b565b858181106128c2576128c2613927565b90506020028101906128d49190613de1565b6128e160e0890189613d55565b878181106128f1576128f1613927565b90506040020161325c565b600101612855565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b60cb546040516001600160a01b038084169216907f237b82f438d75fc568ebab484b75b01d9287b9e98b490b7c23221623b6705dbb905f90a360cb80546001600160a01b0319166001600160a01b0392909216919091179055565b604051631beb2b9760e31b81526001600160a01b0382811660048301523360248301523060448301525f80356001600160e01b0319166064840152917f00000000000000000000000000000000000000000000000000000000000000009091169063df595cb8906084016020604051808303815f875af1158015612a36573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111469190613950565b5f612a88612a688380613d55565b612a7860808601606087016136f8565b6122ca60a08701608088016136f8565b5f612a966040840184613d55565b905011612ab65760405163796cc52560e01b815260040160405180910390fd5b42612ac760a08401608085016136f8565b612ad760808501606086016136f8565b612ae19190613b0d565b63ffffffff1610612b055760405163150358a160e21b815260040160405180910390fd5b5f80805b612b166040860186613d55565b9050811015612c075736612b2d6040870187613d55565b83818110612b3d57612b3d613927565b6040029190910191505f9050612b5660208301836134e6565b6001600160a01b031603612b7d57604051630863a45360e11b815260040160405180910390fd5b612b8a60208201826134e6565b6001600160a01b0316836001600160a01b031610612bbb576040516310fb47f160e31b815260040160405180910390fd5b5f816020013511612bdf576040516310eb483f60e21b815260040160405180910390fd5b612bec60208201826134e6565b9250612bfc602082013585613ae8565b935050600101612b09565b506f4b3b4ca85a86c47a098a223fffffffff821115612c395760405163070b5a6f60e21b815260040160405180910390fd5b5092915050565b6001600160a01b038083165f81815260cc602052604080822080548686166001600160a01b0319821681179092559151919094169392849290917fbab947934d42e0ad206f25c9cab18b5bb6ae144acfb00f40b4e3aa59590ca3129190a4505050565b60cb546040805161ffff600160e01b9093048316815291831660208301527fe6cd4edfdcc1f6d130ab35f73d72378f3a642944fb4ee5bd84b7807a81ea1c4e910160405180910390a160cb805461ffff909216600160e01b0261ffff60e01b19909216919091179055565b61271061ffff83161115612d355760405163891c63df60e01b815260040160405180910390fd5b8254600160201b900463ffffffff164211612d6357604051637b1e25c560e01b815260040160405180910390fd5b8254600160201b900463ffffffff165f03612d8a57825461ffff191661ffff178355612da1565b825462010000810461ffff1661ffff199091161783555b825463ffffffff909116600160201b0267ffffffff000000001961ffff90931662010000029290921667ffffffffffff00001990911617179055565b82612dfb5760405163796cc52560e01b815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000063ffffffff168163ffffffff161115612e4857604051630dd0b9f560e21b815260040160405180910390fd5b612e727f000000000000000000000000000000000000000000000000000000000000000082613e38565b63ffffffff1615612e965760405163ee66470560e01b815260040160405180910390fd5b612ec07f000000000000000000000000000000000000000000000000000000000000000083613e38565b63ffffffff1615612ee457604051633c1a94f160e21b815260040160405180910390fd5b8163ffffffff167f000000000000000000000000000000000000000000000000000000000000000063ffffffff1642612f1d9190613914565b11158015612f5757508163ffffffff167f000000000000000000000000000000000000000000000000000000000000000063ffffffff1611155b612f745760405163041aa75760e11b815260040160405180910390fd5b5f805b84811015611c62575f868683818110612f9257612f92613927565b612fa892602060409092020190810191506134e6565b60405163198f077960e21b81526001600160a01b0380831660048301529192507f00000000000000000000000000000000000000000000000000000000000000009091169063663c1de490602401602060405180830381865afa158015613011573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906130359190613950565b8061305c57506001600160a01b03811673beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac0145b61307957604051632efd965160e11b815260040160405180910390fd5b806001600160a01b0316836001600160a01b0316106130ab5760405163dfad9ca160e01b815260040160405180910390fd5b9150600101612f77565b5f613109826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b031661329a9092919063ffffffff16565b905080515f14806131295750808060200190518101906131299190613950565b610e325760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401611b23565b6040516001600160a01b038316602482015260448101829052610e3290849063a9059cbb60e01b906064016123c1565b6131c3602083613e5f565b6001901b8463ffffffff16106131eb5760405162c6c39d60e71b815260040160405180910390fd5b5f6131f582610c22565b905061323f84848080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152508a92508591505063ffffffff89166132b0565b611c62576040516369ca16c960e01b815260040160405180910390fd5b613267602083613e5f565b6001901b8463ffffffff16106132905760405163054ff4df60e51b815260040160405180910390fd5b5f6131f582611c6a565b60606132a884845f856132c7565b949350505050565b5f836132bd86858561339e565b1495945050505050565b6060824710156133285760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401611b23565b5f5f866001600160a01b031685876040516133439190613e72565b5f6040518083038185875af1925050503d805f811461337d576040519150601f19603f3d011682016040523d82523d5f602084013e613382565b606091505b509150915061339387838387613435565b979650505050505050565b5f602084516133ad9190613e88565b156133cb576040516313717da960e21b815260040160405180910390fd5b8260205b8551811161342c576133e2600285613e88565b5f0361340357815f528086015160205260405f20915060028404935061341a565b808601515f528160205260405f2091506002840493505b613425602082613ae8565b90506133cf565b50949350505050565b606083156134a35782515f0361349c576001600160a01b0385163b61349c5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401611b23565b50816132a8565b6132a883838151156134b85781518083602001fd5b8060405162461bcd60e51b8152600401611b239190613e9b565b6001600160a01b038116811461115d575f5ffd5b5f602082840312156134f6575f5ffd5b81356118c8816134d2565b801515811461115d575f5ffd5b5f5f6040838503121561351f575f5ffd5b823561352a816134d2565b9150602083013561353a81613501565b809150509250929050565b5f60208284031215613555575f5ffd5b5035919050565b5f6040828403121561356c575f5ffd5b50919050565b5f60408284031215613582575f5ffd5b6118c8838361355c565b5f5f83601f84011261359c575f5ffd5b50813567ffffffffffffffff8111156135b3575f5ffd5b6020830191508360208260051b85010111156135cd575f5ffd5b9250929050565b5f5f602083850312156135e5575f5ffd5b823567ffffffffffffffff8111156135fb575f5ffd5b6136078582860161358c565b90969095509350505050565b5f610100828403121561356c575f5ffd5b5f5f60408385031215613635575f5ffd5b823567ffffffffffffffff81111561364b575f5ffd5b61365785828601613613565b925050602083013561353a816134d2565b803563ffffffff811681146126eb575f5ffd5b5f5f6040838503121561368c575f5ffd5b8235915061369c60208401613668565b90509250929050565b5f5f5f604084860312156136b7575f5ffd5b833567ffffffffffffffff8111156136cd575f5ffd5b6136d98682870161358c565b90945092505060208401356136ed816134d2565b809150509250925092565b5f60208284031215613708575f5ffd5b6118c882613668565b5f60208284031215613721575f5ffd5b813560ff811681146118c8575f5ffd5b5f60208284031215613741575f5ffd5b813567ffffffffffffffff811115613757575f5ffd5b6132a884828501613613565b5f5f60408385031215613774575f5ffd5b823561377f816134d2565b946020939093013593505050565b5f5f6040838503121561379e575f5ffd5b82356137a9816134d2565b9150602083013561353a816134d2565b5f5f5f604084860312156137cb575f5ffd5b83356137d6816134d2565b9250602084013567ffffffffffffffff8111156137f1575f5ffd5b6137fd8682870161358c565b9497909650939450505050565b803561ffff811681146126eb575f5ffd5b5f6020828403121561382b575f5ffd5b6118c88261380a565b5f5f60408385031215613845575f5ffd5b8235613850816134d2565b915061369c6020840161380a565b5f5f5f60608486031215613870575f5ffd5b833561387b816134d2565b9250602084013561388b816134d2565b91506138996040850161380a565b90509250925092565b5f5f5f5f5f60a086880312156138b6575f5ffd5b85356138c1816134d2565b94506020860135935060408601356138d8816134d2565b92506138e660608701613668565b91506138f46080870161380a565b90509295509295909350565b634e487b7160e01b5f52601160045260245ffd5b8181038181111561114657611146613900565b634e487b7160e01b5f52603260045260245ffd5b5f8161394957613949613900565b505f190190565b5f60208284031215613960575f5ffd5b81516118c881613501565b5f8235609e1983360301811261397f575f5ffd5b9190910192915050565b5f5f8335601e1984360301811261399e575f5ffd5b830160208101925035905067ffffffffffffffff8111156139bd575f5ffd5b8060061b36038213156135cd575f5ffd5b8183526020830192505f815f5b84811015613a315781356139ee816134d2565b6001600160a01b0316865260208201356bffffffffffffffffffffffff8116808214613a18575f5ffd5b60208801525060409586019591909101906001016139db565b5093949350505050565b5f613a468283613989565b60a08552613a5860a0860182846139ce565b9150506020830135613a69816134d2565b6001600160a01b031660208501526040838101359085015263ffffffff613a9260608501613668565b16606085015263ffffffff613aa960808501613668565b1660808501528091505092915050565b60018060a01b0384168152826020820152606060408201525f613adf6060830184613a3b565b95945050505050565b8082018082111561114657611146613900565b602081525f6118c86020830184613a3b565b63ffffffff818116838216019081111561114657611146613900565b5f823560fe1983360301811261397f575f5ffd5b5f823560be1983360301811261397f575f5ffd5b5f5f8335601e19843603018112613b66575f5ffd5b830160208101925035905067ffffffffffffffff811115613b85575f5ffd5b8036038213156135cd575f5ffd5b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b5f613bc68283613989565b60c08552613bd860c0860182846139ce565b9150506020830135613be9816134d2565b6001600160a01b03166020850152613c046040840184613989565b858303604087015280835290915f91906020015b81831015613c53578335613c2b816134d2565b6001600160a01b03168152602084810135908201526040938401936001939093019201613c18565b613c5f60608701613668565b63ffffffff811660608901529350613c7960808701613668565b63ffffffff811660808901529350613c9460a0870187613b51565b9450925086810360a0880152613393818585613b93565b60018060a01b0384168152826020820152606060408201525f613adf6060830184613bbb565b828152604060208201525f6132a86040830184613bbb565b63ffffffff828116828216039081111561114657611146613900565b5f63ffffffff821680613d1a57613d1a613900565b5f190192915050565b5f60208284031215613d33575f5ffd5b5051919050565b5f60208284031215613d4a575f5ffd5b81516118c8816134d2565b5f5f8335601e19843603018112613d6a575f5ffd5b83018035915067ffffffffffffffff821115613d84575f5ffd5b6020019150600681901b36038213156135cd575f5ffd5b5f5f8335601e19843603018112613db0575f5ffd5b83018035915067ffffffffffffffff821115613dca575f5ffd5b6020019150600581901b36038213156135cd575f5ffd5b5f5f8335601e19843603018112613df6575f5ffd5b83018035915067ffffffffffffffff821115613e10575f5ffd5b6020019150368190038213156135cd575f5ffd5b634e487b7160e01b5f52601260045260245ffd5b5f63ffffffff831680613e4d57613e4d613e24565b8063ffffffff84160691505092915050565b5f82613e6d57613e6d613e24565b500490565b5f82518060208501845e5f920191825250919050565b5f82613e9657613e96613e24565b500690565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f8301168401019150509291505056fea264697066735822122038b85e072953498a6772816d5247c44e56b614c9fdac6ebf7b0e16c898f84d4b64736f6c634300081b0033", >>>>>>> 7da92a53 (fix: remove token param from Deposit event and related APIs (#1013)) +======= + Bin: "0x6101c0604052348015610010575f5ffd5b506040516142d63803806142d683398101604081905261002f91610211565b858a8a8a88888888888f6001600160a01b038116610060576040516339b190bb60e11b815260040160405180910390fd5b6001600160a01b031660805261007685826102d3565b63ffffffff161561009a57604051630e06bd3160e01b815260040160405180910390fd5b6100a762015180866102d3565b63ffffffff16156100cb5760405163223c7b3960e11b815260040160405180910390fd5b6001600160a01b0397881660a05295871660c05293861660e05263ffffffff9283166101005290821661012052811661014052908116610160521661018052166101a052610117610126565b50505050505050505050610306565b5f54610100900460ff16156101915760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff908116146101e0575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b03811681146101f6575f5ffd5b50565b805163ffffffff8116811461020c575f5ffd5b919050565b5f5f5f5f5f5f5f5f5f5f6101408b8d03121561022b575f5ffd5b8a51610236816101e2565b60208c0151909a50610247816101e2565b60408c0151909950610258816101e2565b60608c0151909850610269816101e2565b60808c015190975061027a816101e2565b955061028860a08c016101f9565b945061029660c08c016101f9565b93506102a460e08c016101f9565b92506102b36101008c016101f9565b91506102c26101208c016101f9565b90509295989b9194979a5092959850565b5f63ffffffff8316806102f457634e487b7160e01b5f52601260045260245ffd5b8063ffffffff84160691505092915050565b60805160a05160c05160e05161010051610120516101405161016051610180516101a051613f066103d05f395f81816105a601526129ee01525f818161045a0152612f2f01525f81816103bc015261233201525f81816105080152612eed01525f818161080c0152612dfd01525f818161076001528181612e4d0152612e9b01525f81816108600152611a2601525f818161052f0152612fca01525f81816108d3015261199601525f81816106f201528181610b62015281816111750152611dcb0152613f065ff3fe608060405234801561000f575f5ffd5b506004361061037c575f3560e01c8063886f1195116101d4578063dcbb03b311610109578063f2fde38b116100a9578063fabc1cbc11610079578063fabc1cbc14610981578063fbf1e2c114610994578063fce36c7d146109a7578063ff9f6cce146109ba575f5ffd5b8063f2fde38b14610935578063f6efbb5914610948578063f8cd84481461095b578063f96abf2e1461096e575f5ffd5b8063e810ce21116100e4578063e810ce21146108bb578063ea4d3c9b146108ce578063ed71e6a2146108f5578063f22cef8514610922575f5ffd5b8063dcbb03b314610882578063de02e50314610895578063e063f81f146108a8575f5ffd5b8063a50a1d9c11610174578063bb7e451f1161014f578063bb7e451f146107e8578063bf21a8aa14610807578063c46db6061461082e578063ca8aa7c71461085b575f5ffd5b8063a50a1d9c14610795578063aebd8bae146107a8578063b3dbb0e0146107d5575f5ffd5b80639be3d4e4116101af5780639be3d4e4146107405780639cb9a5fa146107485780639d45c2811461075b578063a0169ddd14610782575f5ffd5b8063886f1195146106ed5780638da5cb5b146107145780639104c31914610725575f5ffd5b80634596021c116102b55780635c975abb11610255578063715018a611610225578063715018a6146106a05780637b8f8b05146106a8578063863cb9a9146106b0578063865c6953146106c3575f5ffd5b80635c975abb146106435780635e9d83481461064b57806363f6a7981461065e5780636d21117e14610673575f5ffd5b80634d18cc35116102905780634d18cc35146105ee57806358baaa3e14610605578063595c6a67146106185780635ac86ab714610620575f5ffd5b80634596021c1461058e5780634657e26a146105a15780634b943960146105c8575f5ffd5b80632b9f64a41161032057806339b70e38116102fb57806339b70e381461052a5780633a8c0786146105515780633ccc861d146105685780633efe1db61461057b575f5ffd5b80632b9f64a4146104b057806336af41fa146104f057806337838ed014610503575f5ffd5b80630eb383451161035b5780630eb3834514610440578063131433b414610455578063136439dd1461047c578063149bc8721461048f575f5ffd5b806218572c1461038057806304a0c502146103b75780630e9a53cf146103f3575b5f5ffd5b6103a261038e3660046134e6565b60d16020525f908152604090205460ff1681565b60405190151581526020015b60405180910390f35b6103de7f000000000000000000000000000000000000000000000000000000000000000081565b60405163ffffffff90911681526020016103ae565b6103fb6109cd565b6040516103ae91905f6080820190508251825263ffffffff602084015116602083015263ffffffff604084015116604083015260608301511515606083015292915050565b61045361044e36600461350e565b610acd565b005b6103de7f000000000000000000000000000000000000000000000000000000000000000081565b61045361048a366004613545565b610b4d565b6104a261049d366004613572565b610c22565b6040519081526020016103ae565b6104d86104be3660046134e6565b60cc6020525f90815260409020546001600160a01b031681565b6040516001600160a01b0390911681526020016103ae565b6104536104fe3660046135d4565b610c97565b6103de7f000000000000000000000000000000000000000000000000000000000000000081565b6104d87f000000000000000000000000000000000000000000000000000000000000000081565b60cb546103de90600160a01b900463ffffffff1681565b610453610576366004613624565b610e37565b61045361058936600461367b565b610e7c565b61045361059c3660046136a5565b611070565b6104d87f000000000000000000000000000000000000000000000000000000000000000081565b6105db6105d63660046134e6565b6110f1565b60405161ffff90911681526020016103ae565b60cb546103de90600160c01b900463ffffffff1681565b6104536106133660046136f8565b61114c565b610453611160565b6103a261062e366004613711565b606654600160ff9092169190911b9081161490565b6066546104a2565b6103a2610659366004613731565b61120f565b60cb546105db90600160e01b900461ffff1681565b6103a2610681366004613763565b60cf60209081525f928352604080842090915290825290205460ff1681565b61045361129a565b60ca546104a2565b6104536106be3660046134e6565b6112ab565b6104a26106d136600461378d565b60cd60209081525f928352604080842090915290825290205481565b6104d87f000000000000000000000000000000000000000000000000000000000000000081565b6033546001600160a01b03166104d8565b6104d873beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac081565b6103fb6112bc565b6104536107563660046137b9565b611358565b6103de7f000000000000000000000000000000000000000000000000000000000000000081565b6104536107903660046134e6565b611503565b6104536107a336600461381b565b61150e565b6103a26107b6366004613763565b60d260209081525f928352604080842090915290825290205460ff1681565b6104536107e3366004613834565b61151f565b6104a26107f63660046134e6565b60ce6020525f908152604090205481565b6103de7f000000000000000000000000000000000000000000000000000000000000000081565b6103a261083c366004613763565b60d060209081525f928352604080842090915290825290205460ff1681565b6104d87f000000000000000000000000000000000000000000000000000000000000000081565b61045361089036600461385e565b611668565b6103fb6108a3366004613545565b6117d3565b6105db6108b636600461378d565b611863565b6103de6108c9366004613545565b6118cf565b6104d87f000000000000000000000000000000000000000000000000000000000000000081565b6103a2610903366004613763565b60d360209081525f928352604080842090915290825290205460ff1681565b61045361093036600461378d565b611950565b6104536109433660046134e6565b611aba565b6104536109563660046138a2565b611b35565b6104a2610969366004613572565b611c6a565b61045361097c3660046136f8565b611c7a565b61045361098f366004613545565b611dc9565b60cb546104d8906001600160a01b031681565b6104536109b53660046135d4565b611edf565b6104536109c83660046135d4565b61202e565b604080516080810182525f80825260208201819052918101829052606081019190915260ca545b8015610aa5575f60ca610a08600184613914565b81548110610a1857610a18613927565b5f91825260209182902060408051608081018252600293909302909101805483526001015463ffffffff80821694840194909452600160201b810490931690820152600160401b90910460ff161580156060830181905291925090610a875750806040015163ffffffff164210155b15610a925792915050565b5080610a9d8161393b565b9150506109f4565b5050604080516080810182525f80825260208201819052918101829052606081019190915290565b610ad56121ad565b6001600160a01b0382165f81815260d1602052604080822054905160ff9091169284151592841515927f4de6293e668df1398422e1def12118052c1539a03cbfedc145895d48d7685f1c9190a4506001600160a01b03919091165f90815260d160205260409020805460ff1916911515919091179055565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa158015610baf573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610bd39190613950565b610bf057604051631d77d47760e21b815260040160405180910390fd5b6066548181168114610c155760405163c61dca5d60e01b815260040160405180910390fd5b610c1e82612207565b5050565b5f80610c3160208401846134e6565b8360200135604051602001610c7a9392919060f89390931b6001600160f81b031916835260609190911b6bffffffffffffffffffffffff19166001830152601582015260350190565b604051602081830303815290604052805190602001209050919050565b606654600190600290811603610cc05760405163840a48d560e01b815260040160405180910390fd5b335f90815260d1602052604090205460ff16610cef57604051635c427cd960e01b815260040160405180910390fd5b610cf7612244565b5f5b82811015610e275736848483818110610d1457610d14613927565b9050602002810190610d26919061396b565b335f81815260ce60209081526040808320549051949550939192610d509290918591879101613ab9565b604051602081830303815290604052805190602001209050610d718361229d565b335f90815260d0602090815260408083208484529091529020805460ff19166001908117909155610da3908390613ae8565b335f81815260ce602052604090819020929092559051829184917f51088b8c89628df3a8174002c2a034d0152fce6af8415d651b2a4734bf27048290610dea908890613afb565b60405180910390a4610e1c333060408601803590610e0b90602089016134e6565b6001600160a01b031692919061238d565b505050600101610cf9565b50610e326001609755565b505050565b606654600290600490811603610e605760405163840a48d560e01b815260040160405180910390fd5b610e68612244565b610e7283836123f8565b610e326001609755565b606654600390600890811603610ea55760405163840a48d560e01b815260040160405180910390fd5b60cb546001600160a01b03163314610ed057604051635c427cd960e01b815260040160405180910390fd5b60cb5463ffffffff600160c01b909104811690831611610f0357604051631ca7e50b60e21b815260040160405180910390fd5b428263ffffffff1610610f29576040516306957c9160e11b815260040160405180910390fd5b60ca5460cb545f90610f4890600160a01b900463ffffffff1642613b0d565b6040805160808101825287815263ffffffff87811660208084018281528684168587018181525f6060880181815260ca8054600181018255925297517f42d72674974f694b5f5159593243114d38a5c39c89d6b62fee061ff523240ee160029092029182015592517f42d72674974f694b5f5159593243114d38a5c39c89d6b62fee061ff523240ee290930180549151975193871667ffffffffffffffff1990921691909117600160201b978716979097029690961760ff60401b1916600160401b921515929092029190911790945560cb805463ffffffff60c01b1916600160c01b840217905593519283529394508892908616917fecd866c3c158fa00bf34d803d5f6023000b57080bcb48af004c2b4b46b3afd08910160405180910390a45050505050565b6066546002906004908116036110995760405163840a48d560e01b815260040160405180910390fd5b6110a1612244565b5f5b838110156110e0576110d88585838181106110c0576110c0613927565b90506020028101906110d29190613b29565b846123f8565b6001016110a3565b506110eb6001609755565b50505050565b6001600160a01b0381165f90815260d5602090815260408083208151606081018352905461ffff80821683526201000082041693820193909352600160201b90920463ffffffff169082015261114690612680565b92915050565b6111546121ad565b61115d816126f0565b50565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa1580156111c2573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111e69190613950565b61120357604051631d77d47760e21b815260040160405180910390fd5b61120d5f19612207565b565b5f6112928260ca61122360208301836136f8565b63ffffffff168154811061123957611239613927565b5f91825260209182902060408051608081018252600293909302909101805483526001015463ffffffff80821694840194909452600160201b810490931690820152600160401b90910460ff1615156060820152612761565b506001919050565b6112a26121ad565b61120d5f612904565b6112b36121ad565b61115d81612955565b604080516080810182525f80825260208201819052918101829052606081019190915260ca80546112ef90600190613914565b815481106112ff576112ff613927565b5f91825260209182902060408051608081018252600293909302909101805483526001015463ffffffff80821694840194909452600160201b810490931690820152600160401b90910460ff1615156060820152919050565b6066546005906020908116036113815760405163840a48d560e01b815260040160405180910390fd5b8361138b816129b0565b6113a85760405163932d94f760e01b815260040160405180910390fd5b6113b0612244565b5f5b838110156114f157368585838181106113cd576113cd613927565b90506020028101906113df9190613b3d565b6001600160a01b0388165f90815260ce6020908152604080832054905193945092611410918b918591879101613cab565b6040516020818303038152906040528051906020012090505f61143284612a5a565b6001600160a01b038b165f90815260d3602090815260408083208684529091529020805460ff19166001908117909155909150611470908490613ae8565b6001600160a01b038b165f81815260ce60205260409081902092909255905183919033907ffc8888bffd711da60bc5092b33f677d81896fe80ecc677b84cfab8184462b6e0906114c39088908a90613cd1565b60405180910390a46114e1333083610e0b6040890160208a016134e6565b5050600190920191506113b29050565b506114fc6001609755565b5050505050565b33610c1e8183612c40565b6115166121ad565b61115d81612ca3565b6066546007906080908116036115485760405163840a48d560e01b815260040160405180910390fd5b82611552816129b0565b61156f5760405163932d94f760e01b815260040160405180910390fd5b60cb545f9061158b90600160a01b900463ffffffff1642613b0d565b6001600160a01b0386165f90815260d5602090815260408083208151606081018352905461ffff80821683526201000082041693820193909352600160201b90920463ffffffff1690820152919250906115e490612680565b6001600160a01b0387165f90815260d560205260409020909150611609908684612d0e565b6040805163ffffffff8416815261ffff838116602083015287168183015290516001600160a01b0388169133917fd1e028bd664486a46ad26040e999cd2d22e1e9a094ee6afe19fcf64678f16f749181900360600190a3505050505050565b6066546006906040908116036116915760405163840a48d560e01b815260040160405180910390fd5b8361169b816129b0565b6116b85760405163932d94f760e01b815260040160405180910390fd5b60cb545f906116d490600160a01b900463ffffffff1642613b0d565b6001600160a01b038781165f90815260d460209081526040808320938a1683529281528282208351606081018552905461ffff80821683526201000082041692820192909252600160201b90910463ffffffff169281019290925291925061173b90612680565b6001600160a01b038089165f90815260d460209081526040808320938b1683529290522090915061176d908684612d0e565b6040805163ffffffff8416815261ffff838116602083015287168183015290516001600160a01b0388811692908a169133917f48e198b6ae357e529204ee53a8e514c470ff77d9cc8e4f7207f8b5d490ae6934919081900360600190a450505050505050565b604080516080810182525f80825260208201819052918101829052606081019190915260ca828154811061180957611809613927565b5f91825260209182902060408051608081018252600293909302909101805483526001015463ffffffff80821694840194909452600160201b810490931690820152600160401b90910460ff161515606082015292915050565b6001600160a01b038281165f90815260d46020908152604080832093851683529281528282208351606081018552905461ffff80821683526201000082041692820192909252600160201b90910463ffffffff1692810192909252906118c890612680565b9392505050565b60ca545f905b63ffffffff811615611936578260ca6118ef600184613ce9565b63ffffffff168154811061190557611905613927565b905f5260205f2090600202015f015403611924576118c8600182613ce9565b8061192e81613d05565b9150506118d5565b5060405163504570e360e01b815260040160405180910390fd5b8161195a816129b0565b6119775760405163932d94f760e01b815260040160405180910390fd5b6040516336b87bd760e11b81526001600160a01b0384811660048301527f00000000000000000000000000000000000000000000000000000000000000001690636d70f7ae90602401602060405180830381865afa1580156119db573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906119ff9190613950565b80611a93575060405163ba1a84e560e01b81526001600160a01b0384811660048301525f917f00000000000000000000000000000000000000000000000000000000000000009091169063ba1a84e590602401602060405180830381865afa158015611a6d573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a919190613d23565b115b611ab05760405163fb494ea160e01b815260040160405180910390fd5b610e328383612c40565b611ac26121ad565b6001600160a01b038116611b2c5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084015b60405180910390fd5b61115d81612904565b5f54610100900460ff1615808015611b5357505f54600160ff909116105b80611b6c5750303b158015611b6c57505f5460ff166001145b611bcf5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401611b23565b5f805460ff191660011790558015611bf0575f805461ff0019166101001790555b611bf985612207565b611c0286612904565b611c0b84612955565b611c14836126f0565b611c1d82612ca3565b8015611c62575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050505050565b5f6001610c3160208401846134e6565b606654600390600890811603611ca35760405163840a48d560e01b815260040160405180910390fd5b60cb546001600160a01b03163314611cce57604051635c427cd960e01b815260040160405180910390fd5b60ca5463ffffffff831610611cf6576040516394a8d38960e01b815260040160405180910390fd5b5f60ca8363ffffffff1681548110611d1057611d10613927565b905f5260205f20906002020190508060010160089054906101000a900460ff1615611d4e57604051631b14174b60e01b815260040160405180910390fd5b6001810154600160201b900463ffffffff164210611d7f57604051630c36f66560e21b815260040160405180910390fd5b60018101805460ff60401b1916600160401b17905560405163ffffffff8416907fd850e6e5dfa497b72661fa73df2923464eaed9dc2ff1d3cb82bccbfeabe5c41e905f90a2505050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611e25573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611e499190613d3a565b6001600160a01b0316336001600160a01b031614611e7a5760405163794821ff60e01b815260040160405180910390fd5b60665480198219811614611ea15760405163c61dca5d60e01b815260040160405180910390fd5b606682905560405182815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c9060200160405180910390a25050565b6066545f90600190811603611f075760405163840a48d560e01b815260040160405180910390fd5b611f0f612244565b5f5b82811015610e275736848483818110611f2c57611f2c613927565b9050602002810190611f3e919061396b565b335f81815260ce60209081526040808320549051949550939192611f689290918591879101613ab9565b604051602081830303815290604052805190602001209050611f898361229d565b335f90815260cf602090815260408083208484529091529020805460ff19166001908117909155611fbb908390613ae8565b335f81815260ce602052604090819020929092559051829184917f450a367a380c4e339e5ae7340c8464ef27af7781ad9945cfe8abd828f89e628190612002908890613afb565b60405180910390a4612023333060408601803590610e0b90602089016134e6565b505050600101611f11565b6066546004906010908116036120575760405163840a48d560e01b815260040160405180910390fd5b335f90815260d1602052604090205460ff1661208657604051635c427cd960e01b815260040160405180910390fd5b61208e612244565b5f5b82811015610e2757368484838181106120ab576120ab613927565b90506020028101906120bd919061396b565b335f81815260ce602090815260408083205490519495509391926120e79290918591879101613ab9565b6040516020818303038152906040528051906020012090506121088361229d565b335f90815260d2602090815260408083208484529091529020805460ff1916600190811790915561213a908390613ae8565b335f81815260ce602052604090819020929092559051829184917f5251b6fdefcb5d81144e735f69ea4c695fd43b0289ca53dc075033f5fc80068b90612181908890613afb565b60405180910390a46121a2333060408601803590610e0b90602089016134e6565b505050600101612090565b6033546001600160a01b0316331461120d5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401611b23565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a250565b6002609754036122965760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401611b23565b6002609755565b6122cf6122aa8280613d55565b6122ba60808501606086016136f8565b6122ca60a08601608087016136f8565b612ddd565b5f8160400135116122f3576040516310eb483f60e21b815260040160405180910390fd5b6f4b3b4ca85a86c47a098a223fffffffff816040013511156123285760405163070b5a6f60e21b815260040160405180910390fd5b61235863ffffffff7f00000000000000000000000000000000000000000000000000000000000000001642613ae8565b61236860808301606084016136f8565b63ffffffff16111561115d57604051637ee2b44360e01b815260040160405180910390fd5b6040516001600160a01b03808516602483015283166044820152606481018290526110eb9085906323b872dd60e01b906084015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b0319909316929092179091526130b5565b5f60ca61240860208501856136f8565b63ffffffff168154811061241e5761241e613927565b5f91825260209182902060408051608081018252600293909302909101805483526001015463ffffffff80821694840194909452600160201b810490931690820152600160401b90910460ff1615156060820152905061247e8382612761565b5f61248f60808501606086016134e6565b6001600160a01b038082165f90815260cc602052604090205491925016806124b45750805b336001600160a01b038216146124dd57604051635c427cd960e01b815260040160405180910390fd5b5f5b6124ec60a0870187613d9b565b9050811015611c62573661250360e0880188613d55565b8381811061251357612513613927565b6001600160a01b0387165f90815260cd602090815260408083209302949094019450929091508290612547908501856134e6565b6001600160a01b03166001600160a01b031681526020019081526020015f205490508082602001351161258d5760405163aa385e8160e01b815260040160405180910390fd5b5f61259c826020850135613914565b6001600160a01b0387165f90815260cd602090815260408220929350850180359291906125c990876134e6565b6001600160a01b031681526020808201929092526040015f209190915561260a90899083906125fa908701876134e6565b6001600160a01b03169190613188565b86516001600160a01b03808a1691878216918916907f9543dbd55580842586a951f0386e24d68a5df99ae29e3b216588b45fd684ce319061264e60208901896134e6565b604080519283526001600160a01b039091166020830152810186905260600160405180910390a45050506001016124df565b5f816040015163ffffffff165f14806126b25750815161ffff9081161480156126b25750816040015163ffffffff1642105b156126ca57505060cb54600160e01b900461ffff1690565b816040015163ffffffff164210156126e3578151611146565b506020015190565b919050565b60cb546040805163ffffffff600160a01b9093048316815291831660208301527faf557c6c02c208794817a705609cfa935f827312a1adfdd26494b6b95dd2b4b3910160405180910390a160cb805463ffffffff909216600160a01b0263ffffffff60a01b19909216919091179055565b80606001511561278457604051631b14174b60e01b815260040160405180910390fd5b806040015163ffffffff164210156127af57604051631437a2bb60e31b815260040160405180910390fd5b6127bc60c0830183613d9b565b90506127cb60a0840184613d9b565b9050146127eb576040516343714afd60e01b815260040160405180910390fd5b6127f860e0830183613d55565b905061280760c0840184613d9b565b905014612827576040516343714afd60e01b815260040160405180910390fd5b80516128539061283d60408501602086016136f8565b61284a6040860186613de1565b866060016131b8565b5f5b61286260a0840184613d9b565b9050811015610e32576128fc608084013561288060a0860186613d9b565b8481811061289057612890613927565b90506020020160208101906128a591906136f8565b6128b260c0870187613d9b565b858181106128c2576128c2613927565b90506020028101906128d49190613de1565b6128e160e0890189613d55565b878181106128f1576128f1613927565b90506040020161325c565b600101612855565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b60cb546040516001600160a01b038084169216907f237b82f438d75fc568ebab484b75b01d9287b9e98b490b7c23221623b6705dbb905f90a360cb80546001600160a01b0319166001600160a01b0392909216919091179055565b604051631beb2b9760e31b81526001600160a01b0382811660048301523360248301523060448301525f80356001600160e01b0319166064840152917f00000000000000000000000000000000000000000000000000000000000000009091169063df595cb8906084016020604051808303815f875af1158015612a36573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111469190613950565b5f612a88612a688380613d55565b612a7860808601606087016136f8565b6122ca60a08701608088016136f8565b5f612a966040840184613d55565b905011612ab65760405163796cc52560e01b815260040160405180910390fd5b42612ac760a08401608085016136f8565b612ad760808501606086016136f8565b612ae19190613b0d565b63ffffffff1610612b055760405163150358a160e21b815260040160405180910390fd5b5f80805b612b166040860186613d55565b9050811015612c075736612b2d6040870187613d55565b83818110612b3d57612b3d613927565b6040029190910191505f9050612b5660208301836134e6565b6001600160a01b031603612b7d57604051630863a45360e11b815260040160405180910390fd5b612b8a60208201826134e6565b6001600160a01b0316836001600160a01b031610612bbb576040516310fb47f160e31b815260040160405180910390fd5b5f816020013511612bdf576040516310eb483f60e21b815260040160405180910390fd5b612bec60208201826134e6565b9250612bfc602082013585613ae8565b935050600101612b09565b506f4b3b4ca85a86c47a098a223fffffffff821115612c395760405163070b5a6f60e21b815260040160405180910390fd5b5092915050565b6001600160a01b038083165f81815260cc602052604080822080548686166001600160a01b0319821681179092559151919094169392849290917fbab947934d42e0ad206f25c9cab18b5bb6ae144acfb00f40b4e3aa59590ca3129190a4505050565b60cb546040805161ffff600160e01b9093048316815291831660208301527fe6cd4edfdcc1f6d130ab35f73d72378f3a642944fb4ee5bd84b7807a81ea1c4e910160405180910390a160cb805461ffff909216600160e01b0261ffff60e01b19909216919091179055565b61271061ffff83161115612d355760405163891c63df60e01b815260040160405180910390fd5b8254600160201b900463ffffffff164211612d6357604051637b1e25c560e01b815260040160405180910390fd5b8254600160201b900463ffffffff165f03612d8a57825461ffff191661ffff178355612da1565b825462010000810461ffff1661ffff199091161783555b825463ffffffff909116600160201b0267ffffffff000000001961ffff90931662010000029290921667ffffffffffff00001990911617179055565b82612dfb5760405163796cc52560e01b815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000063ffffffff168163ffffffff161115612e4857604051630dd0b9f560e21b815260040160405180910390fd5b612e727f000000000000000000000000000000000000000000000000000000000000000082613e38565b63ffffffff1615612e965760405163ee66470560e01b815260040160405180910390fd5b612ec07f000000000000000000000000000000000000000000000000000000000000000083613e38565b63ffffffff1615612ee457604051633c1a94f160e21b815260040160405180910390fd5b8163ffffffff167f000000000000000000000000000000000000000000000000000000000000000063ffffffff1642612f1d9190613914565b11158015612f5757508163ffffffff167f000000000000000000000000000000000000000000000000000000000000000063ffffffff1611155b612f745760405163041aa75760e11b815260040160405180910390fd5b5f805b84811015611c62575f868683818110612f9257612f92613927565b612fa892602060409092020190810191506134e6565b60405163198f077960e21b81526001600160a01b0380831660048301529192507f00000000000000000000000000000000000000000000000000000000000000009091169063663c1de490602401602060405180830381865afa158015613011573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906130359190613950565b8061305c57506001600160a01b03811673beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac0145b61307957604051632efd965160e11b815260040160405180910390fd5b806001600160a01b0316836001600160a01b0316106130ab5760405163dfad9ca160e01b815260040160405180910390fd5b9150600101612f77565b5f613109826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b031661329a9092919063ffffffff16565b905080515f14806131295750808060200190518101906131299190613950565b610e325760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401611b23565b6040516001600160a01b038316602482015260448101829052610e3290849063a9059cbb60e01b906064016123c1565b6131c3602083613e5f565b6001901b8463ffffffff16106131eb5760405162c6c39d60e71b815260040160405180910390fd5b5f6131f582610c22565b905061323f84848080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152508a92508591505063ffffffff89166132b0565b611c62576040516369ca16c960e01b815260040160405180910390fd5b613267602083613e5f565b6001901b8463ffffffff16106132905760405163054ff4df60e51b815260040160405180910390fd5b5f6131f582611c6a565b60606132a884845f856132c7565b949350505050565b5f836132bd86858561339e565b1495945050505050565b6060824710156133285760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401611b23565b5f5f866001600160a01b031685876040516133439190613e72565b5f6040518083038185875af1925050503d805f811461337d576040519150601f19603f3d011682016040523d82523d5f602084013e613382565b606091505b509150915061339387838387613435565b979650505050505050565b5f602084516133ad9190613e88565b156133cb576040516313717da960e21b815260040160405180910390fd5b8260205b8551811161342c576133e2600285613e88565b5f0361340357815f528086015160205260405f20915060028404935061341a565b808601515f528160205260405f2091506002840493505b613425602082613ae8565b90506133cf565b50949350505050565b606083156134a35782515f0361349c576001600160a01b0385163b61349c5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401611b23565b50816132a8565b6132a883838151156134b85781518083602001fd5b8060405162461bcd60e51b8152600401611b239190613e9b565b6001600160a01b038116811461115d575f5ffd5b5f602082840312156134f6575f5ffd5b81356118c8816134d2565b801515811461115d575f5ffd5b5f5f6040838503121561351f575f5ffd5b823561352a816134d2565b9150602083013561353a81613501565b809150509250929050565b5f60208284031215613555575f5ffd5b5035919050565b5f6040828403121561356c575f5ffd5b50919050565b5f60408284031215613582575f5ffd5b6118c8838361355c565b5f5f83601f84011261359c575f5ffd5b50813567ffffffffffffffff8111156135b3575f5ffd5b6020830191508360208260051b85010111156135cd575f5ffd5b9250929050565b5f5f602083850312156135e5575f5ffd5b823567ffffffffffffffff8111156135fb575f5ffd5b6136078582860161358c565b90969095509350505050565b5f610100828403121561356c575f5ffd5b5f5f60408385031215613635575f5ffd5b823567ffffffffffffffff81111561364b575f5ffd5b61365785828601613613565b925050602083013561353a816134d2565b803563ffffffff811681146126eb575f5ffd5b5f5f6040838503121561368c575f5ffd5b8235915061369c60208401613668565b90509250929050565b5f5f5f604084860312156136b7575f5ffd5b833567ffffffffffffffff8111156136cd575f5ffd5b6136d98682870161358c565b90945092505060208401356136ed816134d2565b809150509250925092565b5f60208284031215613708575f5ffd5b6118c882613668565b5f60208284031215613721575f5ffd5b813560ff811681146118c8575f5ffd5b5f60208284031215613741575f5ffd5b813567ffffffffffffffff811115613757575f5ffd5b6132a884828501613613565b5f5f60408385031215613774575f5ffd5b823561377f816134d2565b946020939093013593505050565b5f5f6040838503121561379e575f5ffd5b82356137a9816134d2565b9150602083013561353a816134d2565b5f5f5f604084860312156137cb575f5ffd5b83356137d6816134d2565b9250602084013567ffffffffffffffff8111156137f1575f5ffd5b6137fd8682870161358c565b9497909650939450505050565b803561ffff811681146126eb575f5ffd5b5f6020828403121561382b575f5ffd5b6118c88261380a565b5f5f60408385031215613845575f5ffd5b8235613850816134d2565b915061369c6020840161380a565b5f5f5f60608486031215613870575f5ffd5b833561387b816134d2565b9250602084013561388b816134d2565b91506138996040850161380a565b90509250925092565b5f5f5f5f5f60a086880312156138b6575f5ffd5b85356138c1816134d2565b94506020860135935060408601356138d8816134d2565b92506138e660608701613668565b91506138f46080870161380a565b90509295509295909350565b634e487b7160e01b5f52601160045260245ffd5b8181038181111561114657611146613900565b634e487b7160e01b5f52603260045260245ffd5b5f8161394957613949613900565b505f190190565b5f60208284031215613960575f5ffd5b81516118c881613501565b5f8235609e1983360301811261397f575f5ffd5b9190910192915050565b5f5f8335601e1984360301811261399e575f5ffd5b830160208101925035905067ffffffffffffffff8111156139bd575f5ffd5b8060061b36038213156135cd575f5ffd5b8183526020830192505f815f5b84811015613a315781356139ee816134d2565b6001600160a01b0316865260208201356bffffffffffffffffffffffff8116808214613a18575f5ffd5b60208801525060409586019591909101906001016139db565b5093949350505050565b5f613a468283613989565b60a08552613a5860a0860182846139ce565b9150506020830135613a69816134d2565b6001600160a01b031660208501526040838101359085015263ffffffff613a9260608501613668565b16606085015263ffffffff613aa960808501613668565b1660808501528091505092915050565b60018060a01b0384168152826020820152606060408201525f613adf6060830184613a3b565b95945050505050565b8082018082111561114657611146613900565b602081525f6118c86020830184613a3b565b63ffffffff818116838216019081111561114657611146613900565b5f823560fe1983360301811261397f575f5ffd5b5f823560be1983360301811261397f575f5ffd5b5f5f8335601e19843603018112613b66575f5ffd5b830160208101925035905067ffffffffffffffff811115613b85575f5ffd5b8036038213156135cd575f5ffd5b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b5f613bc68283613989565b60c08552613bd860c0860182846139ce565b9150506020830135613be9816134d2565b6001600160a01b03166020850152613c046040840184613989565b858303604087015280835290915f91906020015b81831015613c53578335613c2b816134d2565b6001600160a01b03168152602084810135908201526040938401936001939093019201613c18565b613c5f60608701613668565b63ffffffff811660608901529350613c7960808701613668565b63ffffffff811660808901529350613c9460a0870187613b51565b9450925086810360a0880152613393818585613b93565b60018060a01b0384168152826020820152606060408201525f613adf6060830184613bbb565b828152604060208201525f6132a86040830184613bbb565b63ffffffff828116828216039081111561114657611146613900565b5f63ffffffff821680613d1a57613d1a613900565b5f190192915050565b5f60208284031215613d33575f5ffd5b5051919050565b5f60208284031215613d4a575f5ffd5b81516118c8816134d2565b5f5f8335601e19843603018112613d6a575f5ffd5b83018035915067ffffffffffffffff821115613d84575f5ffd5b6020019150600681901b36038213156135cd575f5ffd5b5f5f8335601e19843603018112613db0575f5ffd5b83018035915067ffffffffffffffff821115613dca575f5ffd5b6020019150600581901b36038213156135cd575f5ffd5b5f5f8335601e19843603018112613df6575f5ffd5b83018035915067ffffffffffffffff821115613e10575f5ffd5b6020019150368190038213156135cd575f5ffd5b634e487b7160e01b5f52601260045260245ffd5b5f63ffffffff831680613e4d57613e4d613e24565b8063ffffffff84160691505092915050565b5f82613e6d57613e6d613e24565b500490565b5f82518060208501845e5f920191825250919050565b5f82613e9657613e96613e24565b500690565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f8301168401019150509291505056fea264697066735822122001d8f1e9b16b9c1c91a405139ae06b32868e237bf6cef0ef8016876bbdb8292164736f6c634300081b0033", +>>>>>>> eead7c9e (feat: better introspection for encumbered magnitude (#1038)) } // RewardsCoordinatorABI is the input ABI used to generate the binding from. diff --git a/pkg/bindings/SlashingLib/binding.go b/pkg/bindings/SlashingLib/binding.go index 59d3b1afeb..cb36ba7ebe 100644 --- a/pkg/bindings/SlashingLib/binding.go +++ b/pkg/bindings/SlashingLib/binding.go @@ -32,7 +32,7 @@ var ( // SlashingLibMetaData contains all meta data concerning the SlashingLib contract. var SlashingLibMetaData = &bind.MetaData{ ABI: "[]", - Bin: "0x60556032600b8282823980515f1a607314602657634e487b7160e01b5f525f60045260245ffd5b305f52607381538281f3fe730000000000000000000000000000000000000000301460806040525f5ffdfea264697066735822122037a101287b0a7f2671ca731d282a04490481ee7903f1147b16ca0a6bea1d179b64736f6c634300081b0033", + Bin: "0x6055604b600b8282823980515f1a607314603f577f4e487b71000000000000000000000000000000000000000000000000000000005f525f60045260245ffd5b305f52607381538281f3fe730000000000000000000000000000000000000000301460806040525f5ffdfea264697066735822122064093fed1626f49b079e1ddcebe511e7d8efe0282a7ca54e974ae194a9db6e7864736f6c634300081b0033", } // SlashingLibABI is the input ABI used to generate the binding from. diff --git a/pkg/bindings/Snapshots/binding.go b/pkg/bindings/Snapshots/binding.go index 1f35924709..952be20bf6 100644 --- a/pkg/bindings/Snapshots/binding.go +++ b/pkg/bindings/Snapshots/binding.go @@ -32,7 +32,7 @@ var ( // SnapshotsMetaData contains all meta data concerning the Snapshots contract. var SnapshotsMetaData = &bind.MetaData{ ABI: "[{\"type\":\"error\",\"name\":\"InvalidSnapshotOrdering\",\"inputs\":[]}]", - Bin: "0x60556032600b8282823980515f1a607314602657634e487b7160e01b5f525f60045260245ffd5b305f52607381538281f3fe730000000000000000000000000000000000000000301460806040525f5ffdfea2646970667358221220402ddde4d006c9e7fe1fcff86c3b43945e43ee02d19b30e2eaa8f4d5605fd37d64736f6c634300081b0033", + Bin: "0x6055604b600b8282823980515f1a607314603f577f4e487b71000000000000000000000000000000000000000000000000000000005f525f60045260245ffd5b305f52607381538281f3fe730000000000000000000000000000000000000000301460806040525f5ffdfea264697066735822122003e3deed4d6531d9666fc99a9e2a3d00d10deeb84ff5755e24ea228a6b92d0c064736f6c634300081b0033", } // SnapshotsABI is the input ABI used to generate the binding from. diff --git a/pkg/bindings/StrategyBase/binding.go b/pkg/bindings/StrategyBase/binding.go index 92f5430931..13a19160fd 100644 --- a/pkg/bindings/StrategyBase/binding.go +++ b/pkg/bindings/StrategyBase/binding.go @@ -32,7 +32,7 @@ var ( // StrategyBaseMetaData contains all meta data concerning the StrategyBase contract. var StrategyBaseMetaData = &bind.MetaData{ ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"_strategyManager\",\"type\":\"address\",\"internalType\":\"contractIStrategyManager\"},{\"name\":\"_pauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"deposit\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"newShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"explanation\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"_underlyingToken\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"pauseAll\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[{\"name\":\"index\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pauserRegistry\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"shares\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"sharesToUnderlying\",\"inputs\":[{\"name\":\"amountShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"sharesToUnderlyingView\",\"inputs\":[{\"name\":\"amountShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"strategyManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategyManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"totalShares\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"underlyingToShares\",\"inputs\":[{\"name\":\"amountUnderlying\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"underlyingToSharesView\",\"inputs\":[{\"name\":\"amountUnderlying\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"underlyingToken\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"userUnderlying\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"userUnderlyingView\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"withdraw\",\"inputs\":[{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amountShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"ExchangeRateEmitted\",\"inputs\":[{\"name\":\"rate\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StrategyTokenSet\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIERC20\"},{\"name\":\"decimals\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"BalanceExceedsMaxTotalDeposits\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"CurrentlyPaused\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InputAddressZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidNewPausedStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"MaxPerDepositExceedsMax\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NewSharesZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyPauser\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyStrategyManager\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyUnderlyingToken\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyUnpauser\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"TotalSharesExceedsMax\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"WithdrawalAmountExceedsTotalDeposits\",\"inputs\":[]}]", - Bin: "0x60c060405234801561000f575f5ffd5b506040516113a63803806113a683398101604081905261002e9161014b565b806001600160a01b038116610056576040516339b190bb60e11b815260040160405180910390fd5b6001600160a01b03908116608052821660a052610071610078565b5050610183565b5f54610100900460ff16156100e35760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff90811614610132575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b0381168114610148575f5ffd5b50565b5f5f6040838503121561015c575f5ffd5b825161016781610134565b602084015190925061017881610134565b809150509250929050565b60805160a0516111d86101ce5f395f81816101750152818161040201528181610796015261083301525f818161022b0152818161030f01528181610543015261096101526111d85ff3fe608060405234801561000f575f5ffd5b5060043610610127575f3560e01c8063886f1195116100a9578063ce7c2ac21161006e578063ce7c2ac21461029b578063d9caed12146102ae578063e3dae51c146102c1578063f3e73875146102d4578063fabc1cbc146102e7575f5ffd5b8063886f1195146102265780638c8710191461024d5780638f6a624014610260578063ab5921e114610273578063c4d66de814610288575f5ffd5b8063553ca5f8116100ef578063553ca5f8146101c1578063595c6a67146101d45780635ac86ab7146101dc5780635c975abb1461020b5780637a8b263714610213575f5ffd5b8063136439dd1461012b5780632495a5991461014057806339b70e38146101705780633a98ef391461019757806347e7ef24146101ae575b5f5ffd5b61013e610139366004610f4d565b6102fa565b005b603254610153906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b6101537f000000000000000000000000000000000000000000000000000000000000000081565b6101a060335481565b604051908152602001610167565b6101a06101bc366004610f7b565b6103cf565b6101a06101cf366004610fa5565b61051b565b61013e61052e565b6101fb6101ea366004610fd5565b6001805460ff9092161b9081161490565b6040519015158152602001610167565b6001546101a0565b6101a0610221366004610f4d565b6105dd565b6101537f000000000000000000000000000000000000000000000000000000000000000081565b6101a061025b366004610f4d565b610626565b6101a061026e366004610fa5565b610630565b61027b61063d565b6040516101679190610ff0565b61013e610296366004610fa5565b61065d565b6101a06102a9366004610fa5565b61076f565b61013e6102bc366004611025565b610801565b6101a06102cf366004610f4d565b61091e565b6101a06102e2366004610f4d565b610955565b61013e6102f5366004610f4d565b61095f565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa15801561035c573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103809190611063565b61039d57604051631d77d47760e21b815260040160405180910390fd5b60015481811681146103c25760405163c61dca5d60e01b815260040160405180910390fd5b6103cb82610a75565b5050565b600180545f9182918116036103f75760405163840a48d560e01b815260040160405180910390fd5b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610440576040516348da714f60e01b815260040160405180910390fd5b61044a8484610ab2565b6033545f61045a6103e883611096565b90505f6103e8610468610ae0565b6104729190611096565b90505f61047f87836110a9565b90508061048c84896110bc565b61049691906110d3565b9550855f036104b857604051630c392ed360e11b815260040160405180910390fd5b6104c28685611096565b60338190556f4b3b4ca85a86c47a098a223fffffffff10156104f757604051632f14e8a360e11b815260040160405180910390fd5b610510826103e860335461050b9190611096565b610b4f565b505050505092915050565b5f6105286102218361076f565b92915050565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa158015610590573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105b49190611063565b6105d157604051631d77d47760e21b815260040160405180910390fd5b6105db5f19610a75565b565b5f5f6103e86033546105ef9190611096565b90505f6103e86105fd610ae0565b6106079190611096565b90508161061485836110bc565b61061e91906110d3565b949350505050565b5f6105288261091e565b5f6105286102e28361076f565b60606040518060800160405280604d8152602001611156604d9139905090565b5f54610100900460ff161580801561067b57505f54600160ff909116105b806106945750303b15801561069457505f5460ff166001145b6106fc5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b5f805460ff19166001179055801561071d575f805461ff0019166101001790555b61072682610b9b565b80156103cb575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498906020015b60405180910390a15050565b60405163fe243a1760e01b81526001600160a01b0382811660048301523060248301525f917f00000000000000000000000000000000000000000000000000000000000000009091169063fe243a1790604401602060405180830381865afa1580156107dd573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061052891906110f2565b600180546002908116036108285760405163840a48d560e01b815260040160405180910390fd5b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610871576040516348da714f60e01b815260040160405180910390fd5b61087c848484610ce6565b603354808311156108a057604051630b469df360e41b815260040160405180910390fd5b5f6108ad6103e883611096565b90505f6103e86108bb610ae0565b6108c59190611096565b90505f826108d387846110bc565b6108dd91906110d3565b90506108e986856110a9565b6033556109096108f982846110a9565b6103e860335461050b9190611096565b610914888883610d19565b5050505050505050565b5f5f6103e86033546109309190611096565b90505f6103e861093e610ae0565b6109489190611096565b90508061061483866110bc565b5f610528826105dd565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156109bb573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109df9190611109565b6001600160a01b0316336001600160a01b031614610a105760405163794821ff60e01b815260040160405180910390fd5b60015480198219811614610a375760405163c61dca5d60e01b815260040160405180910390fd5b600182905560405182815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c9060200160405180910390a25050565b600181905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a250565b6032546001600160a01b038381169116146103cb57604051630312abdd60e61b815260040160405180910390fd5b6032546040516370a0823160e01b81523060048201525f916001600160a01b0316906370a0823190602401602060405180830381865afa158015610b26573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b4a91906110f2565b905090565b7fd2494f3479e5da49d386657c292c610b5b01df313d07c62eb0cfa49924a31be881610b8384670de0b6b3a76400006110bc565b610b8d91906110d3565b604051908152602001610763565b5f54610100900460ff16610c055760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b60648201526084016106f3565b603280546001600160a01b0319166001600160a01b038316179055610c295f610a75565b7f1c540707b00eb5427b6b774fc799d756516a54aee108b64b327acc55af55750760325f9054906101000a90046001600160a01b0316826001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015610c9b573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610cbf9190611124565b604080516001600160a01b03909316835260ff90911660208301520160405180910390a150565b6032546001600160a01b03838116911614610d1457604051630312abdd60e61b815260040160405180910390fd5b505050565b604080516001600160a01b03858116602483015260448083018590528351808403909101815260649092018352602080830180516001600160e01b031663a9059cbb60e01b17905283518085019094528084527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c656490840152610d1492908516918691859185918591905f90610db19084908490610e30565b905080515f1480610dd1575080806020019051810190610dd19190611063565b610d145760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016106f3565b606061061e84845f85855f5f866001600160a01b03168587604051610e55919061113f565b5f6040518083038185875af1925050503d805f8114610e8f576040519150601f19603f3d011682016040523d82523d5f602084013e610e94565b606091505b5091509150610ea587838387610eb0565b979650505050505050565b60608315610f1e5782515f03610f17576001600160a01b0385163b610f175760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016106f3565b508161061e565b61061e8383815115610f335781518083602001fd5b8060405162461bcd60e51b81526004016106f39190610ff0565b5f60208284031215610f5d575f5ffd5b5035919050565b6001600160a01b0381168114610f78575f5ffd5b50565b5f5f60408385031215610f8c575f5ffd5b8235610f9781610f64565b946020939093013593505050565b5f60208284031215610fb5575f5ffd5b8135610fc081610f64565b9392505050565b60ff81168114610f78575f5ffd5b5f60208284031215610fe5575f5ffd5b8135610fc081610fc7565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b5f5f5f60608486031215611037575f5ffd5b833561104281610f64565b9250602084013561105281610f64565b929592945050506040919091013590565b5f60208284031215611073575f5ffd5b81518015158114610fc0575f5ffd5b634e487b7160e01b5f52601160045260245ffd5b8082018082111561052857610528611082565b8181038181111561052857610528611082565b808202811582820484141761052857610528611082565b5f826110ed57634e487b7160e01b5f52601260045260245ffd5b500490565b5f60208284031215611102575f5ffd5b5051919050565b5f60208284031215611119575f5ffd5b8151610fc081610f64565b5f60208284031215611134575f5ffd5b8151610fc081610fc7565b5f82518060208501845e5f92019182525091905056fe4261736520537472617465677920696d706c656d656e746174696f6e20746f20696e68657269742066726f6d20666f72206d6f726520636f6d706c657820696d706c656d656e746174696f6e73a264697066735822122008bdccf69f7396adcf67fdc972effdb8a3cf009cbbb0388591668d00f8d8e00664736f6c634300081b0033", + Bin: "0x60c060405234801561000f575f5ffd5b506040516113a63803806113a683398101604081905261002e9161014b565b806001600160a01b038116610056576040516339b190bb60e11b815260040160405180910390fd5b6001600160a01b03908116608052821660a052610071610078565b5050610183565b5f54610100900460ff16156100e35760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff90811614610132575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b0381168114610148575f5ffd5b50565b5f5f6040838503121561015c575f5ffd5b825161016781610134565b602084015190925061017881610134565b809150509250929050565b60805160a0516111d86101ce5f395f81816101750152818161040201528181610796015261083301525f818161022b0152818161030f01528181610543015261096101526111d85ff3fe608060405234801561000f575f5ffd5b5060043610610127575f3560e01c8063886f1195116100a9578063ce7c2ac21161006e578063ce7c2ac21461029b578063d9caed12146102ae578063e3dae51c146102c1578063f3e73875146102d4578063fabc1cbc146102e7575f5ffd5b8063886f1195146102265780638c8710191461024d5780638f6a624014610260578063ab5921e114610273578063c4d66de814610288575f5ffd5b8063553ca5f8116100ef578063553ca5f8146101c1578063595c6a67146101d45780635ac86ab7146101dc5780635c975abb1461020b5780637a8b263714610213575f5ffd5b8063136439dd1461012b5780632495a5991461014057806339b70e38146101705780633a98ef391461019757806347e7ef24146101ae575b5f5ffd5b61013e610139366004610f4d565b6102fa565b005b603254610153906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b6101537f000000000000000000000000000000000000000000000000000000000000000081565b6101a060335481565b604051908152602001610167565b6101a06101bc366004610f7b565b6103cf565b6101a06101cf366004610fa5565b61051b565b61013e61052e565b6101fb6101ea366004610fd5565b6001805460ff9092161b9081161490565b6040519015158152602001610167565b6001546101a0565b6101a0610221366004610f4d565b6105dd565b6101537f000000000000000000000000000000000000000000000000000000000000000081565b6101a061025b366004610f4d565b610626565b6101a061026e366004610fa5565b610630565b61027b61063d565b6040516101679190610ff0565b61013e610296366004610fa5565b61065d565b6101a06102a9366004610fa5565b61076f565b61013e6102bc366004611025565b610801565b6101a06102cf366004610f4d565b61091e565b6101a06102e2366004610f4d565b610955565b61013e6102f5366004610f4d565b61095f565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa15801561035c573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103809190611063565b61039d57604051631d77d47760e21b815260040160405180910390fd5b60015481811681146103c25760405163c61dca5d60e01b815260040160405180910390fd5b6103cb82610a75565b5050565b600180545f9182918116036103f75760405163840a48d560e01b815260040160405180910390fd5b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610440576040516348da714f60e01b815260040160405180910390fd5b61044a8484610ab2565b6033545f61045a6103e883611096565b90505f6103e8610468610ae0565b6104729190611096565b90505f61047f87836110a9565b90508061048c84896110bc565b61049691906110d3565b9550855f036104b857604051630c392ed360e11b815260040160405180910390fd5b6104c28685611096565b60338190556f4b3b4ca85a86c47a098a223fffffffff10156104f757604051632f14e8a360e11b815260040160405180910390fd5b610510826103e860335461050b9190611096565b610b4f565b505050505092915050565b5f6105286102218361076f565b92915050565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa158015610590573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105b49190611063565b6105d157604051631d77d47760e21b815260040160405180910390fd5b6105db5f19610a75565b565b5f5f6103e86033546105ef9190611096565b90505f6103e86105fd610ae0565b6106079190611096565b90508161061485836110bc565b61061e91906110d3565b949350505050565b5f6105288261091e565b5f6105286102e28361076f565b60606040518060800160405280604d8152602001611156604d9139905090565b5f54610100900460ff161580801561067b57505f54600160ff909116105b806106945750303b15801561069457505f5460ff166001145b6106fc5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b5f805460ff19166001179055801561071d575f805461ff0019166101001790555b61072682610b9b565b80156103cb575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498906020015b60405180910390a15050565b60405163fe243a1760e01b81526001600160a01b0382811660048301523060248301525f917f00000000000000000000000000000000000000000000000000000000000000009091169063fe243a1790604401602060405180830381865afa1580156107dd573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061052891906110f2565b600180546002908116036108285760405163840a48d560e01b815260040160405180910390fd5b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610871576040516348da714f60e01b815260040160405180910390fd5b61087c848484610ce6565b603354808311156108a057604051630b469df360e41b815260040160405180910390fd5b5f6108ad6103e883611096565b90505f6103e86108bb610ae0565b6108c59190611096565b90505f826108d387846110bc565b6108dd91906110d3565b90506108e986856110a9565b6033556109096108f982846110a9565b6103e860335461050b9190611096565b610914888883610d19565b5050505050505050565b5f5f6103e86033546109309190611096565b90505f6103e861093e610ae0565b6109489190611096565b90508061061483866110bc565b5f610528826105dd565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156109bb573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109df9190611109565b6001600160a01b0316336001600160a01b031614610a105760405163794821ff60e01b815260040160405180910390fd5b60015480198219811614610a375760405163c61dca5d60e01b815260040160405180910390fd5b600182905560405182815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c9060200160405180910390a25050565b600181905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a250565b6032546001600160a01b038381169116146103cb57604051630312abdd60e61b815260040160405180910390fd5b6032546040516370a0823160e01b81523060048201525f916001600160a01b0316906370a0823190602401602060405180830381865afa158015610b26573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b4a91906110f2565b905090565b7fd2494f3479e5da49d386657c292c610b5b01df313d07c62eb0cfa49924a31be881610b8384670de0b6b3a76400006110bc565b610b8d91906110d3565b604051908152602001610763565b5f54610100900460ff16610c055760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b60648201526084016106f3565b603280546001600160a01b0319166001600160a01b038316179055610c295f610a75565b7f1c540707b00eb5427b6b774fc799d756516a54aee108b64b327acc55af55750760325f9054906101000a90046001600160a01b0316826001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015610c9b573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610cbf9190611124565b604080516001600160a01b03909316835260ff90911660208301520160405180910390a150565b6032546001600160a01b03838116911614610d1457604051630312abdd60e61b815260040160405180910390fd5b505050565b604080516001600160a01b03858116602483015260448083018590528351808403909101815260649092018352602080830180516001600160e01b031663a9059cbb60e01b17905283518085019094528084527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c656490840152610d1492908516918691859185918591905f90610db19084908490610e30565b905080515f1480610dd1575080806020019051810190610dd19190611063565b610d145760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016106f3565b606061061e84845f85855f5f866001600160a01b03168587604051610e55919061113f565b5f6040518083038185875af1925050503d805f8114610e8f576040519150601f19603f3d011682016040523d82523d5f602084013e610e94565b606091505b5091509150610ea587838387610eb0565b979650505050505050565b60608315610f1e5782515f03610f17576001600160a01b0385163b610f175760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016106f3565b508161061e565b61061e8383815115610f335781518083602001fd5b8060405162461bcd60e51b81526004016106f39190610ff0565b5f60208284031215610f5d575f5ffd5b5035919050565b6001600160a01b0381168114610f78575f5ffd5b50565b5f5f60408385031215610f8c575f5ffd5b8235610f9781610f64565b946020939093013593505050565b5f60208284031215610fb5575f5ffd5b8135610fc081610f64565b9392505050565b60ff81168114610f78575f5ffd5b5f60208284031215610fe5575f5ffd5b8135610fc081610fc7565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b5f5f5f60608486031215611037575f5ffd5b833561104281610f64565b9250602084013561105281610f64565b929592945050506040919091013590565b5f60208284031215611073575f5ffd5b81518015158114610fc0575f5ffd5b634e487b7160e01b5f52601160045260245ffd5b8082018082111561052857610528611082565b8181038181111561052857610528611082565b808202811582820484141761052857610528611082565b5f826110ed57634e487b7160e01b5f52601260045260245ffd5b500490565b5f60208284031215611102575f5ffd5b5051919050565b5f60208284031215611119575f5ffd5b8151610fc081610f64565b5f60208284031215611134575f5ffd5b8151610fc081610fc7565b5f82518060208501845e5f92019182525091905056fe4261736520537472617465677920696d706c656d656e746174696f6e20746f20696e68657269742066726f6d20666f72206d6f726520636f6d706c657820696d706c656d656e746174696f6e73a2646970667358221220762d0f677dd782b36e4135d769a45b7786803d76c93d6252adb22a9f8dc2e5e464736f6c634300081b0033", } // 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 ea3b7cdf62..942501ba40 100644 --- a/pkg/bindings/StrategyBaseTVLLimits/binding.go +++ b/pkg/bindings/StrategyBaseTVLLimits/binding.go @@ -32,7 +32,7 @@ var ( // StrategyBaseTVLLimitsMetaData contains all meta data concerning the StrategyBaseTVLLimits contract. var StrategyBaseTVLLimitsMetaData = &bind.MetaData{ ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"_strategyManager\",\"type\":\"address\",\"internalType\":\"contractIStrategyManager\"},{\"name\":\"_pauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"deposit\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"newShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"explanation\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"getTVLLimits\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"_maxPerDeposit\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_maxTotalDeposits\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_underlyingToken\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"_underlyingToken\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"maxPerDeposit\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"maxTotalDeposits\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"pauseAll\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[{\"name\":\"index\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pauserRegistry\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"setTVLLimits\",\"inputs\":[{\"name\":\"newMaxPerDeposit\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"newMaxTotalDeposits\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"shares\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"sharesToUnderlying\",\"inputs\":[{\"name\":\"amountShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"sharesToUnderlyingView\",\"inputs\":[{\"name\":\"amountShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"strategyManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategyManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"totalShares\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"underlyingToShares\",\"inputs\":[{\"name\":\"amountUnderlying\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"underlyingToSharesView\",\"inputs\":[{\"name\":\"amountUnderlying\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"underlyingToken\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"userUnderlying\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"userUnderlyingView\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"withdraw\",\"inputs\":[{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amountShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"ExchangeRateEmitted\",\"inputs\":[{\"name\":\"rate\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"MaxPerDepositUpdated\",\"inputs\":[{\"name\":\"previousValue\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"newValue\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"MaxTotalDepositsUpdated\",\"inputs\":[{\"name\":\"previousValue\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"newValue\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StrategyTokenSet\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIERC20\"},{\"name\":\"decimals\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"BalanceExceedsMaxTotalDeposits\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"CurrentlyPaused\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InputAddressZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidNewPausedStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"MaxPerDepositExceedsMax\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NewSharesZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyPauser\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyStrategyManager\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyUnderlyingToken\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyUnpauser\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"TotalSharesExceedsMax\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"WithdrawalAmountExceedsTotalDeposits\",\"inputs\":[]}]", - Bin: "0x60c060405234801561000f575f5ffd5b5060405161173e38038061173e83398101604081905261002e9161014f565b8181806001600160a01b038116610058576040516339b190bb60e11b815260040160405180910390fd5b6001600160a01b03908116608052821660a05261007361007c565b50505050610187565b5f54610100900460ff16156100e75760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff90811614610136575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b038116811461014c575f5ffd5b50565b5f5f60408385031215610160575f5ffd5b825161016b81610138565b602084015190925061017c81610138565b809150509250929050565b60805160a0516115656101d95f395f81816101ce01528181610556015281816109790152610a1601525f81816102960152818161039501528181610467015281816106970152610b4401526115655ff3fe608060405234801561000f575f5ffd5b506004361061016d575f3560e01c80637a8b2637116100d9578063c4d66de811610093578063df6fadc11161006e578063df6fadc11461033f578063e3dae51c1461035a578063f3e738751461036d578063fabc1cbc14610380575f5ffd5b8063c4d66de814610306578063ce7c2ac214610319578063d9caed121461032c575f5ffd5b80637a8b26371461027e578063886f1195146102915780638c871019146102b85780638f6a6240146102cb578063a6ab36f2146102de578063ab5921e1146102f1575f5ffd5b806347e7ef241161012a57806347e7ef2414610210578063553ca5f814610223578063595c6a67146102365780635ac86ab71461023e5780635c975abb1461026d57806361b01b5d14610275575f5ffd5b806311c70c9d14610171578063136439dd146101865780632495a5991461019957806339b70e38146101c95780633a98ef39146101f057806343fe08b014610207575b5f5ffd5b61018461017f366004611236565b610393565b005b610184610194366004611256565b610452565b6032546101ac906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b6101ac7f000000000000000000000000000000000000000000000000000000000000000081565b6101f960335481565b6040519081526020016101c0565b6101f960645481565b6101f961021e366004611284565b610523565b6101f96102313660046112ae565b61066f565b610184610682565b61025d61024c3660046112de565b6001805460ff9092161b9081161490565b60405190151581526020016101c0565b6001546101f9565b6101f960655481565b6101f961028c366004611256565b610731565b6101ac7f000000000000000000000000000000000000000000000000000000000000000081565b6101f96102c6366004611256565b61077a565b6101f96102d93660046112ae565b610784565b6101846102ec3660046112f9565b610791565b6102f961086c565b6040516101c0919061132f565b6101846103143660046112ae565b61088c565b6101f96103273660046112ae565b610952565b61018461033a366004611364565b6109e4565b606454606554604080519283526020830191909152016101c0565b6101f9610368366004611256565b610b01565b6101f961037b366004611256565b610b38565b61018461038e366004611256565b610b42565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156103ef573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061041391906113a2565b6001600160a01b0316336001600160a01b0316146104445760405163794821ff60e01b815260040160405180910390fd5b61044e8282610c58565b5050565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa1580156104b4573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104d891906113bd565b6104f557604051631d77d47760e21b815260040160405180910390fd5b600154818116811461051a5760405163c61dca5d60e01b815260040160405180910390fd5b61044e82610cfc565b600180545f91829181160361054b5760405163840a48d560e01b815260040160405180910390fd5b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610594576040516348da714f60e01b815260040160405180910390fd5b61059e8484610d39565b6033545f6105ae6103e8836113f0565b90505f6103e86105bc610d90565b6105c691906113f0565b90505f6105d38783611403565b9050806105e08489611416565b6105ea919061142d565b9550855f0361060c57604051630c392ed360e11b815260040160405180910390fd5b61061686856113f0565b60338190556f4b3b4ca85a86c47a098a223fffffffff101561064b57604051632f14e8a360e11b815260040160405180910390fd5b610664826103e860335461065f91906113f0565b610dff565b505050505092915050565b5f61067c61028c83610952565b92915050565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa1580156106e4573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061070891906113bd565b61072557604051631d77d47760e21b815260040160405180910390fd5b61072f5f19610cfc565b565b5f5f6103e860335461074391906113f0565b90505f6103e8610751610d90565b61075b91906113f0565b9050816107688583611416565b610772919061142d565b949350505050565b5f61067c82610b01565b5f61067c61037b83610952565b5f54610100900460ff16158080156107af57505f54600160ff909116105b806107c85750303b1580156107c857505f5460ff166001145b6107ed5760405162461bcd60e51b81526004016107e49061144c565b60405180910390fd5b5f805460ff19166001179055801561080e575f805461ff0019166101001790555b6108188484610c58565b61082182610e4b565b8015610866575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b60606040518060800160405280604d81526020016114e3604d9139905090565b5f54610100900460ff16158080156108aa57505f54600160ff909116105b806108c35750303b1580156108c357505f5460ff166001145b6108df5760405162461bcd60e51b81526004016107e49061144c565b5f805460ff191660011790558015610900575f805461ff0019166101001790555b61090982610e4b565b801561044e575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498906020015b60405180910390a15050565b60405163fe243a1760e01b81526001600160a01b0382811660048301523060248301525f917f00000000000000000000000000000000000000000000000000000000000000009091169063fe243a1790604401602060405180830381865afa1580156109c0573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061067c919061149a565b60018054600290811603610a0b5760405163840a48d560e01b815260040160405180910390fd5b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610a54576040516348da714f60e01b815260040160405180910390fd5b610a5f848484610f96565b60335480831115610a8357604051630b469df360e41b815260040160405180910390fd5b5f610a906103e8836113f0565b90505f6103e8610a9e610d90565b610aa891906113f0565b90505f82610ab68784611416565b610ac0919061142d565b9050610acc8685611403565b603355610aec610adc8284611403565b6103e860335461065f91906113f0565b610af7888883610fc9565b5050505050505050565b5f5f6103e8603354610b1391906113f0565b90505f6103e8610b21610d90565b610b2b91906113f0565b9050806107688386611416565b5f61067c82610731565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b9e573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610bc291906113a2565b6001600160a01b0316336001600160a01b031614610bf35760405163794821ff60e01b815260040160405180910390fd5b60015480198219811614610c1a5760405163c61dca5d60e01b815260040160405180910390fd5b600182905560405182815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c9060200160405180910390a25050565b60645460408051918252602082018490527ff97ed4e083acac67830025ecbc756d8fe847cdbdca4cee3fe1e128e98b54ecb5910160405180910390a160655460408051918252602082018390527f6ab181e0440bfbf4bacdf2e99674735ce6638005490688c5f994f5399353e452910160405180910390a180821115610cf15760405163052b07b760e21b815260040160405180910390fd5b606491909155606555565b600181905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a250565b606454811115610d5c5760405163052b07b760e21b815260040160405180910390fd5b606554610d67610d90565b1115610d865760405163d86bae6760e01b815260040160405180910390fd5b61044e8282610fdd565b6032546040516370a0823160e01b81523060048201525f916001600160a01b0316906370a0823190602401602060405180830381865afa158015610dd6573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610dfa919061149a565b905090565b7fd2494f3479e5da49d386657c292c610b5b01df313d07c62eb0cfa49924a31be881610e3384670de0b6b3a7640000611416565b610e3d919061142d565b604051908152602001610946565b5f54610100900460ff16610eb55760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b60648201526084016107e4565b603280546001600160a01b0319166001600160a01b038316179055610ed95f610cfc565b7f1c540707b00eb5427b6b774fc799d756516a54aee108b64b327acc55af55750760325f9054906101000a90046001600160a01b0316826001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f4b573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f6f91906114b1565b604080516001600160a01b03909316835260ff90911660208301520160405180910390a150565b6032546001600160a01b03838116911614610fc457604051630312abdd60e61b815260040160405180910390fd5b505050565b610fc46001600160a01b038316848361100b565b6032546001600160a01b0383811691161461044e57604051630312abdd60e61b815260040160405180910390fd5b604080516001600160a01b03848116602483015260448083018590528351808403909101815260649092018352602080830180516001600160e01b031663a9059cbb60e01b17905283518085019094528084527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c656490840152610fc4928692915f9161109a918516908490611119565b905080515f14806110ba5750808060200190518101906110ba91906113bd565b610fc45760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016107e4565b606061077284845f85855f5f866001600160a01b0316858760405161113e91906114cc565b5f6040518083038185875af1925050503d805f8114611178576040519150601f19603f3d011682016040523d82523d5f602084013e61117d565b606091505b509150915061118e87838387611199565b979650505050505050565b606083156112075782515f03611200576001600160a01b0385163b6112005760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016107e4565b5081610772565b610772838381511561121c5781518083602001fd5b8060405162461bcd60e51b81526004016107e4919061132f565b5f5f60408385031215611247575f5ffd5b50508035926020909101359150565b5f60208284031215611266575f5ffd5b5035919050565b6001600160a01b0381168114611281575f5ffd5b50565b5f5f60408385031215611295575f5ffd5b82356112a08161126d565b946020939093013593505050565b5f602082840312156112be575f5ffd5b81356112c98161126d565b9392505050565b60ff81168114611281575f5ffd5b5f602082840312156112ee575f5ffd5b81356112c9816112d0565b5f5f5f6060848603121561130b575f5ffd5b833592506020840135915060408401356113248161126d565b809150509250925092565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b5f5f5f60608486031215611376575f5ffd5b83356113818161126d565b925060208401356113918161126d565b929592945050506040919091013590565b5f602082840312156113b2575f5ffd5b81516112c98161126d565b5f602082840312156113cd575f5ffd5b815180151581146112c9575f5ffd5b634e487b7160e01b5f52601160045260245ffd5b8082018082111561067c5761067c6113dc565b8181038181111561067c5761067c6113dc565b808202811582820484141761067c5761067c6113dc565b5f8261144757634e487b7160e01b5f52601260045260245ffd5b500490565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b5f602082840312156114aa575f5ffd5b5051919050565b5f602082840312156114c1575f5ffd5b81516112c9816112d0565b5f82518060208501845e5f92019182525091905056fe4261736520537472617465677920696d706c656d656e746174696f6e20746f20696e68657269742066726f6d20666f72206d6f726520636f6d706c657820696d706c656d656e746174696f6e73a26469706673582212208881d7f24e0aaa802aa95109d02da54b43f8bec344dd464bcec12afbcd6ff49f64736f6c634300081b0033", + Bin: "0x60c060405234801561000f575f5ffd5b5060405161173e38038061173e83398101604081905261002e9161014f565b8181806001600160a01b038116610058576040516339b190bb60e11b815260040160405180910390fd5b6001600160a01b03908116608052821660a05261007361007c565b50505050610187565b5f54610100900460ff16156100e75760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff90811614610136575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b038116811461014c575f5ffd5b50565b5f5f60408385031215610160575f5ffd5b825161016b81610138565b602084015190925061017c81610138565b809150509250929050565b60805160a0516115656101d95f395f81816101ce01528181610556015281816109790152610a1601525f81816102960152818161039501528181610467015281816106970152610b4401526115655ff3fe608060405234801561000f575f5ffd5b506004361061016d575f3560e01c80637a8b2637116100d9578063c4d66de811610093578063df6fadc11161006e578063df6fadc11461033f578063e3dae51c1461035a578063f3e738751461036d578063fabc1cbc14610380575f5ffd5b8063c4d66de814610306578063ce7c2ac214610319578063d9caed121461032c575f5ffd5b80637a8b26371461027e578063886f1195146102915780638c871019146102b85780638f6a6240146102cb578063a6ab36f2146102de578063ab5921e1146102f1575f5ffd5b806347e7ef241161012a57806347e7ef2414610210578063553ca5f814610223578063595c6a67146102365780635ac86ab71461023e5780635c975abb1461026d57806361b01b5d14610275575f5ffd5b806311c70c9d14610171578063136439dd146101865780632495a5991461019957806339b70e38146101c95780633a98ef39146101f057806343fe08b014610207575b5f5ffd5b61018461017f366004611236565b610393565b005b610184610194366004611256565b610452565b6032546101ac906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b6101ac7f000000000000000000000000000000000000000000000000000000000000000081565b6101f960335481565b6040519081526020016101c0565b6101f960645481565b6101f961021e366004611284565b610523565b6101f96102313660046112ae565b61066f565b610184610682565b61025d61024c3660046112de565b6001805460ff9092161b9081161490565b60405190151581526020016101c0565b6001546101f9565b6101f960655481565b6101f961028c366004611256565b610731565b6101ac7f000000000000000000000000000000000000000000000000000000000000000081565b6101f96102c6366004611256565b61077a565b6101f96102d93660046112ae565b610784565b6101846102ec3660046112f9565b610791565b6102f961086c565b6040516101c0919061132f565b6101846103143660046112ae565b61088c565b6101f96103273660046112ae565b610952565b61018461033a366004611364565b6109e4565b606454606554604080519283526020830191909152016101c0565b6101f9610368366004611256565b610b01565b6101f961037b366004611256565b610b38565b61018461038e366004611256565b610b42565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156103ef573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061041391906113a2565b6001600160a01b0316336001600160a01b0316146104445760405163794821ff60e01b815260040160405180910390fd5b61044e8282610c58565b5050565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa1580156104b4573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104d891906113bd565b6104f557604051631d77d47760e21b815260040160405180910390fd5b600154818116811461051a5760405163c61dca5d60e01b815260040160405180910390fd5b61044e82610cfc565b600180545f91829181160361054b5760405163840a48d560e01b815260040160405180910390fd5b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610594576040516348da714f60e01b815260040160405180910390fd5b61059e8484610d39565b6033545f6105ae6103e8836113f0565b90505f6103e86105bc610d90565b6105c691906113f0565b90505f6105d38783611403565b9050806105e08489611416565b6105ea919061142d565b9550855f0361060c57604051630c392ed360e11b815260040160405180910390fd5b61061686856113f0565b60338190556f4b3b4ca85a86c47a098a223fffffffff101561064b57604051632f14e8a360e11b815260040160405180910390fd5b610664826103e860335461065f91906113f0565b610dff565b505050505092915050565b5f61067c61028c83610952565b92915050565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa1580156106e4573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061070891906113bd565b61072557604051631d77d47760e21b815260040160405180910390fd5b61072f5f19610cfc565b565b5f5f6103e860335461074391906113f0565b90505f6103e8610751610d90565b61075b91906113f0565b9050816107688583611416565b610772919061142d565b949350505050565b5f61067c82610b01565b5f61067c61037b83610952565b5f54610100900460ff16158080156107af57505f54600160ff909116105b806107c85750303b1580156107c857505f5460ff166001145b6107ed5760405162461bcd60e51b81526004016107e49061144c565b60405180910390fd5b5f805460ff19166001179055801561080e575f805461ff0019166101001790555b6108188484610c58565b61082182610e4b565b8015610866575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b60606040518060800160405280604d81526020016114e3604d9139905090565b5f54610100900460ff16158080156108aa57505f54600160ff909116105b806108c35750303b1580156108c357505f5460ff166001145b6108df5760405162461bcd60e51b81526004016107e49061144c565b5f805460ff191660011790558015610900575f805461ff0019166101001790555b61090982610e4b565b801561044e575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498906020015b60405180910390a15050565b60405163fe243a1760e01b81526001600160a01b0382811660048301523060248301525f917f00000000000000000000000000000000000000000000000000000000000000009091169063fe243a1790604401602060405180830381865afa1580156109c0573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061067c919061149a565b60018054600290811603610a0b5760405163840a48d560e01b815260040160405180910390fd5b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610a54576040516348da714f60e01b815260040160405180910390fd5b610a5f848484610f96565b60335480831115610a8357604051630b469df360e41b815260040160405180910390fd5b5f610a906103e8836113f0565b90505f6103e8610a9e610d90565b610aa891906113f0565b90505f82610ab68784611416565b610ac0919061142d565b9050610acc8685611403565b603355610aec610adc8284611403565b6103e860335461065f91906113f0565b610af7888883610fc9565b5050505050505050565b5f5f6103e8603354610b1391906113f0565b90505f6103e8610b21610d90565b610b2b91906113f0565b9050806107688386611416565b5f61067c82610731565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b9e573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610bc291906113a2565b6001600160a01b0316336001600160a01b031614610bf35760405163794821ff60e01b815260040160405180910390fd5b60015480198219811614610c1a5760405163c61dca5d60e01b815260040160405180910390fd5b600182905560405182815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c9060200160405180910390a25050565b60645460408051918252602082018490527ff97ed4e083acac67830025ecbc756d8fe847cdbdca4cee3fe1e128e98b54ecb5910160405180910390a160655460408051918252602082018390527f6ab181e0440bfbf4bacdf2e99674735ce6638005490688c5f994f5399353e452910160405180910390a180821115610cf15760405163052b07b760e21b815260040160405180910390fd5b606491909155606555565b600181905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a250565b606454811115610d5c5760405163052b07b760e21b815260040160405180910390fd5b606554610d67610d90565b1115610d865760405163d86bae6760e01b815260040160405180910390fd5b61044e8282610fdd565b6032546040516370a0823160e01b81523060048201525f916001600160a01b0316906370a0823190602401602060405180830381865afa158015610dd6573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610dfa919061149a565b905090565b7fd2494f3479e5da49d386657c292c610b5b01df313d07c62eb0cfa49924a31be881610e3384670de0b6b3a7640000611416565b610e3d919061142d565b604051908152602001610946565b5f54610100900460ff16610eb55760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b60648201526084016107e4565b603280546001600160a01b0319166001600160a01b038316179055610ed95f610cfc565b7f1c540707b00eb5427b6b774fc799d756516a54aee108b64b327acc55af55750760325f9054906101000a90046001600160a01b0316826001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f4b573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f6f91906114b1565b604080516001600160a01b03909316835260ff90911660208301520160405180910390a150565b6032546001600160a01b03838116911614610fc457604051630312abdd60e61b815260040160405180910390fd5b505050565b610fc46001600160a01b038316848361100b565b6032546001600160a01b0383811691161461044e57604051630312abdd60e61b815260040160405180910390fd5b604080516001600160a01b03848116602483015260448083018590528351808403909101815260649092018352602080830180516001600160e01b031663a9059cbb60e01b17905283518085019094528084527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c656490840152610fc4928692915f9161109a918516908490611119565b905080515f14806110ba5750808060200190518101906110ba91906113bd565b610fc45760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016107e4565b606061077284845f85855f5f866001600160a01b0316858760405161113e91906114cc565b5f6040518083038185875af1925050503d805f8114611178576040519150601f19603f3d011682016040523d82523d5f602084013e61117d565b606091505b509150915061118e87838387611199565b979650505050505050565b606083156112075782515f03611200576001600160a01b0385163b6112005760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016107e4565b5081610772565b610772838381511561121c5781518083602001fd5b8060405162461bcd60e51b81526004016107e4919061132f565b5f5f60408385031215611247575f5ffd5b50508035926020909101359150565b5f60208284031215611266575f5ffd5b5035919050565b6001600160a01b0381168114611281575f5ffd5b50565b5f5f60408385031215611295575f5ffd5b82356112a08161126d565b946020939093013593505050565b5f602082840312156112be575f5ffd5b81356112c98161126d565b9392505050565b60ff81168114611281575f5ffd5b5f602082840312156112ee575f5ffd5b81356112c9816112d0565b5f5f5f6060848603121561130b575f5ffd5b833592506020840135915060408401356113248161126d565b809150509250925092565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b5f5f5f60608486031215611376575f5ffd5b83356113818161126d565b925060208401356113918161126d565b929592945050506040919091013590565b5f602082840312156113b2575f5ffd5b81516112c98161126d565b5f602082840312156113cd575f5ffd5b815180151581146112c9575f5ffd5b634e487b7160e01b5f52601160045260245ffd5b8082018082111561067c5761067c6113dc565b8181038181111561067c5761067c6113dc565b808202811582820484141761067c5761067c6113dc565b5f8261144757634e487b7160e01b5f52601260045260245ffd5b500490565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b5f602082840312156114aa575f5ffd5b5051919050565b5f602082840312156114c1575f5ffd5b81516112c9816112d0565b5f82518060208501845e5f92019182525091905056fe4261736520537472617465677920696d706c656d656e746174696f6e20746f20696e68657269742066726f6d20666f72206d6f726520636f6d706c657820696d706c656d656e746174696f6e73a26469706673582212200c57a2a22085f981ee53bbcecc92ca02ec3a9be5fb5882eddf73ca423a0ab36764736f6c634300081b0033", } // 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 598d583cb2..20ba8a6086 100644 --- a/pkg/bindings/StrategyFactory/binding.go +++ b/pkg/bindings/StrategyFactory/binding.go @@ -32,7 +32,7 @@ var ( // StrategyFactoryMetaData contains all meta data concerning the StrategyFactory contract. var StrategyFactoryMetaData = &bind.MetaData{ ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"_strategyManager\",\"type\":\"address\",\"internalType\":\"contractIStrategyManager\"},{\"name\":\"_pauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"blacklistTokens\",\"inputs\":[{\"name\":\"tokens\",\"type\":\"address[]\",\"internalType\":\"contractIERC20[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"deployNewStrategy\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"outputs\":[{\"name\":\"newStrategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"deployedStrategies\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"_initialOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_initialPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_strategyBeacon\",\"type\":\"address\",\"internalType\":\"contractIBeacon\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"isBlacklisted\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"pauseAll\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[{\"name\":\"index\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pauserRegistry\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"removeStrategiesFromWhitelist\",\"inputs\":[{\"name\":\"strategiesToRemoveFromWhitelist\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"strategyBeacon\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIBeacon\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"strategyManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategyManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"whitelistStrategies\",\"inputs\":[{\"name\":\"strategiesToWhitelist\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StrategyBeaconModified\",\"inputs\":[{\"name\":\"previousBeacon\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIBeacon\"},{\"name\":\"newBeacon\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIBeacon\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StrategySetForToken\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIERC20\"},{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TokenBlacklisted\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIERC20\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"AlreadyBlacklisted\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"BlacklistedToken\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"CurrentlyPaused\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InputAddressZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidNewPausedStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyPauser\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyUnpauser\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StrategyAlreadyExists\",\"inputs\":[]}]", - Bin: "0x60c060405234801561000f575f5ffd5b5060405161195e38038061195e83398101604081905261002e9161014e565b806001600160a01b038116610056576040516339b190bb60e11b815260040160405180910390fd5b6001600160a01b03908116608052821660a052610071610078565b5050610186565b603354610100900460ff16156100e45760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60335460ff90811614610135576033805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b038116811461014b575f5ffd5b50565b5f5f6040838503121561015f575f5ffd5b825161016a81610137565b602084015190925061017b81610137565b809150509250929050565b60805160a0516117866101d85f395f8181610142015281816105d501528181610869015281816109060152610c4701525f8181610215015281816102f0015281816106530152610b1401526117865ff3fe608060405234801561000f575f5ffd5b5060043610610111575f3560e01c8063886f11951161009e578063f0062d9a1161006e578063f0062d9a1461026e578063f2fde38b14610280578063fabc1cbc14610293578063fe38b32d146102a6578063fe575a87146102b9575f5ffd5b8063886f1195146102105780638da5cb5b14610237578063b768ebc914610248578063c350a1b51461025b575f5ffd5b8063595c6a67116100e4578063595c6a67146101a95780635ac86ab7146101b15780635c975abb146101e45780636b9b6229146101f5578063715018a614610208575f5ffd5b8063136439dd1461011557806323103c411461012a57806339b70e381461013d578063581dfd6514610181575b5f5ffd5b610128610123366004610e44565b6102db565b005b610128610138366004610ea3565b6103b0565b6101647f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020015b60405180910390f35b61016461018f366004610ef6565b60016020525f90815260409020546001600160a01b031681565b61012861063e565b6101d46101bf366004610f18565b609954600160ff9092169190911b9081161490565b6040519015158152602001610178565b609954604051908152602001610178565b610164610203366004610ef6565b6106ed565b6101286108d6565b6101647f000000000000000000000000000000000000000000000000000000000000000081565b6066546001600160a01b0316610164565b610128610256366004610ea3565b6108e7565b610128610269366004610f38565b61096e565b5f54610164906001600160a01b031681565b61012861028e366004610ef6565b610a99565b6101286102a1366004610e44565b610b12565b6101286102b4366004610ea3565b610c28565b6101d46102c7366004610ef6565b60026020525f908152604090205460ff1681565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa15801561033d573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103619190610f77565b61037e57604051631d77d47760e21b815260040160405180910390fd5b60995481811681146103a35760405163c61dca5d60e01b815260040160405180910390fd5b6103ac82610c7e565b5050565b6103b8610cbb565b5f8167ffffffffffffffff8111156103d2576103d2610f96565b6040519080825280602002602001820160405280156103fb578160200160208202803683370190505b5090505f805b838110156105b45760025f86868481811061041e5761041e610faa565b90506020020160208101906104339190610ef6565b6001600160a01b0316815260208101919091526040015f205460ff161561046d5760405163f53de75f60e01b815260040160405180910390fd5b600160025f87878581811061048457610484610faa565b90506020020160208101906104999190610ef6565b6001600160a01b0316815260208101919091526040015f20805460ff19169115159190911790557f75519c51f39873ec0e27dd3bbc09549e4865a113f505393fb9eab5898f6418b38585838181106104f3576104f3610faa565b90506020020160208101906105089190610ef6565b6040516001600160a01b03909116815260200160405180910390a15f60015f87878581811061053957610539610faa565b905060200201602081019061054e9190610ef6565b6001600160a01b03908116825260208201929092526040015f205416905080156105ab578084848151811061058557610585610faa565b6001600160a01b0390921660209283029190910190910152826105a781610fbe565b9350505b50600101610401565b508082528015610638576040516316bb16b760e31b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063b5d8b5b89061060a908590600401610fe2565b5f604051808303815f87803b158015610621575f5ffd5b505af1158015610633573d5f5f3e3d5ffd5b505050505b50505050565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa1580156106a0573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106c49190610f77565b6106e157604051631d77d47760e21b815260040160405180910390fd5b6106eb5f19610c7e565b565b6099545f9081906001908116036107175760405163840a48d560e01b815260040160405180910390fd5b6001600160a01b0383165f9081526002602052604090205460ff16156107505760405163091867bd60e11b815260040160405180910390fd5b6001600160a01b038381165f9081526001602052604090205416156107885760405163c45546f760e01b815260040160405180910390fd5b5f8054604080516001600160a01b0387811660248084019190915283518084039091018152604490920183526020820180516001600160e01b031663189acdbd60e31b17905291519190921691906107df90610e37565b6107ea92919061102d565b604051809103905ff080158015610803573d5f5f3e3d5ffd5b5090506108108482610d15565b6040805160018082528183019092525f916020808301908036833701905050905081815f8151811061084457610844610faa565b6001600160a01b039283166020918202929092010152604051632ef047f960e11b81527f000000000000000000000000000000000000000000000000000000000000000090911690635de08ff2906108a0908490600401610fe2565b5f604051808303815f87803b1580156108b7575f5ffd5b505af11580156108c9573d5f5f3e3d5ffd5b5093979650505050505050565b6108de610cbb565b6106eb5f610d7f565b6108ef610cbb565b604051632ef047f960e11b81526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690635de08ff29061093d9085908590600401611071565b5f604051808303815f87803b158015610954575f5ffd5b505af1158015610966573d5f5f3e3d5ffd5b505050505050565b603354610100900460ff161580801561098e5750603354600160ff909116105b806109a85750303b1580156109a8575060335460ff166001145b610a105760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b6033805460ff191660011790558015610a33576033805461ff0019166101001790555b610a3c84610d7f565b610a4583610c7e565b610a4e82610dd0565b8015610638576033805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a150505050565b610aa1610cbb565b6001600160a01b038116610b065760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610a07565b610b0f81610d7f565b50565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b6e573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b9291906110bd565b6001600160a01b0316336001600160a01b031614610bc35760405163794821ff60e01b815260040160405180910390fd5b60995480198219811614610bea5760405163c61dca5d60e01b815260040160405180910390fd5b609982905560405182815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c9060200160405180910390a25050565b610c30610cbb565b6040516316bb16b760e31b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063b5d8b5b89061093d9085908590600401611071565b609981905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a250565b6066546001600160a01b031633146106eb5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a07565b6001600160a01b038281165f8181526001602090815260409182902080546001600160a01b031916948616948517905581519283528201929092527f6852a55230ef089d785bce7ffbf757985de34026df90a87d7b4a6e56f95d251f910160405180910390a15050565b606680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b5f54604080516001600160a01b03928316815291831660208301527fe21755962a7d7e100b59b9c3e4d4b54085b146313719955efb6a7a25c5c7feee910160405180910390a15f80546001600160a01b0319166001600160a01b0392909216919091179055565b610678806110d983390190565b5f60208284031215610e54575f5ffd5b5035919050565b5f5f83601f840112610e6b575f5ffd5b50813567ffffffffffffffff811115610e82575f5ffd5b6020830191508360208260051b8501011115610e9c575f5ffd5b9250929050565b5f5f60208385031215610eb4575f5ffd5b823567ffffffffffffffff811115610eca575f5ffd5b610ed685828601610e5b565b90969095509350505050565b6001600160a01b0381168114610b0f575f5ffd5b5f60208284031215610f06575f5ffd5b8135610f1181610ee2565b9392505050565b5f60208284031215610f28575f5ffd5b813560ff81168114610f11575f5ffd5b5f5f5f60608486031215610f4a575f5ffd5b8335610f5581610ee2565b9250602084013591506040840135610f6c81610ee2565b809150509250925092565b5f60208284031215610f87575f5ffd5b81518015158114610f11575f5ffd5b634e487b7160e01b5f52604160045260245ffd5b634e487b7160e01b5f52603260045260245ffd5b5f60018201610fdb57634e487b7160e01b5f52601160045260245ffd5b5060010190565b602080825282518282018190525f918401906040840190835b818110156110225783516001600160a01b0316835260209384019390920191600101610ffb565b509095945050505050565b60018060a01b0383168152604060208201525f82518060408401528060208501606085015e5f606082850101526060601f19601f8301168401019150509392505050565b602080825281018290525f8360408301825b858110156110b357823561109681610ee2565b6001600160a01b0316825260209283019290910190600101611083565b5095945050505050565b5f602082840312156110cd575f5ffd5b8151610f1181610ee256fe6080604052604051610678380380610678833981016040819052610022916103ed565b61002d82825f610034565b5050610513565b61003d836100f1565b6040516001600160a01b038416907f1cf3b03a6cf19fa2baba4df148e9dcabedea7f8a5c07840e207e5c089be95d3e905f90a25f8251118061007c5750805b156100ec576100ea836001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156100c0573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906100e491906104af565b83610273565b505b505050565b6001600160a01b0381163b61015b5760405162461bcd60e51b815260206004820152602560248201527f455243313936373a206e657720626561636f6e206973206e6f74206120636f6e6044820152641d1c9858dd60da1b60648201526084015b60405180910390fd5b6101cd816001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561019a573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906101be91906104af565b6001600160a01b03163b151590565b6102325760405162461bcd60e51b815260206004820152603060248201527f455243313936373a20626561636f6e20696d706c656d656e746174696f6e206960448201526f1cc81b9bdd08184818dbdb9d1c9858dd60821b6064820152608401610152565b7fa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d5080546001600160a01b0319166001600160a01b0392909216919091179055565b606061029883836040518060600160405280602781526020016106516027913961029f565b9392505050565b60605f5f856001600160a01b0316856040516102bb91906104c8565b5f60405180830381855af49150503d805f81146102f3576040519150601f19603f3d011682016040523d82523d5f602084013e6102f8565b606091505b50909250905061030a86838387610314565b9695505050505050565b606083156103825782515f0361037b576001600160a01b0385163b61037b5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610152565b508161038c565b61038c8383610394565b949350505050565b8151156103a45781518083602001fd5b8060405162461bcd60e51b815260040161015291906104de565b80516001600160a01b03811681146103d4575f5ffd5b919050565b634e487b7160e01b5f52604160045260245ffd5b5f5f604083850312156103fe575f5ffd5b610407836103be565b60208401519092506001600160401b03811115610422575f5ffd5b8301601f81018513610432575f5ffd5b80516001600160401b0381111561044b5761044b6103d9565b604051601f8201601f19908116603f011681016001600160401b0381118282101715610479576104796103d9565b604052818152828201602001871015610490575f5ffd5b8160208401602083015e5f602083830101528093505050509250929050565b5f602082840312156104bf575f5ffd5b610298826103be565b5f82518060208501845e5f920191825250919050565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b610131806105205f395ff3fe608060405236601057600e6013565b005b600e5b601f601b6021565b60b3565b565b5f60527fa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50546001600160a01b031690565b6001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015608c573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019060ae919060d0565b905090565b365f5f375f5f365f845af43d5f5f3e80801560cc573d5ff35b3d5ffd5b5f6020828403121560df575f5ffd5b81516001600160a01b038116811460f4575f5ffd5b939250505056fea2646970667358221220b2cd81c8646f248580ef0bc50fea50b23b0ad9d543d91e6e625e3aba226c5b5264736f6c634300081b0033416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a26469706673582212201e30e1c7e25f9e71470ec33d1e4eb1694538e630b96f5c3ddfa78f24010d1bd164736f6c634300081b0033", + Bin: "0x60c060405234801561000f575f5ffd5b5060405161195e38038061195e83398101604081905261002e9161014e565b806001600160a01b038116610056576040516339b190bb60e11b815260040160405180910390fd5b6001600160a01b03908116608052821660a052610071610078565b5050610186565b603354610100900460ff16156100e45760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60335460ff90811614610135576033805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b038116811461014b575f5ffd5b50565b5f5f6040838503121561015f575f5ffd5b825161016a81610137565b602084015190925061017b81610137565b809150509250929050565b60805160a0516117866101d85f395f8181610142015281816105d501528181610869015281816109060152610c4701525f8181610215015281816102f0015281816106530152610b1401526117865ff3fe608060405234801561000f575f5ffd5b5060043610610111575f3560e01c8063886f11951161009e578063f0062d9a1161006e578063f0062d9a1461026e578063f2fde38b14610280578063fabc1cbc14610293578063fe38b32d146102a6578063fe575a87146102b9575f5ffd5b8063886f1195146102105780638da5cb5b14610237578063b768ebc914610248578063c350a1b51461025b575f5ffd5b8063595c6a67116100e4578063595c6a67146101a95780635ac86ab7146101b15780635c975abb146101e45780636b9b6229146101f5578063715018a614610208575f5ffd5b8063136439dd1461011557806323103c411461012a57806339b70e381461013d578063581dfd6514610181575b5f5ffd5b610128610123366004610e44565b6102db565b005b610128610138366004610ea3565b6103b0565b6101647f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020015b60405180910390f35b61016461018f366004610ef6565b60016020525f90815260409020546001600160a01b031681565b61012861063e565b6101d46101bf366004610f18565b609954600160ff9092169190911b9081161490565b6040519015158152602001610178565b609954604051908152602001610178565b610164610203366004610ef6565b6106ed565b6101286108d6565b6101647f000000000000000000000000000000000000000000000000000000000000000081565b6066546001600160a01b0316610164565b610128610256366004610ea3565b6108e7565b610128610269366004610f38565b61096e565b5f54610164906001600160a01b031681565b61012861028e366004610ef6565b610a99565b6101286102a1366004610e44565b610b12565b6101286102b4366004610ea3565b610c28565b6101d46102c7366004610ef6565b60026020525f908152604090205460ff1681565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa15801561033d573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103619190610f77565b61037e57604051631d77d47760e21b815260040160405180910390fd5b60995481811681146103a35760405163c61dca5d60e01b815260040160405180910390fd5b6103ac82610c7e565b5050565b6103b8610cbb565b5f8167ffffffffffffffff8111156103d2576103d2610f96565b6040519080825280602002602001820160405280156103fb578160200160208202803683370190505b5090505f805b838110156105b45760025f86868481811061041e5761041e610faa565b90506020020160208101906104339190610ef6565b6001600160a01b0316815260208101919091526040015f205460ff161561046d5760405163f53de75f60e01b815260040160405180910390fd5b600160025f87878581811061048457610484610faa565b90506020020160208101906104999190610ef6565b6001600160a01b0316815260208101919091526040015f20805460ff19169115159190911790557f75519c51f39873ec0e27dd3bbc09549e4865a113f505393fb9eab5898f6418b38585838181106104f3576104f3610faa565b90506020020160208101906105089190610ef6565b6040516001600160a01b03909116815260200160405180910390a15f60015f87878581811061053957610539610faa565b905060200201602081019061054e9190610ef6565b6001600160a01b03908116825260208201929092526040015f205416905080156105ab578084848151811061058557610585610faa565b6001600160a01b0390921660209283029190910190910152826105a781610fbe565b9350505b50600101610401565b508082528015610638576040516316bb16b760e31b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063b5d8b5b89061060a908590600401610fe2565b5f604051808303815f87803b158015610621575f5ffd5b505af1158015610633573d5f5f3e3d5ffd5b505050505b50505050565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa1580156106a0573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106c49190610f77565b6106e157604051631d77d47760e21b815260040160405180910390fd5b6106eb5f19610c7e565b565b6099545f9081906001908116036107175760405163840a48d560e01b815260040160405180910390fd5b6001600160a01b0383165f9081526002602052604090205460ff16156107505760405163091867bd60e11b815260040160405180910390fd5b6001600160a01b038381165f9081526001602052604090205416156107885760405163c45546f760e01b815260040160405180910390fd5b5f8054604080516001600160a01b0387811660248084019190915283518084039091018152604490920183526020820180516001600160e01b031663189acdbd60e31b17905291519190921691906107df90610e37565b6107ea92919061102d565b604051809103905ff080158015610803573d5f5f3e3d5ffd5b5090506108108482610d15565b6040805160018082528183019092525f916020808301908036833701905050905081815f8151811061084457610844610faa565b6001600160a01b039283166020918202929092010152604051632ef047f960e11b81527f000000000000000000000000000000000000000000000000000000000000000090911690635de08ff2906108a0908490600401610fe2565b5f604051808303815f87803b1580156108b7575f5ffd5b505af11580156108c9573d5f5f3e3d5ffd5b5093979650505050505050565b6108de610cbb565b6106eb5f610d7f565b6108ef610cbb565b604051632ef047f960e11b81526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690635de08ff29061093d9085908590600401611071565b5f604051808303815f87803b158015610954575f5ffd5b505af1158015610966573d5f5f3e3d5ffd5b505050505050565b603354610100900460ff161580801561098e5750603354600160ff909116105b806109a85750303b1580156109a8575060335460ff166001145b610a105760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b6033805460ff191660011790558015610a33576033805461ff0019166101001790555b610a3c84610d7f565b610a4583610c7e565b610a4e82610dd0565b8015610638576033805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a150505050565b610aa1610cbb565b6001600160a01b038116610b065760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610a07565b610b0f81610d7f565b50565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b6e573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b9291906110bd565b6001600160a01b0316336001600160a01b031614610bc35760405163794821ff60e01b815260040160405180910390fd5b60995480198219811614610bea5760405163c61dca5d60e01b815260040160405180910390fd5b609982905560405182815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c9060200160405180910390a25050565b610c30610cbb565b6040516316bb16b760e31b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063b5d8b5b89061093d9085908590600401611071565b609981905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a250565b6066546001600160a01b031633146106eb5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a07565b6001600160a01b038281165f8181526001602090815260409182902080546001600160a01b031916948616948517905581519283528201929092527f6852a55230ef089d785bce7ffbf757985de34026df90a87d7b4a6e56f95d251f910160405180910390a15050565b606680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b5f54604080516001600160a01b03928316815291831660208301527fe21755962a7d7e100b59b9c3e4d4b54085b146313719955efb6a7a25c5c7feee910160405180910390a15f80546001600160a01b0319166001600160a01b0392909216919091179055565b610678806110d983390190565b5f60208284031215610e54575f5ffd5b5035919050565b5f5f83601f840112610e6b575f5ffd5b50813567ffffffffffffffff811115610e82575f5ffd5b6020830191508360208260051b8501011115610e9c575f5ffd5b9250929050565b5f5f60208385031215610eb4575f5ffd5b823567ffffffffffffffff811115610eca575f5ffd5b610ed685828601610e5b565b90969095509350505050565b6001600160a01b0381168114610b0f575f5ffd5b5f60208284031215610f06575f5ffd5b8135610f1181610ee2565b9392505050565b5f60208284031215610f28575f5ffd5b813560ff81168114610f11575f5ffd5b5f5f5f60608486031215610f4a575f5ffd5b8335610f5581610ee2565b9250602084013591506040840135610f6c81610ee2565b809150509250925092565b5f60208284031215610f87575f5ffd5b81518015158114610f11575f5ffd5b634e487b7160e01b5f52604160045260245ffd5b634e487b7160e01b5f52603260045260245ffd5b5f60018201610fdb57634e487b7160e01b5f52601160045260245ffd5b5060010190565b602080825282518282018190525f918401906040840190835b818110156110225783516001600160a01b0316835260209384019390920191600101610ffb565b509095945050505050565b60018060a01b0383168152604060208201525f82518060408401528060208501606085015e5f606082850101526060601f19601f8301168401019150509392505050565b602080825281018290525f8360408301825b858110156110b357823561109681610ee2565b6001600160a01b0316825260209283019290910190600101611083565b5095945050505050565b5f602082840312156110cd575f5ffd5b8151610f1181610ee256fe6080604052604051610678380380610678833981016040819052610022916103ed565b61002d82825f610034565b5050610513565b61003d836100f1565b6040516001600160a01b038416907f1cf3b03a6cf19fa2baba4df148e9dcabedea7f8a5c07840e207e5c089be95d3e905f90a25f8251118061007c5750805b156100ec576100ea836001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156100c0573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906100e491906104af565b83610273565b505b505050565b6001600160a01b0381163b61015b5760405162461bcd60e51b815260206004820152602560248201527f455243313936373a206e657720626561636f6e206973206e6f74206120636f6e6044820152641d1c9858dd60da1b60648201526084015b60405180910390fd5b6101cd816001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561019a573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906101be91906104af565b6001600160a01b03163b151590565b6102325760405162461bcd60e51b815260206004820152603060248201527f455243313936373a20626561636f6e20696d706c656d656e746174696f6e206960448201526f1cc81b9bdd08184818dbdb9d1c9858dd60821b6064820152608401610152565b7fa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d5080546001600160a01b0319166001600160a01b0392909216919091179055565b606061029883836040518060600160405280602781526020016106516027913961029f565b9392505050565b60605f5f856001600160a01b0316856040516102bb91906104c8565b5f60405180830381855af49150503d805f81146102f3576040519150601f19603f3d011682016040523d82523d5f602084013e6102f8565b606091505b50909250905061030a86838387610314565b9695505050505050565b606083156103825782515f0361037b576001600160a01b0385163b61037b5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610152565b508161038c565b61038c8383610394565b949350505050565b8151156103a45781518083602001fd5b8060405162461bcd60e51b815260040161015291906104de565b80516001600160a01b03811681146103d4575f5ffd5b919050565b634e487b7160e01b5f52604160045260245ffd5b5f5f604083850312156103fe575f5ffd5b610407836103be565b60208401519092506001600160401b03811115610422575f5ffd5b8301601f81018513610432575f5ffd5b80516001600160401b0381111561044b5761044b6103d9565b604051601f8201601f19908116603f011681016001600160401b0381118282101715610479576104796103d9565b604052818152828201602001871015610490575f5ffd5b8160208401602083015e5f602083830101528093505050509250929050565b5f602082840312156104bf575f5ffd5b610298826103be565b5f82518060208501845e5f920191825250919050565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b610131806105205f395ff3fe608060405236601057600e6013565b005b600e5b601f601b6021565b60b3565b565b5f60527fa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50546001600160a01b031690565b6001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015608c573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019060ae919060d0565b905090565b365f5f375f5f365f845af43d5f5f3e80801560cc573d5ff35b3d5ffd5b5f6020828403121560df575f5ffd5b81516001600160a01b038116811460f4575f5ffd5b939250505056fea2646970667358221220f37d2ffd80ec7d14cc9a0f17394e9d97446c1f630de382043b1ed4ccacf6a7d464736f6c634300081b0033416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220635a3ef1d0e9ee7ff1dc580d781a4dfc61462301a90e38109e3a496baf9773e764736f6c634300081b0033", } // StrategyFactoryABI 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 6465263cee..829f49d70b 100644 --- a/pkg/bindings/StrategyManager/binding.go +++ b/pkg/bindings/StrategyManager/binding.go @@ -32,7 +32,7 @@ var ( // StrategyManagerMetaData contains all meta data concerning the StrategyManager contract. var StrategyManagerMetaData = &bind.MetaData{ ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"_delegation\",\"type\":\"address\",\"internalType\":\"contractIDelegationManager\"},{\"name\":\"_pauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"DEFAULT_BURN_ADDRESS\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"DEPOSIT_TYPEHASH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"addShares\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"shares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"addStrategiesToDepositWhitelist\",\"inputs\":[{\"name\":\"strategiesToWhitelist\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"burnShares\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"burnableShares\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"calculateStrategyDepositDigestHash\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"nonce\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"delegation\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIDelegationManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"depositIntoStrategy\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"depositShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"depositIntoStrategyWithSignature\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"depositShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"domainSeparator\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getDeposits\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getStakerStrategyList\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"increaseBurnableShares\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"addedSharesToBurn\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"initialOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"initialStrategyWhitelister\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"initialPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"nonces\",\"inputs\":[{\"name\":\"signer\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"nonce\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"pauseAll\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[{\"name\":\"index\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pauserRegistry\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"removeDepositShares\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"depositSharesToRemove\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"removeStrategiesFromDepositWhitelist\",\"inputs\":[{\"name\":\"strategiesToRemoveFromWhitelist\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setStrategyWhitelister\",\"inputs\":[{\"name\":\"newStrategyWhitelister\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"stakerDepositShares\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"shares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"stakerStrategyList\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"strategies\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"stakerStrategyListLength\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"strategyIsWhitelistedForDeposit\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"whitelisted\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"strategyWhitelister\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"withdrawSharesAsTokens\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"shares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"BurnableSharesDecreased\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"shares\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BurnableSharesIncreased\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"shares\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Deposit\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"shares\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StrategyAddedToDepositWhitelist\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StrategyRemovedFromDepositWhitelist\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StrategyWhitelisterChanged\",\"inputs\":[{\"name\":\"previousAddress\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"newAddress\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"CurrentlyPaused\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InputAddressZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidNewPausedStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidSignature\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"MaxStrategiesExceeded\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyDelegationManager\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyPauser\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyStrategyWhitelister\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyUnpauser\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SharesAmountTooHigh\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SharesAmountZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SignatureExpired\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StakerAddressZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StrategyNotFound\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StrategyNotWhitelisted\",\"inputs\":[]}]", - Bin: "0x610100604052348015610010575f5ffd5b5060405161285338038061285383398101604081905261002f916101ed565b81816001600160a01b038116610058576040516339b190bb60e11b815260040160405180910390fd5b6001600160a01b039081166080521660a0524660c052610108604080518082018252600a81526922b4b3b2b72630bcb2b960b11b60209182015281517f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a866818301527f71b625cfad44bac63b13dba07f2e1d6084ee04b6f8752101ece6126d584ee6ea81840152466060820152306080808301919091528351808303909101815260a0909101909252815191012090565b60e05261011361011a565b5050610225565b5f54610100900460ff16156101855760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff908116146101d4575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b03811681146101ea575f5ffd5b50565b5f5f604083850312156101fe575f5ffd5b8251610209816101d6565b602084015190925061021a816101d6565b809150509250929050565b60805160a05160c05160e0516125c36102905f395f6112ce01525f61120e01525f81816104c501528181610762015281816109e001528181610c3f0152818161109301526116b101525f818161039a0152818161057101528181610a4a01526112f201526125c35ff3fe608060405234801561000f575f5ffd5b50600436106101fd575f3560e01c80638b8aac3c11610114578063de44acb6116100a9578063f2fde38b11610079578063f2fde38b146104fa578063f3b4a0001461050d578063f698da2514610517578063fabc1cbc1461051f578063fe243a1714610532575f5ffd5b8063de44acb61461048d578063debe1eab146104ad578063df5cf723146104c0578063e7a050aa146104e7575f5ffd5b80639ac01d61116100e45780639ac01d6114610441578063b5d8b5b814610454578063c665670214610467578063cbc2bd621461047a575f5ffd5b80638b8aac3c146103d45780638da5cb5b146103fc57806394f649dd1461040d578063967fc0d21461042e575f5ffd5b8063595c6a6711610195578063663c1de411610165578063663c1de414610339578063715018a61461035b578063724af423146103635780637ecebe0014610376578063886f119514610395575f5ffd5b8063595c6a67146102e35780635ac86ab7146102eb5780635c975abb1461031e5780635de08ff214610326575f5ffd5b806332e89ace116101d057806332e89ace1461026e57806348825e94146102815780634b6d5d6e146102a857806350ff7225146102bb575f5ffd5b8063136439dd146102015780631794bb3c146102165780631b3cbdc1146102295780632eae418c1461025b575b5f5ffd5b61021461020f36600461204d565b61055c565b005b610214610224366004612078565b610631565b6102486102373660046120b6565b60d46020525f908152604090205481565b6040519081526020015b60405180910390f35b6102146102693660046120d1565b610757565b61024861027c366004612133565b610803565b6102487f4337f82d142e41f2a8c10547cd8c859bddb92262a61058e77842e24d9dea922481565b6102146102b63660046120b6565b6108a7565b6102ce6102c9366004612078565b6109d3565b60408051928352602083019190915201610252565b610214610a35565b61030e6102f936600461222e565b609854600160ff9092169190911b9081161490565b6040519015158152602001610252565b609854610248565b61021461033436600461224e565b610ae4565b61030e6103473660046120b6565b60d16020525f908152604090205460ff1681565b610214610c23565b610214610371366004612078565b610c34565b6102486103843660046120b6565b60ca6020525f908152604090205481565b6103bc7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610252565b6102486103e23660046120b6565b6001600160a01b03165f90815260ce602052604090205490565b6033546001600160a01b03166103bc565b61042061041b3660046120b6565b610c88565b604051610252929190612302565b60cb546103bc906001600160a01b031681565b61024861044f36600461235a565b610e00565b61021461046236600461224e565b610e91565b6102146104753660046120b6565b610fd0565b6103bc6104883660046123bb565b610fe1565b6104a061049b3660046120b6565b611015565b60405161025291906123e5565b6102146104bb3660046123bb565b611088565b6103bc7f000000000000000000000000000000000000000000000000000000000000000081565b6102486104f5366004612078565b611143565b6102146105083660046120b6565b611195565b6103bc620e16e481565b61024861120b565b61021461052d36600461204d565b6112f0565b6102486105403660046123f7565b60cd60209081525f928352604080842090915290825290205481565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa1580156105be573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105e2919061242e565b6105ff57604051631d77d47760e21b815260040160405180910390fd5b60985481811681146106245760405163c61dca5d60e01b815260040160405180910390fd5b61062d82611406565b5050565b5f54610100900460ff161580801561064f57505f54600160ff909116105b806106685750303b15801561066857505f5460ff166001145b6106d05760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b5f805460ff1916600117905580156106f1575f805461ff0019166101001790555b6106fa82611406565b61070384611443565b61070c83611494565b8015610751575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146107a05760405163f739589b60e01b815260040160405180910390fd5b604051636ce5768960e11b81526001600160a01b0384169063d9caed12906107d09087908690869060040161244d565b5f604051808303815f87803b1580156107e7575f5ffd5b505af11580156107f9573d5f5f3e3d5ffd5b5050505050505050565b6098545f90819060019081160361082d5760405163840a48d560e01b815260040160405180910390fd5b6108356114fd565b6001600160a01b0385165f90815260ca60205260409020546108668661085f818c8c8c878c610e00565b8688611556565b6001600160a01b0386165f90815260ca6020526040902060018201905561088f868a8a8a6115a8565b92505061089c6001606555565b509695505050505050565b6108af6114fd565b6001600160a01b0381165f81815260d4602090815260408083208054939055805193845290830182905290917fd9d082c3ec4f3a3ffa55c324939a06407f5fbcb87d5e0ce3b9508c92c84ed839910160405180910390a1816001600160a01b031663d9caed12620e16e4846001600160a01b0316632495a5996040518163ffffffff1660e01b8152600401602060405180830381865afa158015610955573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109799190612471565b846040518463ffffffff1660e01b81526004016109989392919061244d565b5f604051808303815f87803b1580156109af575f5ffd5b505af11580156109c1573d5f5f3e3d5ffd5b50505050506109d06001606555565b50565b5f80336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610a1e5760405163f739589b60e01b815260040160405180910390fd5b610a29858585611715565b91509150935093915050565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa158015610a97573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610abb919061242e565b610ad857604051631d77d47760e21b815260040160405180910390fd5b610ae25f19611406565b565b60cb546001600160a01b03163314610b0f576040516320ba3ff960e21b815260040160405180910390fd5b805f5b818110156107515760d15f858584818110610b2f57610b2f61248c565b9050602002016020810190610b4491906120b6565b6001600160a01b0316815260208101919091526040015f205460ff16610c1b57600160d15f868685818110610b7b57610b7b61248c565b9050602002016020810190610b9091906120b6565b6001600160a01b0316815260208101919091526040015f20805460ff19169115159190911790557f0c35b17d91c96eb2751cd456e1252f42a386e524ef9ff26ecc9950859fdc04fe848483818110610bea57610bea61248c565b9050602002016020810190610bff91906120b6565b6040516001600160a01b03909116815260200160405180910390a15b600101610b12565b610c2b61187d565b610ae25f611443565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610c7d5760405163f739589b60e01b815260040160405180910390fd5b6107518383836118d7565b6001600160a01b0381165f90815260ce60205260408120546060918291908167ffffffffffffffff811115610cbf57610cbf61211f565b604051908082528060200260200182016040528015610ce8578160200160208202803683370190505b5090505f5b82811015610d76576001600160a01b0386165f90815260cd6020908152604080832060ce9092528220805491929184908110610d2b57610d2b61248c565b5f9182526020808320909101546001600160a01b031683528201929092526040019020548251839083908110610d6357610d6361248c565b6020908102919091010152600101610ced565b5060ce5f866001600160a01b03166001600160a01b031681526020019081526020015f208181805480602002602001604051908101604052809291908181526020018280548015610dee57602002820191905f5260205f20905b81546001600160a01b03168152600190910190602001808311610dd0575b50505050509150935093505050915091565b604080517f4337f82d142e41f2a8c10547cd8c859bddb92262a61058e77842e24d9dea922460208201526001600160a01b03808916928201929092528187166060820152908516608082015260a0810184905260c0810183905260e081018290525f90610e8690610100016040516020818303038152906040528051906020012061199b565b979650505050505050565b60cb546001600160a01b03163314610ebc576040516320ba3ff960e21b815260040160405180910390fd5b805f5b818110156107515760d15f858584818110610edc57610edc61248c565b9050602002016020810190610ef191906120b6565b6001600160a01b0316815260208101919091526040015f205460ff1615610fc8575f60d15f868685818110610f2857610f2861248c565b9050602002016020810190610f3d91906120b6565b6001600160a01b0316815260208101919091526040015f20805460ff19169115159190911790557f4074413b4b443e4e58019f2855a8765113358c7c72e39509c6af45fc0f5ba030848483818110610f9757610f9761248c565b9050602002016020810190610fac91906120b6565b6040516001600160a01b03909116815260200160405180910390a15b600101610ebf565b610fd861187d565b6109d081611494565b60ce602052815f5260405f208181548110610ffa575f80fd5b5f918252602090912001546001600160a01b03169150829050565b6001600160a01b0381165f90815260ce602090815260409182902080548351818402810184019094528084526060939283018282801561107c57602002820191905f5260205f20905b81546001600160a01b0316815260019091019060200180831161105e575b50505050509050919050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146110d15760405163f739589b60e01b815260040160405180910390fd5b6001600160a01b0382165f90815260d46020526040812080548392906110f89084906124b4565b9091555050604080516001600160a01b0384168152602081018390527fca3e02a4ab7ad3c47a8e36e5a624c30170791726ab720f1babfef21046d953ff910160405180910390a15050565b6098545f90819060019081160361116d5760405163840a48d560e01b815260040160405180910390fd5b6111756114fd565b611181338686866115a8565b915061118d6001606555565b509392505050565b61119d61187d565b6001600160a01b0381166112025760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016106c7565b6109d081611443565b5f7f000000000000000000000000000000000000000000000000000000000000000046146112cb5750604080518082018252600a81526922b4b3b2b72630bcb2b960b11b60209182015281517f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a866818301527f71b625cfad44bac63b13dba07f2e1d6084ee04b6f8752101ece6126d584ee6ea81840152466060820152306080808301919091528351808303909101815260a0909101909252815191012090565b507f000000000000000000000000000000000000000000000000000000000000000090565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561134c573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113709190612471565b6001600160a01b0316336001600160a01b0316146113a15760405163794821ff60e01b815260040160405180910390fd5b609854801982198116146113c85760405163c61dca5d60e01b815260040160405180910390fd5b609882905560405182815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c9060200160405180910390a25050565b609881905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a250565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b60cb54604080516001600160a01b03928316815291831660208301527f4264275e593955ff9d6146a51a4525f6ddace2e81db9391abcc9d1ca48047d29910160405180910390a160cb80546001600160a01b0319166001600160a01b0392909216919091179055565b60026065540361154f5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016106c7565b6002606555565b4281101561157757604051630819bdcd60e01b815260040160405180910390fd5b61158b6001600160a01b03851684846119e1565b61075157604051638baa579f60e01b815260040160405180910390fd5b6001600160a01b0383165f90815260d16020526040812054849060ff166115e257604051632efd965160e11b815260040160405180910390fd5b6115f76001600160a01b038516338786611a3f565b6040516311f9fbc960e21b81526001600160a01b038581166004830152602482018590528616906347e7ef24906044016020604051808303815f875af1158015611643573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061166791906124cd565b91505f5f611676888886611715565b604051631e328e7960e11b81526001600160a01b038b811660048301528a8116602483015260448201849052606482018390529294509092507f000000000000000000000000000000000000000000000000000000000000000090911690633c651cf2906084015f604051808303815f87803b1580156116f4575f5ffd5b505af1158015611706573d5f5f3e3d5ffd5b50505050505050949350505050565b5f806001600160a01b03851661173e576040516316f2ccc960e01b815260040160405180910390fd5b825f0361175e576040516342061b2560e11b815260040160405180910390fd5b6001600160a01b038086165f90815260cd6020908152604080832093881683529290529081205490819003611804576001600160a01b0386165f90815260ce6020908152604090912054106117c6576040516301a1443960e31b815260040160405180910390fd5b6001600160a01b038681165f90815260ce602090815260408220805460018101825590835291200180546001600160a01b0319169187169190911790555b61180e84826124b4565b6001600160a01b038088165f90815260cd60209081526040808320938a16835292905281902091909155517f5548c837ab068cf56a2c2479df0882a4922fd203edb7517321831d95078c5f629061186a9088908890889061244d565b60405180910390a1959294509192505050565b6033546001600160a01b03163314610ae25760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016106c7565b5f815f036118f8576040516342061b2560e11b815260040160405180910390fd5b6001600160a01b038085165f90815260cd60209081526040808320938716835292905220548083111561193e57604051634b18b19360e01b815260040160405180910390fd5b61194883826124e4565b6001600160a01b038087165f90815260cd60209081526040808320938916835292905290812082905590915081900361198f576119858585611a97565b6001915050611994565b5f9150505b9392505050565b5f6119a461120b565b60405161190160f01b6020820152602281019190915260428101839052606201604051602081830303815290604052805190602001209050919050565b5f5f5f6119ee8585611c15565b90925090505f816004811115611a0657611a066124f7565b148015611a245750856001600160a01b0316826001600160a01b0316145b80611a355750611a35868686611c57565b9695505050505050565b610751846323b872dd60e01b858585604051602401611a609392919061244d565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152611d3e565b6001600160a01b0382165f90815260ce6020526040812054905b81811015611ba9576001600160a01b038481165f90815260ce6020526040902080549185169183908110611ae757611ae761248c565b5f918252602090912001546001600160a01b031603611ba1576001600160a01b0384165f90815260ce602052604090208054611b25906001906124e4565b81548110611b3557611b3561248c565b5f9182526020808320909101546001600160a01b03878116845260ce9092526040909220805491909216919083908110611b7157611b7161248c565b905f5260205f20015f6101000a8154816001600160a01b0302191690836001600160a01b03160217905550611ba9565b600101611ab1565b818103611bc957604051632df15a4160e11b815260040160405180910390fd5b6001600160a01b0384165f90815260ce60205260409020805480611bef57611bef61250b565b5f8281526020902081015f1990810180546001600160a01b031916905501905550505050565b5f5f8251604103611c49576020830151604084015160608501515f1a611c3d87828585611e16565b94509450505050611c50565b505f905060025b9250929050565b5f5f5f856001600160a01b0316631626ba7e60e01b8686604051602401611c7f92919061254d565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b0319909416939093179092529051611cbd9190612565565b5f60405180830381855afa9150503d805f8114611cf5576040519150601f19603f3d011682016040523d82523d5f602084013e611cfa565b606091505b5091509150818015611d0e57506020815110155b8015611a3557508051630b135d3f60e11b90611d3390830160209081019084016124cd565b149695505050505050565b5f611d92826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316611ed39092919063ffffffff16565b905080515f1480611db2575080806020019051810190611db2919061242e565b611e115760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016106c7565b505050565b5f807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0831115611e4b57505f90506003611eca565b604080515f8082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015611e9c573d5f5f3e3d5ffd5b5050604051601f1901519150506001600160a01b038116611ec4575f60019250925050611eca565b91505f90505b94509492505050565b6060611ee184845f85611ee9565b949350505050565b606082471015611f4a5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b60648201526084016106c7565b5f5f866001600160a01b03168587604051611f659190612565565b5f6040518083038185875af1925050503d805f8114611f9f576040519150601f19603f3d011682016040523d82523d5f602084013e611fa4565b606091505b5091509150610e86878383876060831561201e5782515f03612017576001600160a01b0385163b6120175760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016106c7565b5081611ee1565b611ee183838151156120335781518083602001fd5b8060405162461bcd60e51b81526004016106c7919061257b565b5f6020828403121561205d575f5ffd5b5035919050565b6001600160a01b03811681146109d0575f5ffd5b5f5f5f6060848603121561208a575f5ffd5b833561209581612064565b925060208401356120a581612064565b929592945050506040919091013590565b5f602082840312156120c6575f5ffd5b813561199481612064565b5f5f5f5f608085870312156120e4575f5ffd5b84356120ef81612064565b935060208501356120ff81612064565b9250604085013561210f81612064565b9396929550929360600135925050565b634e487b7160e01b5f52604160045260245ffd5b5f5f5f5f5f5f60c08789031215612148575f5ffd5b863561215381612064565b9550602087013561216381612064565b945060408701359350606087013561217a81612064565b92506080870135915060a087013567ffffffffffffffff81111561219c575f5ffd5b8701601f810189136121ac575f5ffd5b803567ffffffffffffffff8111156121c6576121c661211f565b604051601f8201601f19908116603f0116810167ffffffffffffffff811182821017156121f5576121f561211f565b6040528181528282016020018b101561220c575f5ffd5b816020840160208301375f602083830101528093505050509295509295509295565b5f6020828403121561223e575f5ffd5b813560ff81168114611994575f5ffd5b5f5f6020838503121561225f575f5ffd5b823567ffffffffffffffff811115612275575f5ffd5b8301601f81018513612285575f5ffd5b803567ffffffffffffffff81111561229b575f5ffd5b8560208260051b84010111156122af575f5ffd5b6020919091019590945092505050565b5f8151808452602084019350602083015f5b828110156122f85781516001600160a01b03168652602095860195909101906001016122d1565b5093949350505050565b604081525f61231460408301856122bf565b82810360208401528084518083526020830191506020860192505f5b8181101561234e578351835260209384019390920191600101612330565b50909695505050505050565b5f5f5f5f5f5f60c0878903121561236f575f5ffd5b863561237a81612064565b9550602087013561238a81612064565b9450604087013561239a81612064565b959894975094956060810135955060808101359460a0909101359350915050565b5f5f604083850312156123cc575f5ffd5b82356123d781612064565b946020939093013593505050565b602081525f61199460208301846122bf565b5f5f60408385031215612408575f5ffd5b823561241381612064565b9150602083013561242381612064565b809150509250929050565b5f6020828403121561243e575f5ffd5b81518015158114611994575f5ffd5b6001600160a01b039384168152919092166020820152604081019190915260600190565b5f60208284031215612481575f5ffd5b815161199481612064565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b808201808211156124c7576124c76124a0565b92915050565b5f602082840312156124dd575f5ffd5b5051919050565b818103818111156124c7576124c76124a0565b634e487b7160e01b5f52602160045260245ffd5b634e487b7160e01b5f52603160045260245ffd5b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b828152604060208201525f611ee1604083018461251f565b5f82518060208501845e5f920191825250919050565b602081525f611994602083018461251f56fea2646970667358221220c3ca26b6e79744d7bfa4ad414d769be211c62e44eabfb7c1ce9505e5c417db0d64736f6c634300081b0033", + Bin: "0x610100604052348015610010575f5ffd5b5060405161285338038061285383398101604081905261002f916101ed565b81816001600160a01b038116610058576040516339b190bb60e11b815260040160405180910390fd5b6001600160a01b039081166080521660a0524660c052610108604080518082018252600a81526922b4b3b2b72630bcb2b960b11b60209182015281517f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a866818301527f71b625cfad44bac63b13dba07f2e1d6084ee04b6f8752101ece6126d584ee6ea81840152466060820152306080808301919091528351808303909101815260a0909101909252815191012090565b60e05261011361011a565b5050610225565b5f54610100900460ff16156101855760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff908116146101d4575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b03811681146101ea575f5ffd5b50565b5f5f604083850312156101fe575f5ffd5b8251610209816101d6565b602084015190925061021a816101d6565b809150509250929050565b60805160a05160c05160e0516125c36102905f395f6112ce01525f61120e01525f81816104c501528181610762015281816109e001528181610c3f0152818161109301526116b101525f818161039a0152818161057101528181610a4a01526112f201526125c35ff3fe608060405234801561000f575f5ffd5b50600436106101fd575f3560e01c80638b8aac3c11610114578063de44acb6116100a9578063f2fde38b11610079578063f2fde38b146104fa578063f3b4a0001461050d578063f698da2514610517578063fabc1cbc1461051f578063fe243a1714610532575f5ffd5b8063de44acb61461048d578063debe1eab146104ad578063df5cf723146104c0578063e7a050aa146104e7575f5ffd5b80639ac01d61116100e45780639ac01d6114610441578063b5d8b5b814610454578063c665670214610467578063cbc2bd621461047a575f5ffd5b80638b8aac3c146103d45780638da5cb5b146103fc57806394f649dd1461040d578063967fc0d21461042e575f5ffd5b8063595c6a6711610195578063663c1de411610165578063663c1de414610339578063715018a61461035b578063724af423146103635780637ecebe0014610376578063886f119514610395575f5ffd5b8063595c6a67146102e35780635ac86ab7146102eb5780635c975abb1461031e5780635de08ff214610326575f5ffd5b806332e89ace116101d057806332e89ace1461026e57806348825e94146102815780634b6d5d6e146102a857806350ff7225146102bb575f5ffd5b8063136439dd146102015780631794bb3c146102165780631b3cbdc1146102295780632eae418c1461025b575b5f5ffd5b61021461020f36600461204d565b61055c565b005b610214610224366004612078565b610631565b6102486102373660046120b6565b60d46020525f908152604090205481565b6040519081526020015b60405180910390f35b6102146102693660046120d1565b610757565b61024861027c366004612133565b610803565b6102487f4337f82d142e41f2a8c10547cd8c859bddb92262a61058e77842e24d9dea922481565b6102146102b63660046120b6565b6108a7565b6102ce6102c9366004612078565b6109d3565b60408051928352602083019190915201610252565b610214610a35565b61030e6102f936600461222e565b609854600160ff9092169190911b9081161490565b6040519015158152602001610252565b609854610248565b61021461033436600461224e565b610ae4565b61030e6103473660046120b6565b60d16020525f908152604090205460ff1681565b610214610c23565b610214610371366004612078565b610c34565b6102486103843660046120b6565b60ca6020525f908152604090205481565b6103bc7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610252565b6102486103e23660046120b6565b6001600160a01b03165f90815260ce602052604090205490565b6033546001600160a01b03166103bc565b61042061041b3660046120b6565b610c88565b604051610252929190612302565b60cb546103bc906001600160a01b031681565b61024861044f36600461235a565b610e00565b61021461046236600461224e565b610e91565b6102146104753660046120b6565b610fd0565b6103bc6104883660046123bb565b610fe1565b6104a061049b3660046120b6565b611015565b60405161025291906123e5565b6102146104bb3660046123bb565b611088565b6103bc7f000000000000000000000000000000000000000000000000000000000000000081565b6102486104f5366004612078565b611143565b6102146105083660046120b6565b611195565b6103bc620e16e481565b61024861120b565b61021461052d36600461204d565b6112f0565b6102486105403660046123f7565b60cd60209081525f928352604080842090915290825290205481565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa1580156105be573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105e2919061242e565b6105ff57604051631d77d47760e21b815260040160405180910390fd5b60985481811681146106245760405163c61dca5d60e01b815260040160405180910390fd5b61062d82611406565b5050565b5f54610100900460ff161580801561064f57505f54600160ff909116105b806106685750303b15801561066857505f5460ff166001145b6106d05760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b5f805460ff1916600117905580156106f1575f805461ff0019166101001790555b6106fa82611406565b61070384611443565b61070c83611494565b8015610751575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146107a05760405163f739589b60e01b815260040160405180910390fd5b604051636ce5768960e11b81526001600160a01b0384169063d9caed12906107d09087908690869060040161244d565b5f604051808303815f87803b1580156107e7575f5ffd5b505af11580156107f9573d5f5f3e3d5ffd5b5050505050505050565b6098545f90819060019081160361082d5760405163840a48d560e01b815260040160405180910390fd5b6108356114fd565b6001600160a01b0385165f90815260ca60205260409020546108668661085f818c8c8c878c610e00565b8688611556565b6001600160a01b0386165f90815260ca6020526040902060018201905561088f868a8a8a6115a8565b92505061089c6001606555565b509695505050505050565b6108af6114fd565b6001600160a01b0381165f81815260d4602090815260408083208054939055805193845290830182905290917fd9d082c3ec4f3a3ffa55c324939a06407f5fbcb87d5e0ce3b9508c92c84ed839910160405180910390a1816001600160a01b031663d9caed12620e16e4846001600160a01b0316632495a5996040518163ffffffff1660e01b8152600401602060405180830381865afa158015610955573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109799190612471565b846040518463ffffffff1660e01b81526004016109989392919061244d565b5f604051808303815f87803b1580156109af575f5ffd5b505af11580156109c1573d5f5f3e3d5ffd5b50505050506109d06001606555565b50565b5f80336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610a1e5760405163f739589b60e01b815260040160405180910390fd5b610a29858585611715565b91509150935093915050565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa158015610a97573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610abb919061242e565b610ad857604051631d77d47760e21b815260040160405180910390fd5b610ae25f19611406565b565b60cb546001600160a01b03163314610b0f576040516320ba3ff960e21b815260040160405180910390fd5b805f5b818110156107515760d15f858584818110610b2f57610b2f61248c565b9050602002016020810190610b4491906120b6565b6001600160a01b0316815260208101919091526040015f205460ff16610c1b57600160d15f868685818110610b7b57610b7b61248c565b9050602002016020810190610b9091906120b6565b6001600160a01b0316815260208101919091526040015f20805460ff19169115159190911790557f0c35b17d91c96eb2751cd456e1252f42a386e524ef9ff26ecc9950859fdc04fe848483818110610bea57610bea61248c565b9050602002016020810190610bff91906120b6565b6040516001600160a01b03909116815260200160405180910390a15b600101610b12565b610c2b61187d565b610ae25f611443565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610c7d5760405163f739589b60e01b815260040160405180910390fd5b6107518383836118d7565b6001600160a01b0381165f90815260ce60205260408120546060918291908167ffffffffffffffff811115610cbf57610cbf61211f565b604051908082528060200260200182016040528015610ce8578160200160208202803683370190505b5090505f5b82811015610d76576001600160a01b0386165f90815260cd6020908152604080832060ce9092528220805491929184908110610d2b57610d2b61248c565b5f9182526020808320909101546001600160a01b031683528201929092526040019020548251839083908110610d6357610d6361248c565b6020908102919091010152600101610ced565b5060ce5f866001600160a01b03166001600160a01b031681526020019081526020015f208181805480602002602001604051908101604052809291908181526020018280548015610dee57602002820191905f5260205f20905b81546001600160a01b03168152600190910190602001808311610dd0575b50505050509150935093505050915091565b604080517f4337f82d142e41f2a8c10547cd8c859bddb92262a61058e77842e24d9dea922460208201526001600160a01b03808916928201929092528187166060820152908516608082015260a0810184905260c0810183905260e081018290525f90610e8690610100016040516020818303038152906040528051906020012061199b565b979650505050505050565b60cb546001600160a01b03163314610ebc576040516320ba3ff960e21b815260040160405180910390fd5b805f5b818110156107515760d15f858584818110610edc57610edc61248c565b9050602002016020810190610ef191906120b6565b6001600160a01b0316815260208101919091526040015f205460ff1615610fc8575f60d15f868685818110610f2857610f2861248c565b9050602002016020810190610f3d91906120b6565b6001600160a01b0316815260208101919091526040015f20805460ff19169115159190911790557f4074413b4b443e4e58019f2855a8765113358c7c72e39509c6af45fc0f5ba030848483818110610f9757610f9761248c565b9050602002016020810190610fac91906120b6565b6040516001600160a01b03909116815260200160405180910390a15b600101610ebf565b610fd861187d565b6109d081611494565b60ce602052815f5260405f208181548110610ffa575f80fd5b5f918252602090912001546001600160a01b03169150829050565b6001600160a01b0381165f90815260ce602090815260409182902080548351818402810184019094528084526060939283018282801561107c57602002820191905f5260205f20905b81546001600160a01b0316815260019091019060200180831161105e575b50505050509050919050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146110d15760405163f739589b60e01b815260040160405180910390fd5b6001600160a01b0382165f90815260d46020526040812080548392906110f89084906124b4565b9091555050604080516001600160a01b0384168152602081018390527fca3e02a4ab7ad3c47a8e36e5a624c30170791726ab720f1babfef21046d953ff910160405180910390a15050565b6098545f90819060019081160361116d5760405163840a48d560e01b815260040160405180910390fd5b6111756114fd565b611181338686866115a8565b915061118d6001606555565b509392505050565b61119d61187d565b6001600160a01b0381166112025760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016106c7565b6109d081611443565b5f7f000000000000000000000000000000000000000000000000000000000000000046146112cb5750604080518082018252600a81526922b4b3b2b72630bcb2b960b11b60209182015281517f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a866818301527f71b625cfad44bac63b13dba07f2e1d6084ee04b6f8752101ece6126d584ee6ea81840152466060820152306080808301919091528351808303909101815260a0909101909252815191012090565b507f000000000000000000000000000000000000000000000000000000000000000090565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561134c573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113709190612471565b6001600160a01b0316336001600160a01b0316146113a15760405163794821ff60e01b815260040160405180910390fd5b609854801982198116146113c85760405163c61dca5d60e01b815260040160405180910390fd5b609882905560405182815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c9060200160405180910390a25050565b609881905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a250565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b60cb54604080516001600160a01b03928316815291831660208301527f4264275e593955ff9d6146a51a4525f6ddace2e81db9391abcc9d1ca48047d29910160405180910390a160cb80546001600160a01b0319166001600160a01b0392909216919091179055565b60026065540361154f5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016106c7565b6002606555565b4281101561157757604051630819bdcd60e01b815260040160405180910390fd5b61158b6001600160a01b03851684846119e1565b61075157604051638baa579f60e01b815260040160405180910390fd5b6001600160a01b0383165f90815260d16020526040812054849060ff166115e257604051632efd965160e11b815260040160405180910390fd5b6115f76001600160a01b038516338786611a3f565b6040516311f9fbc960e21b81526001600160a01b038581166004830152602482018590528616906347e7ef24906044016020604051808303815f875af1158015611643573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061166791906124cd565b91505f5f611676888886611715565b604051631e328e7960e11b81526001600160a01b038b811660048301528a8116602483015260448201849052606482018390529294509092507f000000000000000000000000000000000000000000000000000000000000000090911690633c651cf2906084015f604051808303815f87803b1580156116f4575f5ffd5b505af1158015611706573d5f5f3e3d5ffd5b50505050505050949350505050565b5f806001600160a01b03851661173e576040516316f2ccc960e01b815260040160405180910390fd5b825f0361175e576040516342061b2560e11b815260040160405180910390fd5b6001600160a01b038086165f90815260cd6020908152604080832093881683529290529081205490819003611804576001600160a01b0386165f90815260ce6020908152604090912054106117c6576040516301a1443960e31b815260040160405180910390fd5b6001600160a01b038681165f90815260ce602090815260408220805460018101825590835291200180546001600160a01b0319169187169190911790555b61180e84826124b4565b6001600160a01b038088165f90815260cd60209081526040808320938a16835292905281902091909155517f5548c837ab068cf56a2c2479df0882a4922fd203edb7517321831d95078c5f629061186a9088908890889061244d565b60405180910390a1959294509192505050565b6033546001600160a01b03163314610ae25760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016106c7565b5f815f036118f8576040516342061b2560e11b815260040160405180910390fd5b6001600160a01b038085165f90815260cd60209081526040808320938716835292905220548083111561193e57604051634b18b19360e01b815260040160405180910390fd5b61194883826124e4565b6001600160a01b038087165f90815260cd60209081526040808320938916835292905290812082905590915081900361198f576119858585611a97565b6001915050611994565b5f9150505b9392505050565b5f6119a461120b565b60405161190160f01b6020820152602281019190915260428101839052606201604051602081830303815290604052805190602001209050919050565b5f5f5f6119ee8585611c15565b90925090505f816004811115611a0657611a066124f7565b148015611a245750856001600160a01b0316826001600160a01b0316145b80611a355750611a35868686611c57565b9695505050505050565b610751846323b872dd60e01b858585604051602401611a609392919061244d565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152611d3e565b6001600160a01b0382165f90815260ce6020526040812054905b81811015611ba9576001600160a01b038481165f90815260ce6020526040902080549185169183908110611ae757611ae761248c565b5f918252602090912001546001600160a01b031603611ba1576001600160a01b0384165f90815260ce602052604090208054611b25906001906124e4565b81548110611b3557611b3561248c565b5f9182526020808320909101546001600160a01b03878116845260ce9092526040909220805491909216919083908110611b7157611b7161248c565b905f5260205f20015f6101000a8154816001600160a01b0302191690836001600160a01b03160217905550611ba9565b600101611ab1565b818103611bc957604051632df15a4160e11b815260040160405180910390fd5b6001600160a01b0384165f90815260ce60205260409020805480611bef57611bef61250b565b5f8281526020902081015f1990810180546001600160a01b031916905501905550505050565b5f5f8251604103611c49576020830151604084015160608501515f1a611c3d87828585611e16565b94509450505050611c50565b505f905060025b9250929050565b5f5f5f856001600160a01b0316631626ba7e60e01b8686604051602401611c7f92919061254d565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b0319909416939093179092529051611cbd9190612565565b5f60405180830381855afa9150503d805f8114611cf5576040519150601f19603f3d011682016040523d82523d5f602084013e611cfa565b606091505b5091509150818015611d0e57506020815110155b8015611a3557508051630b135d3f60e11b90611d3390830160209081019084016124cd565b149695505050505050565b5f611d92826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316611ed39092919063ffffffff16565b905080515f1480611db2575080806020019051810190611db2919061242e565b611e115760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016106c7565b505050565b5f807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0831115611e4b57505f90506003611eca565b604080515f8082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015611e9c573d5f5f3e3d5ffd5b5050604051601f1901519150506001600160a01b038116611ec4575f60019250925050611eca565b91505f90505b94509492505050565b6060611ee184845f85611ee9565b949350505050565b606082471015611f4a5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b60648201526084016106c7565b5f5f866001600160a01b03168587604051611f659190612565565b5f6040518083038185875af1925050503d805f8114611f9f576040519150601f19603f3d011682016040523d82523d5f602084013e611fa4565b606091505b5091509150610e86878383876060831561201e5782515f03612017576001600160a01b0385163b6120175760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016106c7565b5081611ee1565b611ee183838151156120335781518083602001fd5b8060405162461bcd60e51b81526004016106c7919061257b565b5f6020828403121561205d575f5ffd5b5035919050565b6001600160a01b03811681146109d0575f5ffd5b5f5f5f6060848603121561208a575f5ffd5b833561209581612064565b925060208401356120a581612064565b929592945050506040919091013590565b5f602082840312156120c6575f5ffd5b813561199481612064565b5f5f5f5f608085870312156120e4575f5ffd5b84356120ef81612064565b935060208501356120ff81612064565b9250604085013561210f81612064565b9396929550929360600135925050565b634e487b7160e01b5f52604160045260245ffd5b5f5f5f5f5f5f60c08789031215612148575f5ffd5b863561215381612064565b9550602087013561216381612064565b945060408701359350606087013561217a81612064565b92506080870135915060a087013567ffffffffffffffff81111561219c575f5ffd5b8701601f810189136121ac575f5ffd5b803567ffffffffffffffff8111156121c6576121c661211f565b604051601f8201601f19908116603f0116810167ffffffffffffffff811182821017156121f5576121f561211f565b6040528181528282016020018b101561220c575f5ffd5b816020840160208301375f602083830101528093505050509295509295509295565b5f6020828403121561223e575f5ffd5b813560ff81168114611994575f5ffd5b5f5f6020838503121561225f575f5ffd5b823567ffffffffffffffff811115612275575f5ffd5b8301601f81018513612285575f5ffd5b803567ffffffffffffffff81111561229b575f5ffd5b8560208260051b84010111156122af575f5ffd5b6020919091019590945092505050565b5f8151808452602084019350602083015f5b828110156122f85781516001600160a01b03168652602095860195909101906001016122d1565b5093949350505050565b604081525f61231460408301856122bf565b82810360208401528084518083526020830191506020860192505f5b8181101561234e578351835260209384019390920191600101612330565b50909695505050505050565b5f5f5f5f5f5f60c0878903121561236f575f5ffd5b863561237a81612064565b9550602087013561238a81612064565b9450604087013561239a81612064565b959894975094956060810135955060808101359460a0909101359350915050565b5f5f604083850312156123cc575f5ffd5b82356123d781612064565b946020939093013593505050565b602081525f61199460208301846122bf565b5f5f60408385031215612408575f5ffd5b823561241381612064565b9150602083013561242381612064565b809150509250929050565b5f6020828403121561243e575f5ffd5b81518015158114611994575f5ffd5b6001600160a01b039384168152919092166020820152604081019190915260600190565b5f60208284031215612481575f5ffd5b815161199481612064565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b808201808211156124c7576124c76124a0565b92915050565b5f602082840312156124dd575f5ffd5b5051919050565b818103818111156124c7576124c76124a0565b634e487b7160e01b5f52602160045260245ffd5b634e487b7160e01b5f52603160045260245ffd5b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b828152604060208201525f611ee1604083018461251f565b5f82518060208501845e5f920191825250919050565b602081525f611994602083018461251f56fea264697066735822122058c045c09833dc14476601e94e0351d0aa865f5a0b5783203f1cfa5fa48c7a6564736f6c634300081b0033", } // StrategyManagerABI is the input ABI used to generate the binding from. diff --git a/src/contracts/core/AllocationManager.sol b/src/contracts/core/AllocationManager.sol index 232af3030a..5a8083c1f8 100644 --- a/src/contracts/core/AllocationManager.sol +++ b/src/contracts/core/AllocationManager.sol @@ -643,13 +643,30 @@ contract AllocationManager is return (operatorSets, _allocations); } + /// @inheritdoc IAllocationManager + function getEncumberedMagnitude(address operator, IStrategy strategy) external view returns (uint64) { + (uint64 curEncumberedMagnitude,) = _getFreeAndUsedMagnitude(operator, strategy); + return curEncumberedMagnitude; + } + /// @inheritdoc IAllocationManager function getAllocatableMagnitude(address operator, IStrategy strategy) external view returns (uint64) { + (, uint64 curAllocatableMagnitude) = _getFreeAndUsedMagnitude(operator, strategy); + return curAllocatableMagnitude; + } + + /// @dev For an operator, returns up-to-date amounts for current encumbered and available + /// magnitude. Note that these two values will always add up to the operator's max magnitude + /// for the strategy + function _getFreeAndUsedMagnitude( + address operator, + IStrategy strategy + ) internal view returns (uint64 curEncumberedMagnitude, uint64 curAllocatableMagnitude) { // This method needs to simulate clearing any pending deallocations. // This roughly mimics the calculations done in `_clearDeallocationQueue` and // `_getUpdatedAllocation`, while operating on a `curEncumberedMagnitude` // rather than continually reading/updating state. - uint64 curEncumberedMagnitude = encumberedMagnitude[operator][strategy]; + curEncumberedMagnitude = encumberedMagnitude[operator][strategy]; uint256 length = deallocationQueue[operator][strategy].length(); for (uint256 i = 0; i < length; ++i) { @@ -670,7 +687,8 @@ contract AllocationManager is // The difference between the operator's max magnitude and its encumbered magnitude // is the magnitude that can be allocated. - return _maxMagnitudeHistory[operator][strategy].latest() - curEncumberedMagnitude; + curAllocatableMagnitude = _maxMagnitudeHistory[operator][strategy].latest() - curEncumberedMagnitude; + return (curEncumberedMagnitude, curAllocatableMagnitude); } /// @inheritdoc IAllocationManager diff --git a/src/contracts/core/AllocationManagerStorage.sol b/src/contracts/core/AllocationManagerStorage.sol index caab8f4195..5d973e6aa7 100644 --- a/src/contracts/core/AllocationManagerStorage.sol +++ b/src/contracts/core/AllocationManagerStorage.sol @@ -83,9 +83,7 @@ abstract contract AllocationManagerStorage is IAllocationManager { _maxMagnitudeHistory; /// @dev For a strategy, contains the amount of magnitude an operator has allocated to operator sets - /// @dev This value should be read with caution, as deallocations that are completable but not - /// popped off the queue are still included in the encumbered magnitude - mapping(address operator => mapping(IStrategy strategy => uint64)) public encumberedMagnitude; + mapping(address operator => mapping(IStrategy strategy => uint64)) internal encumberedMagnitude; /// @dev For a strategy, keeps an ordered queue of operator sets that have pending deallocations /// These must be completed in order to free up magnitude for future allocation diff --git a/src/contracts/interfaces/IAllocationManager.sol b/src/contracts/interfaces/IAllocationManager.sol index 66367393f4..ac8467405f 100644 --- a/src/contracts/interfaces/IAllocationManager.sol +++ b/src/contracts/interfaces/IAllocationManager.sol @@ -400,6 +400,14 @@ interface IAllocationManager is IAllocationManagerErrors, IAllocationManagerEven IStrategy strategy ) external view returns (OperatorSet[] memory, Allocation[] memory); + /** + * @notice For a strategy, get the amount of magnitude that is allocated across one or more operator sets + * @param operator the operator to query + * @param strategy the strategy to get allocatable magnitude for + * @return currently allocated magnitude + */ + function getEncumberedMagnitude(address operator, IStrategy strategy) external view returns (uint64); + /** * @notice For a strategy, get the amount of magnitude not currently allocated to any operator set * @param operator the operator to query diff --git a/src/test/integration/IntegrationBase.t.sol b/src/test/integration/IntegrationBase.t.sol index cb178b3c27..cceccdd67e 100644 --- a/src/test/integration/IntegrationBase.t.sol +++ b/src/test/integration/IntegrationBase.t.sol @@ -1455,7 +1455,7 @@ abstract contract IntegrationBase is IntegrationDeployer { magnitudes = new Magnitudes[](strategies.length); for (uint i = 0; i < strategies.length; ++i) { magnitudes[i] = Magnitudes({ - encumbered: allocationManager.encumberedMagnitude(address(operator), strategies[i]), + encumbered: allocationManager.getEncumberedMagnitude(address(operator), strategies[i]), allocatable: allocationManager.getAllocatableMagnitude(address(operator), strategies[i]), max: allocationManager.getMaxMagnitude(address(operator), strategies[i]) }); diff --git a/src/test/unit/AllocationManagerUnit.t.sol b/src/test/unit/AllocationManagerUnit.t.sol index a3302520bf..d2018b6d2b 100644 --- a/src/test/unit/AllocationManagerUnit.t.sol +++ b/src/test/unit/AllocationManagerUnit.t.sol @@ -225,7 +225,7 @@ contract AllocationManagerUnitTests is EigenLayerUnitTestSetup, IAllocationManag assertEq(expectedAllocation.pendingDiff, allocation.pendingDiff, "pendingDiff != expected"); assertEq(expectedAllocation.effectBlock, allocation.effectBlock, "effectBlock != expected"); - uint256 encumberedMagnitude = allocationManager.encumberedMagnitude(operator, strategy); + uint256 encumberedMagnitude = allocationManager.getEncumberedMagnitude(operator, strategy); uint256 maxMagnitude = allocationManager.getMaxMagnitudes(operator, strategy.toArray())[0]; uint256 allocatableMagnitude = allocationManager.getAllocatableMagnitude(operator, strategy); @@ -678,7 +678,7 @@ contract AllocationManagerUnitTests_SlashOperator is AllocationManagerUnitTests cheats.prank(defaultOperator); allocationManager.modifyAllocations(defaultOperator, allocateParams); - uint64 encumberedMagnitudeBefore = allocationManager.encumberedMagnitude(defaultOperator, strategyMock); + uint64 encumberedMagnitudeBefore = allocationManager.getEncumberedMagnitude(defaultOperator, strategyMock); uint64 maxMagnitudeBefore = allocationManager.getMaxMagnitudes(defaultOperator, strategyMock.toArray())[0]; // The only slash event we expect is the OperatorSlashed. Validate the number @@ -705,7 +705,7 @@ contract AllocationManagerUnitTests_SlashOperator is AllocationManagerUnitTests // Assert encumberedMagnitude and maxMagnitude are unchanged assertEq( encumberedMagnitudeBefore, - allocationManager.encumberedMagnitude(defaultOperator, strategyMock), + allocationManager.getEncumberedMagnitude(defaultOperator, strategyMock), "encumberedMagnitude mutated" ); @@ -2330,7 +2330,7 @@ contract AllocationManagerUnitTests_ModifyAllocations is AllocationManagerUnitTe for (uint256 i; i < numStrats; ++i) { assertEq( WAD, - allocationManager.encumberedMagnitude(defaultOperator, strategies[i]), + allocationManager.getEncumberedMagnitude(defaultOperator, strategies[i]), "encumberedMagnitude not max" ); } @@ -2406,7 +2406,7 @@ contract AllocationManagerUnitTests_ModifyAllocations is AllocationManagerUnitTe operatorSet: defaultOperatorSet, strategy: strategyMock, expectedAllocation: Allocation({currentMagnitude: secondMod, pendingDiff: 0, effectBlock: 0}), - expectedMagnitudes: Magnitudes({encumbered: firstMod, max: WAD, allocatable: WAD - secondMod}) + expectedMagnitudes: Magnitudes({encumbered: secondMod, max: WAD, allocatable: WAD - secondMod}) }); // Check storage after clearing deallocation queue @@ -2515,16 +2515,8 @@ contract AllocationManagerUnitTests_ModifyAllocations is AllocationManagerUnitTe operator: defaultOperator, operatorSet: defaultOperatorSet, strategy: strategyMock, - expectedAllocation: Allocation({ - currentMagnitude: deallocateParams[0].newMagnitudes[0], - pendingDiff: 0, - effectBlock: 0 - }), - expectedMagnitudes: Magnitudes({ - encumbered: allocateParams[0].newMagnitudes[0], - max: WAD, - allocatable: WAD - deallocateParams[0].newMagnitudes[0] - }) + expectedAllocation: Allocation({currentMagnitude: deallocateParams[0].newMagnitudes[0], pendingDiff: 0, effectBlock: 0}), + expectedMagnitudes: Magnitudes({encumbered: deallocateParams[0].newMagnitudes[0], max: WAD, allocatable: WAD - deallocateParams[0].newMagnitudes[0]}) }); } @@ -2898,7 +2890,7 @@ contract AllocationManagerUnitTests_ModifyAllocations is AllocationManagerUnitTe effectBlock: 0 }), expectedMagnitudes: Magnitudes({ - encumbered: allocateParams[i].newMagnitudes[j], + encumbered: deallocateParams[i].newMagnitudes[j], max: WAD, allocatable: WAD - deallocateParams[i].newMagnitudes[j] }) @@ -3167,7 +3159,7 @@ contract AllocationManagerUnitTests_ClearDeallocationQueue is AllocationManagerU // At this point, we should be able to allocate again to opSet1 AND have only 5e17 encumbered magnitude assertEq( 5e17, - allocationManager.encumberedMagnitude(defaultOperator, strategyMock), + allocationManager.getEncumberedMagnitude(defaultOperator, strategyMock), "encumbered magnitude not correct" ); AllocateParams[] memory thirdAllocation = _newAllocateParams(defaultOperatorSet, 5e17); From 456c4badffae53221a89476a0e394de17be06cb5 Mon Sep 17 00:00:00 2001 From: Yash Patil <40046473+ypatil12@users.noreply.github.com> Date: Tue, 21 Jan 2025 12:43:21 -0500 Subject: [PATCH 10/35] chore: remove unused helper (#1039) * chore: remove unused helper * chore: bindings --- pkg/bindings/AVSDirectory/binding.go | 2 +- pkg/bindings/AllocationManager/binding.go | 2 +- pkg/bindings/BackingEigen/binding.go | 2 +- pkg/bindings/BeaconChainProofs/binding.go | 2 +- pkg/bindings/BytesLib/binding.go | 2 +- pkg/bindings/DelegationManager/binding.go | 2 +- pkg/bindings/Eigen/binding.go | 2 +- pkg/bindings/EigenPod/binding.go | 2 +- pkg/bindings/EigenPodManager/binding.go | 2 +- pkg/bindings/EigenStrategy/binding.go | 2 +- pkg/bindings/Endian/binding.go | 2 +- pkg/bindings/Merkle/binding.go | 2 +- pkg/bindings/OperatorSetLib/binding.go | 2 +- pkg/bindings/PauserRegistry/binding.go | 2 +- pkg/bindings/PermissionController/binding.go | 2 +- pkg/bindings/RewardsCoordinator/binding.go | 4 ++++ pkg/bindings/SlashingLib/binding.go | 2 +- pkg/bindings/Snapshots/binding.go | 2 +- pkg/bindings/StrategyBase/binding.go | 2 +- pkg/bindings/StrategyBaseTVLLimits/binding.go | 2 +- pkg/bindings/StrategyFactory/binding.go | 2 +- pkg/bindings/StrategyManager/binding.go | 2 +- src/contracts/libraries/SlashingLib.sol | 7 ------- 23 files changed, 25 insertions(+), 28 deletions(-) diff --git a/pkg/bindings/AVSDirectory/binding.go b/pkg/bindings/AVSDirectory/binding.go index 8143a24853..a37af907a5 100644 --- a/pkg/bindings/AVSDirectory/binding.go +++ b/pkg/bindings/AVSDirectory/binding.go @@ -39,7 +39,7 @@ type ISignatureUtilsSignatureWithSaltAndExpiry struct { // AVSDirectoryMetaData contains all meta data concerning the AVSDirectory contract. var AVSDirectoryMetaData = &bind.MetaData{ ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"_delegation\",\"type\":\"address\",\"internalType\":\"contractIDelegationManager\"},{\"name\":\"_pauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"OPERATOR_AVS_REGISTRATION_TYPEHASH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"OPERATOR_SET_FORCE_DEREGISTRATION_TYPEHASH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"OPERATOR_SET_REGISTRATION_TYPEHASH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"avsOperatorStatus\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"enumIAVSDirectoryTypes.OperatorAVSRegistrationStatus\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"calculateOperatorAVSRegistrationDigestHash\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"cancelSalt\",\"inputs\":[{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"delegation\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIDelegationManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"deregisterOperatorFromAVS\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"domainSeparator\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"initialOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"initialPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"operatorSaltIsSpent\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"isSpent\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"pauseAll\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[{\"name\":\"index\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pauserRegistry\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"registerOperatorToAVS\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSignature\",\"type\":\"tuple\",\"internalType\":\"structISignatureUtils.SignatureWithSaltAndExpiry\",\"components\":[{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"updateAVSMetadataURI\",\"inputs\":[{\"name\":\"metadataURI\",\"type\":\"string\",\"internalType\":\"string\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"AVSMetadataURIUpdated\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"metadataURI\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorAVSRegistrationStatusUpdated\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"avs\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"status\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"enumIAVSDirectoryTypes.OperatorAVSRegistrationStatus\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"CurrentlyPaused\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InputAddressZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidNewPausedStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidSignature\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyPauser\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyUnpauser\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OperatorAlreadyRegisteredToAVS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OperatorNotRegisteredToAVS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OperatorNotRegisteredToEigenLayer\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SaltSpent\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SignatureExpired\",\"inputs\":[]}]", - Bin: "0x610100604052348015610010575f5ffd5b50604051612ac3380380612ac38339818101604052810190610032919061032c565b81815f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610099576040517f7363217600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff1681525050508073ffffffffffffffffffffffffffffffffffffffff1660a08173ffffffffffffffffffffffffffffffffffffffff1681525050504660c0818152505061011961013560201b60201c565b60e0818152505061012e6101c460201b60201c565b50506104be565b5f7f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a8666040518060400160405280600a81526020017f456967656e4c61796572000000000000000000000000000000000000000000008152508051906020012046306040516020016101a994939291906103a9565b60405160208183030381529060405280519060200120905090565b5f60019054906101000a900460ff1615610213576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161020a9061046c565b60405180910390fd5b60ff80165f5f9054906101000a900460ff1660ff16146102805760ff5f5f6101000a81548160ff021916908360ff1602179055507f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb384740249860ff60405161027791906104a5565b60405180910390a15b565b5f5ffd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6102af82610286565b9050919050565b5f6102c0826102a5565b9050919050565b6102d0816102b6565b81146102da575f5ffd5b50565b5f815190506102eb816102c7565b92915050565b5f6102fb826102a5565b9050919050565b61030b816102f1565b8114610315575f5ffd5b50565b5f8151905061032681610302565b92915050565b5f5f6040838503121561034257610341610282565b5b5f61034f858286016102dd565b925050602061036085828601610318565b9150509250929050565b5f819050919050565b61037c8161036a565b82525050565b5f819050919050565b61039481610382565b82525050565b6103a3816102a5565b82525050565b5f6080820190506103bc5f830187610373565b6103c96020830186610373565b6103d6604083018561038b565b6103e3606083018461039a565b95945050505050565b5f82825260208201905092915050565b7f496e697469616c697a61626c653a20636f6e747261637420697320696e6974695f8201527f616c697a696e6700000000000000000000000000000000000000000000000000602082015250565b5f6104566027836103ec565b9150610461826103fc565b604082019050919050565b5f6020820190508181035f8301526104838161044a565b9050919050565b5f60ff82169050919050565b61049f8161048a565b82525050565b5f6020820190506104b85f830184610496565b92915050565b60805160a05160c05160e0516125b661050d5f395f6110c701525f61109301525f818161088c0152610f8501525f81816103ea0152818161055a0152818161068a01526110ee01526125b65ff3fe608060405234801561000f575f5ffd5b5060043610610140575f3560e01c8063a364f4da116100b6578063dce974b91161007a578063dce974b91461033a578063df5cf72314610358578063ec76f44214610376578063f2fde38b14610392578063f698da25146103ae578063fabc1cbc146103cc57610140565b8063a364f4da146102aa578063a98fb355146102c6578063c825fe68146102e2578063cd6dc68714610300578063d79aceab1461031c57610140565b80635c975abb116101085780635c975abb146101fa578063715018a614610218578063886f1195146102225780638da5cb5b146102405780639926ee7d1461025e578063a1060c881461027a57610140565b8063136439dd14610144578063374823b51461016057806349075da314610190578063595c6a67146101c05780635ac86ab7146101ca575b5f5ffd5b61015e600480360381019061015991906118d7565b6103e8565b005b61017a6004803603810190610175919061198f565b610504565b60405161018791906119e7565b60405180910390f35b6101aa60048036038101906101a59190611a00565b61052e565b6040516101b79190611ab1565b60405180910390f35b6101c8610558565b005b6101e460048036038101906101df9190611b00565b610651565b6040516101f191906119e7565b60405180910390f35b61020261066c565b60405161020f9190611b3a565b60405180910390f35b610220610675565b005b61022a610688565b6040516102379190611bae565b60405180910390f35b6102486106ac565b6040516102559190611bd6565b60405180910390f35b61027860048036038101906102739190611db0565b6106d4565b005b610294600480360381019061028f9190611e0a565b610af1565b6040516102a19190611e7d565b60405180910390f35b6102c460048036038101906102bf9190611e96565b610b53565b005b6102e060048036038101906102db9190611f1e565b610d7d565b005b6102ea610dd1565b6040516102f79190611e7d565b60405180910390f35b61031a60048036038101906103159190611f69565b610df5565b005b610324610f3b565b6040516103319190611e7d565b60405180910390f35b610342610f5f565b60405161034f9190611e7d565b60405180910390f35b610360610f83565b60405161036d9190611fc7565b60405180910390f35b610390600480360381019061038b9190611fe0565b610fa7565b005b6103ac60048036038101906103a79190611e96565b61100e565b005b6103b6611090565b6040516103c39190611e7d565b60405180910390f35b6103e660048036038101906103e191906118d7565b6110ec565b005b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166346fbf68e336040518263ffffffff1660e01b81526004016104419190611bd6565b602060405180830381865afa15801561045c573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104809190612035565b6104b6576040517f75df51dc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f606654905080828216146104f7576040517fc61dca5d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6105008261127a565b5050565b6099602052815f5260405f20602052805f5260405f205f915091509054906101000a900460ff1681565b6098602052815f5260405f20602052805f5260405f205f915091509054906101000a900460ff1681565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166346fbf68e336040518263ffffffff1660e01b81526004016105b19190611bd6565b602060405180830381865afa1580156105cc573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105f09190612035565b610626576040517f75df51dc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61064f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61127a565b565b5f5f8260ff166001901b905080816066541614915050919050565b5f606654905090565b61067d6112d2565b6106865f611350565b565b7f000000000000000000000000000000000000000000000000000000000000000081565b5f60335f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b5f6106de81610651565b15610715576040517f840a48d500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60018081111561072857610727611a3e565b5b60985f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1660018111156107bf576107be611a3e565b5b036107f6576040517f354a517600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60995f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f836020015181526020019081526020015f205f9054906101000a900460ff161561088a576040517f3531324400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16636d70f7ae846040518263ffffffff1660e01b81526004016108e39190611bd6565b602060405180830381865afa1580156108fe573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109229190612035565b610958576040517f9f88c8af00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61097e83610970853386602001518760400151610af1565b845f01518560400151611413565b600160995f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f846020015181526020019081526020015f205f6101000a81548160ff021916908315150217905550600160985f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff02191690836001811115610a8157610a80611a3e565b5b02179055503373ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167ff0952b1c65271d819d39983d2abb044b9cace59bcc4d4dd389f586ebdcb15b416001604051610ae49190611ab1565b60405180910390a3505050565b5f610b497fda2c89bafdd34776a2b8bb9c83c82f419e20cc8c67207f70edd58249b92661bd86868686604051602001610b2e959493929190612060565b604051602081830303815290604052805190602001206114b4565b9050949350505050565b5f610b5d81610651565b15610b94576040517f840a48d500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180811115610ba757610ba6611a3e565b5b60985f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff166001811115610c3e57610c3d611a3e565b5b14610c75576040517f52df45c900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f60985f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff02191690836001811115610d0f57610d0e611a3e565b5b02179055503373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167ff0952b1c65271d819d39983d2abb044b9cace59bcc4d4dd389f586ebdcb15b415f604051610d719190611ab1565b60405180910390a35050565b3373ffffffffffffffffffffffffffffffffffffffff167fa89c1dc243d8908a96dd84944bcc97d6bc6ac00dd78e20621576be6a3c9437138383604051610dc59291906120ed565b60405180910390a25050565b7f809c5ac049c45b7a7f050a20f00c16cf63797efbf8b1eb8d749fdfa39ff8f92981565b5f5f60019054906101000a900460ff16159050808015610e25575060015f5f9054906101000a900460ff1660ff16105b80610e525750610e34306114ec565b158015610e51575060015f5f9054906101000a900460ff1660ff16145b5b610e91576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e889061217f565b60405180910390fd5b60015f5f6101000a81548160ff021916908360ff1602179055508015610ecc5760015f60016101000a81548160ff0219169083151502179055505b610ed58261127a565b610ede83611350565b8015610f36575f5f60016101000a81548160ff0219169083151502179055507f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024986001604051610f2d91906121d6565b60405180910390a15b505050565b7fda2c89bafdd34776a2b8bb9c83c82f419e20cc8c67207f70edd58249b92661bd81565b7f4ee65f64218c67b68da66fd0db16560040a6b973290b9e71912d661ee53fe49581565b7f000000000000000000000000000000000000000000000000000000000000000081565b600160995f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8381526020019081526020015f205f6101000a81548160ff02191690831515021790555050565b6110166112d2565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611084576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161107b9061225f565b60405180910390fd5b61108d81611350565b50565b5f7f000000000000000000000000000000000000000000000000000000000000000046146110c5576110c061150e565b6110e7565b7f00000000000000000000000000000000000000000000000000000000000000005b905090565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611155573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111799190612291565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146111dd576040517f794821ff00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f60665490508019821982191614611221576040517fc61dca5d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b816066819055503373ffffffffffffffffffffffffffffffffffffffff167f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c8360405161126e9190611b3a565b60405180910390a25050565b806066819055503373ffffffffffffffffffffffffffffffffffffffff167fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d826040516112c79190611b3a565b60405180910390a250565b6112da61159d565b73ffffffffffffffffffffffffffffffffffffffff166112f86106ac565b73ffffffffffffffffffffffffffffffffffffffff161461134e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161134590612306565b60405180910390fd5b565b5f60335f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160335f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b4281101561144d576040517f0819bdcd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61147883838673ffffffffffffffffffffffffffffffffffffffff166115a49092919063ffffffff16565b6114ae576040517f8baa579f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b5f6114bd611090565b826040516020016114cf929190612398565b604051602081830303815290604052805190602001209050919050565b5f5f8273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b5f7f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a8666040518060400160405280600a81526020017f456967656e4c617965720000000000000000000000000000000000000000000081525080519060200120463060405160200161158294939291906123ce565b60405160208183030381529060405280519060200120905090565b5f33905090565b5f5f5f6115b18585611630565b915091505f60048111156115c8576115c7611a3e565b5b8160048111156115db576115da611a3e565b5b14801561161357508573ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b80611625575061162486868661167c565b5b925050509392505050565b5f5f604183510361166d575f5f5f602086015192506040860151915060608601515f1a9050611661878285856117bb565b94509450505050611675565b5f6002915091505b9250929050565b5f5f5f8573ffffffffffffffffffffffffffffffffffffffff16631626ba7e60e01b86866040516024016116b1929190612471565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505060405161171b91906124d9565b5f60405180830381855afa9150503d805f8114611753576040519150601f19603f3d011682016040523d82523d5f602084013e611758565b606091505b509150915081801561176c57506020815110155b80156117b05750631626ba7e60e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916818060200190518101906117ae9190612503565b145b925050509392505050565b5f5f7f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0835f1c11156117f3575f60039150915061188a565b5f6001878787876040515f8152602001604052604051611816949392919061253d565b6020604051602081039080840390855afa158015611836573d5f5f3e3d5ffd5b5050506020604051035190505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611882575f6001925092505061188a565b805f92509250505b94509492505050565b5f604051905090565b5f5ffd5b5f5ffd5b5f819050919050565b6118b6816118a4565b81146118c0575f5ffd5b50565b5f813590506118d1816118ad565b92915050565b5f602082840312156118ec576118eb61189c565b5b5f6118f9848285016118c3565b91505092915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f61192b82611902565b9050919050565b61193b81611921565b8114611945575f5ffd5b50565b5f8135905061195681611932565b92915050565b5f819050919050565b61196e8161195c565b8114611978575f5ffd5b50565b5f8135905061198981611965565b92915050565b5f5f604083850312156119a5576119a461189c565b5b5f6119b285828601611948565b92505060206119c38582860161197b565b9150509250929050565b5f8115159050919050565b6119e1816119cd565b82525050565b5f6020820190506119fa5f8301846119d8565b92915050565b5f5f60408385031215611a1657611a1561189c565b5b5f611a2385828601611948565b9250506020611a3485828601611948565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b60028110611a7c57611a7b611a3e565b5b50565b5f819050611a8c82611a6b565b919050565b5f611a9b82611a7f565b9050919050565b611aab81611a91565b82525050565b5f602082019050611ac45f830184611aa2565b92915050565b5f60ff82169050919050565b611adf81611aca565b8114611ae9575f5ffd5b50565b5f81359050611afa81611ad6565b92915050565b5f60208284031215611b1557611b1461189c565b5b5f611b2284828501611aec565b91505092915050565b611b34816118a4565b82525050565b5f602082019050611b4d5f830184611b2b565b92915050565b5f819050919050565b5f611b76611b71611b6c84611902565b611b53565b611902565b9050919050565b5f611b8782611b5c565b9050919050565b5f611b9882611b7d565b9050919050565b611ba881611b8e565b82525050565b5f602082019050611bc15f830184611b9f565b92915050565b611bd081611921565b82525050565b5f602082019050611be95f830184611bc7565b92915050565b5f5ffd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b611c3982611bf3565b810181811067ffffffffffffffff82111715611c5857611c57611c03565b5b80604052505050565b5f611c6a611893565b9050611c768282611c30565b919050565b5f5ffd5b5f5ffd5b5f5ffd5b5f67ffffffffffffffff821115611ca157611ca0611c03565b5b611caa82611bf3565b9050602081019050919050565b828183375f83830152505050565b5f611cd7611cd284611c87565b611c61565b905082815260208101848484011115611cf357611cf2611c83565b5b611cfe848285611cb7565b509392505050565b5f82601f830112611d1a57611d19611c7f565b5b8135611d2a848260208601611cc5565b91505092915050565b5f60608284031215611d4857611d47611bef565b5b611d526060611c61565b90505f82013567ffffffffffffffff811115611d7157611d70611c7b565b5b611d7d84828501611d06565b5f830152506020611d908482850161197b565b6020830152506040611da4848285016118c3565b60408301525092915050565b5f5f60408385031215611dc657611dc561189c565b5b5f611dd385828601611948565b925050602083013567ffffffffffffffff811115611df457611df36118a0565b5b611e0085828601611d33565b9150509250929050565b5f5f5f5f60808587031215611e2257611e2161189c565b5b5f611e2f87828801611948565b9450506020611e4087828801611948565b9350506040611e518782880161197b565b9250506060611e62878288016118c3565b91505092959194509250565b611e778161195c565b82525050565b5f602082019050611e905f830184611e6e565b92915050565b5f60208284031215611eab57611eaa61189c565b5b5f611eb884828501611948565b91505092915050565b5f5ffd5b5f5ffd5b5f5f83601f840112611ede57611edd611c7f565b5b8235905067ffffffffffffffff811115611efb57611efa611ec1565b5b602083019150836001820283011115611f1757611f16611ec5565b5b9250929050565b5f5f60208385031215611f3457611f3361189c565b5b5f83013567ffffffffffffffff811115611f5157611f506118a0565b5b611f5d85828601611ec9565b92509250509250929050565b5f5f60408385031215611f7f57611f7e61189c565b5b5f611f8c85828601611948565b9250506020611f9d858286016118c3565b9150509250929050565b5f611fb182611b7d565b9050919050565b611fc181611fa7565b82525050565b5f602082019050611fda5f830184611fb8565b92915050565b5f60208284031215611ff557611ff461189c565b5b5f6120028482850161197b565b91505092915050565b612014816119cd565b811461201e575f5ffd5b50565b5f8151905061202f8161200b565b92915050565b5f6020828403121561204a5761204961189c565b5b5f61205784828501612021565b91505092915050565b5f60a0820190506120735f830188611e6e565b6120806020830187611bc7565b61208d6040830186611bc7565b61209a6060830185611e6e565b6120a76080830184611b2b565b9695505050505050565b5f82825260208201905092915050565b5f6120cc83856120b1565b93506120d9838584611cb7565b6120e283611bf3565b840190509392505050565b5f6020820190508181035f8301526121068184866120c1565b90509392505050565b7f496e697469616c697a61626c653a20636f6e747261637420697320616c7265615f8201527f647920696e697469616c697a6564000000000000000000000000000000000000602082015250565b5f612169602e836120b1565b91506121748261210f565b604082019050919050565b5f6020820190508181035f8301526121968161215d565b9050919050565b5f819050919050565b5f6121c06121bb6121b68461219d565b611b53565b611aca565b9050919050565b6121d0816121a6565b82525050565b5f6020820190506121e95f8301846121c7565b92915050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f20615f8201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b5f6122496026836120b1565b9150612254826121ef565b604082019050919050565b5f6020820190508181035f8301526122768161223d565b9050919050565b5f8151905061228b81611932565b92915050565b5f602082840312156122a6576122a561189c565b5b5f6122b38482850161227d565b91505092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65725f82015250565b5f6122f06020836120b1565b91506122fb826122bc565b602082019050919050565b5f6020820190508181035f83015261231d816122e4565b9050919050565b5f81905092915050565b7f19010000000000000000000000000000000000000000000000000000000000005f82015250565b5f612362600283612324565b915061236d8261232e565b600282019050919050565b5f819050919050565b61239261238d8261195c565b612378565b82525050565b5f6123a282612356565b91506123ae8285612381565b6020820191506123be8284612381565b6020820191508190509392505050565b5f6080820190506123e15f830187611e6e565b6123ee6020830186611e6e565b6123fb6040830185611b2b565b6124086060830184611bc7565b95945050505050565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f61244382612411565b61244d818561241b565b935061245d81856020860161242b565b61246681611bf3565b840191505092915050565b5f6040820190506124845f830185611e6e565b81810360208301526124968184612439565b90509392505050565b5f81905092915050565b5f6124b382612411565b6124bd818561249f565b93506124cd81856020860161242b565b80840191505092915050565b5f6124e482846124a9565b915081905092915050565b5f815190506124fd81611965565b92915050565b5f602082840312156125185761251761189c565b5b5f612525848285016124ef565b91505092915050565b61253781611aca565b82525050565b5f6080820190506125505f830187611e6e565b61255d602083018661252e565b61256a6040830185611e6e565b6125776060830184611e6e565b9594505050505056fea2646970667358221220925329a0da45be69255de62f8f9fdf914899d8e2b6a85309c61398e68a75a3b164736f6c634300081b0033", + Bin: "0x610100604052348015610010575f5ffd5b5060405161170438038061170483398101604081905261002f916101ed565b81816001600160a01b038116610058576040516339b190bb60e11b815260040160405180910390fd5b6001600160a01b039081166080521660a0524660c052610108604080518082018252600a81526922b4b3b2b72630bcb2b960b11b60209182015281517f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a866818301527f71b625cfad44bac63b13dba07f2e1d6084ee04b6f8752101ece6126d584ee6ea81840152466060820152306080808301919091528351808303909101815260a0909101909252815191012090565b60e05261011361011a565b5050610225565b5f54610100900460ff16156101855760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff908116146101d4575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b03811681146101ea575f5ffd5b50565b5f5f604083850312156101fe575f5ffd5b8251610209816101d6565b602084015190925061021a816101d6565b809150509250929050565b60805160a05160c05160e0516114906102745f395f610b7a01525f610aba01525f8181610340015261063d01525f818161021c015281816103d8015281816104ad0152610b9e01526114905ff3fe608060405234801561000f575f5ffd5b506004361061013d575f3560e01c8063a364f4da116100b4578063dce974b911610079578063dce974b914610314578063df5cf7231461033b578063ec76f44214610362578063f2fde38b14610395578063f698da25146103a8578063fabc1cbc146103b0575f5ffd5b8063a364f4da1461028d578063a98fb355146102a0578063c825fe68146102b3578063cd6dc687146102da578063d79aceab146102ed575f5ffd5b80635c975abb116101055780635c975abb146101fd578063715018a61461020f578063886f1195146102175780638da5cb5b146102565780639926ee7d14610267578063a1060c881461027a575f5ffd5b8063136439dd14610141578063374823b51461015657806349075da314610198578063595c6a67146101d25780635ac86ab7146101da575b5f5ffd5b61015461014f366004611075565b6103c3565b005b6101836101643660046110a0565b609960209081525f928352604080842090915290825290205460ff1681565b60405190151581526020015b60405180910390f35b6101c56101a63660046110ca565b609860209081525f928352604080842090915290825290205460ff1681565b60405161018f9190611115565b610154610498565b6101836101e836600461113b565b606654600160ff9092169190911b9081161490565b6066545b60405190815260200161018f565b610154610547565b61023e7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200161018f565b6033546001600160a01b031661023e565b6101546102753660046111d0565b610558565b6102016102883660046112bd565b610777565b61015461029b366004611300565b6107f6565b6101546102ae36600461131b565b6108db565b6102017f809c5ac049c45b7a7f050a20f00c16cf63797efbf8b1eb8d749fdfa39ff8f92981565b6101546102e83660046110a0565b610922565b6102017fda2c89bafdd34776a2b8bb9c83c82f419e20cc8c67207f70edd58249b92661bd81565b6102017f4ee65f64218c67b68da66fd0db16560040a6b973290b9e71912d661ee53fe49581565b61023e7f000000000000000000000000000000000000000000000000000000000000000081565b610154610370366004611075565b335f90815260996020908152604080832093835292905220805460ff19166001179055565b6101546103a3366004611300565b610a3e565b610201610ab7565b6101546103be366004611075565b610b9c565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa158015610425573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104499190611389565b61046657604051631d77d47760e21b815260040160405180910390fd5b606654818116811461048b5760405163c61dca5d60e01b815260040160405180910390fd5b61049482610cab565b5050565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa1580156104fa573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061051e9190611389565b61053b57604051631d77d47760e21b815260040160405180910390fd5b6105455f19610cab565b565b61054f610ce8565b6105455f610d42565b6066545f906001908116036105805760405163840a48d560e01b815260040160405180910390fd5b6001335f9081526098602090815260408083206001600160a01b038816845290915290205460ff1660018111156105b9576105b9611101565b036105d757604051631aa528bb60e11b815260040160405180910390fd5b6001600160a01b0383165f90815260996020908152604080832085830151845290915290205460ff161561061e57604051630d4c4c9160e21b815260040160405180910390fd5b6040516336b87bd760e11b81526001600160a01b0384811660048301527f00000000000000000000000000000000000000000000000000000000000000001690636d70f7ae90602401602060405180830381865afa158015610682573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106a69190611389565b6106c357604051639f88c8af60e01b815260040160405180910390fd5b6106e7836106db853386602001518760400151610777565b84516040860151610d93565b6001600160a01b0383165f81815260996020908152604080832086830151845282528083208054600160ff19918216811790925533808652609885528386208787529094529382902080549094168117909355519092917ff0952b1c65271d819d39983d2abb044b9cace59bcc4d4dd389f586ebdcb15b419161076a9190611115565b60405180910390a3505050565b604080517fda2c89bafdd34776a2b8bb9c83c82f419e20cc8c67207f70edd58249b92661bd60208201526001600160a01b038087169282019290925290841660608201526080810183905260a081018290525f906107ed9060c00160405160208183030381529060405280519060200120610deb565b95945050505050565b6066545f9060019081160361081e5760405163840a48d560e01b815260040160405180910390fd5b6001335f9081526098602090815260408083206001600160a01b038716845290915290205460ff16600181111561085757610857611101565b14610875576040516352df45c960e01b815260040160405180910390fd5b335f8181526098602090815260408083206001600160a01b0387168085529252808320805460ff191690555190917ff0952b1c65271d819d39983d2abb044b9cace59bcc4d4dd389f586ebdcb15b41916108cf9190611115565b60405180910390a35050565b336001600160a01b03167fa89c1dc243d8908a96dd84944bcc97d6bc6ac00dd78e20621576be6a3c94371383836040516109169291906113a8565b60405180910390a25050565b5f54610100900460ff161580801561094057505f54600160ff909116105b806109595750303b15801561095957505f5460ff166001145b6109c15760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b5f805460ff1916600117905580156109e2575f805461ff0019166101001790555b6109eb82610cab565b6109f483610d42565b8015610a39575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050565b610a46610ce8565b6001600160a01b038116610aab5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016109b8565b610ab481610d42565b50565b5f7f00000000000000000000000000000000000000000000000000000000000000004614610b775750604080518082018252600a81526922b4b3b2b72630bcb2b960b11b60209182015281517f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a866818301527f71b625cfad44bac63b13dba07f2e1d6084ee04b6f8752101ece6126d584ee6ea81840152466060820152306080808301919091528351808303909101815260a0909101909252815191012090565b507f000000000000000000000000000000000000000000000000000000000000000090565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610bf8573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c1c91906113d6565b6001600160a01b0316336001600160a01b031614610c4d5760405163794821ff60e01b815260040160405180910390fd5b60665480198219811614610c745760405163c61dca5d60e01b815260040160405180910390fd5b606682905560405182815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c90602001610916565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a250565b6033546001600160a01b031633146105455760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016109b8565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b42811015610db457604051630819bdcd60e01b815260040160405180910390fd5b610dc86001600160a01b0385168484610e31565b610de557604051638baa579f60e01b815260040160405180910390fd5b50505050565b5f610df4610ab7565b60405161190160f01b6020820152602281019190915260428101839052606201604051602081830303815290604052805190602001209050919050565b5f5f5f610e3e8585610e8f565b90925090505f816004811115610e5657610e56611101565b148015610e745750856001600160a01b0316826001600160a01b0316145b80610e855750610e85868686610ed1565b9695505050505050565b5f5f8251604103610ec3576020830151604084015160608501515f1a610eb787828585610fb8565b94509450505050610eca565b505f905060025b9250929050565b5f5f5f856001600160a01b0316631626ba7e60e01b8686604051602401610ef99291906113f1565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b0319909416939093179092529051610f37919061142d565b5f60405180830381855afa9150503d805f8114610f6f576040519150601f19603f3d011682016040523d82523d5f602084013e610f74565b606091505b5091509150818015610f8857506020815110155b8015610e8557508051630b135d3f60e11b90610fad9083016020908101908401611443565b149695505050505050565b5f807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0831115610fed57505f9050600361106c565b604080515f8082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa15801561103e573d5f5f3e3d5ffd5b5050604051601f1901519150506001600160a01b038116611066575f6001925092505061106c565b91505f90505b94509492505050565b5f60208284031215611085575f5ffd5b5035919050565b6001600160a01b0381168114610ab4575f5ffd5b5f5f604083850312156110b1575f5ffd5b82356110bc8161108c565b946020939093013593505050565b5f5f604083850312156110db575f5ffd5b82356110e68161108c565b915060208301356110f68161108c565b809150509250929050565b634e487b7160e01b5f52602160045260245ffd5b602081016002831061113557634e487b7160e01b5f52602160045260245ffd5b91905290565b5f6020828403121561114b575f5ffd5b813560ff8116811461115b575f5ffd5b9392505050565b634e487b7160e01b5f52604160045260245ffd5b6040516060810167ffffffffffffffff8111828210171561119957611199611162565b60405290565b604051601f8201601f1916810167ffffffffffffffff811182821017156111c8576111c8611162565b604052919050565b5f5f604083850312156111e1575f5ffd5b82356111ec8161108c565b9150602083013567ffffffffffffffff811115611207575f5ffd5b830160608186031215611218575f5ffd5b611220611176565b813567ffffffffffffffff811115611236575f5ffd5b8201601f81018713611246575f5ffd5b803567ffffffffffffffff81111561126057611260611162565b611273601f8201601f191660200161119f565b818152886020838501011115611287575f5ffd5b816020840160208301375f6020928201830152835283810135908301525060409182013591810191909152919491935090915050565b5f5f5f5f608085870312156112d0575f5ffd5b84356112db8161108c565b935060208501356112eb8161108c565b93969395505050506040820135916060013590565b5f60208284031215611310575f5ffd5b813561115b8161108c565b5f5f6020838503121561132c575f5ffd5b823567ffffffffffffffff811115611342575f5ffd5b8301601f81018513611352575f5ffd5b803567ffffffffffffffff811115611368575f5ffd5b856020828401011115611379575f5ffd5b6020919091019590945092505050565b5f60208284031215611399575f5ffd5b8151801515811461115b575f5ffd5b60208152816020820152818360408301375f818301604090810191909152601f909201601f19160101919050565b5f602082840312156113e6575f5ffd5b815161115b8161108c565b828152604060208201525f82518060408401528060208501606085015e5f606082850101526060601f19601f8301168401019150509392505050565b5f82518060208501845e5f920191825250919050565b5f60208284031215611453575f5ffd5b505191905056fea2646970667358221220dac23420e90e0bd5ba6e8cdf6633661ff54956fb8326b8a2b164dca48bbf756964736f6c634300081b0033", } // AVSDirectoryABI is the input ABI used to generate the binding from. diff --git a/pkg/bindings/AllocationManager/binding.go b/pkg/bindings/AllocationManager/binding.go index a4e215221a..8146779a82 100644 --- a/pkg/bindings/AllocationManager/binding.go +++ b/pkg/bindings/AllocationManager/binding.go @@ -81,7 +81,7 @@ type OperatorSet struct { // AllocationManagerMetaData contains all meta data concerning the AllocationManager contract. var AllocationManagerMetaData = &bind.MetaData{ ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"_delegation\",\"type\":\"address\",\"internalType\":\"contractIDelegationManager\"},{\"name\":\"_pauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"},{\"name\":\"_permissionController\",\"type\":\"address\",\"internalType\":\"contractIPermissionController\"},{\"name\":\"_DEALLOCATION_DELAY\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"_ALLOCATION_CONFIGURATION_DELAY\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"ALLOCATION_CONFIGURATION_DELAY\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"DEALLOCATION_DELAY\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"addStrategiesToOperatorSet\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetId\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"clearDeallocationQueue\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"numToClear\",\"type\":\"uint16[]\",\"internalType\":\"uint16[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"createOperatorSets\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"params\",\"type\":\"tuple[]\",\"internalType\":\"structIAllocationManagerTypes.CreateSetParams[]\",\"components\":[{\"name\":\"operatorSetId\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"delegation\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIDelegationManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"deregisterFromOperatorSets\",\"inputs\":[{\"name\":\"params\",\"type\":\"tuple\",\"internalType\":\"structIAllocationManagerTypes.DeregisterParams\",\"components\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetIds\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"getAVSRegistrar\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIAVSRegistrar\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAllocatableMagnitude\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAllocatedSets\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple[]\",\"internalType\":\"structOperatorSet[]\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAllocatedStrategies\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAllocation\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIAllocationManagerTypes.Allocation\",\"components\":[{\"name\":\"currentMagnitude\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"pendingDiff\",\"type\":\"int128\",\"internalType\":\"int128\"},{\"name\":\"effectBlock\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAllocationDelay\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAllocations\",\"inputs\":[{\"name\":\"operators\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple[]\",\"internalType\":\"structIAllocationManagerTypes.Allocation[]\",\"components\":[{\"name\":\"currentMagnitude\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"pendingDiff\",\"type\":\"int128\",\"internalType\":\"int128\"},{\"name\":\"effectBlock\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getEncumberedMagnitude\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getMaxMagnitude\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getMaxMagnitudes\",\"inputs\":[{\"name\":\"operators\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64[]\",\"internalType\":\"uint64[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getMaxMagnitudes\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64[]\",\"internalType\":\"uint64[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getMaxMagnitudesAtBlock\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"blockNumber\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64[]\",\"internalType\":\"uint64[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getMemberCount\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getMembers\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getMinimumSlashableStake\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"operators\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"futureBlock\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[{\"name\":\"slashableStake\",\"type\":\"uint256[][]\",\"internalType\":\"uint256[][]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getOperatorSetCount\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getRegisteredSets\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple[]\",\"internalType\":\"structOperatorSet[]\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getStrategiesInOperatorSet\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getStrategyAllocations\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple[]\",\"internalType\":\"structOperatorSet[]\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"\",\"type\":\"tuple[]\",\"internalType\":\"structIAllocationManagerTypes.Allocation[]\",\"components\":[{\"name\":\"currentMagnitude\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"pendingDiff\",\"type\":\"int128\",\"internalType\":\"int128\"},{\"name\":\"effectBlock\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"initialOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"initialPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"isMemberOfOperatorSet\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isOperatorSet\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"modifyAllocations\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"params\",\"type\":\"tuple[]\",\"internalType\":\"structIAllocationManagerTypes.AllocateParams[]\",\"components\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"newMagnitudes\",\"type\":\"uint64[]\",\"internalType\":\"uint64[]\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"pauseAll\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[{\"name\":\"index\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pauserRegistry\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"permissionController\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIPermissionController\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"registerForOperatorSets\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"params\",\"type\":\"tuple\",\"internalType\":\"structIAllocationManagerTypes.RegisterParams\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetIds\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"removeStrategiesFromOperatorSet\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetId\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setAVSRegistrar\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"registrar\",\"type\":\"address\",\"internalType\":\"contractIAVSRegistrar\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setAllocationDelay\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"delay\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"slashOperator\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"params\",\"type\":\"tuple\",\"internalType\":\"structIAllocationManagerTypes.SlashingParams\",\"components\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetId\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"wadsToSlash\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"},{\"name\":\"description\",\"type\":\"string\",\"internalType\":\"string\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"updateAVSMetadataURI\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"metadataURI\",\"type\":\"string\",\"internalType\":\"string\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"AVSMetadataURIUpdated\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"metadataURI\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"AVSRegistrarSet\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"registrar\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIAVSRegistrar\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"AllocationDelaySet\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"delay\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"},{\"name\":\"effectBlock\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"AllocationUpdated\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"magnitude\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"effectBlock\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"EncumberedMagnitudeUpdated\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"encumberedMagnitude\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"MaxMagnitudeUpdated\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"maxMagnitude\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorAddedToOperatorSet\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorRemovedFromOperatorSet\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorSetCreated\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorSlashed\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"strategies\",\"type\":\"address[]\",\"indexed\":false,\"internalType\":\"contractIStrategy[]\"},{\"name\":\"wadSlashed\",\"type\":\"uint256[]\",\"indexed\":false,\"internalType\":\"uint256[]\"},{\"name\":\"description\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StrategyAddedToOperatorSet\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StrategyRemovedFromOperatorSet\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"AlreadyMemberOfSet\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"CurrentlyPaused\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"Empty\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InputAddressZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InputArrayLengthMismatch\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InsufficientMagnitude\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidCaller\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidNewPausedStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidOperator\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidOperatorSet\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidPermissions\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidSnapshotOrdering\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidWadToSlash\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ModificationAlreadyPending\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotMemberOfSet\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyPauser\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyUnpauser\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OperatorNotSlashable\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OutOfBounds\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SameMagnitude\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StrategiesMustBeInAscendingOrder\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StrategyAlreadyInOperatorSet\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StrategyNotInOperatorSet\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"UninitializedAllocationDelay\",\"inputs\":[]}]", - Bin: "0x610120604052348015610010575f5ffd5b50604051615a79380380615a7983398101604081905261002f91610180565b82858383876001600160a01b03811661005b576040516339b190bb60e11b815260040160405180910390fd5b6001600160a01b0390811660805292831660a05263ffffffff91821660c0521660e052166101005261008b610095565b50505050506101e9565b5f54610100900460ff16156101005760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff9081161461014f575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b0381168114610165575f5ffd5b50565b805163ffffffff8116811461017b575f5ffd5b919050565b5f5f5f5f5f60a08688031215610194575f5ffd5b855161019f81610151565b60208701519095506101b081610151565b60408701519094506101c181610151565b92506101cf60608701610168565b91506101dd60808701610168565b90509295509295909350565b60805160a05160c05160e051610100516157ff61027a5f395f81816103f9015261359701525f81816105480152613b9701525f818161031e015281816120c601526127bd01525f81816106c701528181610c77015281816115fc01528181611c6301528181611ccd0152612a8401525f818161056f0152818161077201528181611d72015261320e01526157ff5ff3fe608060405234801561000f575f5ffd5b5060043610610281575f3560e01c80636e875dba11610156578063adc2e3d9116100ca578063cd6dc68711610084578063cd6dc6871461069c578063d3d96ff4146106af578063df5cf723146106c2578063f2fde38b146106e9578063f605ce08146106fc578063fabc1cbc1461070f575f5ffd5b8063adc2e3d91461060e578063b2447af714610621578063b66bd98914610634578063b9fbaed114610647578063ba1a84e514610676578063c221d8ae14610689575f5ffd5b80638ce648541161011b5780638ce64854146105915780638da5cb5b146105b157806394d7d00c146105c2578063952899ee146105d5578063a9333ec8146105e8578063a9821821146105fb575f5ffd5b80636e875dba14610515578063715018a61461052857806379ae50cd146105305780637bc1ef6114610543578063886f11951461056a575f5ffd5b80634657e26a116101f8578063595c6a67116101b2578063595c6a67146104875780635ac86ab71461048f5780635c975abb146104b2578063670d3ba2146104c45780636cfb4481146104d75780636e3492b514610502575f5ffd5b80634657e26a146103f45780634a10ffe51461041b5780634b5046ef1461043b57806350feea201461044e578063547afb871461046157806356c483e614610474575f5ffd5b80632981eb77116102495780632981eb77146103195780632bab2c4a14610355578063304c10cd1461037557806336352057146103a057806340120dab146103b35780634177a87c146103d4575f5ffd5b806310e1b9b814610285578063136439dd146102ae57806315fe5028146102c3578063260dc758146102e3578063261f84e014610306575b5f5ffd5b610298610293366004614736565b610722565b6040516102a5919061477d565b60405180910390f35b6102c16102bc3660046147b0565b61075d565b005b6102d66102d13660046147c7565b610832565b6040516102a59190614845565b6102f66102f1366004614857565b610949565b60405190151581526020016102a5565b6102c16103143660046148b1565b610980565b6103407f000000000000000000000000000000000000000000000000000000000000000081565b60405163ffffffff90911681526020016102a5565b610368610363366004614996565b610c23565b6040516102a59190614a4a565b6103886103833660046147c7565b610f10565b6040516001600160a01b0390911681526020016102a5565b6102c16103ae366004614aad565b610f3f565b6103c66103c1366004614aff565b611751565b6040516102a5929190614b8c565b6103e76103e2366004614857565b6118cc565b6040516102a59190614be9565b6103887f000000000000000000000000000000000000000000000000000000000000000081565b61042e610429366004614bfb565b6118f0565b6040516102a59190614c3e565b6102c1610449366004614c89565b611998565b6102c161045c366004614d09565b611a52565b61042e61046f366004614d67565b611bb0565b6102c1610482366004614da9565b611c58565b6102c1611d5d565b6102f661049d366004614ddc565b606654600160ff9092169190911b9081161490565b6066545b6040519081526020016102a5565b6102f66104d2366004614dfc565b611e0c565b6104ea6104e5366004614aff565b611e1d565b6040516001600160401b0390911681526020016102a5565b6102c1610510366004614e3d565b611e32565b6103e7610523366004614857565b612202565b6102c1612213565b6102d661053e3660046147c7565b612224565b6103407f000000000000000000000000000000000000000000000000000000000000000081565b6103887f000000000000000000000000000000000000000000000000000000000000000081565b6105a461059f366004614e6e565b6122fe565b6040516102a59190614eb1565b6033546001600160a01b0316610388565b61042e6105d0366004614ec3565b6123c3565b6102c16105e3366004614f1e565b6124af565b6104ea6105f6366004614aff565b612976565b6102c16106093660046150c7565b6129a5565b6102c161061c366004615145565b612a15565b6104b661062f366004614857565b612d64565b6102c1610642366004614d09565b612d86565b61065a6106553660046147c7565b612ee0565b60408051921515835263ffffffff9091166020830152016102a5565b6104b66106843660046147c7565b612f7a565b6103e7610697366004614dfc565b612f9a565b6102c16106aa366004615187565b612fcb565b6102c16106bd366004614aff565b6130e8565b6103887f000000000000000000000000000000000000000000000000000000000000000081565b6102c16106f73660046147c7565b613187565b6104ea61070a366004614aff565b613200565b6102c161071d3660046147b0565b61320c565b604080516060810182525f80825260208201819052918101829052906107518561074b86613322565b85613385565b925050505b9392505050565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa1580156107bf573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107e391906151b1565b61080057604051631d77d47760e21b815260040160405180910390fd5b60665481811681146108255760405163c61dca5d60e01b815260040160405180910390fd5b61082e826134f1565b5050565b6001600160a01b0381165f908152609d60205260408120606091906108569061352e565b90505f816001600160401b038111156108715761087161465a565b6040519080825280602002602001820160405280156108b557816020015b604080518082019091525f808252602082015281526020019060019003908161088f5790505b5090505f5b82811015610941576001600160a01b0385165f908152609d6020526040902061091c906108e79083613537565b604080518082019091525f80825260208201525060408051808201909152606082901c815263ffffffff909116602082015290565b82828151811061092e5761092e6151d0565b60209081029190910101526001016108ba565b509392505050565b60208082015182516001600160a01b03165f90815260989092526040822061097a9163ffffffff9081169061354216565b92915050565b8261098a81613559565b6109a75760405163932d94f760e01b815260040160405180910390fd5b5f5b82811015610c1c575f6040518060400160405280876001600160a01b031681526020018686858181106109de576109de6151d0565b90506020028101906109f091906151e4565b6109fe906020810190615202565b63ffffffff168152509050610a48816020015163ffffffff1660985f896001600160a01b03166001600160a01b031681526020019081526020015f2061360390919063ffffffff16565b610a6557604051631fb1705560e21b815260040160405180910390fd5b7f31629285ead2335ae0933f86ed2ae63321f7af77b4e6eaabc42c057880977e6c6040518060400160405280886001600160a01b03168152602001836020015163ffffffff16815250604051610abb919061521b565b60405180910390a15f610acd82613322565b90505f5b868685818110610ae357610ae36151d0565b9050602002810190610af591906151e4565b610b03906020810190615229565b9050811015610c1157610b79878786818110610b2157610b216151d0565b9050602002810190610b3391906151e4565b610b41906020810190615229565b83818110610b5157610b516151d0565b9050602002016020810190610b6691906147c7565b5f8481526099602052604090209061360e565b507f7ab260fe0af193db5f4986770d831bda4ea46099dc817e8b6716dcae8af8e88b83888887818110610bae57610bae6151d0565b9050602002810190610bc091906151e4565b610bce906020810190615229565b84818110610bde57610bde6151d0565b9050602002016020810190610bf391906147c7565b604051610c0192919061526e565b60405180910390a1600101610ad1565b5050506001016109a9565b5050505050565b606083516001600160401b03811115610c3e57610c3e61465a565b604051908082528060200260200182016040528015610c7157816020015b6060815260200190600190039081610c5c5790505b5090505f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663f0e0e67686866040518363ffffffff1660e01b8152600401610cc3929190615294565b5f60405180830381865afa158015610cdd573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610d0491908101906152b8565b90505f5b8551811015610f06575f868281518110610d2457610d246151d0565b6020026020010151905085516001600160401b03811115610d4757610d4761465a565b604051908082528060200260200182016040528015610d70578160200160208202803683370190505b50848381518110610d8357610d836151d0565b60209081029190910101525f5b8651811015610efc575f878281518110610dac57610dac6151d0565b6020908102919091018101516001600160a01b038086165f90815260a1845260408082209284168252919093528220909250610de790613622565b9050806001600160401b03165f03610e00575050610ef4565b5f610e0c858d85610722565b90508863ffffffff16816040015163ffffffff1611158015610e3457505f8160200151600f0b125b15610e5657610e4a815f01518260200151613635565b6001600160401b031681525b80515f90610e71906001600160401b03908116908516613649565b9050610eb881898981518110610e8957610e896151d0565b60200260200101518781518110610ea257610ea26151d0565b602002602001015161365d90919063ffffffff16565b898881518110610eca57610eca6151d0565b60200260200101518681518110610ee357610ee36151d0565b602002602001018181525050505050505b600101610d90565b5050600101610d08565b5050949350505050565b6001600160a01b038082165f908152609760205260408120549091168015610f385780610756565b5090919050565b606654600190600290811603610f685760405163840a48d560e01b815260040160405180910390fd5b82610f7281613559565b610f8f5760405163932d94f760e01b815260040160405180910390fd5b5f6040518060400160405280866001600160a01b03168152602001856020016020810190610fbd9190615202565b63ffffffff16905290505f610fde610fd860208701876147c7565b83613671565b9050610fed6060860186615229565b9050610ffc6040870187615229565b90501461101c576040516343714afd60e01b815260040160405180910390fd5b60208083015183516001600160a01b03165f9081526098909252604090912061104e9163ffffffff9081169061354216565b61106b57604051631fb1705560e21b815260040160405180910390fd5b806110895760405163ebbff49760e01b815260040160405180910390fd5b5f6110976040870187615229565b90506001600160401b038111156110b0576110b061465a565b6040519080825280602002602001820160405280156110d9578160200160208202803683370190505b5090505f5b6110eb6040880188615229565b90508110156116e25780158061117e57506111096040880188615229565b6111146001846153d8565b818110611123576111236151d0565b905060200201602081019061113891906147c7565b6001600160a01b031661114e6040890189615229565b8381811061115e5761115e6151d0565b905060200201602081019061117391906147c7565b6001600160a01b0316115b61119b57604051639f1c805360e01b815260040160405180910390fd5b6111a86060880188615229565b828181106111b8576111b86151d0565b905060200201355f1080156111f85750670de0b6b3a76400006111de6060890189615229565b838181106111ee576111ee6151d0565b9050602002013511155b61121557604051631353603160e01b815260040160405180910390fd5b6112716112256040890189615229565b83818110611235576112356151d0565b905060200201602081019061124a91906147c7565b60995f61125688613322565b81526020019081526020015f206136e790919063ffffffff16565b61128e576040516331bc342760e11b815260040160405180910390fd5b5f806112e06112a060208b018b6147c7565b6112a988613322565b6112b660408d018d615229565b878181106112c6576112c66151d0565b90506020020160208101906112db91906147c7565b613385565b805191935091506001600160401b03165f036112fd5750506116da565b5f61133861130e60608c018c615229565b8681811061131e5761131e6151d0565b85516001600160401b031692602090910201359050613708565b83519091506113536001600160401b03808416908316613649565b868681518110611365576113656151d0565b60200260200101818152505081835f0181815161138291906153eb565b6001600160401b031690525083518290859061139f9083906153eb565b6001600160401b03169052506020840180518391906113bf9083906153eb565b6001600160401b031690525060208301515f600f9190910b12156114da575f6114226113ee60608e018e615229565b888181106113fe576113fe6151d0565b9050602002013585602001516114139061540a565b6001600160801b031690613708565b9050806001600160401b03168460200181815161143f919061542e565b600f0b9052507f1487af5418c47ee5ea45ef4a93398668120890774a9e13487e61e9dc3baf76dd61147360208e018e6147c7565b8a8e80604001906114849190615229565b8a818110611494576114946151d0565b90506020020160208101906114a991906147c7565b6114ba885f01518960200151613635565b88604001516040516114d095949392919061545b565b60405180910390a1505b61152c6114ea60208d018d6147c7565b6114f38a613322565b61150060408f018f615229565b89818110611510576115106151d0565b905060200201602081019061152591906147c7565b878761371e565b7f1487af5418c47ee5ea45ef4a93398668120890774a9e13487e61e9dc3baf76dd61155a60208d018d6147c7565b8961156860408f018f615229565b89818110611578576115786151d0565b905060200201602081019061158d91906147c7565b86516040516115a19493929190439061545b565b60405180910390a16115f26115b960208d018d6147c7565b6115c660408e018e615229565b888181106115d6576115d66151d0565b90506020020160208101906115eb91906147c7565b865161395e565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001663601bb36f61162e60208e018e6147c7565b61163b60408f018f615229565b8981811061164b5761164b6151d0565b905060200201602081019061166091906147c7565b875160405160e085901b6001600160e01b03191681526001600160a01b0393841660048201529290911660248301526001600160401b0380861660448401521660648201526084015f604051808303815f87803b1580156116bf575f5ffd5b505af11580156116d1573d5f5f3e3d5ffd5b50505050505050505b6001016110de565b507f80969ad29428d6797ee7aad084f9e4a42a82fc506dcd2ca3b6fb431f85ccebe561171160208801886147c7565b8461171f60408a018a615229565b8561172d60808d018d6154ac565b6040516117409796959493929190615516565b60405180910390a150505050505050565b6001600160a01b0382165f908152609d6020526040812060609182916117769061352e565b90505f816001600160401b038111156117915761179161465a565b6040519080825280602002602001820160405280156117d557816020015b604080518082019091525f80825260208201528152602001906001900390816117af5790505b5090505f826001600160401b038111156117f1576117f161465a565b60405190808252806020026020018201604052801561183a57816020015b604080516060810182525f80825260208083018290529282015282525f1990920191018161180f5790505b5090505f5b838110156118bd576001600160a01b0388165f908152609d6020526040812061186c906108e79084613537565b905080848381518110611881576118816151d0565b602002602001018190525061189789828a610722565b8383815181106118a9576118a96151d0565b60209081029190910101525060010161183f565b509093509150505b9250929050565b60605f61075660995f6118de86613322565b81526020019081526020015f206139e0565b60605f83516001600160401b0381111561190c5761190c61465a565b604051908082528060200260200182016040528015611935578160200160208202803683370190505b5090505f5b845181101561094157611966858281518110611958576119586151d0565b602002602001015185612976565b828281518110611978576119786151d0565b6001600160401b039092166020928302919091019091015260010161193a565b6066545f906001908116036119c05760405163840a48d560e01b815260040160405180910390fd5b8382146119e0576040516343714afd60e01b815260040160405180910390fd5b5f5b84811015611a4957611a4187878784818110611a0057611a006151d0565b9050602002016020810190611a1591906147c7565b868685818110611a2757611a276151d0565b9050602002016020810190611a3c91906155ac565b6139ec565b6001016119e2565b50505050505050565b83611a5c81613559565b611a795760405163932d94f760e01b815260040160405180910390fd5b604080518082019091526001600160a01b038616815263ffffffff851660208201525f611aa582613322565b9050611ae6826020015163ffffffff1660985f8a6001600160a01b03166001600160a01b031681526020019081526020015f2061354290919063ffffffff16565b611b0357604051631fb1705560e21b815260040160405180910390fd5b5f5b84811015611ba657611b22868683818110610b5157610b516151d0565b611b3f5760405163585cfb2f60e01b815260040160405180910390fd5b7f7ab260fe0af193db5f4986770d831bda4ea46099dc817e8b6716dcae8af8e88b83878784818110611b7357611b736151d0565b9050602002016020810190611b8891906147c7565b604051611b9692919061526e565b60405180910390a1600101611b05565b5050505050505050565b60605f82516001600160401b03811115611bcc57611bcc61465a565b604051908082528060200260200182016040528015611bf5578160200160208202803683370190505b5090505f5b835181101561094157611c2685858381518110611c1957611c196151d0565b6020026020010151612976565b828281518110611c3857611c386151d0565b6001600160401b0390921660209283029190910190910152600101611bfa565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614611d5357611c9182613559565b611cae576040516348f5c3ed60e01b815260040160405180910390fd5b6040516336b87bd760e11b81526001600160a01b0383811660048301527f00000000000000000000000000000000000000000000000000000000000000001690636d70f7ae90602401602060405180830381865afa158015611d12573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611d3691906151b1565b611d535760405163ccea9e6f60e01b815260040160405180910390fd5b61082e8282613af0565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa158015611dbf573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611de391906151b1565b611e0057604051631d77d47760e21b815260040160405180910390fd5b611e0a5f196134f1565b565b5f61075683609a5f61125686613322565b5f5f611e298484613c9c565b95945050505050565b606654600290600490811603611e5b5760405163840a48d560e01b815260040160405180910390fd5b611e70611e6b60208401846147c7565b613559565b80611e895750611e89611e6b60408401602085016147c7565b611ea6576040516348f5c3ed60e01b815260040160405180910390fd5b5f5b611eb56040840184615229565b9050811015612177575f6040518060400160405280856020016020810190611edd91906147c7565b6001600160a01b03168152602001611ef86040870187615229565b85818110611f0857611f086151d0565b9050602002016020810190611f1d9190615202565b63ffffffff168152509050611f6a816020015163ffffffff1660985f876020016020810190611f4c91906147c7565b6001600160a01b0316815260208101919091526040015f2090613542565b611f8757604051631fb1705560e21b815260040160405180910390fd5b609e5f611f9760208701876147c7565b6001600160a01b03166001600160a01b031681526020019081526020015f205f611fc083613322565b815260208101919091526040015f205460ff16611ff0576040516325131d4f60e01b815260040160405180910390fd5b61202a611ffc82613322565b609c5f61200c60208901896147c7565b6001600160a01b0316815260208101919091526040015f2090613e0b565b5061206261203b60208601866147c7565b609a5f61204785613322565b81526020019081526020015f20613e1690919063ffffffff16565b5061207060208501856147c7565b6001600160a01b03167fad34c3070be1dffbcaa499d000ba2b8d9848aefcac3059df245dd95c4ece14fe826040516120a8919061521b565b60405180910390a2604080518082019091525f8152602081016120eb7f0000000000000000000000000000000000000000000000000000000000000000436155cd565b63ffffffff169052609e5f61210360208801886147c7565b6001600160a01b03166001600160a01b031681526020019081526020015f205f61212c84613322565b81526020808201929092526040015f2082518154939092015163ffffffff166101000264ffffffff00199215159290921664ffffffffff199093169290921717905550600101611ea8565b5061218b61038360408401602085016147c7565b6001600160a01b0316639d8e0c236121a660208501856147c7565b6121b36040860186615229565b6040518463ffffffff1660e01b81526004016121d193929190615622565b5f604051808303815f87803b1580156121e8575f5ffd5b505af19250505080156121f9575060015b1561082e575050565b606061097a609a5f6118de85613322565b61221b613e2a565b611e0a5f613e84565b6001600160a01b0381165f908152609c60205260408120606091906122489061352e565b90505f816001600160401b038111156122635761226361465a565b6040519080825280602002602001820160405280156122a757816020015b604080518082019091525f80825260208201528152602001906001900390816122815790505b5090505f5b82811015610941576001600160a01b0385165f908152609c602052604090206122d9906108e79083613537565b8282815181106122eb576122eb6151d0565b60209081029190910101526001016122ac565b60605f84516001600160401b0381111561231a5761231a61465a565b60405190808252806020026020018201604052801561236357816020015b604080516060810182525f80825260208083018290529282015282525f199092019101816123385790505b5090505f5b85518110156123ba57612395868281518110612386576123866151d0565b60200260200101518686610722565b8282815181106123a7576123a76151d0565b6020908102919091010152600101612368565b50949350505050565b60605f83516001600160401b038111156123df576123df61465a565b604051908082528060200260200182016040528015612408578160200160208202803683370190505b5090505f5b84518110156123ba576001600160a01b0386165f90815260a160205260408120865161247d92879291899086908110612448576124486151d0565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020015f20613ed590919063ffffffff16565b82828151811061248f5761248f6151d0565b6001600160401b039092166020928302919091019091015260010161240d565b6066545f906001908116036124d75760405163840a48d560e01b815260040160405180910390fd5b6124e083613559565b6124fd576040516348f5c3ed60e01b815260040160405180910390fd5b5f5f5f61250986612ee0565b915091508161252b5760405163fa55fc8160e01b815260040160405180910390fd5b91505f90505b8351811015610c1c5783818151811061254c5761254c6151d0565b6020026020010151604001515184828151811061256b5761256b6151d0565b6020026020010151602001515114612596576040516343714afd60e01b815260040160405180910390fd5b5f8482815181106125a9576125a96151d0565b602090810291909101810151518082015181516001600160a01b03165f908152609890935260409092209092506125e99163ffffffff9081169061354216565b61260657604051631fb1705560e21b815260040160405180910390fd5b5f6126118783613671565b90505f5b868481518110612627576126276151d0565b6020026020010151602001515181101561296b575f87858151811061264e5761264e6151d0565b602002602001015160200151828151811061266b5761266b6151d0565b60200260200101519050612682898261ffff6139ec565b5f5f6126918b61074b88613322565b915091508060200151600f0b5f146126bc57604051630d8fcbe360e41b815260040160405180910390fd5b5f6126c987858489613ee9565b905061270e825f01518c8a815181106126e4576126e46151d0565b6020026020010151604001518781518110612701576127016151d0565b6020026020010151613f1f565b600f0b602083018190525f0361273757604051634606179360e11b815260040160405180910390fd5b5f8260200151600f0b121561287b5780156127fd576127b861275888613322565b6001600160a01b03808f165f90815260a360209081526040808320938a16835292905220908154600160801b90819004600f0b5f818152600180860160205260409091209390935583546001600160801b03908116939091011602179055565b6127e27f0000000000000000000000000000000000000000000000000000000000000000436155cd565b6127ed9060016155cd565b63ffffffff1660408301526128e8565b61280f83602001518360200151613635565b6001600160401b031660208401528a518b9089908110612831576128316151d0565b602002602001015160400151858151811061284e5761284e6151d0565b6020908102919091018101516001600160401b031683525f9083015263ffffffff431660408301526128e8565b5f8260200151600f0b13156128e85761289c83602001518360200151613635565b6001600160401b0390811660208501819052845190911610156128d257604051636c9be0bf60e01b815260040160405180910390fd5b6128dc89436155cd565b63ffffffff1660408301525b6128fd8c6128f589613322565b86868661371e565b7f1487af5418c47ee5ea45ef4a93398668120890774a9e13487e61e9dc3baf76dd8c61292b6108e78a613322565b8661293d865f01518760200151613635565b866040015160405161295395949392919061545b565b60405180910390a15050600190920191506126159050565b505050600101612531565b6001600160a01b038083165f90815260a160209081526040808320938516835292905290812061075690613622565b826129af81613559565b6129cc5760405163932d94f760e01b815260040160405180910390fd5b836001600160a01b03167fa89c1dc243d8908a96dd84944bcc97d6bc6ac00dd78e20621576be6a3c9437138484604051612a07929190615646565b60405180910390a250505050565b606654600290600490811603612a3e5760405163840a48d560e01b815260040160405180910390fd5b82612a4881613559565b612a655760405163932d94f760e01b815260040160405180910390fd5b6040516336b87bd760e11b81526001600160a01b0385811660048301527f00000000000000000000000000000000000000000000000000000000000000001690636d70f7ae90602401602060405180830381865afa158015612ac9573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612aed91906151b1565b612b0a5760405163ccea9e6f60e01b815260040160405180910390fd5b5f5b612b196020850185615229565b9050811015612ce157604080518082019091525f9080612b3c60208801886147c7565b6001600160a01b03168152602001868060200190612b5a9190615229565b85818110612b6a57612b6a6151d0565b9050602002016020810190612b7f9190615202565b63ffffffff90811690915260208083015183516001600160a01b03165f90815260989092526040909120929350612bbb92919081169061354216565b612bd857604051631fb1705560e21b815260040160405180910390fd5b612be28682613671565b15612c0057604051636c6c6e2760e11b815260040160405180910390fd5b612c29612c0c82613322565b6001600160a01b0388165f908152609c6020526040902090613603565b50612c5586609a5f612c3a85613322565b81526020019081526020015f2061360e90919063ffffffff16565b50856001600160a01b03167f43232edf9071753d2321e5fa7e018363ee248e5f2142e6c08edd3265bfb4895e82604051612c8f919061521b565b60405180910390a26001600160a01b0386165f908152609e60205260408120600191612cba84613322565b815260208101919091526040015f20805460ff191691151591909117905550600101612b0c565b50612cf261038360208501856147c7565b6001600160a01b031663adcf73f785612d0e6020870187615229565b612d1b60408901896154ac565b6040518663ffffffff1660e01b8152600401612d3b959493929190615659565b5f604051808303815f87803b158015612d52575f5ffd5b505af1158015611ba6573d5f5f3e3d5ffd5b5f61097a609a5f612d7485613322565b81526020019081526020015f2061352e565b83612d9081613559565b612dad5760405163932d94f760e01b815260040160405180910390fd5b6040805180820182526001600160a01b03871680825263ffffffff80881660208085018290525f93845260989052939091209192612dec929161354216565b612e0957604051631fb1705560e21b815260040160405180910390fd5b5f612e1382613322565b90505f5b84811015611ba657612e5c868683818110612e3457612e346151d0565b9050602002016020810190612e4991906147c7565b5f84815260996020526040902090613e16565b612e79576040516331bc342760e11b815260040160405180910390fd5b7f7b4b073d80dcac55a11177d8459ad9f664ceeb91f71f27167bb14f8152a7eeee83878784818110612ead57612ead6151d0565b9050602002016020810190612ec291906147c7565b604051612ed092919061526e565b60405180910390a1600101612e17565b6001600160a01b0381165f908152609b602090815260408083208151608081018352905463ffffffff80821680845260ff600160201b8404161515958401869052650100000000008304821694840194909452600160481b909104166060820181905284939192919015801590612f615750826060015163ffffffff164310155b15612f70575050604081015160015b9590945092505050565b6001600160a01b0381165f90815260986020526040812061097a9061352e565b6001600160a01b0382165f908152609f6020526040812060609190612fc390826118de86613322565b949350505050565b5f54610100900460ff1615808015612fe957505f54600160ff909116105b806130025750303b15801561300257505f5460ff166001145b61306a5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b5f805460ff19166001179055801561308b575f805461ff0019166101001790555b613094826134f1565b61309d83613e84565b80156130e3575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498906020015b60405180910390a15b505050565b816130f281613559565b61310f5760405163932d94f760e01b815260040160405180910390fd5b6001600160a01b038381165f90815260976020526040902080546001600160a01b0319169184169190911790557f2ae945c40c44dc0ec263f95609c3fdc6952e0aefa22d6374e44f2c997acedf858361316781610f10565b604080516001600160a01b039384168152929091166020830152016130da565b61318f613e2a565b6001600160a01b0381166131f45760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401613061565b6131fd81613e84565b50565b5f5f6123ba8484613c9c565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015613268573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061328c919061569c565b6001600160a01b0316336001600160a01b0316146132bd5760405163794821ff60e01b815260040160405180910390fd5b606654801982198116146132e45760405163c61dca5d60e01b815260040160405180910390fd5b606682905560405182815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c9060200160405180910390a25050565b5f815f0151826020015163ffffffff1660405160200161336d92919060609290921b6bffffffffffffffffffffffff1916825260a01b6001600160a01b031916601482015260200190565b60405160208183030381529060405261097a906156b7565b6040805180820182525f80825260208083018290528351606081018552828152808201839052808501839052845180860186526001600160a01b03898116855260a18452868520908816855290925293822092939281906133e590613622565b6001600160401b0390811682526001600160a01b038981165f81815260a260209081526040808320948c168084529482528083205486169682019690965291815260a082528481208b8252825284812092815291815290839020835160608101855290549283168152600160401b8304600f0b91810191909152600160c01b90910463ffffffff169181018290529192504310156134875790925090506134e9565b613498815f01518260200151613635565b6001600160401b0316815260208101515f600f9190910b12156134d6576134c782602001518260200151613635565b6001600160401b031660208301525b5f60408201819052602082015290925090505b935093915050565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a250565b5f61097a825490565b5f6107568383613f36565b5f8181526001830160205260408120541515610756565b604051631beb2b9760e31b81526001600160a01b0382811660048301523360248301523060448301525f80356001600160e01b0319166064840152917f00000000000000000000000000000000000000000000000000000000000000009091169063df595cb8906084016020604051808303815f875af11580156135df573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061097a91906151b1565b5f6107568383613f5c565b5f610756836001600160a01b038416613f5c565b5f61097a82670de0b6b3a7640000613fa8565b5f610756826001600160401b03851661542e565b5f61075683670de0b6b3a764000084613fec565b5f6107568383670de0b6b3a7640000613fec565b6001600160a01b0382165f908152609e6020526040812081908161369485613322565b815260208082019290925260409081015f2081518083019092525460ff8116151580835261010090910463ffffffff1692820192909252915080612fc357506020015163ffffffff164311159392505050565b6001600160a01b0381165f9081526001830160205260408120541515610756565b5f6107568383670de0b6b3a764000060016140d1565b6020808301516001600160a01b038088165f90815260a284526040808220928816825291909352909120546001600160401b039081169116146137e457602082810180516001600160a01b038881165f81815260a286526040808220938a1680835293875290819020805467ffffffffffffffff19166001600160401b0395861617905593518451918252948101919091529216908201527facf9095feb3a370c9cf692421c69ef320d4db5c66e6a7d29c7694eb02364fc559060600160405180910390a15b6001600160a01b038086165f90815260a060209081526040808320888452825280832093871683529281529082902083518154928501519385015163ffffffff16600160c01b0263ffffffff60c01b196001600160801b038616600160401b026001600160c01b03199095166001600160401b03909316929092179390931716919091179055600f0b156138c6576001600160a01b0385165f908152609f60209081526040808320878452909152902061389e908461360e565b506001600160a01b0385165f908152609d602052604090206138c09085613603565b50610c1c565b80516001600160401b03165f03610c1c576001600160a01b0385165f908152609f6020908152604080832087845290915290206139039084613e16565b506001600160a01b0385165f908152609f60209081526040808320878452909152902061392f9061352e565b5f03610c1c576001600160a01b0385165f908152609d602052604090206139569085613e0b565b505050505050565b6001600160a01b038084165f90815260a16020908152604080832093861683529290522061398d90438361412a565b604080516001600160a01b038086168252841660208201526001600160401b038316918101919091527f1c6458079a41077d003c11faf9bf097e693bd67979e4e6500bac7b29db779b5c906060016130da565b60605f6107568361413e565b6001600160a01b038381165f90815260a360209081526040808320938616835292905290812054600f81810b600160801b909204900b035b5f81118015613a3657508261ffff1682105b15610c1c576001600160a01b038086165f90815260a3602090815260408083209388168352929052908120613a6a90614197565b90505f5f613a79888489613385565b91509150806040015163ffffffff16431015613a9757505050610c1c565b613aa4888489858561371e565b6001600160a01b038089165f90815260a360209081526040808320938b16835292905220613ad1906141e9565b50613adb856156da565b9450613ae6846156f2565b9350505050613a24565b6001600160a01b0382165f908152609b60209081526040918290208251608081018452905463ffffffff808216835260ff600160201b830416151593830193909352650100000000008104831693820193909352600160481b909204166060820181905215801590613b6c5750806060015163ffffffff164310155b15613b8657604081015163ffffffff168152600160208201525b63ffffffff82166040820152613bbc7f0000000000000000000000000000000000000000000000000000000000000000436155cd565b613bc79060016155cd565b63ffffffff90811660608381019182526001600160a01b0386165f818152609b602090815260409182902087518154838a0151858b01519851928a1664ffffffffff1990921691909117600160201b91151591909102176cffffffffffffffff0000000000191665010000000000978916979097026cffffffff000000000000000000191696909617600160481b968816968702179055815192835294871694820194909452928301919091527f4e85751d6331506c6c62335f207eb31f12a61e570f34f5c17640308785c6d4db91016130da565b6001600160a01b038281165f81815260a2602090815260408083209486168084529482528083205493835260a38252808320948352939052918220546001600160401b039091169190600f81810b600160801b909204900b03815b81811015613dc7576001600160a01b038087165f90815260a3602090815260408083209389168352929052908120613d2f9083614266565b6001600160a01b038881165f90815260a0602090815260408083208584528252808320938b16835292815290829020825160608101845290546001600160401b0381168252600160401b8104600f0b92820192909252600160c01b90910463ffffffff16918101829052919250431015613daa575050613dc7565b613db8868260200151613635565b95505050806001019050613cf7565b506001600160a01b038086165f90815260a1602090815260408083209388168352929052208390613df790613622565b613e0191906153eb565b9150509250929050565b5f61075683836142d5565b5f610756836001600160a01b0384166142d5565b6033546001600160a01b03163314611e0a5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401613061565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b5f6107568383670de0b6b3a76400006143b8565b5f613efa8460995f61125689613322565b8015613f035750815b8015611e2957505090516001600160401b031615159392505050565b5f6107566001600160401b03808516908416615707565b5f825f018281548110613f4b57613f4b6151d0565b905f5260205f200154905092915050565b5f818152600183016020526040812054613fa157508154600181810184555f84815260208082209093018490558454848252828601909352604090209190915561097a565b505f61097a565b81545f908015613fe457613fce84613fc16001846153d8565b5f91825260209091200190565b54600160201b90046001600160e01b0316612fc3565b509092915050565b5f80805f19858709858702925082811083820303915050805f036140235783828161401957614019615734565b0492505050610756565b80841161406a5760405162461bcd60e51b81526020600482015260156024820152744d6174683a206d756c446976206f766572666c6f7760581b6044820152606401613061565b5f8486880960026001871981018816978890046003810283188082028403028082028403028082028403028082028403028082028403029081029092039091025f889003889004909101858311909403939093029303949094049190911702949350505050565b5f5f6140de868686613fec565b905060018360028111156140f4576140f4615748565b14801561411057505f848061410b5761410b615734565b868809115b15611e295761412060018261575c565b9695505050505050565b6130e383836001600160401b038416614400565b6060815f0180548060200260200160405190810160405280929190818152602001828054801561418b57602002820191905f5260205f20905b815481526020019060010190808311614177575b50505050509050919050565b5f6141b18254600f81810b600160801b909204900b131590565b156141cf57604051631ed9509560e11b815260040160405180910390fd5b508054600f0b5f9081526001909101602052604090205490565b5f6142038254600f81810b600160801b909204900b131590565b1561422157604051631ed9509560e11b815260040160405180910390fd5b508054600f0b5f818152600180840160205260408220805492905583546fffffffffffffffffffffffffffffffff191692016001600160801b03169190911790915590565b5f5f61428861427484614503565b85546142839190600f0b61576f565b614570565b8454909150600160801b9004600f90810b9082900b126142bb57604051632d0483c560e21b815260040160405180910390fd5b600f0b5f9081526001939093016020525050604090205490565b5f81815260018301602052604081205480156143af575f6142f76001836153d8565b85549091505f9061430a906001906153d8565b9050818114614369575f865f018281548110614328576143286151d0565b905f5260205f200154905080875f018481548110614348576143486151d0565b5f918252602080832090910192909255918252600188019052604090208390555b855486908061437a5761437a615796565b600190038181905f5260205f20015f90559055856001015f8681526020019081526020015f205f90556001935050505061097a565b5f91505061097a565b82545f90816143c9868683856145d9565b905080156143f6576143e086613fc16001846153d8565b54600160201b90046001600160e01b0316610751565b5091949350505050565b825480156144b6575f61441885613fc16001856153d8565b60408051808201909152905463ffffffff808216808452600160201b9092046001600160e01b03166020840152919250908516101561446a5760405163151b8e3f60e11b815260040160405180910390fd5b805163ffffffff8086169116036144b4578261448b86613fc16001866153d8565b80546001600160e01b0392909216600160201b0263ffffffff9092169190911790555050505050565b505b506040805180820190915263ffffffff92831681526001600160e01b03918216602080830191825285546001810187555f968752952091519051909216600160201b029190921617910155565b5f6001600160ff1b0382111561456c5760405162461bcd60e51b815260206004820152602860248201527f53616665436173743a2076616c756520646f65736e27742066697420696e2061604482015267371034b73a191a9b60c11b6064820152608401613061565b5090565b80600f81900b81146145d45760405162461bcd60e51b815260206004820152602760248201527f53616665436173743a2076616c756520646f65736e27742066697420696e20316044820152663238206269747360c81b6064820152608401613061565b919050565b5f5b81831015610941575f6145ee848461462c565b5f8781526020902090915063ffffffff86169082015463ffffffff16111561461857809250614626565b61462381600161575c565b93505b506145db565b5f61463a60028484186157aa565b6107569084841661575c565b6001600160a01b03811681146131fd575f5ffd5b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b03811182821017156146905761469061465a565b60405290565b604051601f8201601f191681016001600160401b03811182821017156146be576146be61465a565b604052919050565b803563ffffffff811681146145d4575f5ffd5b5f604082840312156146e9575f5ffd5b604080519081016001600160401b038111828210171561470b5761470b61465a565b604052905080823561471c81614646565b815261472a602084016146c6565b60208201525092915050565b5f5f5f60808486031215614748575f5ffd5b833561475381614646565b925061476285602086016146d9565b9150606084013561477281614646565b809150509250925092565b81516001600160401b03168152602080830151600f0b9082015260408083015163ffffffff16908201526060810161097a565b5f602082840312156147c0575f5ffd5b5035919050565b5f602082840312156147d7575f5ffd5b813561075681614646565b80516001600160a01b0316825260209081015163ffffffff16910152565b5f8151808452602084019350602083015f5b8281101561483b576148258683516147e2565b6040959095019460209190910190600101614812565b5093949350505050565b602081525f6107566020830184614800565b5f60408284031215614867575f5ffd5b61075683836146d9565b5f5f83601f840112614881575f5ffd5b5081356001600160401b03811115614897575f5ffd5b6020830191508360208260051b85010111156118c5575f5ffd5b5f5f5f604084860312156148c3575f5ffd5b83356148ce81614646565b925060208401356001600160401b038111156148e8575f5ffd5b6148f486828701614871565b9497909650939450505050565b5f6001600160401b038211156149195761491961465a565b5060051b60200190565b5f82601f830112614932575f5ffd5b813561494561494082614901565b614696565b8082825260208201915060208360051b860101925085831115614966575f5ffd5b602085015b8381101561498c57803561497e81614646565b83526020928301920161496b565b5095945050505050565b5f5f5f5f60a085870312156149a9575f5ffd5b6149b386866146d9565b935060408501356001600160401b038111156149cd575f5ffd5b6149d987828801614923565b93505060608501356001600160401b038111156149f4575f5ffd5b614a0087828801614923565b925050614a0f608086016146c6565b905092959194509250565b5f8151808452602084019350602083015f5b8281101561483b578151865260209586019590910190600101614a2c565b5f602082016020835280845180835260408501915060408160051b8601019250602086015f5b82811015614aa157603f19878603018452614a8c858351614a1a565b94506020938401939190910190600101614a70565b50929695505050505050565b5f5f60408385031215614abe575f5ffd5b8235614ac981614646565b915060208301356001600160401b03811115614ae3575f5ffd5b830160a08186031215614af4575f5ffd5b809150509250929050565b5f5f60408385031215614b10575f5ffd5b8235614b1b81614646565b91506020830135614af481614646565b5f8151808452602084019350602083015f5b8281101561483b57614b7686835180516001600160401b03168252602080820151600f0b9083015260409081015163ffffffff16910152565b6060959095019460209190910190600101614b3d565b604081525f614b9e6040830185614800565b8281036020840152611e298185614b2b565b5f8151808452602084019350602083015f5b8281101561483b5781516001600160a01b0316865260209586019590910190600101614bc2565b602081525f6107566020830184614bb0565b5f5f60408385031215614c0c575f5ffd5b82356001600160401b03811115614c21575f5ffd5b614c2d85828601614923565b9250506020830135614af481614646565b602080825282518282018190525f918401906040840190835b81811015614c7e5783516001600160401b0316835260209384019390920191600101614c57565b509095945050505050565b5f5f5f5f5f60608688031215614c9d575f5ffd5b8535614ca881614646565b945060208601356001600160401b03811115614cc2575f5ffd5b614cce88828901614871565b90955093505060408601356001600160401b03811115614cec575f5ffd5b614cf888828901614871565b969995985093965092949392505050565b5f5f5f5f60608587031215614d1c575f5ffd5b8435614d2781614646565b9350614d35602086016146c6565b925060408501356001600160401b03811115614d4f575f5ffd5b614d5b87828801614871565b95989497509550505050565b5f5f60408385031215614d78575f5ffd5b8235614d8381614646565b915060208301356001600160401b03811115614d9d575f5ffd5b613e0185828601614923565b5f5f60408385031215614dba575f5ffd5b8235614dc581614646565b9150614dd3602084016146c6565b90509250929050565b5f60208284031215614dec575f5ffd5b813560ff81168114610756575f5ffd5b5f5f60608385031215614e0d575f5ffd5b8235614e1881614646565b9150614dd384602085016146d9565b5f60608284031215614e37575f5ffd5b50919050565b5f60208284031215614e4d575f5ffd5b81356001600160401b03811115614e62575f5ffd5b612fc384828501614e27565b5f5f5f60808486031215614e80575f5ffd5b83356001600160401b03811115614e95575f5ffd5b614ea186828701614923565b93505061476285602086016146d9565b602081525f6107566020830184614b2b565b5f5f5f60608486031215614ed5575f5ffd5b8335614ee081614646565b925060208401356001600160401b03811115614efa575f5ffd5b614f0686828701614923565b925050614f15604085016146c6565b90509250925092565b5f5f60408385031215614f2f575f5ffd5b8235614f3a81614646565b915060208301356001600160401b03811115614f54575f5ffd5b8301601f81018513614f64575f5ffd5b8035614f7261494082614901565b8082825260208201915060208360051b850101925087831115614f93575f5ffd5b602084015b838110156150b85780356001600160401b03811115614fb5575f5ffd5b85016080818b03601f19011215614fca575f5ffd5b614fd261466e565b614fdf8b602084016146d9565b815260608201356001600160401b03811115614ff9575f5ffd5b6150088c602083860101614923565b60208301525060808201356001600160401b03811115615026575f5ffd5b6020818401019250508a601f83011261503d575f5ffd5b813561504b61494082614901565b8082825260208201915060208360051b86010192508d83111561506c575f5ffd5b6020850194505b828510156150a25784356001600160401b0381168114615091575f5ffd5b825260209485019490910190615073565b6040840152505084525060209283019201614f98565b50809450505050509250929050565b5f5f5f604084860312156150d9575f5ffd5b83356150e481614646565b925060208401356001600160401b038111156150fe575f5ffd5b8401601f8101861361510e575f5ffd5b80356001600160401b03811115615123575f5ffd5b866020828401011115615134575f5ffd5b939660209190910195509293505050565b5f5f60408385031215615156575f5ffd5b823561516181614646565b915060208301356001600160401b0381111561517b575f5ffd5b613e0185828601614e27565b5f5f60408385031215615198575f5ffd5b82356151a381614646565b946020939093013593505050565b5f602082840312156151c1575f5ffd5b81518015158114610756575f5ffd5b634e487b7160e01b5f52603260045260245ffd5b5f8235603e198336030181126151f8575f5ffd5b9190910192915050565b5f60208284031215615212575f5ffd5b610756826146c6565b6040810161097a82846147e2565b5f5f8335601e1984360301811261523e575f5ffd5b8301803591506001600160401b03821115615257575f5ffd5b6020019150600581901b36038213156118c5575f5ffd5b6060810161527c82856147e2565b6001600160a01b039290921660409190910152919050565b604081525f6152a66040830185614bb0565b8281036020840152611e298185614bb0565b5f602082840312156152c8575f5ffd5b81516001600160401b038111156152dd575f5ffd5b8201601f810184136152ed575f5ffd5b80516152fb61494082614901565b8082825260208201915060208360051b85010192508683111561531c575f5ffd5b602084015b838110156153b95780516001600160401b0381111561533e575f5ffd5b8501603f8101891361534e575f5ffd5b602081015161535f61494082614901565b808282526020820191506020808460051b8601010192508b831115615382575f5ffd5b6040840193505b828410156153a4578351825260209384019390910190615389565b86525050602093840193919091019050615321565b509695505050505050565b634e487b7160e01b5f52601160045260245ffd5b8181038181111561097a5761097a6153c4565b6001600160401b03828116828216039081111561097a5761097a6153c4565b5f81600f0b60016001607f1b03198103615426576154266153c4565b5f0392915050565b600f81810b9083900b0160016001607f1b03811360016001607f1b03198212171561097a5761097a6153c4565b6001600160a01b038616815260c0810161547860208301876147e2565b6001600160a01b039490941660608201526001600160401b0392909216608083015263ffffffff1660a09091015292915050565b5f5f8335601e198436030181126154c1575f5ffd5b8301803591506001600160401b038211156154da575f5ffd5b6020019150368190038213156118c5575f5ffd5b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b6001600160a01b03881681525f60c08201615534602084018a6147e2565b60c060608401528690528660e083015f5b8881101561557557823561555881614646565b6001600160a01b0316825260209283019290910190600101615545565b5083810360808501526155888188614a1a565b91505082810360a084015261559e8185876154ee565b9a9950505050505050505050565b5f602082840312156155bc575f5ffd5b813561ffff81168114610756575f5ffd5b63ffffffff818116838216019081111561097a5761097a6153c4565b8183526020830192505f815f5b8481101561483b5763ffffffff61560c836146c6565b16865260209586019591909101906001016155f6565b6001600160a01b03841681526040602082018190525f90611e2990830184866155e9565b602081525f612fc36020830184866154ee565b6001600160a01b03861681526060602082018190525f9061567d90830186886155e9565b82810360408401526156908185876154ee565b98975050505050505050565b5f602082840312156156ac575f5ffd5b815161075681614646565b80516020808301519190811015614e37575f1960209190910360031b1b16919050565b5f600182016156eb576156eb6153c4565b5060010190565b5f81615700576157006153c4565b505f190190565b600f82810b9082900b0360016001607f1b0319811260016001607f1b038213171561097a5761097a6153c4565b634e487b7160e01b5f52601260045260245ffd5b634e487b7160e01b5f52602160045260245ffd5b8082018082111561097a5761097a6153c4565b8082018281125f83128015821682158216171561578e5761578e6153c4565b505092915050565b634e487b7160e01b5f52603160045260245ffd5b5f826157c457634e487b7160e01b5f52601260045260245ffd5b50049056fea2646970667358221220ff7b3d6eba82cde361f8cfb28b8ec6b1dd4f114bf6fd9c7228e0203e36010e3064736f6c634300081b0033", + Bin: "0x610120604052348015610010575f5ffd5b50604051615a79380380615a7983398101604081905261002f91610180565b82858383876001600160a01b03811661005b576040516339b190bb60e11b815260040160405180910390fd5b6001600160a01b0390811660805292831660a05263ffffffff91821660c0521660e052166101005261008b610095565b50505050506101e9565b5f54610100900460ff16156101005760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff9081161461014f575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b0381168114610165575f5ffd5b50565b805163ffffffff8116811461017b575f5ffd5b919050565b5f5f5f5f5f60a08688031215610194575f5ffd5b855161019f81610151565b60208701519095506101b081610151565b60408701519094506101c181610151565b92506101cf60608701610168565b91506101dd60808701610168565b90509295509295909350565b60805160a05160c05160e051610100516157ff61027a5f395f81816103f9015261359701525f81816105480152613b9701525f818161031e015281816120c601526127bd01525f81816106c701528181610c77015281816115fc01528181611c6301528181611ccd0152612a8401525f818161056f0152818161077201528181611d72015261320e01526157ff5ff3fe608060405234801561000f575f5ffd5b5060043610610281575f3560e01c80636e875dba11610156578063adc2e3d9116100ca578063cd6dc68711610084578063cd6dc6871461069c578063d3d96ff4146106af578063df5cf723146106c2578063f2fde38b146106e9578063f605ce08146106fc578063fabc1cbc1461070f575f5ffd5b8063adc2e3d91461060e578063b2447af714610621578063b66bd98914610634578063b9fbaed114610647578063ba1a84e514610676578063c221d8ae14610689575f5ffd5b80638ce648541161011b5780638ce64854146105915780638da5cb5b146105b157806394d7d00c146105c2578063952899ee146105d5578063a9333ec8146105e8578063a9821821146105fb575f5ffd5b80636e875dba14610515578063715018a61461052857806379ae50cd146105305780637bc1ef6114610543578063886f11951461056a575f5ffd5b80634657e26a116101f8578063595c6a67116101b2578063595c6a67146104875780635ac86ab71461048f5780635c975abb146104b2578063670d3ba2146104c45780636cfb4481146104d75780636e3492b514610502575f5ffd5b80634657e26a146103f45780634a10ffe51461041b5780634b5046ef1461043b57806350feea201461044e578063547afb871461046157806356c483e614610474575f5ffd5b80632981eb77116102495780632981eb77146103195780632bab2c4a14610355578063304c10cd1461037557806336352057146103a057806340120dab146103b35780634177a87c146103d4575f5ffd5b806310e1b9b814610285578063136439dd146102ae57806315fe5028146102c3578063260dc758146102e3578063261f84e014610306575b5f5ffd5b610298610293366004614736565b610722565b6040516102a5919061477d565b60405180910390f35b6102c16102bc3660046147b0565b61075d565b005b6102d66102d13660046147c7565b610832565b6040516102a59190614845565b6102f66102f1366004614857565b610949565b60405190151581526020016102a5565b6102c16103143660046148b1565b610980565b6103407f000000000000000000000000000000000000000000000000000000000000000081565b60405163ffffffff90911681526020016102a5565b610368610363366004614996565b610c23565b6040516102a59190614a4a565b6103886103833660046147c7565b610f10565b6040516001600160a01b0390911681526020016102a5565b6102c16103ae366004614aad565b610f3f565b6103c66103c1366004614aff565b611751565b6040516102a5929190614b8c565b6103e76103e2366004614857565b6118cc565b6040516102a59190614be9565b6103887f000000000000000000000000000000000000000000000000000000000000000081565b61042e610429366004614bfb565b6118f0565b6040516102a59190614c3e565b6102c1610449366004614c89565b611998565b6102c161045c366004614d09565b611a52565b61042e61046f366004614d67565b611bb0565b6102c1610482366004614da9565b611c58565b6102c1611d5d565b6102f661049d366004614ddc565b606654600160ff9092169190911b9081161490565b6066545b6040519081526020016102a5565b6102f66104d2366004614dfc565b611e0c565b6104ea6104e5366004614aff565b611e1d565b6040516001600160401b0390911681526020016102a5565b6102c1610510366004614e3d565b611e32565b6103e7610523366004614857565b612202565b6102c1612213565b6102d661053e3660046147c7565b612224565b6103407f000000000000000000000000000000000000000000000000000000000000000081565b6103887f000000000000000000000000000000000000000000000000000000000000000081565b6105a461059f366004614e6e565b6122fe565b6040516102a59190614eb1565b6033546001600160a01b0316610388565b61042e6105d0366004614ec3565b6123c3565b6102c16105e3366004614f1e565b6124af565b6104ea6105f6366004614aff565b612976565b6102c16106093660046150c7565b6129a5565b6102c161061c366004615145565b612a15565b6104b661062f366004614857565b612d64565b6102c1610642366004614d09565b612d86565b61065a6106553660046147c7565b612ee0565b60408051921515835263ffffffff9091166020830152016102a5565b6104b66106843660046147c7565b612f7a565b6103e7610697366004614dfc565b612f9a565b6102c16106aa366004615187565b612fcb565b6102c16106bd366004614aff565b6130e8565b6103887f000000000000000000000000000000000000000000000000000000000000000081565b6102c16106f73660046147c7565b613187565b6104ea61070a366004614aff565b613200565b6102c161071d3660046147b0565b61320c565b604080516060810182525f80825260208201819052918101829052906107518561074b86613322565b85613385565b925050505b9392505050565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa1580156107bf573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107e391906151b1565b61080057604051631d77d47760e21b815260040160405180910390fd5b60665481811681146108255760405163c61dca5d60e01b815260040160405180910390fd5b61082e826134f1565b5050565b6001600160a01b0381165f908152609d60205260408120606091906108569061352e565b90505f816001600160401b038111156108715761087161465a565b6040519080825280602002602001820160405280156108b557816020015b604080518082019091525f808252602082015281526020019060019003908161088f5790505b5090505f5b82811015610941576001600160a01b0385165f908152609d6020526040902061091c906108e79083613537565b604080518082019091525f80825260208201525060408051808201909152606082901c815263ffffffff909116602082015290565b82828151811061092e5761092e6151d0565b60209081029190910101526001016108ba565b509392505050565b60208082015182516001600160a01b03165f90815260989092526040822061097a9163ffffffff9081169061354216565b92915050565b8261098a81613559565b6109a75760405163932d94f760e01b815260040160405180910390fd5b5f5b82811015610c1c575f6040518060400160405280876001600160a01b031681526020018686858181106109de576109de6151d0565b90506020028101906109f091906151e4565b6109fe906020810190615202565b63ffffffff168152509050610a48816020015163ffffffff1660985f896001600160a01b03166001600160a01b031681526020019081526020015f2061360390919063ffffffff16565b610a6557604051631fb1705560e21b815260040160405180910390fd5b7f31629285ead2335ae0933f86ed2ae63321f7af77b4e6eaabc42c057880977e6c6040518060400160405280886001600160a01b03168152602001836020015163ffffffff16815250604051610abb919061521b565b60405180910390a15f610acd82613322565b90505f5b868685818110610ae357610ae36151d0565b9050602002810190610af591906151e4565b610b03906020810190615229565b9050811015610c1157610b79878786818110610b2157610b216151d0565b9050602002810190610b3391906151e4565b610b41906020810190615229565b83818110610b5157610b516151d0565b9050602002016020810190610b6691906147c7565b5f8481526099602052604090209061360e565b507f7ab260fe0af193db5f4986770d831bda4ea46099dc817e8b6716dcae8af8e88b83888887818110610bae57610bae6151d0565b9050602002810190610bc091906151e4565b610bce906020810190615229565b84818110610bde57610bde6151d0565b9050602002016020810190610bf391906147c7565b604051610c0192919061526e565b60405180910390a1600101610ad1565b5050506001016109a9565b5050505050565b606083516001600160401b03811115610c3e57610c3e61465a565b604051908082528060200260200182016040528015610c7157816020015b6060815260200190600190039081610c5c5790505b5090505f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663f0e0e67686866040518363ffffffff1660e01b8152600401610cc3929190615294565b5f60405180830381865afa158015610cdd573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610d0491908101906152b8565b90505f5b8551811015610f06575f868281518110610d2457610d246151d0565b6020026020010151905085516001600160401b03811115610d4757610d4761465a565b604051908082528060200260200182016040528015610d70578160200160208202803683370190505b50848381518110610d8357610d836151d0565b60209081029190910101525f5b8651811015610efc575f878281518110610dac57610dac6151d0565b6020908102919091018101516001600160a01b038086165f90815260a1845260408082209284168252919093528220909250610de790613622565b9050806001600160401b03165f03610e00575050610ef4565b5f610e0c858d85610722565b90508863ffffffff16816040015163ffffffff1611158015610e3457505f8160200151600f0b125b15610e5657610e4a815f01518260200151613635565b6001600160401b031681525b80515f90610e71906001600160401b03908116908516613649565b9050610eb881898981518110610e8957610e896151d0565b60200260200101518781518110610ea257610ea26151d0565b602002602001015161365d90919063ffffffff16565b898881518110610eca57610eca6151d0565b60200260200101518681518110610ee357610ee36151d0565b602002602001018181525050505050505b600101610d90565b5050600101610d08565b5050949350505050565b6001600160a01b038082165f908152609760205260408120549091168015610f385780610756565b5090919050565b606654600190600290811603610f685760405163840a48d560e01b815260040160405180910390fd5b82610f7281613559565b610f8f5760405163932d94f760e01b815260040160405180910390fd5b5f6040518060400160405280866001600160a01b03168152602001856020016020810190610fbd9190615202565b63ffffffff16905290505f610fde610fd860208701876147c7565b83613671565b9050610fed6060860186615229565b9050610ffc6040870187615229565b90501461101c576040516343714afd60e01b815260040160405180910390fd5b60208083015183516001600160a01b03165f9081526098909252604090912061104e9163ffffffff9081169061354216565b61106b57604051631fb1705560e21b815260040160405180910390fd5b806110895760405163ebbff49760e01b815260040160405180910390fd5b5f6110976040870187615229565b90506001600160401b038111156110b0576110b061465a565b6040519080825280602002602001820160405280156110d9578160200160208202803683370190505b5090505f5b6110eb6040880188615229565b90508110156116e25780158061117e57506111096040880188615229565b6111146001846153d8565b818110611123576111236151d0565b905060200201602081019061113891906147c7565b6001600160a01b031661114e6040890189615229565b8381811061115e5761115e6151d0565b905060200201602081019061117391906147c7565b6001600160a01b0316115b61119b57604051639f1c805360e01b815260040160405180910390fd5b6111a86060880188615229565b828181106111b8576111b86151d0565b905060200201355f1080156111f85750670de0b6b3a76400006111de6060890189615229565b838181106111ee576111ee6151d0565b9050602002013511155b61121557604051631353603160e01b815260040160405180910390fd5b6112716112256040890189615229565b83818110611235576112356151d0565b905060200201602081019061124a91906147c7565b60995f61125688613322565b81526020019081526020015f206136e790919063ffffffff16565b61128e576040516331bc342760e11b815260040160405180910390fd5b5f806112e06112a060208b018b6147c7565b6112a988613322565b6112b660408d018d615229565b878181106112c6576112c66151d0565b90506020020160208101906112db91906147c7565b613385565b805191935091506001600160401b03165f036112fd5750506116da565b5f61133861130e60608c018c615229565b8681811061131e5761131e6151d0565b85516001600160401b031692602090910201359050613708565b83519091506113536001600160401b03808416908316613649565b868681518110611365576113656151d0565b60200260200101818152505081835f0181815161138291906153eb565b6001600160401b031690525083518290859061139f9083906153eb565b6001600160401b03169052506020840180518391906113bf9083906153eb565b6001600160401b031690525060208301515f600f9190910b12156114da575f6114226113ee60608e018e615229565b888181106113fe576113fe6151d0565b9050602002013585602001516114139061540a565b6001600160801b031690613708565b9050806001600160401b03168460200181815161143f919061542e565b600f0b9052507f1487af5418c47ee5ea45ef4a93398668120890774a9e13487e61e9dc3baf76dd61147360208e018e6147c7565b8a8e80604001906114849190615229565b8a818110611494576114946151d0565b90506020020160208101906114a991906147c7565b6114ba885f01518960200151613635565b88604001516040516114d095949392919061545b565b60405180910390a1505b61152c6114ea60208d018d6147c7565b6114f38a613322565b61150060408f018f615229565b89818110611510576115106151d0565b905060200201602081019061152591906147c7565b878761371e565b7f1487af5418c47ee5ea45ef4a93398668120890774a9e13487e61e9dc3baf76dd61155a60208d018d6147c7565b8961156860408f018f615229565b89818110611578576115786151d0565b905060200201602081019061158d91906147c7565b86516040516115a19493929190439061545b565b60405180910390a16115f26115b960208d018d6147c7565b6115c660408e018e615229565b888181106115d6576115d66151d0565b90506020020160208101906115eb91906147c7565b865161395e565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001663601bb36f61162e60208e018e6147c7565b61163b60408f018f615229565b8981811061164b5761164b6151d0565b905060200201602081019061166091906147c7565b875160405160e085901b6001600160e01b03191681526001600160a01b0393841660048201529290911660248301526001600160401b0380861660448401521660648201526084015f604051808303815f87803b1580156116bf575f5ffd5b505af11580156116d1573d5f5f3e3d5ffd5b50505050505050505b6001016110de565b507f80969ad29428d6797ee7aad084f9e4a42a82fc506dcd2ca3b6fb431f85ccebe561171160208801886147c7565b8461171f60408a018a615229565b8561172d60808d018d6154ac565b6040516117409796959493929190615516565b60405180910390a150505050505050565b6001600160a01b0382165f908152609d6020526040812060609182916117769061352e565b90505f816001600160401b038111156117915761179161465a565b6040519080825280602002602001820160405280156117d557816020015b604080518082019091525f80825260208201528152602001906001900390816117af5790505b5090505f826001600160401b038111156117f1576117f161465a565b60405190808252806020026020018201604052801561183a57816020015b604080516060810182525f80825260208083018290529282015282525f1990920191018161180f5790505b5090505f5b838110156118bd576001600160a01b0388165f908152609d6020526040812061186c906108e79084613537565b905080848381518110611881576118816151d0565b602002602001018190525061189789828a610722565b8383815181106118a9576118a96151d0565b60209081029190910101525060010161183f565b509093509150505b9250929050565b60605f61075660995f6118de86613322565b81526020019081526020015f206139e0565b60605f83516001600160401b0381111561190c5761190c61465a565b604051908082528060200260200182016040528015611935578160200160208202803683370190505b5090505f5b845181101561094157611966858281518110611958576119586151d0565b602002602001015185612976565b828281518110611978576119786151d0565b6001600160401b039092166020928302919091019091015260010161193a565b6066545f906001908116036119c05760405163840a48d560e01b815260040160405180910390fd5b8382146119e0576040516343714afd60e01b815260040160405180910390fd5b5f5b84811015611a4957611a4187878784818110611a0057611a006151d0565b9050602002016020810190611a1591906147c7565b868685818110611a2757611a276151d0565b9050602002016020810190611a3c91906155ac565b6139ec565b6001016119e2565b50505050505050565b83611a5c81613559565b611a795760405163932d94f760e01b815260040160405180910390fd5b604080518082019091526001600160a01b038616815263ffffffff851660208201525f611aa582613322565b9050611ae6826020015163ffffffff1660985f8a6001600160a01b03166001600160a01b031681526020019081526020015f2061354290919063ffffffff16565b611b0357604051631fb1705560e21b815260040160405180910390fd5b5f5b84811015611ba657611b22868683818110610b5157610b516151d0565b611b3f5760405163585cfb2f60e01b815260040160405180910390fd5b7f7ab260fe0af193db5f4986770d831bda4ea46099dc817e8b6716dcae8af8e88b83878784818110611b7357611b736151d0565b9050602002016020810190611b8891906147c7565b604051611b9692919061526e565b60405180910390a1600101611b05565b5050505050505050565b60605f82516001600160401b03811115611bcc57611bcc61465a565b604051908082528060200260200182016040528015611bf5578160200160208202803683370190505b5090505f5b835181101561094157611c2685858381518110611c1957611c196151d0565b6020026020010151612976565b828281518110611c3857611c386151d0565b6001600160401b0390921660209283029190910190910152600101611bfa565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614611d5357611c9182613559565b611cae576040516348f5c3ed60e01b815260040160405180910390fd5b6040516336b87bd760e11b81526001600160a01b0383811660048301527f00000000000000000000000000000000000000000000000000000000000000001690636d70f7ae90602401602060405180830381865afa158015611d12573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611d3691906151b1565b611d535760405163ccea9e6f60e01b815260040160405180910390fd5b61082e8282613af0565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa158015611dbf573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611de391906151b1565b611e0057604051631d77d47760e21b815260040160405180910390fd5b611e0a5f196134f1565b565b5f61075683609a5f61125686613322565b5f5f611e298484613c9c565b95945050505050565b606654600290600490811603611e5b5760405163840a48d560e01b815260040160405180910390fd5b611e70611e6b60208401846147c7565b613559565b80611e895750611e89611e6b60408401602085016147c7565b611ea6576040516348f5c3ed60e01b815260040160405180910390fd5b5f5b611eb56040840184615229565b9050811015612177575f6040518060400160405280856020016020810190611edd91906147c7565b6001600160a01b03168152602001611ef86040870187615229565b85818110611f0857611f086151d0565b9050602002016020810190611f1d9190615202565b63ffffffff168152509050611f6a816020015163ffffffff1660985f876020016020810190611f4c91906147c7565b6001600160a01b0316815260208101919091526040015f2090613542565b611f8757604051631fb1705560e21b815260040160405180910390fd5b609e5f611f9760208701876147c7565b6001600160a01b03166001600160a01b031681526020019081526020015f205f611fc083613322565b815260208101919091526040015f205460ff16611ff0576040516325131d4f60e01b815260040160405180910390fd5b61202a611ffc82613322565b609c5f61200c60208901896147c7565b6001600160a01b0316815260208101919091526040015f2090613e0b565b5061206261203b60208601866147c7565b609a5f61204785613322565b81526020019081526020015f20613e1690919063ffffffff16565b5061207060208501856147c7565b6001600160a01b03167fad34c3070be1dffbcaa499d000ba2b8d9848aefcac3059df245dd95c4ece14fe826040516120a8919061521b565b60405180910390a2604080518082019091525f8152602081016120eb7f0000000000000000000000000000000000000000000000000000000000000000436155cd565b63ffffffff169052609e5f61210360208801886147c7565b6001600160a01b03166001600160a01b031681526020019081526020015f205f61212c84613322565b81526020808201929092526040015f2082518154939092015163ffffffff166101000264ffffffff00199215159290921664ffffffffff199093169290921717905550600101611ea8565b5061218b61038360408401602085016147c7565b6001600160a01b0316639d8e0c236121a660208501856147c7565b6121b36040860186615229565b6040518463ffffffff1660e01b81526004016121d193929190615622565b5f604051808303815f87803b1580156121e8575f5ffd5b505af19250505080156121f9575060015b1561082e575050565b606061097a609a5f6118de85613322565b61221b613e2a565b611e0a5f613e84565b6001600160a01b0381165f908152609c60205260408120606091906122489061352e565b90505f816001600160401b038111156122635761226361465a565b6040519080825280602002602001820160405280156122a757816020015b604080518082019091525f80825260208201528152602001906001900390816122815790505b5090505f5b82811015610941576001600160a01b0385165f908152609c602052604090206122d9906108e79083613537565b8282815181106122eb576122eb6151d0565b60209081029190910101526001016122ac565b60605f84516001600160401b0381111561231a5761231a61465a565b60405190808252806020026020018201604052801561236357816020015b604080516060810182525f80825260208083018290529282015282525f199092019101816123385790505b5090505f5b85518110156123ba57612395868281518110612386576123866151d0565b60200260200101518686610722565b8282815181106123a7576123a76151d0565b6020908102919091010152600101612368565b50949350505050565b60605f83516001600160401b038111156123df576123df61465a565b604051908082528060200260200182016040528015612408578160200160208202803683370190505b5090505f5b84518110156123ba576001600160a01b0386165f90815260a160205260408120865161247d92879291899086908110612448576124486151d0565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020015f20613ed590919063ffffffff16565b82828151811061248f5761248f6151d0565b6001600160401b039092166020928302919091019091015260010161240d565b6066545f906001908116036124d75760405163840a48d560e01b815260040160405180910390fd5b6124e083613559565b6124fd576040516348f5c3ed60e01b815260040160405180910390fd5b5f5f5f61250986612ee0565b915091508161252b5760405163fa55fc8160e01b815260040160405180910390fd5b91505f90505b8351811015610c1c5783818151811061254c5761254c6151d0565b6020026020010151604001515184828151811061256b5761256b6151d0565b6020026020010151602001515114612596576040516343714afd60e01b815260040160405180910390fd5b5f8482815181106125a9576125a96151d0565b602090810291909101810151518082015181516001600160a01b03165f908152609890935260409092209092506125e99163ffffffff9081169061354216565b61260657604051631fb1705560e21b815260040160405180910390fd5b5f6126118783613671565b90505f5b868481518110612627576126276151d0565b6020026020010151602001515181101561296b575f87858151811061264e5761264e6151d0565b602002602001015160200151828151811061266b5761266b6151d0565b60200260200101519050612682898261ffff6139ec565b5f5f6126918b61074b88613322565b915091508060200151600f0b5f146126bc57604051630d8fcbe360e41b815260040160405180910390fd5b5f6126c987858489613ee9565b905061270e825f01518c8a815181106126e4576126e46151d0565b6020026020010151604001518781518110612701576127016151d0565b6020026020010151613f1f565b600f0b602083018190525f0361273757604051634606179360e11b815260040160405180910390fd5b5f8260200151600f0b121561287b5780156127fd576127b861275888613322565b6001600160a01b03808f165f90815260a360209081526040808320938a16835292905220908154600160801b90819004600f0b5f818152600180860160205260409091209390935583546001600160801b03908116939091011602179055565b6127e27f0000000000000000000000000000000000000000000000000000000000000000436155cd565b6127ed9060016155cd565b63ffffffff1660408301526128e8565b61280f83602001518360200151613635565b6001600160401b031660208401528a518b9089908110612831576128316151d0565b602002602001015160400151858151811061284e5761284e6151d0565b6020908102919091018101516001600160401b031683525f9083015263ffffffff431660408301526128e8565b5f8260200151600f0b13156128e85761289c83602001518360200151613635565b6001600160401b0390811660208501819052845190911610156128d257604051636c9be0bf60e01b815260040160405180910390fd5b6128dc89436155cd565b63ffffffff1660408301525b6128fd8c6128f589613322565b86868661371e565b7f1487af5418c47ee5ea45ef4a93398668120890774a9e13487e61e9dc3baf76dd8c61292b6108e78a613322565b8661293d865f01518760200151613635565b866040015160405161295395949392919061545b565b60405180910390a15050600190920191506126159050565b505050600101612531565b6001600160a01b038083165f90815260a160209081526040808320938516835292905290812061075690613622565b826129af81613559565b6129cc5760405163932d94f760e01b815260040160405180910390fd5b836001600160a01b03167fa89c1dc243d8908a96dd84944bcc97d6bc6ac00dd78e20621576be6a3c9437138484604051612a07929190615646565b60405180910390a250505050565b606654600290600490811603612a3e5760405163840a48d560e01b815260040160405180910390fd5b82612a4881613559565b612a655760405163932d94f760e01b815260040160405180910390fd5b6040516336b87bd760e11b81526001600160a01b0385811660048301527f00000000000000000000000000000000000000000000000000000000000000001690636d70f7ae90602401602060405180830381865afa158015612ac9573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612aed91906151b1565b612b0a5760405163ccea9e6f60e01b815260040160405180910390fd5b5f5b612b196020850185615229565b9050811015612ce157604080518082019091525f9080612b3c60208801886147c7565b6001600160a01b03168152602001868060200190612b5a9190615229565b85818110612b6a57612b6a6151d0565b9050602002016020810190612b7f9190615202565b63ffffffff90811690915260208083015183516001600160a01b03165f90815260989092526040909120929350612bbb92919081169061354216565b612bd857604051631fb1705560e21b815260040160405180910390fd5b612be28682613671565b15612c0057604051636c6c6e2760e11b815260040160405180910390fd5b612c29612c0c82613322565b6001600160a01b0388165f908152609c6020526040902090613603565b50612c5586609a5f612c3a85613322565b81526020019081526020015f2061360e90919063ffffffff16565b50856001600160a01b03167f43232edf9071753d2321e5fa7e018363ee248e5f2142e6c08edd3265bfb4895e82604051612c8f919061521b565b60405180910390a26001600160a01b0386165f908152609e60205260408120600191612cba84613322565b815260208101919091526040015f20805460ff191691151591909117905550600101612b0c565b50612cf261038360208501856147c7565b6001600160a01b031663adcf73f785612d0e6020870187615229565b612d1b60408901896154ac565b6040518663ffffffff1660e01b8152600401612d3b959493929190615659565b5f604051808303815f87803b158015612d52575f5ffd5b505af1158015611ba6573d5f5f3e3d5ffd5b5f61097a609a5f612d7485613322565b81526020019081526020015f2061352e565b83612d9081613559565b612dad5760405163932d94f760e01b815260040160405180910390fd5b6040805180820182526001600160a01b03871680825263ffffffff80881660208085018290525f93845260989052939091209192612dec929161354216565b612e0957604051631fb1705560e21b815260040160405180910390fd5b5f612e1382613322565b90505f5b84811015611ba657612e5c868683818110612e3457612e346151d0565b9050602002016020810190612e4991906147c7565b5f84815260996020526040902090613e16565b612e79576040516331bc342760e11b815260040160405180910390fd5b7f7b4b073d80dcac55a11177d8459ad9f664ceeb91f71f27167bb14f8152a7eeee83878784818110612ead57612ead6151d0565b9050602002016020810190612ec291906147c7565b604051612ed092919061526e565b60405180910390a1600101612e17565b6001600160a01b0381165f908152609b602090815260408083208151608081018352905463ffffffff80821680845260ff600160201b8404161515958401869052650100000000008304821694840194909452600160481b909104166060820181905284939192919015801590612f615750826060015163ffffffff164310155b15612f70575050604081015160015b9590945092505050565b6001600160a01b0381165f90815260986020526040812061097a9061352e565b6001600160a01b0382165f908152609f6020526040812060609190612fc390826118de86613322565b949350505050565b5f54610100900460ff1615808015612fe957505f54600160ff909116105b806130025750303b15801561300257505f5460ff166001145b61306a5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b5f805460ff19166001179055801561308b575f805461ff0019166101001790555b613094826134f1565b61309d83613e84565b80156130e3575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498906020015b60405180910390a15b505050565b816130f281613559565b61310f5760405163932d94f760e01b815260040160405180910390fd5b6001600160a01b038381165f90815260976020526040902080546001600160a01b0319169184169190911790557f2ae945c40c44dc0ec263f95609c3fdc6952e0aefa22d6374e44f2c997acedf858361316781610f10565b604080516001600160a01b039384168152929091166020830152016130da565b61318f613e2a565b6001600160a01b0381166131f45760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401613061565b6131fd81613e84565b50565b5f5f6123ba8484613c9c565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015613268573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061328c919061569c565b6001600160a01b0316336001600160a01b0316146132bd5760405163794821ff60e01b815260040160405180910390fd5b606654801982198116146132e45760405163c61dca5d60e01b815260040160405180910390fd5b606682905560405182815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c9060200160405180910390a25050565b5f815f0151826020015163ffffffff1660405160200161336d92919060609290921b6bffffffffffffffffffffffff1916825260a01b6001600160a01b031916601482015260200190565b60405160208183030381529060405261097a906156b7565b6040805180820182525f80825260208083018290528351606081018552828152808201839052808501839052845180860186526001600160a01b03898116855260a18452868520908816855290925293822092939281906133e590613622565b6001600160401b0390811682526001600160a01b038981165f81815260a260209081526040808320948c168084529482528083205486169682019690965291815260a082528481208b8252825284812092815291815290839020835160608101855290549283168152600160401b8304600f0b91810191909152600160c01b90910463ffffffff169181018290529192504310156134875790925090506134e9565b613498815f01518260200151613635565b6001600160401b0316815260208101515f600f9190910b12156134d6576134c782602001518260200151613635565b6001600160401b031660208301525b5f60408201819052602082015290925090505b935093915050565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a250565b5f61097a825490565b5f6107568383613f36565b5f8181526001830160205260408120541515610756565b604051631beb2b9760e31b81526001600160a01b0382811660048301523360248301523060448301525f80356001600160e01b0319166064840152917f00000000000000000000000000000000000000000000000000000000000000009091169063df595cb8906084016020604051808303815f875af11580156135df573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061097a91906151b1565b5f6107568383613f5c565b5f610756836001600160a01b038416613f5c565b5f61097a82670de0b6b3a7640000613fa8565b5f610756826001600160401b03851661542e565b5f61075683670de0b6b3a764000084613fec565b5f6107568383670de0b6b3a7640000613fec565b6001600160a01b0382165f908152609e6020526040812081908161369485613322565b815260208082019290925260409081015f2081518083019092525460ff8116151580835261010090910463ffffffff1692820192909252915080612fc357506020015163ffffffff164311159392505050565b6001600160a01b0381165f9081526001830160205260408120541515610756565b5f6107568383670de0b6b3a764000060016140d1565b6020808301516001600160a01b038088165f90815260a284526040808220928816825291909352909120546001600160401b039081169116146137e457602082810180516001600160a01b038881165f81815260a286526040808220938a1680835293875290819020805467ffffffffffffffff19166001600160401b0395861617905593518451918252948101919091529216908201527facf9095feb3a370c9cf692421c69ef320d4db5c66e6a7d29c7694eb02364fc559060600160405180910390a15b6001600160a01b038086165f90815260a060209081526040808320888452825280832093871683529281529082902083518154928501519385015163ffffffff16600160c01b0263ffffffff60c01b196001600160801b038616600160401b026001600160c01b03199095166001600160401b03909316929092179390931716919091179055600f0b156138c6576001600160a01b0385165f908152609f60209081526040808320878452909152902061389e908461360e565b506001600160a01b0385165f908152609d602052604090206138c09085613603565b50610c1c565b80516001600160401b03165f03610c1c576001600160a01b0385165f908152609f6020908152604080832087845290915290206139039084613e16565b506001600160a01b0385165f908152609f60209081526040808320878452909152902061392f9061352e565b5f03610c1c576001600160a01b0385165f908152609d602052604090206139569085613e0b565b505050505050565b6001600160a01b038084165f90815260a16020908152604080832093861683529290522061398d90438361412a565b604080516001600160a01b038086168252841660208201526001600160401b038316918101919091527f1c6458079a41077d003c11faf9bf097e693bd67979e4e6500bac7b29db779b5c906060016130da565b60605f6107568361413e565b6001600160a01b038381165f90815260a360209081526040808320938616835292905290812054600f81810b600160801b909204900b035b5f81118015613a3657508261ffff1682105b15610c1c576001600160a01b038086165f90815260a3602090815260408083209388168352929052908120613a6a90614197565b90505f5f613a79888489613385565b91509150806040015163ffffffff16431015613a9757505050610c1c565b613aa4888489858561371e565b6001600160a01b038089165f90815260a360209081526040808320938b16835292905220613ad1906141e9565b50613adb856156da565b9450613ae6846156f2565b9350505050613a24565b6001600160a01b0382165f908152609b60209081526040918290208251608081018452905463ffffffff808216835260ff600160201b830416151593830193909352650100000000008104831693820193909352600160481b909204166060820181905215801590613b6c5750806060015163ffffffff164310155b15613b8657604081015163ffffffff168152600160208201525b63ffffffff82166040820152613bbc7f0000000000000000000000000000000000000000000000000000000000000000436155cd565b613bc79060016155cd565b63ffffffff90811660608381019182526001600160a01b0386165f818152609b602090815260409182902087518154838a0151858b01519851928a1664ffffffffff1990921691909117600160201b91151591909102176cffffffffffffffff0000000000191665010000000000978916979097026cffffffff000000000000000000191696909617600160481b968816968702179055815192835294871694820194909452928301919091527f4e85751d6331506c6c62335f207eb31f12a61e570f34f5c17640308785c6d4db91016130da565b6001600160a01b038281165f81815260a2602090815260408083209486168084529482528083205493835260a38252808320948352939052918220546001600160401b039091169190600f81810b600160801b909204900b03815b81811015613dc7576001600160a01b038087165f90815260a3602090815260408083209389168352929052908120613d2f9083614266565b6001600160a01b038881165f90815260a0602090815260408083208584528252808320938b16835292815290829020825160608101845290546001600160401b0381168252600160401b8104600f0b92820192909252600160c01b90910463ffffffff16918101829052919250431015613daa575050613dc7565b613db8868260200151613635565b95505050806001019050613cf7565b506001600160a01b038086165f90815260a1602090815260408083209388168352929052208390613df790613622565b613e0191906153eb565b9150509250929050565b5f61075683836142d5565b5f610756836001600160a01b0384166142d5565b6033546001600160a01b03163314611e0a5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401613061565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b5f6107568383670de0b6b3a76400006143b8565b5f613efa8460995f61125689613322565b8015613f035750815b8015611e2957505090516001600160401b031615159392505050565b5f6107566001600160401b03808516908416615707565b5f825f018281548110613f4b57613f4b6151d0565b905f5260205f200154905092915050565b5f818152600183016020526040812054613fa157508154600181810184555f84815260208082209093018490558454848252828601909352604090209190915561097a565b505f61097a565b81545f908015613fe457613fce84613fc16001846153d8565b5f91825260209091200190565b54600160201b90046001600160e01b0316612fc3565b509092915050565b5f80805f19858709858702925082811083820303915050805f036140235783828161401957614019615734565b0492505050610756565b80841161406a5760405162461bcd60e51b81526020600482015260156024820152744d6174683a206d756c446976206f766572666c6f7760581b6044820152606401613061565b5f8486880960026001871981018816978890046003810283188082028403028082028403028082028403028082028403028082028403029081029092039091025f889003889004909101858311909403939093029303949094049190911702949350505050565b5f5f6140de868686613fec565b905060018360028111156140f4576140f4615748565b14801561411057505f848061410b5761410b615734565b868809115b15611e295761412060018261575c565b9695505050505050565b6130e383836001600160401b038416614400565b6060815f0180548060200260200160405190810160405280929190818152602001828054801561418b57602002820191905f5260205f20905b815481526020019060010190808311614177575b50505050509050919050565b5f6141b18254600f81810b600160801b909204900b131590565b156141cf57604051631ed9509560e11b815260040160405180910390fd5b508054600f0b5f9081526001909101602052604090205490565b5f6142038254600f81810b600160801b909204900b131590565b1561422157604051631ed9509560e11b815260040160405180910390fd5b508054600f0b5f818152600180840160205260408220805492905583546fffffffffffffffffffffffffffffffff191692016001600160801b03169190911790915590565b5f5f61428861427484614503565b85546142839190600f0b61576f565b614570565b8454909150600160801b9004600f90810b9082900b126142bb57604051632d0483c560e21b815260040160405180910390fd5b600f0b5f9081526001939093016020525050604090205490565b5f81815260018301602052604081205480156143af575f6142f76001836153d8565b85549091505f9061430a906001906153d8565b9050818114614369575f865f018281548110614328576143286151d0565b905f5260205f200154905080875f018481548110614348576143486151d0565b5f918252602080832090910192909255918252600188019052604090208390555b855486908061437a5761437a615796565b600190038181905f5260205f20015f90559055856001015f8681526020019081526020015f205f90556001935050505061097a565b5f91505061097a565b82545f90816143c9868683856145d9565b905080156143f6576143e086613fc16001846153d8565b54600160201b90046001600160e01b0316610751565b5091949350505050565b825480156144b6575f61441885613fc16001856153d8565b60408051808201909152905463ffffffff808216808452600160201b9092046001600160e01b03166020840152919250908516101561446a5760405163151b8e3f60e11b815260040160405180910390fd5b805163ffffffff8086169116036144b4578261448b86613fc16001866153d8565b80546001600160e01b0392909216600160201b0263ffffffff9092169190911790555050505050565b505b506040805180820190915263ffffffff92831681526001600160e01b03918216602080830191825285546001810187555f968752952091519051909216600160201b029190921617910155565b5f6001600160ff1b0382111561456c5760405162461bcd60e51b815260206004820152602860248201527f53616665436173743a2076616c756520646f65736e27742066697420696e2061604482015267371034b73a191a9b60c11b6064820152608401613061565b5090565b80600f81900b81146145d45760405162461bcd60e51b815260206004820152602760248201527f53616665436173743a2076616c756520646f65736e27742066697420696e20316044820152663238206269747360c81b6064820152608401613061565b919050565b5f5b81831015610941575f6145ee848461462c565b5f8781526020902090915063ffffffff86169082015463ffffffff16111561461857809250614626565b61462381600161575c565b93505b506145db565b5f61463a60028484186157aa565b6107569084841661575c565b6001600160a01b03811681146131fd575f5ffd5b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b03811182821017156146905761469061465a565b60405290565b604051601f8201601f191681016001600160401b03811182821017156146be576146be61465a565b604052919050565b803563ffffffff811681146145d4575f5ffd5b5f604082840312156146e9575f5ffd5b604080519081016001600160401b038111828210171561470b5761470b61465a565b604052905080823561471c81614646565b815261472a602084016146c6565b60208201525092915050565b5f5f5f60808486031215614748575f5ffd5b833561475381614646565b925061476285602086016146d9565b9150606084013561477281614646565b809150509250925092565b81516001600160401b03168152602080830151600f0b9082015260408083015163ffffffff16908201526060810161097a565b5f602082840312156147c0575f5ffd5b5035919050565b5f602082840312156147d7575f5ffd5b813561075681614646565b80516001600160a01b0316825260209081015163ffffffff16910152565b5f8151808452602084019350602083015f5b8281101561483b576148258683516147e2565b6040959095019460209190910190600101614812565b5093949350505050565b602081525f6107566020830184614800565b5f60408284031215614867575f5ffd5b61075683836146d9565b5f5f83601f840112614881575f5ffd5b5081356001600160401b03811115614897575f5ffd5b6020830191508360208260051b85010111156118c5575f5ffd5b5f5f5f604084860312156148c3575f5ffd5b83356148ce81614646565b925060208401356001600160401b038111156148e8575f5ffd5b6148f486828701614871565b9497909650939450505050565b5f6001600160401b038211156149195761491961465a565b5060051b60200190565b5f82601f830112614932575f5ffd5b813561494561494082614901565b614696565b8082825260208201915060208360051b860101925085831115614966575f5ffd5b602085015b8381101561498c57803561497e81614646565b83526020928301920161496b565b5095945050505050565b5f5f5f5f60a085870312156149a9575f5ffd5b6149b386866146d9565b935060408501356001600160401b038111156149cd575f5ffd5b6149d987828801614923565b93505060608501356001600160401b038111156149f4575f5ffd5b614a0087828801614923565b925050614a0f608086016146c6565b905092959194509250565b5f8151808452602084019350602083015f5b8281101561483b578151865260209586019590910190600101614a2c565b5f602082016020835280845180835260408501915060408160051b8601019250602086015f5b82811015614aa157603f19878603018452614a8c858351614a1a565b94506020938401939190910190600101614a70565b50929695505050505050565b5f5f60408385031215614abe575f5ffd5b8235614ac981614646565b915060208301356001600160401b03811115614ae3575f5ffd5b830160a08186031215614af4575f5ffd5b809150509250929050565b5f5f60408385031215614b10575f5ffd5b8235614b1b81614646565b91506020830135614af481614646565b5f8151808452602084019350602083015f5b8281101561483b57614b7686835180516001600160401b03168252602080820151600f0b9083015260409081015163ffffffff16910152565b6060959095019460209190910190600101614b3d565b604081525f614b9e6040830185614800565b8281036020840152611e298185614b2b565b5f8151808452602084019350602083015f5b8281101561483b5781516001600160a01b0316865260209586019590910190600101614bc2565b602081525f6107566020830184614bb0565b5f5f60408385031215614c0c575f5ffd5b82356001600160401b03811115614c21575f5ffd5b614c2d85828601614923565b9250506020830135614af481614646565b602080825282518282018190525f918401906040840190835b81811015614c7e5783516001600160401b0316835260209384019390920191600101614c57565b509095945050505050565b5f5f5f5f5f60608688031215614c9d575f5ffd5b8535614ca881614646565b945060208601356001600160401b03811115614cc2575f5ffd5b614cce88828901614871565b90955093505060408601356001600160401b03811115614cec575f5ffd5b614cf888828901614871565b969995985093965092949392505050565b5f5f5f5f60608587031215614d1c575f5ffd5b8435614d2781614646565b9350614d35602086016146c6565b925060408501356001600160401b03811115614d4f575f5ffd5b614d5b87828801614871565b95989497509550505050565b5f5f60408385031215614d78575f5ffd5b8235614d8381614646565b915060208301356001600160401b03811115614d9d575f5ffd5b613e0185828601614923565b5f5f60408385031215614dba575f5ffd5b8235614dc581614646565b9150614dd3602084016146c6565b90509250929050565b5f60208284031215614dec575f5ffd5b813560ff81168114610756575f5ffd5b5f5f60608385031215614e0d575f5ffd5b8235614e1881614646565b9150614dd384602085016146d9565b5f60608284031215614e37575f5ffd5b50919050565b5f60208284031215614e4d575f5ffd5b81356001600160401b03811115614e62575f5ffd5b612fc384828501614e27565b5f5f5f60808486031215614e80575f5ffd5b83356001600160401b03811115614e95575f5ffd5b614ea186828701614923565b93505061476285602086016146d9565b602081525f6107566020830184614b2b565b5f5f5f60608486031215614ed5575f5ffd5b8335614ee081614646565b925060208401356001600160401b03811115614efa575f5ffd5b614f0686828701614923565b925050614f15604085016146c6565b90509250925092565b5f5f60408385031215614f2f575f5ffd5b8235614f3a81614646565b915060208301356001600160401b03811115614f54575f5ffd5b8301601f81018513614f64575f5ffd5b8035614f7261494082614901565b8082825260208201915060208360051b850101925087831115614f93575f5ffd5b602084015b838110156150b85780356001600160401b03811115614fb5575f5ffd5b85016080818b03601f19011215614fca575f5ffd5b614fd261466e565b614fdf8b602084016146d9565b815260608201356001600160401b03811115614ff9575f5ffd5b6150088c602083860101614923565b60208301525060808201356001600160401b03811115615026575f5ffd5b6020818401019250508a601f83011261503d575f5ffd5b813561504b61494082614901565b8082825260208201915060208360051b86010192508d83111561506c575f5ffd5b6020850194505b828510156150a25784356001600160401b0381168114615091575f5ffd5b825260209485019490910190615073565b6040840152505084525060209283019201614f98565b50809450505050509250929050565b5f5f5f604084860312156150d9575f5ffd5b83356150e481614646565b925060208401356001600160401b038111156150fe575f5ffd5b8401601f8101861361510e575f5ffd5b80356001600160401b03811115615123575f5ffd5b866020828401011115615134575f5ffd5b939660209190910195509293505050565b5f5f60408385031215615156575f5ffd5b823561516181614646565b915060208301356001600160401b0381111561517b575f5ffd5b613e0185828601614e27565b5f5f60408385031215615198575f5ffd5b82356151a381614646565b946020939093013593505050565b5f602082840312156151c1575f5ffd5b81518015158114610756575f5ffd5b634e487b7160e01b5f52603260045260245ffd5b5f8235603e198336030181126151f8575f5ffd5b9190910192915050565b5f60208284031215615212575f5ffd5b610756826146c6565b6040810161097a82846147e2565b5f5f8335601e1984360301811261523e575f5ffd5b8301803591506001600160401b03821115615257575f5ffd5b6020019150600581901b36038213156118c5575f5ffd5b6060810161527c82856147e2565b6001600160a01b039290921660409190910152919050565b604081525f6152a66040830185614bb0565b8281036020840152611e298185614bb0565b5f602082840312156152c8575f5ffd5b81516001600160401b038111156152dd575f5ffd5b8201601f810184136152ed575f5ffd5b80516152fb61494082614901565b8082825260208201915060208360051b85010192508683111561531c575f5ffd5b602084015b838110156153b95780516001600160401b0381111561533e575f5ffd5b8501603f8101891361534e575f5ffd5b602081015161535f61494082614901565b808282526020820191506020808460051b8601010192508b831115615382575f5ffd5b6040840193505b828410156153a4578351825260209384019390910190615389565b86525050602093840193919091019050615321565b509695505050505050565b634e487b7160e01b5f52601160045260245ffd5b8181038181111561097a5761097a6153c4565b6001600160401b03828116828216039081111561097a5761097a6153c4565b5f81600f0b60016001607f1b03198103615426576154266153c4565b5f0392915050565b600f81810b9083900b0160016001607f1b03811360016001607f1b03198212171561097a5761097a6153c4565b6001600160a01b038616815260c0810161547860208301876147e2565b6001600160a01b039490941660608201526001600160401b0392909216608083015263ffffffff1660a09091015292915050565b5f5f8335601e198436030181126154c1575f5ffd5b8301803591506001600160401b038211156154da575f5ffd5b6020019150368190038213156118c5575f5ffd5b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b6001600160a01b03881681525f60c08201615534602084018a6147e2565b60c060608401528690528660e083015f5b8881101561557557823561555881614646565b6001600160a01b0316825260209283019290910190600101615545565b5083810360808501526155888188614a1a565b91505082810360a084015261559e8185876154ee565b9a9950505050505050505050565b5f602082840312156155bc575f5ffd5b813561ffff81168114610756575f5ffd5b63ffffffff818116838216019081111561097a5761097a6153c4565b8183526020830192505f815f5b8481101561483b5763ffffffff61560c836146c6565b16865260209586019591909101906001016155f6565b6001600160a01b03841681526040602082018190525f90611e2990830184866155e9565b602081525f612fc36020830184866154ee565b6001600160a01b03861681526060602082018190525f9061567d90830186886155e9565b82810360408401526156908185876154ee565b98975050505050505050565b5f602082840312156156ac575f5ffd5b815161075681614646565b80516020808301519190811015614e37575f1960209190910360031b1b16919050565b5f600182016156eb576156eb6153c4565b5060010190565b5f81615700576157006153c4565b505f190190565b600f82810b9082900b0360016001607f1b0319811260016001607f1b038213171561097a5761097a6153c4565b634e487b7160e01b5f52601260045260245ffd5b634e487b7160e01b5f52602160045260245ffd5b8082018082111561097a5761097a6153c4565b8082018281125f83128015821682158216171561578e5761578e6153c4565b505092915050565b634e487b7160e01b5f52603160045260245ffd5b5f826157c457634e487b7160e01b5f52601260045260245ffd5b50049056fea2646970667358221220b6448b6e0c870da2f921bd7c4483b01f34691ed74ee37710fc519e5a80ab26a164736f6c634300081b0033", } // AllocationManagerABI 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 3e8b6142ff..5367ed4b91 100644 --- a/pkg/bindings/BackingEigen/binding.go +++ b/pkg/bindings/BackingEigen/binding.go @@ -38,7 +38,7 @@ type ERC20VotesUpgradeableCheckpoint struct { // BackingEigenMetaData contains all meta data concerning the BackingEigen contract. var BackingEigenMetaData = &bind.MetaData{ ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"_EIGEN\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"CLOCK_MODE\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"DOMAIN_SEPARATOR\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"EIGEN\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"allowance\",\"inputs\":[{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"spender\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"allowedFrom\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"allowedTo\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"approve\",\"inputs\":[{\"name\":\"spender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"balanceOf\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"burn\",\"inputs\":[{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"checkpoints\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"pos\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structERC20VotesUpgradeable.Checkpoint\",\"components\":[{\"name\":\"fromBlock\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"votes\",\"type\":\"uint224\",\"internalType\":\"uint224\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"clock\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint48\",\"internalType\":\"uint48\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"decimals\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"decreaseAllowance\",\"inputs\":[{\"name\":\"spender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"subtractedValue\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"delegate\",\"inputs\":[{\"name\":\"delegatee\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"delegateBySig\",\"inputs\":[{\"name\":\"delegatee\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"nonce\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"v\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"r\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"s\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"delegates\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"disableTransferRestrictions\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"eip712Domain\",\"inputs\":[],\"outputs\":[{\"name\":\"fields\",\"type\":\"bytes1\",\"internalType\":\"bytes1\"},{\"name\":\"name\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"version\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"chainId\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"verifyingContract\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"extensions\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getPastTotalSupply\",\"inputs\":[{\"name\":\"timepoint\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getPastVotes\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"timepoint\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getVotes\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"increaseAllowance\",\"inputs\":[{\"name\":\"spender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"addedValue\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"initialOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"isMinter\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"mint\",\"inputs\":[{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"name\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"nonces\",\"inputs\":[{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"numCheckpoints\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"permit\",\"inputs\":[{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"spender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"deadline\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"v\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"r\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"s\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setAllowedFrom\",\"inputs\":[{\"name\":\"from\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"isAllowedFrom\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setAllowedTo\",\"inputs\":[{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"isAllowedTo\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setIsMinter\",\"inputs\":[{\"name\":\"minterAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"newStatus\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"symbol\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"totalSupply\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"transfer\",\"inputs\":[{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"transferFrom\",\"inputs\":[{\"name\":\"from\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"transferRestrictionsDisabledAfter\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"event\",\"name\":\"Approval\",\"inputs\":[{\"name\":\"owner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"spender\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Backed\",\"inputs\":[],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegateChanged\",\"inputs\":[{\"name\":\"delegator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"fromDelegate\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"toDelegate\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegateVotesChanged\",\"inputs\":[{\"name\":\"delegate\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"previousBalance\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"newBalance\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"EIP712DomainChanged\",\"inputs\":[],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"IsMinterModified\",\"inputs\":[{\"name\":\"minterAddress\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newStatus\",\"type\":\"bool\",\"indexed\":false,\"internalType\":\"bool\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"SetAllowedFrom\",\"inputs\":[{\"name\":\"from\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"isAllowedFrom\",\"type\":\"bool\",\"indexed\":false,\"internalType\":\"bool\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"SetAllowedTo\",\"inputs\":[{\"name\":\"to\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"isAllowedTo\",\"type\":\"bool\",\"indexed\":false,\"internalType\":\"bool\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Transfer\",\"inputs\":[{\"name\":\"from\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TransferRestrictionsDisabled\",\"inputs\":[],\"anonymous\":false}]", - Bin: "0x60a060405234801561000f575f5ffd5b50604051615929380380615929833981810160405281019061003191906101a6565b8073ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff168152505061007361007960201b60201c565b506102a3565b5f60019054906101000a900460ff16156100c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100bf90610251565b60405180910390fd5b60ff80165f5f9054906101000a900460ff1660ff16146101355760ff5f5f6101000a81548160ff021916908360ff1602179055507f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb384740249860ff60405161012c919061028a565b60405180910390a15b565b5f5ffd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6101648261013b565b9050919050565b5f6101758261015a565b9050919050565b6101858161016b565b811461018f575f5ffd5b50565b5f815190506101a08161017c565b92915050565b5f602082840312156101bb576101ba610137565b5b5f6101c884828501610192565b91505092915050565b5f82825260208201905092915050565b7f496e697469616c697a61626c653a20636f6e747261637420697320696e6974695f8201527f616c697a696e6700000000000000000000000000000000000000000000000000602082015250565b5f61023b6027836101d1565b9150610246826101e1565b604082019050919050565b5f6020820190508181035f8301526102688161022f565b9050919050565b5f60ff82169050919050565b6102848161026f565b82525050565b5f60208201905061029d5f83018461027b565b92915050565b6080516156596102d05f395f81816113e5015281816114100152818161143b01526118e501526156595ff3fe608060405234801561000f575f5ffd5b5060043610610246575f3560e01c80637ecebe0011610139578063aa271e1a116100b6578063dd62ed3e1161007a578063dd62ed3e14610752578063eb415f4514610782578063f1127ed81461078c578063f2fde38b146107bc578063fdc371ce146107d857610246565b8063aa271e1a146106b2578063b8c25594146106e2578063c3cda520146106fe578063c4d66de81461071a578063d505accf1461073657610246565b806395d89b41116100fd57806395d89b41146105e65780639ab24eb0146106045780639aec4bae14610634578063a457c2d714610652578063a9059cbb1461068257610246565b80637ecebe001461052657806384b0196e146105565780638da5cb5b1461057a5780638e539e8c1461059857806391ddadf4146105c857610246565b806340c10f19116101c757806366eb399f1161018b57806366eb399f146104705780636fcfff451461048c57806370a08231146104bc578063715018a6146104ec57806378aa33ba146104f657610246565b806340c10f19146103ce57806342966c68146103ea5780634bf5d7e914610406578063587cde1e146104245780635c19a95c1461045457610246565b806323b872dd1161020e57806323b872dd14610302578063313ce567146103325780633644e51514610350578063395093511461036e5780633a46b1a81461039e57610246565b80630455e6941461024a57806306fdde031461027a578063095ea7b31461029857806318160ddd146102c85780631ffacdef146102e6575b5f5ffd5b610264600480360381019061025f91906138f3565b6107f6565b6040516102719190613938565b60405180910390f35b610282610814565b60405161028f91906139c1565b60405180910390f35b6102b260048036038101906102ad9190613a14565b6108a4565b6040516102bf9190613938565b60405180910390f35b6102d06108c6565b6040516102dd9190613a61565b60405180910390f35b61030060048036038101906102fb9190613aa4565b6108cf565b005b61031c60048036038101906103179190613ae2565b6108e5565b6040516103299190613938565b60405180910390f35b61033a610913565b6040516103479190613b4d565b60405180910390f35b61035861091b565b6040516103659190613b7e565b60405180910390f35b61038860048036038101906103839190613a14565b610929565b6040516103959190613938565b60405180910390f35b6103b860048036038101906103b39190613a14565b61095f565b6040516103c59190613a61565b60405180910390f35b6103e860048036038101906103e39190613a14565b6109ff565b005b61040460048036038101906103ff9190613b97565b610a97565b005b61040e610aab565b60405161041b91906139c1565b60405180910390f35b61043e600480360381019061043991906138f3565b610ae8565b60405161044b9190613bd1565b60405180910390f35b61046e600480360381019061046991906138f3565b610b4d565b005b61048a60048036038101906104859190613aa4565b610b61565b005b6104a660048036038101906104a191906138f3565b610c10565b6040516104b39190613c08565b60405180910390f35b6104d660048036038101906104d191906138f3565b610c61565b6040516104e39190613a61565b60405180910390f35b6104f4610ca7565b005b610510600480360381019061050b91906138f3565b610cba565b60405161051d9190613938565b60405180910390f35b610540600480360381019061053b91906138f3565b610cd8565b60405161054d9190613a61565b60405180910390f35b61055e610d25565b6040516105719796959493929190613d12565b60405180910390f35b610582610e1f565b60405161058f9190613bd1565b60405180910390f35b6105b260048036038101906105ad9190613b97565b610e47565b6040516105bf9190613a61565b60405180910390f35b6105d0610eac565b6040516105dd9190613db4565b60405180910390f35b6105ee610ebb565b6040516105fb91906139c1565b60405180910390f35b61061e600480360381019061061991906138f3565b610f4b565b60405161062b9190613a61565b60405180910390f35b61063c611049565b6040516106499190613a61565b60405180910390f35b61066c60048036038101906106679190613a14565b611050565b6040516106799190613938565b60405180910390f35b61069c60048036038101906106979190613a14565b6110c5565b6040516106a99190613938565b60405180910390f35b6106cc60048036038101906106c791906138f3565b6110e7565b6040516106d99190613938565b60405180910390f35b6106fc60048036038101906106f79190613aa4565b611105565b005b61071860048036038101906107139190613e21565b61111b565b005b610734600480360381019061072f91906138f3565b61121e565b005b610750600480360381019061074b9190613eaa565b6114f4565b005b61076c60048036038101906107679190613f47565b611633565b6040516107799190613a61565b60405180910390f35b61078a6116b5565b005b6107a660048036038101906107a19190613faf565b611758565b6040516107b3919061405f565b60405180910390f35b6107d660048036038101906107d191906138f3565b611861565b005b6107e06118e3565b6040516107ed91906140d3565b60405180910390f35b610131602052805f5260405f205f915054906101000a900460ff1681565b60606068805461082390614119565b80601f016020809104026020016040519081016040528092919081815260200182805461084f90614119565b801561089a5780601f106108715761010080835404028352916020019161089a565b820191905f5260205f20905b81548152906001019060200180831161087d57829003601f168201915b5050505050905090565b5f5f6108ae611907565b90506108bb81858561190e565b600191505092915050565b5f606754905090565b6108d7611ad1565b6108e18282611b4f565b5050565b5f5f6108ef611907565b90506108fc858285611bf6565b610907858585611c81565b60019150509392505050565b5f6012905090565b5f610924611ef0565b905090565b5f5f610933611907565b90506109548185856109458589611633565b61094f9190614176565b61190e565b600191505092915050565b5f610968610eac565b65ffffffffffff1682106109b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109a8906141f3565b60405180910390fd5b6109f760ff5f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2083611efe565b905092915050565b6101335f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16610a89576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a8090614281565b60405180910390fd5b610a93828261203e565b5050565b610aa8610aa2611907565b826120cc565b50565b60606040518060400160405280600e81526020017f6d6f64653d74696d657374616d70000000000000000000000000000000000000815250905090565b5f60fe5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b610b5e610b58611907565b826120eb565b50565b610b69611ad1565b8173ffffffffffffffffffffffffffffffffffffffff167f0124b12503bddc2616c0f3f54fd23ed283f5ef0c1483a75409e42612176b8bde82604051610baf9190613938565b60405180910390a2806101335f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055505050565b5f610c5a60ff5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2080549050612200565b9050919050565b5f60655f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b610caf611ad1565b610cb85f612252565b565b610132602052805f5260405f205f915054906101000a900460ff1681565b5f610d1e60cb5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20612315565b9050919050565b5f6060805f5f5f60605f5f1b609754148015610d4457505f5f1b609854145b610d83576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d7a906142e9565b60405180910390fd5b610d8b612321565b610d936123b1565b46305f5f1b5f67ffffffffffffffff811115610db257610db1614307565b5b604051908082528060200260200182016040528015610de05781602001602082028036833780820191505090505b507f0f00000000000000000000000000000000000000000000000000000000000000959493929190965096509650965096509650965090919293949596565b5f60335f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b5f610e50610eac565b65ffffffffffff168210610e99576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e90906141f3565b60405180910390fd5b610ea561010083611efe565b9050919050565b5f610eb642612441565b905090565b606060698054610eca90614119565b80601f0160208091040260200160405190810160405280929190818152602001828054610ef690614119565b8015610f415780601f10610f1857610100808354040283529160200191610f41565b820191905f5260205f20905b815481529060010190602001808311610f2457829003601f168201915b5050505050905090565b5f5f60ff5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f208054905090505f81146110215760ff5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206001820381548110610fe957610fe8614334565b5b905f5260205f20015f0160049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16611023565b5f5b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16915050919050565b6101305481565b5f5f61105a611907565b90505f6110678286611633565b9050838110156110ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110a3906143d1565b60405180910390fd5b6110b9828686840361190e565b60019250505092915050565b5f5f6110cf611907565b90506110dc818585611c81565b600191505092915050565b610133602052805f5260405f205f915054906101000a900460ff1681565b61110d611ad1565b6111178282612495565b5050565b8342111561115e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161115590614439565b60405180910390fd5b5f6111bf6111b77fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf89898960405160200161119c9493929190614457565b6040516020818303038152906040528051906020012061253c565b858585612555565b90506111ca8161257e565b861461120b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611202906144e4565b60405180910390fd5b61121581886120eb565b50505050505050565b5f5f60019054906101000a900460ff1615905080801561124e575060015f5f9054906101000a900460ff1660ff16105b8061127b575061125d306125d9565b15801561127a575060015f5f9054906101000a900460ff1660ff16145b5b6112ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112b190614572565b60405180910390fd5b60015f5f6101000a81548160ff021916908360ff16021790555080156112f55760015f60016101000a81548160ff0219169083151502179055505b6112fd6125fb565b6113716040518060400160405280600d81526020017f4261636b696e6720456967656e000000000000000000000000000000000000008152506040518060400160405280600681526020017f62454947454e0000000000000000000000000000000000000000000000000000815250612653565b61137a82612252565b6113b86040518060400160405280600681526020017f62454947454e00000000000000000000000000000000000000000000000000008152506126af565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6101308190555061140b7f00000000000000000000000000000000000000000000000000000000000000006001611b4f565b6114367f00000000000000000000000000000000000000000000000000000000000000006001612495565b61146c7f00000000000000000000000000000000000000000000000000000000000000006b05686877afb5cbccbf73400061203e565b7fb7c23c1e2e36f298e9879a88ecfcd07e28fbb439bcfa9c78ca1363ca14370d2660405160405180910390a180156114f0575f5f60016101000a81548160ff0219169083151502179055507f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb384740249860016040516114e791906145c9565b60405180910390a15b5050565b83421115611537576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161152e9061462c565b60405180910390fd5b5f7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98888886115658c61257e565b8960405160200161157b9695949392919061464a565b6040516020818303038152906040528051906020012090505f61159d8261253c565b90505f6115ac82878787612555565b90508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461161c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611613906146f3565b60405180910390fd5b6116278a8a8a61190e565b50505050505050505050565b5f60665f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905092915050565b6116bd611ad1565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6101305414611722576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611719906147a7565b60405180910390fd5b5f610130819055507f2b18986d3ba809db2f13a5d7bf17f60d357b37d9cbb55dd71cbbac8dc4060f6460405160405180910390a1565b611760613859565b60ff5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f208263ffffffff16815481106117b5576117b4614334565b5b905f5260205f20016040518060400160405290815f82015f9054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020015f820160049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1681525050905092915050565b611869611ad1565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036118d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118ce90614835565b60405180910390fd5b6118e081612252565b50565b7f000000000000000000000000000000000000000000000000000000000000000081565b5f33905090565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361197c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611973906148c3565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036119ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119e190614951565b60405180910390fd5b8060665f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92583604051611ac49190613a61565b60405180910390a3505050565b611ad9611907565b73ffffffffffffffffffffffffffffffffffffffff16611af7610e1f565b73ffffffffffffffffffffffffffffffffffffffff1614611b4d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b44906149b9565b60405180910390fd5b565b806101315f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff167fcf20b1ecb604b0e8888d579c64e8a3b10e590d45c1c2dddb393bed284362227182604051611bea9190613938565b60405180910390a25050565b5f611c018484611633565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114611c7b5781811015611c6d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c6490614a21565b60405180910390fd5b611c7a848484840361190e565b5b50505050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611cef576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ce690614aaf565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611d5d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d5490614b3d565b60405180910390fd5b611d6883838361273f565b5f60655f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905081811015611dec576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611de390614bcb565b60405180910390fd5b81810360655f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508160655f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051611ed79190613a61565b60405180910390a3611eea84848461286c565b50505050565b5f611ef9612897565b905090565b5f5f838054905090505f5f90505f8290506005831115611f72575f611f22846128fa565b84611f2d9190614be9565b905085611f3a88836129f0565b5f015f9054906101000a900463ffffffff1663ffffffff161115611f6057809150611f70565b600181611f6d9190614176565b92505b505b5b80821015611fcf575f611f868383612a02565b905085611f9388836129f0565b5f015f9054906101000a900463ffffffff1663ffffffff161115611fb957809150611fc9565b600181611fc69190614176565b92505b50611f73565b5f811461201357611fe386600183036129f0565b5f0160049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16612015565b5f5b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16935050505092915050565b6120488282612a27565b612050612b76565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff166120766108c6565b11156120b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120ae90614c8c565b60405180910390fd5b6120c6610100612b9983612bae565b50505050565b6120d68282612e77565b6120e561010061303c83612bae565b50505050565b5f6120f583610ae8565b90505f61210184610c61565b90508260fe5f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f60405160405180910390a46121fa828483613051565b50505050565b5f63ffffffff801682111561224a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161224190614d1a565b60405180910390fd5b819050919050565b5f60335f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160335f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f815f01549050919050565b60606099805461233090614119565b80601f016020809104026020016040519081016040528092919081815260200182805461235c90614119565b80156123a75780601f1061237e576101008083540402835291602001916123a7565b820191905f5260205f20905b81548152906001019060200180831161238a57829003601f168201915b5050505050905090565b6060609a80546123c090614119565b80601f01602080910402602001604051908101604052809291908181526020018280546123ec90614119565b80156124375780601f1061240e57610100808354040283529160200191612437565b820191905f5260205f20905b81548152906001019060200180831161241a57829003601f168201915b5050505050905090565b5f65ffffffffffff801682111561248d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161248490614da8565b60405180910390fd5b819050919050565b806101325f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff167f72a561d1af7409467dae4f1e9fc52590a9335a1dda17727e2b6aa8c4db35109b826040516125309190613938565b60405180910390a25050565b5f61254e612548611ef0565b83613241565b9050919050565b5f5f5f61256487878787613281565b9150915061257181613359565b8192505050949350505050565b5f5f60cb5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2090506125c881612315565b91506125d3816134be565b50919050565b5f5f8273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b5f60019054906101000a900460ff16612649576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161264090614e36565b60405180910390fd5b6126516134d2565b565b5f60019054906101000a900460ff166126a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161269890614e36565b60405180910390fd5b6126ab8282613532565b5050565b5f60019054906101000a900460ff166126fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126f490614e36565b60405180910390fd5b61273c816040518060400160405280600181526020017f31000000000000000000000000000000000000000000000000000000000000008152506135a4565b50565b61013054421161285c576101315f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16806127e657506101325f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff165b8061281c57505f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16145b61285b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161285290614eea565b60405180910390fd5b5b612867838383613628565b505050565b61287783838361362d565b61289261288384610ae8565b61288c84610ae8565b83613051565b505050565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f6128c1613632565b6128c9613699565b46306040516020016128df959493929190614f08565b60405160208183030381529060405280519060200120905090565b5f5f820361290a575f90506129eb565b5f600161291684613700565b901c6001901b905060018184816129305761292f614f59565b5b048201901c9050600181848161294957612948614f59565b5b048201901c9050600181848161296257612961614f59565b5b048201901c9050600181848161297b5761297a614f59565b5b048201901c9050600181848161299457612993614f59565b5b048201901c905060018184816129ad576129ac614f59565b5b048201901c905060018184816129c6576129c5614f59565b5b048201901c90506129e7818285816129e1576129e0614f59565b5b046137d7565b9150505b919050565b5f825f528160205f2001905092915050565b5f6002828418612a129190614f86565b828416612a1f9190614176565b905092915050565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612a95576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a8c90615000565b60405180910390fd5b612aa05f838361273f565b8060675f828254612ab19190614176565b925050819055508060655f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055508173ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051612b5f9190613a61565b60405180910390a3612b725f838361286c565b5050565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff905090565b5f8183612ba69190614176565b905092915050565b5f5f5f858054905090505f5f8214612c6e57612bcd87600184036129f0565b6040518060400160405290815f82015f9054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020015f820160049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1681525050612ca8565b60405180604001604052805f63ffffffff1681526020015f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff168152505b905080602001517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff169350612cdd84868863ffffffff16565b92505f82118015612d055750612cf1610eac565b65ffffffffffff16815f015163ffffffff16145b15612d7557612d13836137ef565b612d2088600185036129f0565b5f0160046101000a8154817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff02191690837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff160217905550612e6d565b866040518060400160405280612d99612d8c610eac565b65ffffffffffff16612200565b63ffffffff168152602001612dad866137ef565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16815250908060018154018082558091505060019003905f5260205f20015f909190919091505f820151815f015f6101000a81548163ffffffff021916908363ffffffff1602179055506020820151815f0160046101000a8154817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff02191690837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16021790555050505b5050935093915050565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612ee5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612edc9061508e565b60405180910390fd5b612ef0825f8361273f565b5f60655f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905081811015612f74576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f6b9061511c565b60405180910390fd5b81810360655f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508160675f82825403925050819055505f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516130249190613a61565b60405180910390a3613037835f8461286c565b505050565b5f81836130499190614be9565b905092915050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415801561308c57505f81115b1561323c575f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614613166575f5f61310f60ff5f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2061303c85612bae565b915091508473ffffffffffffffffffffffffffffffffffffffff167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a724838360405161315b92919061513a565b60405180910390a250505b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161461323b575f5f6131e460ff5f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20612b9985612bae565b915091508373ffffffffffffffffffffffffffffffffffffffff167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a724838360405161323092919061513a565b60405180910390a250505b5b505050565b5f6040517f190100000000000000000000000000000000000000000000000000000000000081528360028201528260228201526042812091505092915050565b5f5f7f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0835f1c11156132b9575f600391509150613350565b5f6001878787876040515f81526020016040526040516132dc9493929190615161565b6020604051602081039080840390855afa1580156132fc573d5f5f3e3d5ffd5b5050506020604051035190505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603613348575f60019250925050613350565b805f92509250505b94509492505050565b5f600481111561336c5761336b6151a4565b5b81600481111561337f5761337e6151a4565b5b03156134bb5760016004811115613399576133986151a4565b5b8160048111156133ac576133ab6151a4565b5b036133ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133e39061521b565b60405180910390fd5b60026004811115613400576133ff6151a4565b5b816004811115613413576134126151a4565b5b03613453576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161344a90615283565b60405180910390fd5b60036004811115613467576134666151a4565b5b81600481111561347a576134796151a4565b5b036134ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134b190615311565b60405180910390fd5b5b50565b6001815f015f828254019250508190555050565b5f60019054906101000a900460ff16613520576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161351790614e36565b60405180910390fd5b61353061352b611907565b612252565b565b5f60019054906101000a900460ff16613580576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161357790614e36565b60405180910390fd5b816068908161358f91906154c6565b50806069908161359f91906154c6565b505050565b5f60019054906101000a900460ff166135f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016135e990614e36565b60405180910390fd5b816099908161360191906154c6565b5080609a908161361191906154c6565b505f5f1b6097819055505f5f1b6098819055505050565b505050565b505050565b5f5f61363c612321565b90505f81511115613657578080519060200120915050613696565b5f60975490505f5f1b8114613670578092505050613696565b7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470925050505b90565b5f5f6136a36123b1565b90505f815111156136be5780805190602001209150506136fd565b5f60985490505f5f1b81146136d75780925050506136fd565b7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470925050505b90565b5f5f5f90505f608084901c111561371f57608083901c92506080810190505b5f604084901c111561373957604083901c92506040810190505b5f602084901c111561375357602083901c92506020810190505b5f601084901c111561376d57601083901c92506010810190505b5f600884901c111561378757600883901c92506008810190505b5f600484901c11156137a157600483901c92506004810190505b5f600284901c11156137bb57600283901c92506002810190505b5f600184901c11156137ce576001810190505b80915050919050565b5f8183106137e557816137e7565b825b905092915050565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8016821115613851576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161384890615605565b60405180910390fd5b819050919050565b60405180604001604052805f63ffffffff1681526020015f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1681525090565b5f5ffd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6138c282613899565b9050919050565b6138d2816138b8565b81146138dc575f5ffd5b50565b5f813590506138ed816138c9565b92915050565b5f6020828403121561390857613907613895565b5b5f613915848285016138df565b91505092915050565b5f8115159050919050565b6139328161391e565b82525050565b5f60208201905061394b5f830184613929565b92915050565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f601f19601f8301169050919050565b5f61399382613951565b61399d818561395b565b93506139ad81856020860161396b565b6139b681613979565b840191505092915050565b5f6020820190508181035f8301526139d98184613989565b905092915050565b5f819050919050565b6139f3816139e1565b81146139fd575f5ffd5b50565b5f81359050613a0e816139ea565b92915050565b5f5f60408385031215613a2a57613a29613895565b5b5f613a37858286016138df565b9250506020613a4885828601613a00565b9150509250929050565b613a5b816139e1565b82525050565b5f602082019050613a745f830184613a52565b92915050565b613a838161391e565b8114613a8d575f5ffd5b50565b5f81359050613a9e81613a7a565b92915050565b5f5f60408385031215613aba57613ab9613895565b5b5f613ac7858286016138df565b9250506020613ad885828601613a90565b9150509250929050565b5f5f5f60608486031215613af957613af8613895565b5b5f613b06868287016138df565b9350506020613b17868287016138df565b9250506040613b2886828701613a00565b9150509250925092565b5f60ff82169050919050565b613b4781613b32565b82525050565b5f602082019050613b605f830184613b3e565b92915050565b5f819050919050565b613b7881613b66565b82525050565b5f602082019050613b915f830184613b6f565b92915050565b5f60208284031215613bac57613bab613895565b5b5f613bb984828501613a00565b91505092915050565b613bcb816138b8565b82525050565b5f602082019050613be45f830184613bc2565b92915050565b5f63ffffffff82169050919050565b613c0281613bea565b82525050565b5f602082019050613c1b5f830184613bf9565b92915050565b5f7fff0000000000000000000000000000000000000000000000000000000000000082169050919050565b613c5581613c21565b82525050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b613c8d816139e1565b82525050565b5f613c9e8383613c84565b60208301905092915050565b5f602082019050919050565b5f613cc082613c5b565b613cca8185613c65565b9350613cd583613c75565b805f5b83811015613d05578151613cec8882613c93565b9750613cf783613caa565b925050600181019050613cd8565b5085935050505092915050565b5f60e082019050613d255f83018a613c4c565b8181036020830152613d378189613989565b90508181036040830152613d4b8188613989565b9050613d5a6060830187613a52565b613d676080830186613bc2565b613d7460a0830185613b6f565b81810360c0830152613d868184613cb6565b905098975050505050505050565b5f65ffffffffffff82169050919050565b613dae81613d94565b82525050565b5f602082019050613dc75f830184613da5565b92915050565b613dd681613b32565b8114613de0575f5ffd5b50565b5f81359050613df181613dcd565b92915050565b613e0081613b66565b8114613e0a575f5ffd5b50565b5f81359050613e1b81613df7565b92915050565b5f5f5f5f5f5f60c08789031215613e3b57613e3a613895565b5b5f613e4889828a016138df565b9650506020613e5989828a01613a00565b9550506040613e6a89828a01613a00565b9450506060613e7b89828a01613de3565b9350506080613e8c89828a01613e0d565b92505060a0613e9d89828a01613e0d565b9150509295509295509295565b5f5f5f5f5f5f5f60e0888a031215613ec557613ec4613895565b5b5f613ed28a828b016138df565b9750506020613ee38a828b016138df565b9650506040613ef48a828b01613a00565b9550506060613f058a828b01613a00565b9450506080613f168a828b01613de3565b93505060a0613f278a828b01613e0d565b92505060c0613f388a828b01613e0d565b91505092959891949750929550565b5f5f60408385031215613f5d57613f5c613895565b5b5f613f6a858286016138df565b9250506020613f7b858286016138df565b9150509250929050565b613f8e81613bea565b8114613f98575f5ffd5b50565b5f81359050613fa981613f85565b92915050565b5f5f60408385031215613fc557613fc4613895565b5b5f613fd2858286016138df565b9250506020613fe385828601613f9b565b9150509250929050565b613ff681613bea565b82525050565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff82169050919050565b61402c81613ffc565b82525050565b604082015f8201516140465f850182613fed565b5060208201516140596020850182614023565b50505050565b5f6040820190506140725f830184614032565b92915050565b5f819050919050565b5f61409b61409661409184613899565b614078565b613899565b9050919050565b5f6140ac82614081565b9050919050565b5f6140bd826140a2565b9050919050565b6140cd816140b3565b82525050565b5f6020820190506140e65f8301846140c4565b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f600282049050600182168061413057607f821691505b602082108103614143576141426140ec565b5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f614180826139e1565b915061418b836139e1565b92508282019050808211156141a3576141a2614149565b5b92915050565b7f4552433230566f7465733a20667574757265206c6f6f6b7570000000000000005f82015250565b5f6141dd60198361395b565b91506141e8826141a9565b602082019050919050565b5f6020820190508181035f83015261420a816141d1565b9050919050565b7f4261636b696e67456967656e2e6d696e743a2063616c6c6572206973206e6f745f8201527f2061206d696e7465720000000000000000000000000000000000000000000000602082015250565b5f61426b60298361395b565b915061427682614211565b604082019050919050565b5f6020820190508181035f8301526142988161425f565b9050919050565b7f4549503731323a20556e696e697469616c697a656400000000000000000000005f82015250565b5f6142d360158361395b565b91506142de8261429f565b602082019050919050565b5f6020820190508181035f830152614300816142c7565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f775f8201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b5f6143bb60258361395b565b91506143c682614361565b604082019050919050565b5f6020820190508181035f8301526143e8816143af565b9050919050565b7f4552433230566f7465733a207369676e617475726520657870697265640000005f82015250565b5f614423601d8361395b565b915061442e826143ef565b602082019050919050565b5f6020820190508181035f83015261445081614417565b9050919050565b5f60808201905061446a5f830187613b6f565b6144776020830186613bc2565b6144846040830185613a52565b6144916060830184613a52565b95945050505050565b7f4552433230566f7465733a20696e76616c6964206e6f6e6365000000000000005f82015250565b5f6144ce60198361395b565b91506144d98261449a565b602082019050919050565b5f6020820190508181035f8301526144fb816144c2565b9050919050565b7f496e697469616c697a61626c653a20636f6e747261637420697320616c7265615f8201527f647920696e697469616c697a6564000000000000000000000000000000000000602082015250565b5f61455c602e8361395b565b915061456782614502565b604082019050919050565b5f6020820190508181035f83015261458981614550565b9050919050565b5f819050919050565b5f6145b36145ae6145a984614590565b614078565b613b32565b9050919050565b6145c381614599565b82525050565b5f6020820190506145dc5f8301846145ba565b92915050565b7f45524332305065726d69743a206578706972656420646561646c696e650000005f82015250565b5f614616601d8361395b565b9150614621826145e2565b602082019050919050565b5f6020820190508181035f8301526146438161460a565b9050919050565b5f60c08201905061465d5f830189613b6f565b61466a6020830188613bc2565b6146776040830187613bc2565b6146846060830186613a52565b6146916080830185613a52565b61469e60a0830184613a52565b979650505050505050565b7f45524332305065726d69743a20696e76616c6964207369676e617475726500005f82015250565b5f6146dd601e8361395b565b91506146e8826146a9565b602082019050919050565b5f6020820190508181035f83015261470a816146d1565b9050919050565b7f4261636b696e67456967656e2e64697361626c655472616e73666572526573745f8201527f72696374696f6e733a207472616e73666572207265737472696374696f6e732060208201527f61726520616c72656164792064697361626c6564000000000000000000000000604082015250565b5f61479160548361395b565b915061479c82614711565b606082019050919050565b5f6020820190508181035f8301526147be81614785565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f20615f8201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b5f61481f60268361395b565b915061482a826147c5565b604082019050919050565b5f6020820190508181035f83015261484c81614813565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f206164645f8201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b5f6148ad60248361395b565b91506148b882614853565b604082019050919050565b5f6020820190508181035f8301526148da816148a1565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f2061646472655f8201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b5f61493b60228361395b565b9150614946826148e1565b604082019050919050565b5f6020820190508181035f8301526149688161492f565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65725f82015250565b5f6149a360208361395b565b91506149ae8261496f565b602082019050919050565b5f6020820190508181035f8301526149d081614997565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000005f82015250565b5f614a0b601d8361395b565b9150614a16826149d7565b602082019050919050565b5f6020820190508181035f830152614a38816149ff565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f2061645f8201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b5f614a9960258361395b565b9150614aa482614a3f565b604082019050919050565b5f6020820190508181035f830152614ac681614a8d565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f20616464725f8201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b5f614b2760238361395b565b9150614b3282614acd565b604082019050919050565b5f6020820190508181035f830152614b5481614b1b565b9050919050565b7f45524332303a207472616e7366657220616d6f756e74206578636565647320625f8201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b5f614bb560268361395b565b9150614bc082614b5b565b604082019050919050565b5f6020820190508181035f830152614be281614ba9565b9050919050565b5f614bf3826139e1565b9150614bfe836139e1565b9250828203905081811115614c1657614c15614149565b5b92915050565b7f4552433230566f7465733a20746f74616c20737570706c79207269736b73206f5f8201527f766572666c6f77696e6720766f74657300000000000000000000000000000000602082015250565b5f614c7660308361395b565b9150614c8182614c1c565b604082019050919050565b5f6020820190508181035f830152614ca381614c6a565b9050919050565b7f53616665436173743a2076616c756520646f65736e27742066697420696e20335f8201527f3220626974730000000000000000000000000000000000000000000000000000602082015250565b5f614d0460268361395b565b9150614d0f82614caa565b604082019050919050565b5f6020820190508181035f830152614d3181614cf8565b9050919050565b7f53616665436173743a2076616c756520646f65736e27742066697420696e20345f8201527f3820626974730000000000000000000000000000000000000000000000000000602082015250565b5f614d9260268361395b565b9150614d9d82614d38565b604082019050919050565b5f6020820190508181035f830152614dbf81614d86565b9050919050565b7f496e697469616c697a61626c653a20636f6e7472616374206973206e6f7420695f8201527f6e697469616c697a696e67000000000000000000000000000000000000000000602082015250565b5f614e20602b8361395b565b9150614e2b82614dc6565b604082019050919050565b5f6020820190508181035f830152614e4d81614e14565b9050919050565b7f4261636b696e67456967656e2e5f6265666f7265546f6b656e5472616e7366655f8201527f723a2066726f6d206f7220746f206d7573742062652077686974656c6973746560208201527f6400000000000000000000000000000000000000000000000000000000000000604082015250565b5f614ed460418361395b565b9150614edf82614e54565b606082019050919050565b5f6020820190508181035f830152614f0181614ec8565b9050919050565b5f60a082019050614f1b5f830188613b6f565b614f286020830187613b6f565b614f356040830186613b6f565b614f426060830185613a52565b614f4f6080830184613bc2565b9695505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f614f90826139e1565b9150614f9b836139e1565b925082614fab57614faa614f59565b5b828204905092915050565b7f45524332303a206d696e7420746f20746865207a65726f2061646472657373005f82015250565b5f614fea601f8361395b565b9150614ff582614fb6565b602082019050919050565b5f6020820190508181035f83015261501781614fde565b9050919050565b7f45524332303a206275726e2066726f6d20746865207a65726f206164647265735f8201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b5f61507860218361395b565b91506150838261501e565b604082019050919050565b5f6020820190508181035f8301526150a58161506c565b9050919050565b7f45524332303a206275726e20616d6f756e7420657863656564732062616c616e5f8201527f6365000000000000000000000000000000000000000000000000000000000000602082015250565b5f61510660228361395b565b9150615111826150ac565b604082019050919050565b5f6020820190508181035f830152615133816150fa565b9050919050565b5f60408201905061514d5f830185613a52565b61515a6020830184613a52565b9392505050565b5f6080820190506151745f830187613b6f565b6151816020830186613b3e565b61518e6040830185613b6f565b61519b6060830184613b6f565b95945050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b7f45434453413a20696e76616c6964207369676e617475726500000000000000005f82015250565b5f61520560188361395b565b9150615210826151d1565b602082019050919050565b5f6020820190508181035f830152615232816151f9565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265206c656e677468005f82015250565b5f61526d601f8361395b565b915061527882615239565b602082019050919050565b5f6020820190508181035f83015261529a81615261565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c5f8201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b5f6152fb60228361395b565b9150615306826152a1565b604082019050919050565b5f6020820190508181035f830152615328816152ef565b9050919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f6008830261538b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82615350565b6153958683615350565b95508019841693508086168417925050509392505050565b5f6153c76153c26153bd846139e1565b614078565b6139e1565b9050919050565b5f819050919050565b6153e0836153ad565b6153f46153ec826153ce565b84845461535c565b825550505050565b5f5f905090565b61540b6153fc565b6154168184846153d7565b505050565b5b818110156154395761542e5f82615403565b60018101905061541c565b5050565b601f82111561547e5761544f8161532f565b61545884615341565b81016020851015615467578190505b61547b61547385615341565b83018261541b565b50505b505050565b5f82821c905092915050565b5f61549e5f1984600802615483565b1980831691505092915050565b5f6154b6838361548f565b9150826002028217905092915050565b6154cf82613951565b67ffffffffffffffff8111156154e8576154e7614307565b5b6154f28254614119565b6154fd82828561543d565b5f60209050601f83116001811461552e575f841561551c578287015190505b61552685826154ab565b86555061558d565b601f19841661553c8661532f565b5f5b828110156155635784890151825560018201915060208501945060208101905061553e565b86831015615580578489015161557c601f89168261548f565b8355505b6001600288020188555050505b505050505050565b7f53616665436173743a2076616c756520646f65736e27742066697420696e20325f8201527f3234206269747300000000000000000000000000000000000000000000000000602082015250565b5f6155ef60278361395b565b91506155fa82615595565b604082019050919050565b5f6020820190508181035f83015261561c816155e3565b905091905056fea2646970667358221220a3bf83e8609c7520c6c9efc527a92aaaccd3e1ffbb422f73bb4e7a8832183d2d64736f6c634300081b0033", + Bin: "0x60a060405234801561000f575f5ffd5b50604051612d11380380612d1183398101604081905261002e91610105565b6001600160a01b038116608052610043610049565b50610132565b5f54610100900460ff16156100b45760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff90811614610103575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b5f60208284031215610115575f5ffd5b81516001600160a01b038116811461012b575f5ffd5b9392505050565b608051612bb261015f5f395f81816105e901528181610dae01528181610dd90152610e040152612bb25ff3fe608060405234801561000f575f5ffd5b506004361061023f575f3560e01c80637ecebe0011610135578063aa271e1a116100b4578063dd62ed3e11610079578063dd62ed3e14610579578063eb415f451461058c578063f1127ed814610594578063f2fde38b146105d1578063fdc371ce146105e4575f5ffd5b8063aa271e1a1461050a578063b8c255941461052d578063c3cda52014610540578063c4d66de814610553578063d505accf14610566575f5ffd5b806395d89b41116100fa57806395d89b41146104bf5780639ab24eb0146104c75780639aec4bae146104da578063a457c2d7146104e4578063a9059cbb146104f7575f5ffd5b80637ecebe001461044e57806384b0196e146104615780638da5cb5b1461047c5780638e539e8c1461048d57806391ddadf4146104a0575f5ffd5b806340c10f19116101c157806366eb399f1161018657806366eb399f146103c05780636fcfff45146103d357806370a08231146103fb578063715018a61461042357806378aa33ba1461042b575f5ffd5b806340c10f191461031a57806342966c681461032d5780634bf5d7e914610340578063587cde1e1461036a5780635c19a95c146103ad575f5ffd5b806323b872dd1161020757806323b872dd146102ca578063313ce567146102dd5780633644e515146102ec57806339509351146102f45780633a46b1a814610307575f5ffd5b80630455e6941461024357806306fdde031461027b578063095ea7b31461029057806318160ddd146102a35780631ffacdef146102b5575b5f5ffd5b610266610251366004612682565b6101316020525f908152604090205460ff1681565b60405190151581526020015b60405180910390f35b61028361060b565b60405161027291906126c9565b61026661029e3660046126db565b61069b565b6067545b604051908152602001610272565b6102c86102c3366004612703565b6106b4565b005b6102666102d836600461273c565b6106ca565b60405160128152602001610272565b6102a76106ed565b6102666103023660046126db565b6106fb565b6102a76103153660046126db565b61071c565b6102c86103283660046126db565b6107a4565b6102c861033b366004612776565b61081f565b60408051808201909152600e81526d06d6f64653d74696d657374616d760941b6020820152610283565b610395610378366004612682565b6001600160a01b039081165f90815260fe60205260409020541690565b6040516001600160a01b039091168152602001610272565b6102c86103bb366004612682565b61082c565b6102c86103ce366004612703565b610836565b6103e66103e1366004612682565b6108ae565b60405163ffffffff9091168152602001610272565b6102a7610409366004612682565b6001600160a01b03165f9081526065602052604090205490565b6102c86108cf565b610266610439366004612682565b6101326020525f908152604090205460ff1681565b6102a761045c366004612682565b6108e2565b6104696108ff565b604051610272979695949392919061278d565b6033546001600160a01b0316610395565b6102a761049b366004612776565b610998565b6104a86109ff565b60405165ffffffffffff9091168152602001610272565b610283610a09565b6102a76104d5366004612682565b610a18565b6102a76101305481565b6102666104f23660046126db565b610a95565b6102666105053660046126db565b610b0f565b610266610518366004612682565b6101336020525f908152604090205460ff1681565b6102c861053b366004612703565b610b1c565b6102c861054e366004612833565b610b2e565b6102c8610561366004612682565b610c63565b6102c8610574366004612887565b610ea5565b6102a76105873660046128ed565b611006565b6102c8611030565b6105a76105a236600461291e565b6110fe565b60408051825163ffffffff1681526020928301516001600160e01b03169281019290925201610272565b6102c86105df366004612682565b61117f565b6103957f000000000000000000000000000000000000000000000000000000000000000081565b60606068805461061a90612950565b80601f016020809104026020016040519081016040528092919081815260200182805461064690612950565b80156106915780601f1061066857610100808354040283529160200191610691565b820191905f5260205f20905b81548152906001019060200180831161067457829003601f168201915b5050505050905090565b5f336106a88185856111f5565b60019150505b92915050565b6106bc611318565b6106c68282611372565b5050565b5f336106d78582856113d2565b6106e285858561144a565b506001949350505050565b5f6106f6611604565b905090565b5f336106a881858561070d8383611006565b6107179190612996565b6111f5565b5f6107256109ff565b65ffffffffffff16821061077c5760405162461bcd60e51b815260206004820152601960248201527804552433230566f7465733a20667574757265206c6f6f6b757603c1b60448201526064015b60405180910390fd5b6001600160a01b0383165f90815260ff6020526040902061079d908361160d565b9392505050565b335f908152610133602052604090205460ff166108155760405162461bcd60e51b815260206004820152602960248201527f4261636b696e67456967656e2e6d696e743a2063616c6c6572206973206e6f7460448201526810309036b4b73a32b960b91b6064820152608401610773565b6106c682826116ee565b6108293382611779565b50565b6108293382611792565b61083e611318565b816001600160a01b03167f0124b12503bddc2616c0f3f54fd23ed283f5ef0c1483a75409e42612176b8bde8260405161087b911515815260200190565b60405180910390a26001600160a01b03919091165f90815261013360205260409020805460ff1916911515919091179055565b6001600160a01b0381165f90815260ff60205260408120546106ae9061180b565b6108d7611318565b6108e05f611873565b565b6001600160a01b0381165f90815260cb60205260408120546106ae565b5f6060805f5f5f60606097545f5f1b14801561091b5750609854155b61095f5760405162461bcd60e51b81526020600482015260156024820152741152540dcc4c8e88155b9a5b9a5d1a585b1a5e9959605a1b6044820152606401610773565b6109676118c4565b61096f6118d3565b604080515f80825260208201909252600f60f81b9b939a50919850469750309650945092509050565b5f6109a16109ff565b65ffffffffffff1682106109f35760405162461bcd60e51b815260206004820152601960248201527804552433230566f7465733a20667574757265206c6f6f6b757603c1b6044820152606401610773565b6106ae6101008361160d565b5f6106f6426118e2565b60606069805461061a90612950565b6001600160a01b0381165f90815260ff60205260408120548015610a83576001600160a01b0383165f90815260ff6020526040902080545f198301908110610a6257610a626129bd565b5f9182526020909120015464010000000090046001600160e01b0316610a85565b5f5b6001600160e01b03169392505050565b5f3381610aa28286611006565b905083811015610b025760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610773565b6106e282868684036111f5565b5f336106a881858561144a565b610b24611318565b6106c68282611948565b83421115610b7e5760405162461bcd60e51b815260206004820152601d60248201527f4552433230566f7465733a207369676e617475726520657870697265640000006044820152606401610773565b604080517fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf60208201526001600160a01b0388169181019190915260608101869052608081018590525f90610bf790610bef9060a001604051602081830303815290604052805190602001206119a0565b8585856119cc565b9050610c02816119f2565b8614610c505760405162461bcd60e51b815260206004820152601960248201527f4552433230566f7465733a20696e76616c6964206e6f6e6365000000000000006044820152606401610773565b610c5a8188611792565b50505050505050565b5f54610100900460ff1615808015610c8157505f54600160ff909116105b80610c9a5750303b158015610c9a57505f5460ff166001145b610cfd5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610773565b5f805460ff191660011790558015610d1e575f805461ff0019166101001790555b610d26611a19565b610d736040518060400160405280600d81526020016c2130b1b5b4b7339022b4b3b2b760991b815250604051806040016040528060068152602001653122a4a3a2a760d11b815250611a47565b610d7c82611873565b610da3604051806040016040528060068152602001653122a4a3a2a760d11b815250611a77565b5f1961013055610dd47f00000000000000000000000000000000000000000000000000000000000000006001611372565b610dff7f00000000000000000000000000000000000000000000000000000000000000006001611948565b610e357f00000000000000000000000000000000000000000000000000000000000000006b05686877afb5cbccbf7340006116ee565b6040517fb7c23c1e2e36f298e9879a88ecfcd07e28fbb439bcfa9c78ca1363ca14370d26905f90a180156106c6575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15050565b83421115610ef55760405162461bcd60e51b815260206004820152601d60248201527f45524332305065726d69743a206578706972656420646561646c696e650000006044820152606401610773565b5f7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9888888610f238c6119f2565b6040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090505f610f7d826119a0565b90505f610f8c828787876119cc565b9050896001600160a01b0316816001600160a01b031614610fef5760405162461bcd60e51b815260206004820152601e60248201527f45524332305065726d69743a20696e76616c6964207369676e617475726500006044820152606401610773565b610ffa8a8a8a6111f5565b50505050505050505050565b6001600160a01b039182165f90815260666020908152604080832093909416825291909152205490565b611038611318565b5f1961013054146110ce5760405162461bcd60e51b815260206004820152605460248201527f4261636b696e67456967656e2e64697361626c655472616e736665725265737460448201527f72696374696f6e733a207472616e73666572207265737472696374696f6e7320606482015273185c9948185b1c9958591e48191a5cd8589b195960621b608482015260a401610773565b5f6101308190556040517f2b18986d3ba809db2f13a5d7bf17f60d357b37d9cbb55dd71cbbac8dc4060f649190a1565b604080518082019091525f80825260208201526001600160a01b0383165f90815260ff60205260409020805463ffffffff8416908110611140576111406129bd565b5f9182526020918290206040805180820190915291015463ffffffff8116825264010000000090046001600160e01b0316918101919091529392505050565b611187611318565b6001600160a01b0381166111ec5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610773565b61082981611873565b6001600160a01b0383166112575760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610773565b6001600160a01b0382166112b85760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610773565b6001600160a01b038381165f8181526066602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6033546001600160a01b031633146108e05760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610773565b6001600160a01b0382165f8181526101316020908152604091829020805460ff191685151590811790915591519182527fcf20b1ecb604b0e8888d579c64e8a3b10e590d45c1c2dddb393bed284362227191015b60405180910390a25050565b5f6113dd8484611006565b90505f19811461144457818110156114375760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610773565b61144484848484036111f5565b50505050565b6001600160a01b0383166114ae5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610773565b6001600160a01b0382166115105760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610773565b61151b838383611ac0565b6001600160a01b0383165f90815260656020526040902054818110156115925760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610773565b6001600160a01b038085165f8181526065602052604080822086860390559286168082529083902080548601905591517fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906115f19086815260200190565b60405180910390a3611444848484611b9c565b5f6106f6611bcd565b81545f9081816005811115611664575f61162684611c40565b61163090856129d1565b5f88815260209020909150869082015463ffffffff16111561165457809150611662565b61165f816001612996565b92505b505b808210156116af575f6116778383611d24565b5f88815260209020909150869082015463ffffffff16111561169b578091506116a9565b6116a6816001612996565b92505b50611664565b80156116d9575f8681526020902081015f19015464010000000090046001600160e01b03166116db565b5f5b6001600160e01b03169695505050505050565b6116f88282611d3e565b6067546001600160e01b03101561176a5760405162461bcd60e51b815260206004820152603060248201527f4552433230566f7465733a20746f74616c20737570706c79207269736b73206f60448201526f766572666c6f77696e6720766f74657360801b6064820152608401610773565b611444610100611e0f83611e1a565b6117838282611f86565b6114446101006120c983611e1a565b6001600160a01b038281165f81815260fe6020818152604080842080546065845282862054949093528787166001600160a01b03198416811790915590519190951694919391928592917f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f9190a46114448284836120d4565b5f63ffffffff82111561186f5760405162461bcd60e51b815260206004820152602660248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203360448201526532206269747360d01b6064820152608401610773565b5090565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b60606099805461061a90612950565b6060609a805461061a90612950565b5f65ffffffffffff82111561186f5760405162461bcd60e51b815260206004820152602660248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203460448201526538206269747360d01b6064820152608401610773565b6001600160a01b0382165f8181526101326020908152604091829020805460ff191685151590811790915591519182527f72a561d1af7409467dae4f1e9fc52590a9335a1dda17727e2b6aa8c4db35109b91016113c6565b5f6106ae6119ac611604565b8360405161190160f01b8152600281019290925260228201526042902090565b5f5f5f6119db8787878761220e565b915091506119e8816122cb565b5095945050505050565b6001600160a01b0381165f90815260cb602052604090208054600181018255905b50919050565b5f54610100900460ff16611a3f5760405162461bcd60e51b8152600401610773906129e4565b6108e0612414565b5f54610100900460ff16611a6d5760405162461bcd60e51b8152600401610773906129e4565b6106c68282612443565b5f54610100900460ff16611a9d5760405162461bcd60e51b8152600401610773906129e4565b61082981604051806040016040528060018152602001603160f81b815250612482565b610130544211611b97576001600160a01b0383165f908152610131602052604090205460ff1680611b0957506001600160a01b0382165f908152610132602052604090205460ff165b80611b1b57506001600160a01b038316155b611b975760405162461bcd60e51b815260206004820152604160248201527f4261636b696e67456967656e2e5f6265666f7265546f6b656e5472616e73666560448201527f723a2066726f6d206f7220746f206d7573742062652077686974656c697374656064820152601960fa1b608482015260a401610773565b505050565b6001600160a01b038381165f90815260fe6020526040808220548584168352912054611b97929182169116836120d4565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f611bf76124cf565b611bff612527565b60408051602081019490945283019190915260608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b5f815f03611c4f57505f919050565b5f6001611c5b84612557565b901c6001901b90506001818481611c7457611c74612a2f565b048201901c90506001818481611c8c57611c8c612a2f565b048201901c90506001818481611ca457611ca4612a2f565b048201901c90506001818481611cbc57611cbc612a2f565b048201901c90506001818481611cd457611cd4612a2f565b048201901c90506001818481611cec57611cec612a2f565b048201901c90506001818481611d0457611d04612a2f565b048201901c905061079d81828581611d1e57611d1e612a2f565b046125ea565b5f611d326002848418612a43565b61079d90848416612996565b6001600160a01b038216611d945760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610773565b611d9f5f8383611ac0565b8060675f828254611db09190612996565b90915550506001600160a01b0382165f818152606560209081526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a36106c65f8383611b9c565b5f61079d8284612996565b82545f908190818115611e64575f8781526020902082015f190160408051808201909152905463ffffffff8116825264010000000090046001600160e01b03166020820152611e78565b604080518082019091525f80825260208201525b905080602001516001600160e01b03169350611e9884868863ffffffff16565b92505f82118015611ec05750611eac6109ff565b65ffffffffffff16815f015163ffffffff16145b15611f0357611ece836125ff565b5f8881526020902083015f190180546001600160e01b03929092166401000000000263ffffffff909216919091179055611f7c565b866040518060400160405280611f27611f1a6109ff565b65ffffffffffff1661180b565b63ffffffff168152602001611f3b866125ff565b6001600160e01b0390811690915282546001810184555f938452602093849020835194909301519091166401000000000263ffffffff909316929092179101555b5050935093915050565b6001600160a01b038216611fe65760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401610773565b611ff1825f83611ac0565b6001600160a01b0382165f90815260656020526040902054818110156120645760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b6064820152608401610773565b6001600160a01b0383165f8181526065602090815260408083208686039055606780548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3611b97835f84611b9c565b5f61079d82846129d1565b816001600160a01b0316836001600160a01b0316141580156120f557505f81115b15611b97576001600160a01b03831615612182576001600160a01b0383165f90815260ff60205260408120819061212f906120c985611e1a565b91509150846001600160a01b03167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a7248383604051612177929190918252602082015260400190565b60405180910390a250505b6001600160a01b03821615611b97576001600160a01b0382165f90815260ff6020526040812081906121b790611e0f85611e1a565b91509150836001600160a01b03167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a72483836040516121ff929190918252602082015260400190565b60405180910390a25050505050565b5f807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a083111561224357505f905060036122c2565b604080515f8082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015612294573d5f5f3e3d5ffd5b5050604051601f1901519150506001600160a01b0381166122bc575f600192509250506122c2565b91505f90505b94509492505050565b5f8160048111156122de576122de612a62565b036122e65750565b60018160048111156122fa576122fa612a62565b036123475760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610773565b600281600481111561235b5761235b612a62565b036123a85760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610773565b60038160048111156123bc576123bc612a62565b036108295760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401610773565b5f54610100900460ff1661243a5760405162461bcd60e51b8152600401610773906129e4565b6108e033611873565b5f54610100900460ff166124695760405162461bcd60e51b8152600401610773906129e4565b60686124758382612ac1565b506069611b978282612ac1565b5f54610100900460ff166124a85760405162461bcd60e51b8152600401610773906129e4565b60996124b48382612ac1565b50609a6124c18282612ac1565b50505f609781905560985550565b5f5f6124d96118c4565b8051909150156124f0578051602090910120919050565b60975480156124ff5792915050565b7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4709250505090565b5f5f6125316118d3565b805190915015612548578051602090910120919050565b60985480156124ff5792915050565b5f80608083901c1561256b57608092831c92015b604083901c1561257d57604092831c92015b602083901c1561258f57602092831c92015b601083901c156125a157601092831c92015b600883901c156125b357600892831c92015b600483901c156125c557600492831c92015b600283901c156125d757600292831c92015b600183901c156106ae5760010192915050565b5f8183106125f8578161079d565b5090919050565b5f6001600160e01b0382111561186f5760405162461bcd60e51b815260206004820152602760248201527f53616665436173743a2076616c756520646f65736e27742066697420696e20326044820152663234206269747360c81b6064820152608401610773565b80356001600160a01b038116811461267d575f5ffd5b919050565b5f60208284031215612692575f5ffd5b61079d82612667565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f61079d602083018461269b565b5f5f604083850312156126ec575f5ffd5b6126f583612667565b946020939093013593505050565b5f5f60408385031215612714575f5ffd5b61271d83612667565b915060208301358015158114612731575f5ffd5b809150509250929050565b5f5f5f6060848603121561274e575f5ffd5b61275784612667565b925061276560208501612667565b929592945050506040919091013590565b5f60208284031215612786575f5ffd5b5035919050565b60ff60f81b8816815260e060208201525f6127ab60e083018961269b565b82810360408401526127bd818961269b565b606084018890526001600160a01b038716608085015260a0840186905283810360c0850152845180825260208087019350909101905f5b818110156128125783518352602093840193909201916001016127f4565b50909b9a5050505050505050505050565b803560ff8116811461267d575f5ffd5b5f5f5f5f5f5f60c08789031215612848575f5ffd5b61285187612667565b9550602087013594506040870135935061286d60608801612823565b9598949750929560808101359460a0909101359350915050565b5f5f5f5f5f5f5f60e0888a03121561289d575f5ffd5b6128a688612667565b96506128b460208901612667565b955060408801359450606088013593506128d060808901612823565b9699959850939692959460a0840135945060c09093013592915050565b5f5f604083850312156128fe575f5ffd5b61290783612667565b915061291560208401612667565b90509250929050565b5f5f6040838503121561292f575f5ffd5b61293883612667565b9150602083013563ffffffff81168114612731575f5ffd5b600181811c9082168061296457607f821691505b602082108103611a1357634e487b7160e01b5f52602260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b808201808211156106ae576106ae612982565b634e487b7160e01b5f52604160045260245ffd5b634e487b7160e01b5f52603260045260245ffd5b818103818111156106ae576106ae612982565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b634e487b7160e01b5f52601260045260245ffd5b5f82612a5d57634e487b7160e01b5f52601260045260245ffd5b500490565b634e487b7160e01b5f52602160045260245ffd5b601f821115611b9757805f5260205f20601f840160051c81016020851015612a9b5750805b601f840160051c820191505b81811015612aba575f8155600101612aa7565b5050505050565b815167ffffffffffffffff811115612adb57612adb6129a9565b612aef81612ae98454612950565b84612a76565b6020601f821160018114612b21575f8315612b0a5750848201515b5f19600385901b1c1916600184901b178455612aba565b5f84815260208120601f198516915b82811015612b505787850151825560209485019460019092019101612b30565b5084821015612b6d57868401515f19600387901b60f8161c191681555b50505050600190811b0190555056fea2646970667358221220bc65aa22c82ea1986fef941c8ffca5d6f9991e3fb75b2eefff53e26501e45f9064736f6c634300081b0033", } // 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 690fd7eba9..3e48868c16 100644 --- a/pkg/bindings/BeaconChainProofs/binding.go +++ b/pkg/bindings/BeaconChainProofs/binding.go @@ -32,7 +32,7 @@ var ( // BeaconChainProofsMetaData contains all meta data concerning the BeaconChainProofs contract. var BeaconChainProofsMetaData = &bind.MetaData{ ABI: "[{\"type\":\"error\",\"name\":\"InvalidProof\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidProofLength\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidValidatorFieldsLength\",\"inputs\":[]}]", - Bin: "0x6055604b600b8282823980515f1a607314603f577f4e487b71000000000000000000000000000000000000000000000000000000005f525f60045260245ffd5b305f52607381538281f3fe730000000000000000000000000000000000000000301460806040525f5ffdfea2646970667358221220e966fe1ac727cb856429c26261b13e331ed7734d558c3490b20722025f7323c164736f6c634300081b0033", + Bin: "0x60556032600b8282823980515f1a607314602657634e487b7160e01b5f525f60045260245ffd5b305f52607381538281f3fe730000000000000000000000000000000000000000301460806040525f5ffdfea2646970667358221220b786d81c68c50488570935b357a548005dc46a3e40dcde8c9c3cfe80240891a564736f6c634300081b0033", } // 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 1364073886..80d08fb9da 100644 --- a/pkg/bindings/BytesLib/binding.go +++ b/pkg/bindings/BytesLib/binding.go @@ -32,7 +32,7 @@ var ( // BytesLibMetaData contains all meta data concerning the BytesLib contract. var BytesLibMetaData = &bind.MetaData{ ABI: "[{\"type\":\"error\",\"name\":\"OutOfBounds\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"Overflow\",\"inputs\":[]}]", - Bin: "0x6055604b600b8282823980515f1a607314603f577f4e487b71000000000000000000000000000000000000000000000000000000005f525f60045260245ffd5b305f52607381538281f3fe730000000000000000000000000000000000000000301460806040525f5ffdfea264697066735822122073605cc0bad4552fd220618caa14124a2265b033a5e934a861f6ad07be34c91c64736f6c634300081b0033", + Bin: "0x60556032600b8282823980515f1a607314602657634e487b7160e01b5f525f60045260245ffd5b305f52607381538281f3fe730000000000000000000000000000000000000000301460806040525f5ffdfea2646970667358221220517c792f82001a69d55f8c03043251e3baff982c0b3c945ebf5259c111341b5664736f6c634300081b0033", } // BytesLibABI is the input ABI used to generate the binding from. diff --git a/pkg/bindings/DelegationManager/binding.go b/pkg/bindings/DelegationManager/binding.go index 905e4cb411..356ef3cecb 100644 --- a/pkg/bindings/DelegationManager/binding.go +++ b/pkg/bindings/DelegationManager/binding.go @@ -56,7 +56,7 @@ 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\":\"_eigenPodManager\",\"type\":\"address\",\"internalType\":\"contractIEigenPodManager\"},{\"name\":\"_allocationManager\",\"type\":\"address\",\"internalType\":\"contractIAllocationManager\"},{\"name\":\"_pauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"},{\"name\":\"_permissionController\",\"type\":\"address\",\"internalType\":\"contractIPermissionController\"},{\"name\":\"_MIN_WITHDRAWAL_DELAY\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"DELEGATION_APPROVAL_TYPEHASH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"allocationManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIAllocationManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"beaconChainETHStrategy\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"calculateDelegationApprovalDigestHash\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"approver\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"approverSalt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"calculateWithdrawalRoot\",\"inputs\":[{\"name\":\"withdrawal\",\"type\":\"tuple\",\"internalType\":\"structIDelegationManagerTypes.Withdrawal\",\"components\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"delegatedTo\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"withdrawer\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"nonce\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startBlock\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"scaledShares\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"completeQueuedWithdrawal\",\"inputs\":[{\"name\":\"withdrawal\",\"type\":\"tuple\",\"internalType\":\"structIDelegationManagerTypes.Withdrawal\",\"components\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"delegatedTo\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"withdrawer\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"nonce\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startBlock\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"scaledShares\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}]},{\"name\":\"tokens\",\"type\":\"address[]\",\"internalType\":\"contractIERC20[]\"},{\"name\":\"receiveAsTokens\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeQueuedWithdrawals\",\"inputs\":[{\"name\":\"withdrawals\",\"type\":\"tuple[]\",\"internalType\":\"structIDelegationManagerTypes.Withdrawal[]\",\"components\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"delegatedTo\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"withdrawer\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"nonce\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startBlock\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"scaledShares\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}]},{\"name\":\"tokens\",\"type\":\"address[][]\",\"internalType\":\"contractIERC20[][]\"},{\"name\":\"receiveAsTokens\",\"type\":\"bool[]\",\"internalType\":\"bool[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"convertToDepositShares\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"withdrawableShares\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"cumulativeWithdrawalsQueued\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"totalQueued\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"decreaseDelegatedShares\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"curDepositShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"beaconChainSlashingFactorDecrease\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"delegateTo\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"approverSignatureAndExpiry\",\"type\":\"tuple\",\"internalType\":\"structISignatureUtils.SignatureWithExpiry\",\"components\":[{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"approverSalt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"delegatedTo\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"delegationApprover\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"delegationApproverSaltIsSpent\",\"inputs\":[{\"name\":\"delegationApprover\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"spent\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"depositScalingFactor\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"domainSeparator\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"eigenPodManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIEigenPodManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getDepositedShares\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getOperatorShares\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getOperatorsShares\",\"inputs\":[{\"name\":\"operators\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256[][]\",\"internalType\":\"uint256[][]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getQueuedWithdrawal\",\"inputs\":[{\"name\":\"withdrawalRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIDelegationManagerTypes.Withdrawal\",\"components\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"delegatedTo\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"withdrawer\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"nonce\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startBlock\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"scaledShares\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getQueuedWithdrawalRoots\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32[]\",\"internalType\":\"bytes32[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getQueuedWithdrawals\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"withdrawals\",\"type\":\"tuple[]\",\"internalType\":\"structIDelegationManagerTypes.Withdrawal[]\",\"components\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"delegatedTo\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"withdrawer\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"nonce\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startBlock\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"scaledShares\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}]},{\"name\":\"shares\",\"type\":\"uint256[][]\",\"internalType\":\"uint256[][]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getSlashableSharesInQueue\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getWithdrawableShares\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"outputs\":[{\"name\":\"withdrawableShares\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"},{\"name\":\"depositShares\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"increaseDelegatedShares\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"prevDepositShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"addedShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"initialOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"initialPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"isDelegated\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isOperator\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"minWithdrawalDelayBlocks\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"modifyOperatorDetails\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"newDelegationApprover\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"operatorShares\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"shares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"pauseAll\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[{\"name\":\"index\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pauserRegistry\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pendingWithdrawals\",\"inputs\":[{\"name\":\"withdrawalRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"pending\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"permissionController\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIPermissionController\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"queueWithdrawals\",\"inputs\":[{\"name\":\"params\",\"type\":\"tuple[]\",\"internalType\":\"structIDelegationManagerTypes.QueuedWithdrawalParams[]\",\"components\":[{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"depositShares\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"},{\"name\":\"__deprecated_withdrawer\",\"type\":\"address\",\"internalType\":\"address\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32[]\",\"internalType\":\"bytes32[]\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"redelegate\",\"inputs\":[{\"name\":\"newOperator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"newOperatorApproverSig\",\"type\":\"tuple\",\"internalType\":\"structISignatureUtils.SignatureWithExpiry\",\"components\":[{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"approverSalt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"withdrawalRoots\",\"type\":\"bytes32[]\",\"internalType\":\"bytes32[]\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"registerAsOperator\",\"inputs\":[{\"name\":\"initDelegationApprover\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"allocationDelay\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"metadataURI\",\"type\":\"string\",\"internalType\":\"string\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"slashOperatorShares\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"prevMaxMagnitude\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"newMaxMagnitude\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"strategyManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategyManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"undelegate\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"withdrawalRoots\",\"type\":\"bytes32[]\",\"internalType\":\"bytes32[]\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"updateOperatorMetadataURI\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"metadataURI\",\"type\":\"string\",\"internalType\":\"string\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"DelegationApproverUpdated\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newDelegationApprover\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DepositScalingFactorUpdated\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"newDepositScalingFactor\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorMetadataURIUpdated\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"metadataURI\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorRegistered\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"delegationApprover\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorSharesDecreased\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"staker\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"shares\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorSharesIncreased\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"staker\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"shares\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"SlashingWithdrawalCompleted\",\"inputs\":[{\"name\":\"withdrawalRoot\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"SlashingWithdrawalQueued\",\"inputs\":[{\"name\":\"withdrawalRoot\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"},{\"name\":\"withdrawal\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIDelegationManagerTypes.Withdrawal\",\"components\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"delegatedTo\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"withdrawer\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"nonce\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startBlock\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"scaledShares\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}]},{\"name\":\"sharesToWithdraw\",\"type\":\"uint256[]\",\"indexed\":false,\"internalType\":\"uint256[]\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StakerDelegated\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StakerForceUndelegated\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StakerUndelegated\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"ActivelyDelegated\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"CallerCannotUndelegate\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"CurrentlyPaused\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"FullySlashed\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InputAddressZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InputArrayLengthMismatch\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InputArrayLengthZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidNewPausedStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidPermissions\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidSignature\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidSnapshotOrdering\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotActivelyDelegated\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyAllocationManager\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyEigenPodManager\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyPauser\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyStrategyManagerOrEigenPodManager\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyUnpauser\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OperatorNotRegistered\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OperatorsCannotUndelegate\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SaltSpent\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SignatureExpired\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"WithdrawalDelayNotElapsed\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"WithdrawalNotQueued\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"WithdrawerNotCaller\",\"inputs\":[]}]", - Bin: "0x610180604052348015610010575f5ffd5b50604051615dd6380380615dd683398101604081905261002f9161021c565b8186868684876001600160a01b03811661005c576040516339b190bb60e11b815260040160405180910390fd5b6001600160a01b0390811660805293841660a05291831660c05290911660e05263ffffffff16610100524661012052610125604080518082018252600a81526922b4b3b2b72630bcb2b960b11b60209182015281517f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a866818301527f71b625cfad44bac63b13dba07f2e1d6084ee04b6f8752101ece6126d584ee6ea81840152466060820152306080808301919091528351808303909101815260a0909101909252815191012090565b610140526001600160a01b03166101605261013e610149565b5050505050506102a7565b5f54610100900460ff16156101b45760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff90811614610203575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b0381168114610219575f5ffd5b50565b5f5f5f5f5f5f60c08789031215610231575f5ffd5b865161023c81610205565b602088015190965061024d81610205565b604088015190955061025e81610205565b606088015190945061026f81610205565b608088015190935061028081610205565b60a088015190925063ffffffff81168114610299575f5ffd5b809150509295509295509295565b60805160a05160c05160e05161010051610120516101405161016051615a3a61039c5f395f818161042c01526132fa01525f61271601525f61265601525f818161070001528181611504015281816134f5015261383101525f818161075001528181610da901528181610f5a0152818161169f0152818161185e01528181611cb2015281816128eb01526133b101525f818161045301528181610ee0015281816117c501528181611a23015281816130e3015261363b01525f818161038901528181610eae01528181611977015261361501525f81816105ee01528181610b410152818161107a015261273a0152615a3a5ff3fe608060405234801561000f575f5ffd5b50600436106102cb575f3560e01c8063715018a61161017b578063bfae3fd2116100e4578063e4cc3f901161009e578063f2fde38b11610079578063f2fde38b146107de578063f698da25146107f1578063fabc1cbc146107f9578063fd8aa88d1461080c575f5ffd5b8063e4cc3f9014610798578063eea9064b146107ab578063f0e0e676146107be575f5ffd5b8063bfae3fd2146106e3578063c448feb8146106f6578063c978f7ac1461072a578063ca8aa7c71461074b578063cd6dc68714610772578063da8be86414610785575f5ffd5b80639104c319116101355780639104c319146106345780639435bb431461064f578063a178848414610662578063a33a343314610681578063b7f06ebe14610694578063bb45fef2146106b6575f5ffd5b8063715018a6146105a4578063778e55f3146105ac57806378296ec5146105d6578063886f1195146105e95780638da5cb5b146106105780639004134714610621575f5ffd5b806354b7c96c116102375780635dd68579116101f157806365da1264116101cc57806365da12641461053557806366d5ba931461055d5780636d70f7ae1461057e5780636e17444814610591575f5ffd5b80635dd68579146104ee578063601bb36f1461050f57806360a0d1ce14610522575f5ffd5b806354b7c96c14610475578063595c6a6714610488578063597b36da146104905780635ac86ab7146104a35780635c975abb146104c65780635d975e88146104ce575f5ffd5b806339b70e381161028857806339b70e38146103845780633c651cf2146103c35780633cdeb5e0146103d65780633e28391d146104045780634657e26a146104275780634665bcda1461044e575f5ffd5b806304a4f979146102cf5780630b9f487a146103095780630dd8dd021461031c578063136439dd1461033c57806325df922e146103515780632aa6d88814610371575b5f5ffd5b6102f67f14bde674c9f64b2ad00eaaee4a8bed1fabef35c7507e3c5b9cfc9436909a2dad81565b6040519081526020015b60405180910390f35b6102f6610317366004614957565b61081f565b61032f61032a3660046149ee565b6108a7565b6040516103009190614a2c565b61034f61034a366004614a63565b610b2c565b005b61036461035f366004614bf8565b610c01565b6040516103009190614ca6565b61034f61037f366004614d08565b610d61565b6103ab7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610300565b61034f6103d1366004614d66565b610ea3565b6103ab6103e4366004614da9565b6001600160a01b039081165f908152609960205260409020600101541690565b610417610412366004614da9565b610fea565b6040519015158152602001610300565b6103ab7f000000000000000000000000000000000000000000000000000000000000000081565b6103ab7f000000000000000000000000000000000000000000000000000000000000000081565b61034f610483366004614dc4565b611009565b61034f611065565b6102f661049e366004614eb7565b611114565b6104176104b1366004614ee8565b606654600160ff9092169190911b9081161490565b6066546102f6565b6104e16104dc366004614a63565b611143565b6040516103009190614fbf565b6105016104fc366004614da9565b61125f565b60405161030092919061501f565b61034f61051d3660046150a0565b611694565b61034f6105303660046150f9565b6117ba565b6103ab610543366004614da9565b609a6020525f90815260409020546001600160a01b031681565b61057061056b366004614da9565b61194f565b604051610300929190615138565b61041761058c366004614da9565b611c4f565b6102f661059f366004614dc4565b611c87565b61034f611d31565b6102f66105ba366004614dc4565b609860209081525f928352604080842090915290825290205481565b61034f6105e436600461515c565b611d42565b6103ab7f000000000000000000000000000000000000000000000000000000000000000081565b6033546001600160a01b03166103ab565b61036461062f3660046151ac565b611dca565b6103ab73beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac081565b61034f61065d3660046151f8565b611ea0565b6102f6610670366004614da9565b609f6020525f908152604090205481565b61032f61068f366004615294565b611f70565b6104176106a2366004614a63565b609e6020525f908152604090205460ff1681565b6104176106c436600461537b565b609c60209081525f928352604080842090915290825290205460ff1681565b6102f66106f1366004614dc4565b611f88565b60405163ffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152602001610300565b61073d6107383660046151ac565b611fc4565b6040516103009291906153a5565b6103ab7f000000000000000000000000000000000000000000000000000000000000000081565b61034f61078036600461537b565b612251565b61032f610793366004614da9565b61236c565b61034f6107a63660046153c4565b61247c565b61034f6107b9366004615294565b6124d2565b6107d16107cc366004615437565b612535565b60405161030091906154e4565b61034f6107ec366004614da9565b6125da565b6102f6612653565b61034f610807366004614a63565b612738565b61032f61081a366004614da9565b61284f565b604080517f14bde674c9f64b2ad00eaaee4a8bed1fabef35c7507e3c5b9cfc9436909a2dad60208201526001600160a01b03808616928201929092528187166060820152908516608082015260a0810183905260c081018290525f9061089d9060e00160405160208183030381529060405280519060200120612872565b9695505050505050565b6066546060906001906002908116036108d35760405163840a48d560e01b815260040160405180910390fd5b5f836001600160401b038111156108ec576108ec614a7a565b604051908082528060200260200182016040528015610915578160200160208202803683370190505b50335f908152609a60205260408120549192506001600160a01b03909116905b85811015610b215786868281811061094f5761094f6154f6565b9050602002810190610961919061550a565b61096f906020810190615528565b9050878783818110610983576109836154f6565b9050602002810190610995919061550a565b61099f9080615528565b9050146109bf576040516343714afd60e01b815260040160405180910390fd5b5f610a2933848a8a868181106109d7576109d76154f6565b90506020028101906109e9919061550a565b6109f39080615528565b808060200260200160405190810160405280939291908181526020018383602002808284375f920191909152506128a092505050565b9050610afb33848a8a86818110610a4257610a426154f6565b9050602002810190610a54919061550a565b610a5e9080615528565b808060200260200160405190810160405280939291908181526020018383602002808284375f920191909152508e92508d9150889050818110610aa357610aa36154f6565b9050602002810190610ab5919061550a565b610ac3906020810190615528565b808060200260200160405190810160405280939291908181526020018383602002808284375f920191909152508892506129e7915050565b848381518110610b0d57610b0d6154f6565b602090810291909101015250600101610935565b509095945050505050565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa158015610b8e573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610bb2919061556d565b610bcf57604051631d77d47760e21b815260040160405180910390fd5b6066548181168114610bf45760405163c61dca5d60e01b815260040160405180910390fd5b610bfd82612edc565b5050565b6001600160a01b038084165f908152609a60205260408120546060921690610c2a8683876128a0565b90505f85516001600160401b03811115610c4657610c46614a7a565b604051908082528060200260200182016040528015610c6f578160200160208202803683370190505b5090505f5b8651811015610d54576001600160a01b0388165f90815260a260205260408120885182908a9085908110610caa57610caa6154f6565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020015f206040518060200160405290815f820154815250509050610d2e878381518110610cfc57610cfc6154f6565b6020026020010151858481518110610d1657610d166154f6565b602002602001015183612f199092919063ffffffff16565b838381518110610d4057610d406154f6565b602090810291909101015250600101610c74565b50925050505b9392505050565b610d6a33610fea565b15610d8857604051633bf2b50360e11b815260040160405180910390fd5b604051632b6241f360e11b815233600482015263ffffffff841660248201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906356c483e6906044015f604051808303815f87803b158015610df2575f5ffd5b505af1158015610e04573d5f5f3e3d5ffd5b50505050610e123385612f37565b610e1c3333612f99565b6040516001600160a01b038516815233907fa453db612af59e5521d6ab9284dc3e2d06af286eb1b1b7b771fce4716c19f2c19060200160405180910390a2336001600160a01b03167f02a919ed0e2acad1dd90f17ef2fa4ae5462ee1339170034a8531cca4b67080908383604051610e95929190615588565b60405180910390a250505050565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161480610f025750336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016145b610f1f5760405163045206a560e21b815260040160405180910390fd5b6001600160a01b038481165f908152609a602052604080822054905163152667d960e31b8152908316600482018190528684166024830152927f0000000000000000000000000000000000000000000000000000000000000000169063a9333ec890604401602060405180830381865afa158015610f9f573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610fc391906155b6565b90505f610fd187878461309c565b9050610fe183888888888661317e565b50505050505050565b6001600160a01b039081165f908152609a602052604090205416151590565b81611013816132bc565b6110305760405163932d94f760e01b815260040160405180910390fd5b61103983611c4f565b611056576040516325ec6c1f60e01b815260040160405180910390fd5b6110608383612f37565b505050565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa1580156110c7573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110eb919061556d565b61110857604051631d77d47760e21b815260040160405180910390fd5b6111125f19612edc565b565b5f816040516020016111269190614fbf565b604051602081830303815290604052805190602001209050919050565b61114b614813565b5f82815260a46020908152604091829020825160e08101845281546001600160a01b03908116825260018301548116828501526002830154168185015260038201546060820152600482015463ffffffff1660808201526005820180548551818602810186019096528086529194929360a086019392908301828280156111f957602002820191905f5260205f20905b81546001600160a01b031681526001909101906020018083116111db575b505050505081526020016006820180548060200260200160405190810160405280929190818152602001828054801561124f57602002820191905f5260205f20905b81548152602001906001019080831161123b575b5050505050815250509050919050565b6060805f61126c8461284f565b8051909150806001600160401b0381111561128957611289614a7a565b6040519080825280602002602001820160405280156112c257816020015b6112af614813565b8152602001906001900390816112a75790505b509350806001600160401b038111156112dd576112dd614a7a565b60405190808252806020026020018201604052801561131057816020015b60608152602001906001900390816112fb5790505b506001600160a01b038087165f908152609a60205260408120549295509116905b8281101561168b5760a45f85838151811061134e5761134e6154f6565b60209081029190910181015182528181019290925260409081015f20815160e08101835281546001600160a01b03908116825260018301548116828601526002830154168184015260038201546060820152600482015463ffffffff1660808201526005820180548451818702810187019095528085529194929360a086019390929083018282801561140857602002820191905f5260205f20905b81546001600160a01b031681526001909101906020018083116113ea575b505050505081526020016006820180548060200260200160405190810160405280929190818152602001828054801561145e57602002820191905f5260205f20905b81548152602001906001019080831161144a575b505050505081525050868281518110611479576114796154f6565b6020026020010181905250858181518110611496576114966154f6565b602002602001015160a00151516001600160401b038111156114ba576114ba614a7a565b6040519080825280602002602001820160405280156114e3578160200160208202803683370190505b508582815181106114f6576114f66154f6565b60200260200101819052505f7f0000000000000000000000000000000000000000000000000000000000000000878381518110611535576115356154f6565b60200260200101516080015161154b91906155e5565b905060604363ffffffff168263ffffffff1610156115935761158c89858a868151811061157a5761157a6154f6565b602002602001015160a0015185613366565b90506115be565b6115bb89858a86815181106115aa576115aa6154f6565b602002602001015160a001516128a0565b90505b5f5b8884815181106115d2576115d26154f6565b602002602001015160a001515181101561167d5761163f8985815181106115fb576115fb6154f6565b602002602001015160c001518281518110611618576116186154f6565b6020026020010151838381518110611632576116326154f6565b6020026020010151613494565b888581518110611651576116516154f6565b6020026020010151828151811061166a5761166a6154f6565b60209081029190910101526001016115c0565b505050806001019050611331565b50505050915091565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146116dd576040516323d871a560e01b815260040160405180910390fd5b6001600160a01b038085165f90815260986020908152604080832093871683529290529081205461171b906001600160401b0380861690851661349f565b90505f61172a868686866134b7565b90505f6117378284615601565b9050611745875f8886613574565b5f61174f876135ee565b60405163debe1eab60e01b81526001600160a01b038981166004830152602482018590529192509082169063debe1eab906044015f604051808303815f87803b15801561179a575f5ffd5b505af11580156117ac573d5f5f3e3d5ffd5b505050505050505050505050565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461180357604051633213a66160e21b815260040160405180910390fd5b61180c83610fea565b15611060576001600160a01b038381165f908152609a602052604080822054905163152667d960e31b81529083166004820181905273beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac06024830152927f0000000000000000000000000000000000000000000000000000000000000000169063a9333ec890604401602060405180830381865afa1580156118a3573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906118c791906155b6565b6001600160a01b0386165f90815260a26020908152604080832073beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac084528252808320815192830190915254815291925061192d866119256001600160401b03808716908916613660565b849190613674565b9050610fe1848873beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac084613574565b6040516394f649dd60e01b81526001600160a01b03828116600483015260609182915f9182917f000000000000000000000000000000000000000000000000000000000000000016906394f649dd906024015f60405180830381865afa1580156119bb573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526119e2919081019061566f565b60405163fe243a1760e01b81526001600160a01b03888116600483015273beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac060248301529294509092505f917f0000000000000000000000000000000000000000000000000000000000000000169063fe243a1790604401602060405180830381865afa158015611a68573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a8c919061572a565b9050805f03611aa057509094909350915050565b5f83516001611aaf9190615601565b6001600160401b03811115611ac657611ac6614a7a565b604051908082528060200260200182016040528015611aef578160200160208202803683370190505b5090505f84516001611b019190615601565b6001600160401b03811115611b1857611b18614a7a565b604051908082528060200260200182016040528015611b41578160200160208202803683370190505b50905073beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac082865181518110611b6c57611b6c6154f6565b60200260200101906001600160a01b031690816001600160a01b0316815250508281865181518110611ba057611ba06154f6565b60209081029190910101525f5b8551811015611c4157858181518110611bc857611bc86154f6565b6020026020010151838281518110611be257611be26154f6565b60200260200101906001600160a01b031690816001600160a01b031681525050848181518110611c1457611c146154f6565b6020026020010151828281518110611c2e57611c2e6154f6565b6020908102919091010152600101611bad565b509097909650945050505050565b5f6001600160a01b03821615801590611c8157506001600160a01b038083165f818152609a6020526040902054909116145b92915050565b60405163152667d960e31b81526001600160a01b03838116600483015282811660248301525f9182917f0000000000000000000000000000000000000000000000000000000000000000169063a9333ec890604401602060405180830381865afa158015611cf7573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611d1b91906155b6565b9050611d298484835f6134b7565b949350505050565b611d39613692565b6111125f6136ec565b82611d4c816132bc565b611d695760405163932d94f760e01b815260040160405180910390fd5b611d7284611c4f565b611d8f576040516325ec6c1f60e01b815260040160405180910390fd5b836001600160a01b03167f02a919ed0e2acad1dd90f17ef2fa4ae5462ee1339170034a8531cca4b67080908484604051610e95929190615588565b60605f82516001600160401b03811115611de657611de6614a7a565b604051908082528060200260200182016040528015611e0f578160200160208202803683370190505b5090505f5b8351811015611e98576001600160a01b0385165f9081526098602052604081208551909190869084908110611e4b57611e4b6154f6565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020015f2054828281518110611e8557611e856154f6565b6020908102919091010152600101611e14565b509392505050565b606654600290600490811603611ec95760405163840a48d560e01b815260040160405180910390fd5b611ed161373d565b855f5b81811015611f6457611f5c898983818110611ef157611ef16154f6565b9050602002810190611f039190615741565b611f0c90615755565b888884818110611f1e57611f1e6154f6565b9050602002810190611f309190615528565b888886818110611f4257611f426154f6565b9050602002016020810190611f579190615760565b613796565b600101611ed4565b5050610fe1600160c955565b6060611f7b3361236c565b9050610d5a8484846124d2565b6001600160a01b038083165f90815260a260209081526040808320938516835292815282822083519182019093529154825290610d5a90613bd8565b60608082516001600160401b03811115611fe057611fe0614a7a565b604051908082528060200260200182016040528015612009578160200160208202803683370190505b50915082516001600160401b0381111561202557612025614a7a565b60405190808252806020026020018201604052801561204e578160200160208202803683370190505b506001600160a01b038086165f908152609a60205260408120549293509116906120798683876128a0565b90505f5b8551811015612246575f6120a987838151811061209c5761209c6154f6565b60200260200101516135ee565b9050806001600160a01b031663fe243a17898985815181106120cd576120cd6154f6565b60200260200101516040518363ffffffff1660e01b81526004016121079291906001600160a01b0392831681529116602082015260400190565b602060405180830381865afa158015612122573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612146919061572a565b858381518110612158576121586154f6565b6020026020010181815250505f60a25f8a6001600160a01b03166001600160a01b031681526020019081526020015f205f89858151811061219b5761219b6154f6565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020015f206040518060200160405290815f82015481525050905061221f8684815181106121ed576121ed6154f6565b6020026020010151858581518110612207576122076154f6565b6020026020010151836136749092919063ffffffff16565b878481518110612231576122316154f6565b6020908102919091010152505060010161207d565b5050505b9250929050565b5f54610100900460ff161580801561226f57505f54600160ff909116105b806122885750303b15801561228857505f5460ff166001145b6122f05760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b5f805460ff191660011790558015612311575f805461ff0019166101001790555b61231a82612edc565b612323836136ec565b8015611060575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a1505050565b606061237782610fea565b6123945760405163a5c7c44560e01b815260040160405180910390fd5b61239d82611c4f565b156123bb576040516311ca333560e31b815260040160405180910390fd5b336001600160a01b03831614612473576001600160a01b038083165f908152609a6020526040902054166123ee816132bc565b8061241457506001600160a01b038181165f908152609960205260409020600101541633145b61243157604051631e499a2360e11b815260040160405180910390fd5b806001600160a01b0316836001600160a01b03167ff0eddf07e6ea14f388b47e1e94a0f464ecbd9eed4171130e0fc0e99fb4030a8a60405160405180910390a3505b611c8182613bf7565b6066546002906004908116036124a55760405163840a48d560e01b815260040160405180910390fd5b6124ad61373d565b6124c16124b986615755565b858585613796565b6124cb600160c955565b5050505050565b6124db33610fea565b156124f957604051633bf2b50360e11b815260040160405180910390fd5b61250283611c4f565b61251f576040516325ec6c1f60e01b815260040160405180910390fd5b61252b33848484613e56565b6110603384612f99565b60605f83516001600160401b0381111561255157612551614a7a565b60405190808252806020026020018201604052801561258457816020015b606081526020019060019003908161256f5790505b5090505f5b8451811015611e98576125b58582815181106125a7576125a76154f6565b602002602001015185611dca565b8282815181106125c7576125c76154f6565b6020908102919091010152600101612589565b6125e2613692565b6001600160a01b0381166126475760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016122e7565b612650816136ec565b50565b5f7f000000000000000000000000000000000000000000000000000000000000000046146127135750604080518082018252600a81526922b4b3b2b72630bcb2b960b11b60209182015281517f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a866818301527f71b625cfad44bac63b13dba07f2e1d6084ee04b6f8752101ece6126d584ee6ea81840152466060820152306080808301919091528351808303909101815260a0909101909252815191012090565b507f000000000000000000000000000000000000000000000000000000000000000090565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612794573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906127b8919061577b565b6001600160a01b0316336001600160a01b0316146127e95760405163794821ff60e01b815260040160405180910390fd5b606654801982198116146128105760405163c61dca5d60e01b815260040160405180910390fd5b606682905560405182815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c906020015b60405180910390a25050565b6001600160a01b0381165f90815260a360205260409020606090611c8190613f1b565b5f61287b612653565b60405161190160f01b6020820152602281019190915260428101839052606201611126565b60605f82516001600160401b038111156128bc576128bc614a7a565b6040519080825280602002602001820160405280156128e5578160200160208202803683370190505b5090505f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663547afb8786866040518363ffffffff1660e01b8152600401612937929190615796565b5f60405180830381865afa158015612951573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261297891908101906157b9565b90505f5b8451811015610b21576129c28786838151811061299b5761299b6154f6565b60200260200101518484815181106129b5576129b56154f6565b602002602001015161309c565b8382815181106129d4576129d46154f6565b602090810291909101015260010161297c565b5f6001600160a01b038616612a0f576040516339b190bb60e11b815260040160405180910390fd5b83515f03612a305760405163796cc52560e01b815260040160405180910390fd5b5f84516001600160401b03811115612a4a57612a4a614a7a565b604051908082528060200260200182016040528015612a73578160200160208202803683370190505b5090505f85516001600160401b03811115612a9057612a90614a7a565b604051908082528060200260200182016040528015612ab9578160200160208202803683370190505b5090505f5b8651811015612d0f575f612add88838151811061209c5761209c6154f6565b90505f60a25f8c6001600160a01b03166001600160a01b031681526020019081526020015f205f8a8581518110612b1657612b166154f6565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020015f206040518060200160405290815f820154815250509050612b82888481518110612b6857612b686154f6565b6020026020010151888581518110612207576122076154f6565b848481518110612b9457612b946154f6565b602002602001018181525050612bcc888481518110612bb557612bb56154f6565b602002602001015182613f2790919063ffffffff16565b858481518110612bde57612bde6154f6565b60209081029190910101526001600160a01b038a1615612c7357612c358a8a8581518110612c0e57612c0e6154f6565b6020026020010151878681518110612c2857612c286154f6565b6020026020010151613f3b565b612c738a8c8b8681518110612c4c57612c4c6154f6565b6020026020010151878781518110612c6657612c666154f6565b6020026020010151613574565b816001600160a01b031663724af4238c8b8681518110612c9557612c956154f6565b60200260200101518b8781518110612caf57612caf6154f6565b60200260200101516040518463ffffffff1660e01b8152600401612cd593929190615848565b5f604051808303815f87803b158015612cec575f5ffd5b505af1158015612cfe573d5f5f3e3d5ffd5b505050505050806001019050612abe565b506001600160a01b0388165f908152609f60205260408120805491829190612d368361586c565b91905055505f6040518060e001604052808b6001600160a01b031681526020018a6001600160a01b031681526020018b6001600160a01b031681526020018381526020014363ffffffff1681526020018981526020018581525090505f612d9c82611114565b5f818152609e602090815260408083208054600160ff19909116811790915560a4835292819020865181546001600160a01b03199081166001600160a01b039283161783558885015195830180548216968316969096179095559187015160028201805490951692169190911790925560608501516003830155608085015160048301805463ffffffff191663ffffffff90921691909117905560a085015180519394508593612e52926005850192019061486c565b5060c08201518051612e6e9160068401916020909101906148cf565b5050506001600160a01b038b165f90815260a360205260409020612e929082613fc9565b507f26b2aae26516e8719ef50ea2f6831a2efbd4e37dccdf0f6936b27bc08e793e30818386604051612ec693929190615884565b60405180910390a19a9950505050505050505050565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a250565b5f611d2982612f31612f2a87613bd8565b8690613fd4565b90613fd4565b6001600160a01b038281165f8181526099602090815260409182902060010180546001600160a01b0319169486169485179055905192835290917f773b54c04d756fcc5e678111f7d730de3be98192000799eee3d63716055a87c69101612843565b6066545f90600190811603612fc15760405163840a48d560e01b815260040160405180910390fd5b6001600160a01b038381165f818152609a602052604080822080546001600160a01b0319169487169485179055517fc3ee9f2e5fda98e8066a1f745b2df9285f416fe98cf2559cd21484b3d87433049190a35f5f61301e8561194f565b915091505f61302e8686856128a0565b90505f5b8351811015610fe1576130948688868481518110613052576130526154f6565b60200260200101515f87868151811061306d5761306d6154f6565b6020026020010151878781518110613087576130876154f6565b602002602001015161317e565b600101613032565b5f73beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeabf196001600160a01b0384160161316e5760405163a3d75e0960e01b81526001600160a01b0385811660048301525f917f00000000000000000000000000000000000000000000000000000000000000009091169063a3d75e0990602401602060405180830381865afa15801561312a573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061314e91906155b6565b90506131666001600160401b03848116908316613660565b915050610d5a565b506001600160401b031692915050565b805f0361319e57604051630a33bc6960e21b815260040160405180910390fd5b6001600160a01b038086165f90815260a2602090815260408083209388168352929052206131ce81858585613fe8565b6040805160208101909152815481527f8be932bac54561f27260f95463d9b8ab37e06b2842e5ee2404157cc13df6eb8f908790879061320c90613bd8565b60405161321b93929190615848565b60405180910390a161322c86610fea565b15610fe1576001600160a01b038088165f90815260986020908152604080832093891683529290529081208054859290613267908490615601565b92505081905550866001600160a01b03167f1ec042c965e2edd7107b51188ee0f383e22e76179041ab3a9d18ff151405166c8787866040516132ab93929190615848565b60405180910390a250505050505050565b604051631beb2b9760e31b81526001600160a01b0382811660048301523360248301523060448301525f80356001600160e01b0319166064840152917f00000000000000000000000000000000000000000000000000000000000000009091169063df595cb8906084016020604051808303815f875af1158015613342573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611c81919061556d565b60605f83516001600160401b0381111561338257613382614a7a565b6040519080825280602002602001820160405280156133ab578160200160208202803683370190505b5090505f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166394d7d00c8787876040518463ffffffff1660e01b81526004016133ff939291906158ae565b5f60405180830381865afa158015613419573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261344091908101906157b9565b90505f5b8551811015613488576134638887838151811061299b5761299b6154f6565b838281518110613475576134756154f6565b6020908102919091010152600101613444565b50909695505050505050565b5f610d5a8383613660565b5f6134ad8483856001614057565b611d2990856158e7565b6001600160a01b038085165f90815260a560209081526040808320938716835292905290812081906134e8906140b2565b90505f61354e600161351a7f0000000000000000000000000000000000000000000000000000000000000000436158fa565b61352491906158fa565b6001600160a01b03808a165f90815260a560209081526040808320938c16835292905220906140cc565b90505f61355b82846158e7565b90506135688187876140e8565b98975050505050505050565b6001600160a01b038085165f908152609860209081526040808320938616835292905290812080548392906135aa9084906158e7565b92505081905550836001600160a01b03167f6909600037b75d7b4733aedd815442b5ec018a827751c832aaff64eba5d6d2dd848484604051610e9593929190615848565b5f6001600160a01b03821673beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac014613639577f0000000000000000000000000000000000000000000000000000000000000000611c81565b7f000000000000000000000000000000000000000000000000000000000000000092915050565b5f610d5a8383670de0b6b3a7640000614106565b5f611d298261368c61368587613bd8565b8690613660565b90613660565b6033546001600160a01b031633146111125760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016122e7565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b600260c9540361378f5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016122e7565b600260c955565b60a08401515182146137bb576040516343714afd60e01b815260040160405180910390fd5b83604001516001600160a01b0316336001600160a01b0316146137f1576040516316110d3560e21b815260040160405180910390fd5b5f6137fb85611114565b5f818152609e602052604090205490915060ff1661382c576040516387c9d21960e01b815260040160405180910390fd5b60605f7f0000000000000000000000000000000000000000000000000000000000000000876080015161385f91906155e5565b90508063ffffffff164363ffffffff161161388d576040516378f67ae160e11b815260040160405180910390fd5b6138a4875f015188602001518960a0015184613366565b87516001600160a01b03165f90815260a3602052604090209092506138ca9150836141eb565b505f82815260a46020526040812080546001600160a01b031990811682556001820180548216905560028201805490911690556003810182905560048101805463ffffffff19169055906139216005830182614908565b61392e600683015f614908565b50505f828152609e602052604090819020805460ff19169055517f1f40400889274ed07b24845e5054a87a0cab969eb1277aafe61ae352e7c32a00906139779084815260200190565b60405180910390a185516001600160a01b039081165f908152609a6020526040812054885160a08a015191909316926139b19184906128a0565b90505f5b8860a0015151811015613bcd575f6139dc8a60a00151838151811061209c5761209c6154f6565b90505f613a128b60c0015184815181106139f8576139f86154f6565b6020026020010151878581518110611632576116326154f6565b9050805f03613a22575050613bc5565b8715613af057816001600160a01b0316632eae418c8c5f01518d60a001518681518110613a5157613a516154f6565b60200260200101518d8d88818110613a6b57613a6b6154f6565b9050602002016020810190613a809190614da9565b60405160e085901b6001600160e01b03191681526001600160a01b03938416600482015291831660248301529091166044820152606481018490526084015f604051808303815f87803b158015613ad5575f5ffd5b505af1158015613ae7573d5f5f3e3d5ffd5b50505050613bc2565b5f5f836001600160a01b03166350ff72258e5f01518f60a001518881518110613b1b57613b1b6154f6565b6020026020010151866040518463ffffffff1660e01b8152600401613b4293929190615848565b60408051808303815f875af1158015613b5d573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613b819190615916565b91509150613bbf878e5f01518f60a001518881518110613ba357613ba36154f6565b602002602001015185858b8b81518110613087576130876154f6565b50505b50505b6001016139b5565b505050505050505050565b80515f9015613be8578151611c81565b670de0b6b3a764000092915050565b606654606090600190600290811603613c235760405163840a48d560e01b815260040160405180910390fd5b6001600160a01b038084165f818152609a602052604080822080546001600160a01b0319811690915590519316928392917ffee30966a256b71e14bc0ebfc94315e28ef4a97a7131a9e2b7a310a73af4467691a35f5f613c828661194f565b9150915081515f03613c9657505050613e50565b81516001600160401b03811115613caf57613caf614a7a565b604051908082528060200260200182016040528015613cd8578160200160208202803683370190505b5094505f613ce78785856128a0565b90505f5b8351811015613e4a576040805160018082528183019092525f916020808301908036833750506040805160018082528183019092529293505f9291506020808301908036833750506040805160018082528183019092529293505f92915060208083019080368337019050509050868481518110613d6b57613d6b6154f6565b6020026020010151835f81518110613d8557613d856154f6565b60200260200101906001600160a01b031690816001600160a01b031681525050858481518110613db757613db76154f6565b6020026020010151825f81518110613dd157613dd16154f6565b602002602001018181525050848481518110613def57613def6154f6565b6020026020010151815f81518110613e0957613e096154f6565b602002602001018181525050613e228b898585856129e7565b8a8581518110613e3457613e346154f6565b6020908102919091010152505050600101613ceb565b50505050505b50919050565b6001600160a01b038084165f908152609960205260409020600101541680613e7e5750613f15565b6001600160a01b0381165f908152609c6020908152604080832085845290915290205460ff1615613ec257604051630d4c4c9160e21b815260040160405180910390fd5b6001600160a01b0381165f908152609c602090815260408083208584528252909120805460ff191660011790558301516124cb908290613f0990889088908490889061081f565b855160208701516141f6565b50505050565b60605f610d5a83614248565b5f610d5a613f3484613bd8565b8390613660565b6001600160a01b03821673beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac014611060576001600160a01b038084165f90815260a5602090815260408083209386168352929052908120613f8e906140b2565b9050613f1543613f9e8484615601565b6001600160a01b038088165f90815260a560209081526040808320938a1683529290522091906142a1565b5f610d5a83836142ac565b5f610d5a83670de0b6b3a764000084614106565b825f0361400857614001670de0b6b3a764000082613fd4565b8455613f15565b6040805160208101909152845481525f90614024908584613674565b90505f6140318483615601565b90505f61404c84612f31614045888a615601565b8590613fd4565b875550505050505050565b5f5f614064868686614106565b9050600183600281111561407a5761407a615938565b14801561409657505f84806140915761409161594c565b868809115b156140a9576140a6600182615601565b90505b95945050505050565b5f6140bd82826142f8565b6001600160e01b031692915050565b5f6140d883838361433d565b6001600160e01b03169392505050565b5f611d296140f68385615960565b85906001600160401b0316613660565b5f80805f19858709858702925082811083820303915050805f0361413d578382816141335761413361594c565b0492505050610d5a565b8084116141845760405162461bcd60e51b81526020600482015260156024820152744d6174683a206d756c446976206f766572666c6f7760581b60448201526064016122e7565b5f8486880960026001871981018816978890046003810283188082028403028082028403028082028403028082028403028082028403029081029092039091025f889003889004909101858311909403939093029303949094049190911702949350505050565b5f610d5a8383614386565b4281101561421757604051630819bdcd60e01b815260040160405180910390fd5b61422b6001600160a01b0385168484614469565b613f1557604051638baa579f60e01b815260040160405180910390fd5b6060815f0180548060200260200160405190810160405280929190818152602001828054801561429557602002820191905f5260205f20905b815481526020019060010190808311614281575b50505050509050919050565b6110608383836144bd565b5f8181526001830160205260408120546142f157508154600181810184555f848152602080822090930184905584548482528286019093526040902091909155611c81565b505f611c81565b81545f9080156143355761431e846143116001846158e7565b5f91825260209091200190565b5464010000000090046001600160e01b0316611d29565b509092915050565b82545f908161434e868683856145c3565b9050801561437c57614365866143116001846158e7565b5464010000000090046001600160e01b031661089d565b5091949350505050565b5f8181526001830160205260408120548015614460575f6143a86001836158e7565b85549091505f906143bb906001906158e7565b905081811461441a575f865f0182815481106143d9576143d96154f6565b905f5260205f200154905080875f0184815481106143f9576143f96154f6565b5f918252602080832090910192909255918252600188019052604090208390555b855486908061442b5761442b61597f565b600190038181905f5260205f20015f90559055856001015f8681526020019081526020015f205f905560019350505050611c81565b5f915050611c81565b5f5f5f6144768585614616565b90925090505f81600481111561448e5761448e615938565b1480156144ac5750856001600160a01b0316826001600160a01b0316145b8061089d575061089d868686614655565b82548015614575575f6144d5856143116001856158e7565b60408051808201909152905463ffffffff8082168084526401000000009092046001600160e01b0316602084015291925090851610156145285760405163151b8e3f60e11b815260040160405180910390fd5b805163ffffffff8086169116036145735782614549866143116001866158e7565b80546001600160e01b03929092166401000000000263ffffffff9092169190911790555050505050565b505b506040805180820190915263ffffffff92831681526001600160e01b03918216602080830191825285546001810187555f968752952091519051909216640100000000029190921617910155565b5f5b81831015611e98575f6145d8848461473c565b5f8781526020902090915063ffffffff86169082015463ffffffff16111561460257809250614610565b61460d816001615601565b93505b506145c5565b5f5f825160410361464a576020830151604084015160608501515f1a61463e87828585614756565b9450945050505061224a565b505f9050600261224a565b5f5f5f856001600160a01b0316631626ba7e60e01b868660405160240161467d929190615993565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b03199094169390931790925290516146bb91906159cf565b5f60405180830381855afa9150503d805f81146146f3576040519150601f19603f3d011682016040523d82523d5f602084013e6146f8565b606091505b509150915081801561470c57506020815110155b801561089d57508051630b135d3f60e11b90614731908301602090810190840161572a565b149695505050505050565b5f61474a60028484186159e5565b610d5a90848416615601565b5f807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a083111561478b57505f9050600361480a565b604080515f8082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa1580156147dc573d5f5f3e3d5ffd5b5050604051601f1901519150506001600160a01b038116614804575f6001925092505061480a565b91505f90505b94509492505050565b6040518060e001604052805f6001600160a01b031681526020015f6001600160a01b031681526020015f6001600160a01b031681526020015f81526020015f63ffffffff16815260200160608152602001606081525090565b828054828255905f5260205f209081019282156148bf579160200282015b828111156148bf57825182546001600160a01b0319166001600160a01b0390911617825560209092019160019091019061488a565b506148cb92915061491f565b5090565b828054828255905f5260205f209081019282156148bf579160200282015b828111156148bf5782518255916020019190600101906148ed565b5080545f8255905f5260205f209081019061265091905b5b808211156148cb575f8155600101614920565b6001600160a01b0381168114612650575f5ffd5b803561495281614933565b919050565b5f5f5f5f5f60a0868803121561496b575f5ffd5b853561497681614933565b9450602086013561498681614933565b9350604086013561499681614933565b94979396509394606081013594506080013592915050565b5f5f83601f8401126149be575f5ffd5b5081356001600160401b038111156149d4575f5ffd5b6020830191508360208260051b850101111561224a575f5ffd5b5f5f602083850312156149ff575f5ffd5b82356001600160401b03811115614a14575f5ffd5b614a20858286016149ae565b90969095509350505050565b602080825282518282018190525f918401906040840190835b81811015610b21578351835260209384019390920191600101614a45565b5f60208284031215614a73575f5ffd5b5035919050565b634e487b7160e01b5f52604160045260245ffd5b60405160e081016001600160401b0381118282101715614ab057614ab0614a7a565b60405290565b604080519081016001600160401b0381118282101715614ab057614ab0614a7a565b604051601f8201601f191681016001600160401b0381118282101715614b0057614b00614a7a565b604052919050565b5f6001600160401b03821115614b2057614b20614a7a565b5060051b60200190565b5f82601f830112614b39575f5ffd5b8135614b4c614b4782614b08565b614ad8565b8082825260208201915060208360051b860101925085831115614b6d575f5ffd5b602085015b83811015614b93578035614b8581614933565b835260209283019201614b72565b5095945050505050565b5f82601f830112614bac575f5ffd5b8135614bba614b4782614b08565b8082825260208201915060208360051b860101925085831115614bdb575f5ffd5b602085015b83811015614b93578035835260209283019201614be0565b5f5f5f60608486031215614c0a575f5ffd5b8335614c1581614933565b925060208401356001600160401b03811115614c2f575f5ffd5b614c3b86828701614b2a565b92505060408401356001600160401b03811115614c56575f5ffd5b614c6286828701614b9d565b9150509250925092565b5f8151808452602084019350602083015f5b82811015614c9c578151865260209586019590910190600101614c7e565b5093949350505050565b602081525f610d5a6020830184614c6c565b803563ffffffff81168114614952575f5ffd5b5f5f83601f840112614cdb575f5ffd5b5081356001600160401b03811115614cf1575f5ffd5b60208301915083602082850101111561224a575f5ffd5b5f5f5f5f60608587031215614d1b575f5ffd5b8435614d2681614933565b9350614d3460208601614cb8565b925060408501356001600160401b03811115614d4e575f5ffd5b614d5a87828801614ccb565b95989497509550505050565b5f5f5f5f60808587031215614d79575f5ffd5b8435614d8481614933565b93506020850135614d9481614933565b93969395505050506040820135916060013590565b5f60208284031215614db9575f5ffd5b8135610d5a81614933565b5f5f60408385031215614dd5575f5ffd5b8235614de081614933565b91506020830135614df081614933565b809150509250929050565b5f60e08284031215614e0b575f5ffd5b614e13614a8e565b9050614e1e82614947565b8152614e2c60208301614947565b6020820152614e3d60408301614947565b604082015260608281013590820152614e5860808301614cb8565b608082015260a08201356001600160401b03811115614e75575f5ffd5b614e8184828501614b2a565b60a08301525060c08201356001600160401b03811115614e9f575f5ffd5b614eab84828501614b9d565b60c08301525092915050565b5f60208284031215614ec7575f5ffd5b81356001600160401b03811115614edc575f5ffd5b611d2984828501614dfb565b5f60208284031215614ef8575f5ffd5b813560ff81168114610d5a575f5ffd5b5f8151808452602084019350602083015f5b82811015614c9c5781516001600160a01b0316865260209586019590910190600101614f1a565b80516001600160a01b03908116835260208083015182169084015260408083015190911690830152606080820151908301526080808201515f91614f8c9085018263ffffffff169052565b5060a082015160e060a0850152614fa660e0850182614f08565b905060c083015184820360c08601526140a98282614c6c565b602081525f610d5a6020830184614f41565b5f82825180855260208501945060208160051b830101602085015f5b8381101561348857601f19858403018852615009838351614c6c565b6020988901989093509190910190600101614fed565b5f604082016040835280855180835260608501915060608160051b8601019250602087015f5b8281101561507657605f19878603018452615061858351614f41565b94506020938401939190910190600101615045565b5050505082810360208401526140a98185614fd1565b6001600160401b0381168114612650575f5ffd5b5f5f5f5f608085870312156150b3575f5ffd5b84356150be81614933565b935060208501356150ce81614933565b925060408501356150de8161508c565b915060608501356150ee8161508c565b939692955090935050565b5f5f5f6060848603121561510b575f5ffd5b833561511681614933565b925060208401359150604084013561512d8161508c565b809150509250925092565b604081525f61514a6040830185614f08565b82810360208401526140a98185614c6c565b5f5f5f6040848603121561516e575f5ffd5b833561517981614933565b925060208401356001600160401b03811115615193575f5ffd5b61519f86828701614ccb565b9497909650939450505050565b5f5f604083850312156151bd575f5ffd5b82356151c881614933565b915060208301356001600160401b038111156151e2575f5ffd5b6151ee85828601614b2a565b9150509250929050565b5f5f5f5f5f5f6060878903121561520d575f5ffd5b86356001600160401b03811115615222575f5ffd5b61522e89828a016149ae565b90975095505060208701356001600160401b0381111561524c575f5ffd5b61525889828a016149ae565b90955093505060408701356001600160401b03811115615276575f5ffd5b61528289828a016149ae565b979a9699509497509295939492505050565b5f5f5f606084860312156152a6575f5ffd5b83356152b181614933565b925060208401356001600160401b038111156152cb575f5ffd5b8401604081870312156152dc575f5ffd5b6152e4614ab6565b81356001600160401b038111156152f9575f5ffd5b8201601f81018813615309575f5ffd5b80356001600160401b0381111561532257615322614a7a565b615335601f8201601f1916602001614ad8565b818152896020838501011115615349575f5ffd5b816020840160208301375f60209282018301528352928301359282019290925293969395505050506040919091013590565b5f5f6040838503121561538c575f5ffd5b823561539781614933565b946020939093013593505050565b604081525f61514a6040830185614c6c565b8015158114612650575f5ffd5b5f5f5f5f606085870312156153d7575f5ffd5b84356001600160401b038111156153ec575f5ffd5b850160e081880312156153fd575f5ffd5b935060208501356001600160401b03811115615417575f5ffd5b615423878288016149ae565b90945092505060408501356150ee816153b7565b5f5f60408385031215615448575f5ffd5b82356001600160401b0381111561545d575f5ffd5b8301601f8101851361546d575f5ffd5b803561547b614b4782614b08565b8082825260208201915060208360051b85010192508783111561549c575f5ffd5b6020840193505b828410156154c75783356154b681614933565b8252602093840193909101906154a3565b945050505060208301356001600160401b038111156151e2575f5ffd5b602081525f610d5a6020830184614fd1565b634e487b7160e01b5f52603260045260245ffd5b5f8235605e1983360301811261551e575f5ffd5b9190910192915050565b5f5f8335601e1984360301811261553d575f5ffd5b8301803591506001600160401b03821115615556575f5ffd5b6020019150600581901b360382131561224a575f5ffd5b5f6020828403121561557d575f5ffd5b8151610d5a816153b7565b60208152816020820152818360408301375f818301604090810191909152601f909201601f19160101919050565b5f602082840312156155c6575f5ffd5b8151610d5a8161508c565b634e487b7160e01b5f52601160045260245ffd5b63ffffffff8181168382160190811115611c8157611c816155d1565b80820180821115611c8157611c816155d1565b5f82601f830112615623575f5ffd5b8151615631614b4782614b08565b8082825260208201915060208360051b860101925085831115615652575f5ffd5b602085015b83811015614b93578051835260209283019201615657565b5f5f60408385031215615680575f5ffd5b82516001600160401b03811115615695575f5ffd5b8301601f810185136156a5575f5ffd5b80516156b3614b4782614b08565b8082825260208201915060208360051b8501019250878311156156d4575f5ffd5b6020840193505b828410156156ff5783516156ee81614933565b8252602093840193909101906156db565b8095505050505060208301516001600160401b0381111561571e575f5ffd5b6151ee85828601615614565b5f6020828403121561573a575f5ffd5b5051919050565b5f823560de1983360301811261551e575f5ffd5b5f611c813683614dfb565b5f60208284031215615770575f5ffd5b8135610d5a816153b7565b5f6020828403121561578b575f5ffd5b8151610d5a81614933565b6001600160a01b03831681526040602082018190525f90611d2990830184614f08565b5f602082840312156157c9575f5ffd5b81516001600160401b038111156157de575f5ffd5b8201601f810184136157ee575f5ffd5b80516157fc614b4782614b08565b8082825260208201915060208360051b85010192508683111561581d575f5ffd5b6020840193505b8284101561089d5783516158378161508c565b825260209384019390910190615824565b6001600160a01b039384168152919092166020820152604081019190915260600190565b5f6001820161587d5761587d6155d1565b5060010190565b838152606060208201525f61589c6060830185614f41565b828103604084015261089d8185614c6c565b6001600160a01b03841681526060602082018190525f906158d190830185614f08565b905063ffffffff83166040830152949350505050565b81810381811115611c8157611c816155d1565b63ffffffff8281168282160390811115611c8157611c816155d1565b5f5f60408385031215615927575f5ffd5b505080516020909101519092909150565b634e487b7160e01b5f52602160045260245ffd5b634e487b7160e01b5f52601260045260245ffd5b6001600160401b038281168282160390811115611c8157611c816155d1565b634e487b7160e01b5f52603160045260245ffd5b828152604060208201525f82518060408401528060208501606085015e5f606082850101526060601f19601f8301168401019150509392505050565b5f82518060208501845e5f920191825250919050565b5f826159ff57634e487b7160e01b5f52601260045260245ffd5b50049056fea264697066735822122089f485a47f2f5b45a7d907f4f2e0da7f25b36f9a443f499224dc3ec452cbe8b764736f6c634300081b0033", + Bin: "0x610180604052348015610010575f5ffd5b50604051615dd6380380615dd683398101604081905261002f9161021c565b8186868684876001600160a01b03811661005c576040516339b190bb60e11b815260040160405180910390fd5b6001600160a01b0390811660805293841660a05291831660c05290911660e05263ffffffff16610100524661012052610125604080518082018252600a81526922b4b3b2b72630bcb2b960b11b60209182015281517f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a866818301527f71b625cfad44bac63b13dba07f2e1d6084ee04b6f8752101ece6126d584ee6ea81840152466060820152306080808301919091528351808303909101815260a0909101909252815191012090565b610140526001600160a01b03166101605261013e610149565b5050505050506102a7565b5f54610100900460ff16156101b45760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff90811614610203575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b0381168114610219575f5ffd5b50565b5f5f5f5f5f5f60c08789031215610231575f5ffd5b865161023c81610205565b602088015190965061024d81610205565b604088015190955061025e81610205565b606088015190945061026f81610205565b608088015190935061028081610205565b60a088015190925063ffffffff81168114610299575f5ffd5b809150509295509295509295565b60805160a05160c05160e05161010051610120516101405161016051615a3a61039c5f395f818161042c01526132fa01525f61271601525f61265601525f818161070001528181611504015281816134f5015261383101525f818161075001528181610da901528181610f5a0152818161169f0152818161185e01528181611cb2015281816128eb01526133b101525f818161045301528181610ee0015281816117c501528181611a23015281816130e3015261363b01525f818161038901528181610eae01528181611977015261361501525f81816105ee01528181610b410152818161107a015261273a0152615a3a5ff3fe608060405234801561000f575f5ffd5b50600436106102cb575f3560e01c8063715018a61161017b578063bfae3fd2116100e4578063e4cc3f901161009e578063f2fde38b11610079578063f2fde38b146107de578063f698da25146107f1578063fabc1cbc146107f9578063fd8aa88d1461080c575f5ffd5b8063e4cc3f9014610798578063eea9064b146107ab578063f0e0e676146107be575f5ffd5b8063bfae3fd2146106e3578063c448feb8146106f6578063c978f7ac1461072a578063ca8aa7c71461074b578063cd6dc68714610772578063da8be86414610785575f5ffd5b80639104c319116101355780639104c319146106345780639435bb431461064f578063a178848414610662578063a33a343314610681578063b7f06ebe14610694578063bb45fef2146106b6575f5ffd5b8063715018a6146105a4578063778e55f3146105ac57806378296ec5146105d6578063886f1195146105e95780638da5cb5b146106105780639004134714610621575f5ffd5b806354b7c96c116102375780635dd68579116101f157806365da1264116101cc57806365da12641461053557806366d5ba931461055d5780636d70f7ae1461057e5780636e17444814610591575f5ffd5b80635dd68579146104ee578063601bb36f1461050f57806360a0d1ce14610522575f5ffd5b806354b7c96c14610475578063595c6a6714610488578063597b36da146104905780635ac86ab7146104a35780635c975abb146104c65780635d975e88146104ce575f5ffd5b806339b70e381161028857806339b70e38146103845780633c651cf2146103c35780633cdeb5e0146103d65780633e28391d146104045780634657e26a146104275780634665bcda1461044e575f5ffd5b806304a4f979146102cf5780630b9f487a146103095780630dd8dd021461031c578063136439dd1461033c57806325df922e146103515780632aa6d88814610371575b5f5ffd5b6102f67f14bde674c9f64b2ad00eaaee4a8bed1fabef35c7507e3c5b9cfc9436909a2dad81565b6040519081526020015b60405180910390f35b6102f6610317366004614957565b61081f565b61032f61032a3660046149ee565b6108a7565b6040516103009190614a2c565b61034f61034a366004614a63565b610b2c565b005b61036461035f366004614bf8565b610c01565b6040516103009190614ca6565b61034f61037f366004614d08565b610d61565b6103ab7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610300565b61034f6103d1366004614d66565b610ea3565b6103ab6103e4366004614da9565b6001600160a01b039081165f908152609960205260409020600101541690565b610417610412366004614da9565b610fea565b6040519015158152602001610300565b6103ab7f000000000000000000000000000000000000000000000000000000000000000081565b6103ab7f000000000000000000000000000000000000000000000000000000000000000081565b61034f610483366004614dc4565b611009565b61034f611065565b6102f661049e366004614eb7565b611114565b6104176104b1366004614ee8565b606654600160ff9092169190911b9081161490565b6066546102f6565b6104e16104dc366004614a63565b611143565b6040516103009190614fbf565b6105016104fc366004614da9565b61125f565b60405161030092919061501f565b61034f61051d3660046150a0565b611694565b61034f6105303660046150f9565b6117ba565b6103ab610543366004614da9565b609a6020525f90815260409020546001600160a01b031681565b61057061056b366004614da9565b61194f565b604051610300929190615138565b61041761058c366004614da9565b611c4f565b6102f661059f366004614dc4565b611c87565b61034f611d31565b6102f66105ba366004614dc4565b609860209081525f928352604080842090915290825290205481565b61034f6105e436600461515c565b611d42565b6103ab7f000000000000000000000000000000000000000000000000000000000000000081565b6033546001600160a01b03166103ab565b61036461062f3660046151ac565b611dca565b6103ab73beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac081565b61034f61065d3660046151f8565b611ea0565b6102f6610670366004614da9565b609f6020525f908152604090205481565b61032f61068f366004615294565b611f70565b6104176106a2366004614a63565b609e6020525f908152604090205460ff1681565b6104176106c436600461537b565b609c60209081525f928352604080842090915290825290205460ff1681565b6102f66106f1366004614dc4565b611f88565b60405163ffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152602001610300565b61073d6107383660046151ac565b611fc4565b6040516103009291906153a5565b6103ab7f000000000000000000000000000000000000000000000000000000000000000081565b61034f61078036600461537b565b612251565b61032f610793366004614da9565b61236c565b61034f6107a63660046153c4565b61247c565b61034f6107b9366004615294565b6124d2565b6107d16107cc366004615437565b612535565b60405161030091906154e4565b61034f6107ec366004614da9565b6125da565b6102f6612653565b61034f610807366004614a63565b612738565b61032f61081a366004614da9565b61284f565b604080517f14bde674c9f64b2ad00eaaee4a8bed1fabef35c7507e3c5b9cfc9436909a2dad60208201526001600160a01b03808616928201929092528187166060820152908516608082015260a0810183905260c081018290525f9061089d9060e00160405160208183030381529060405280519060200120612872565b9695505050505050565b6066546060906001906002908116036108d35760405163840a48d560e01b815260040160405180910390fd5b5f836001600160401b038111156108ec576108ec614a7a565b604051908082528060200260200182016040528015610915578160200160208202803683370190505b50335f908152609a60205260408120549192506001600160a01b03909116905b85811015610b215786868281811061094f5761094f6154f6565b9050602002810190610961919061550a565b61096f906020810190615528565b9050878783818110610983576109836154f6565b9050602002810190610995919061550a565b61099f9080615528565b9050146109bf576040516343714afd60e01b815260040160405180910390fd5b5f610a2933848a8a868181106109d7576109d76154f6565b90506020028101906109e9919061550a565b6109f39080615528565b808060200260200160405190810160405280939291908181526020018383602002808284375f920191909152506128a092505050565b9050610afb33848a8a86818110610a4257610a426154f6565b9050602002810190610a54919061550a565b610a5e9080615528565b808060200260200160405190810160405280939291908181526020018383602002808284375f920191909152508e92508d9150889050818110610aa357610aa36154f6565b9050602002810190610ab5919061550a565b610ac3906020810190615528565b808060200260200160405190810160405280939291908181526020018383602002808284375f920191909152508892506129e7915050565b848381518110610b0d57610b0d6154f6565b602090810291909101015250600101610935565b509095945050505050565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa158015610b8e573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610bb2919061556d565b610bcf57604051631d77d47760e21b815260040160405180910390fd5b6066548181168114610bf45760405163c61dca5d60e01b815260040160405180910390fd5b610bfd82612edc565b5050565b6001600160a01b038084165f908152609a60205260408120546060921690610c2a8683876128a0565b90505f85516001600160401b03811115610c4657610c46614a7a565b604051908082528060200260200182016040528015610c6f578160200160208202803683370190505b5090505f5b8651811015610d54576001600160a01b0388165f90815260a260205260408120885182908a9085908110610caa57610caa6154f6565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020015f206040518060200160405290815f820154815250509050610d2e878381518110610cfc57610cfc6154f6565b6020026020010151858481518110610d1657610d166154f6565b602002602001015183612f199092919063ffffffff16565b838381518110610d4057610d406154f6565b602090810291909101015250600101610c74565b50925050505b9392505050565b610d6a33610fea565b15610d8857604051633bf2b50360e11b815260040160405180910390fd5b604051632b6241f360e11b815233600482015263ffffffff841660248201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906356c483e6906044015f604051808303815f87803b158015610df2575f5ffd5b505af1158015610e04573d5f5f3e3d5ffd5b50505050610e123385612f37565b610e1c3333612f99565b6040516001600160a01b038516815233907fa453db612af59e5521d6ab9284dc3e2d06af286eb1b1b7b771fce4716c19f2c19060200160405180910390a2336001600160a01b03167f02a919ed0e2acad1dd90f17ef2fa4ae5462ee1339170034a8531cca4b67080908383604051610e95929190615588565b60405180910390a250505050565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161480610f025750336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016145b610f1f5760405163045206a560e21b815260040160405180910390fd5b6001600160a01b038481165f908152609a602052604080822054905163152667d960e31b8152908316600482018190528684166024830152927f0000000000000000000000000000000000000000000000000000000000000000169063a9333ec890604401602060405180830381865afa158015610f9f573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610fc391906155b6565b90505f610fd187878461309c565b9050610fe183888888888661317e565b50505050505050565b6001600160a01b039081165f908152609a602052604090205416151590565b81611013816132bc565b6110305760405163932d94f760e01b815260040160405180910390fd5b61103983611c4f565b611056576040516325ec6c1f60e01b815260040160405180910390fd5b6110608383612f37565b505050565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa1580156110c7573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110eb919061556d565b61110857604051631d77d47760e21b815260040160405180910390fd5b6111125f19612edc565b565b5f816040516020016111269190614fbf565b604051602081830303815290604052805190602001209050919050565b61114b614813565b5f82815260a46020908152604091829020825160e08101845281546001600160a01b03908116825260018301548116828501526002830154168185015260038201546060820152600482015463ffffffff1660808201526005820180548551818602810186019096528086529194929360a086019392908301828280156111f957602002820191905f5260205f20905b81546001600160a01b031681526001909101906020018083116111db575b505050505081526020016006820180548060200260200160405190810160405280929190818152602001828054801561124f57602002820191905f5260205f20905b81548152602001906001019080831161123b575b5050505050815250509050919050565b6060805f61126c8461284f565b8051909150806001600160401b0381111561128957611289614a7a565b6040519080825280602002602001820160405280156112c257816020015b6112af614813565b8152602001906001900390816112a75790505b509350806001600160401b038111156112dd576112dd614a7a565b60405190808252806020026020018201604052801561131057816020015b60608152602001906001900390816112fb5790505b506001600160a01b038087165f908152609a60205260408120549295509116905b8281101561168b5760a45f85838151811061134e5761134e6154f6565b60209081029190910181015182528181019290925260409081015f20815160e08101835281546001600160a01b03908116825260018301548116828601526002830154168184015260038201546060820152600482015463ffffffff1660808201526005820180548451818702810187019095528085529194929360a086019390929083018282801561140857602002820191905f5260205f20905b81546001600160a01b031681526001909101906020018083116113ea575b505050505081526020016006820180548060200260200160405190810160405280929190818152602001828054801561145e57602002820191905f5260205f20905b81548152602001906001019080831161144a575b505050505081525050868281518110611479576114796154f6565b6020026020010181905250858181518110611496576114966154f6565b602002602001015160a00151516001600160401b038111156114ba576114ba614a7a565b6040519080825280602002602001820160405280156114e3578160200160208202803683370190505b508582815181106114f6576114f66154f6565b60200260200101819052505f7f0000000000000000000000000000000000000000000000000000000000000000878381518110611535576115356154f6565b60200260200101516080015161154b91906155e5565b905060604363ffffffff168263ffffffff1610156115935761158c89858a868151811061157a5761157a6154f6565b602002602001015160a0015185613366565b90506115be565b6115bb89858a86815181106115aa576115aa6154f6565b602002602001015160a001516128a0565b90505b5f5b8884815181106115d2576115d26154f6565b602002602001015160a001515181101561167d5761163f8985815181106115fb576115fb6154f6565b602002602001015160c001518281518110611618576116186154f6565b6020026020010151838381518110611632576116326154f6565b6020026020010151613494565b888581518110611651576116516154f6565b6020026020010151828151811061166a5761166a6154f6565b60209081029190910101526001016115c0565b505050806001019050611331565b50505050915091565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146116dd576040516323d871a560e01b815260040160405180910390fd5b6001600160a01b038085165f90815260986020908152604080832093871683529290529081205461171b906001600160401b0380861690851661349f565b90505f61172a868686866134b7565b90505f6117378284615601565b9050611745875f8886613574565b5f61174f876135ee565b60405163debe1eab60e01b81526001600160a01b038981166004830152602482018590529192509082169063debe1eab906044015f604051808303815f87803b15801561179a575f5ffd5b505af11580156117ac573d5f5f3e3d5ffd5b505050505050505050505050565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461180357604051633213a66160e21b815260040160405180910390fd5b61180c83610fea565b15611060576001600160a01b038381165f908152609a602052604080822054905163152667d960e31b81529083166004820181905273beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac06024830152927f0000000000000000000000000000000000000000000000000000000000000000169063a9333ec890604401602060405180830381865afa1580156118a3573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906118c791906155b6565b6001600160a01b0386165f90815260a26020908152604080832073beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac084528252808320815192830190915254815291925061192d866119256001600160401b03808716908916613660565b849190613674565b9050610fe1848873beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac084613574565b6040516394f649dd60e01b81526001600160a01b03828116600483015260609182915f9182917f000000000000000000000000000000000000000000000000000000000000000016906394f649dd906024015f60405180830381865afa1580156119bb573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526119e2919081019061566f565b60405163fe243a1760e01b81526001600160a01b03888116600483015273beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac060248301529294509092505f917f0000000000000000000000000000000000000000000000000000000000000000169063fe243a1790604401602060405180830381865afa158015611a68573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a8c919061572a565b9050805f03611aa057509094909350915050565b5f83516001611aaf9190615601565b6001600160401b03811115611ac657611ac6614a7a565b604051908082528060200260200182016040528015611aef578160200160208202803683370190505b5090505f84516001611b019190615601565b6001600160401b03811115611b1857611b18614a7a565b604051908082528060200260200182016040528015611b41578160200160208202803683370190505b50905073beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac082865181518110611b6c57611b6c6154f6565b60200260200101906001600160a01b031690816001600160a01b0316815250508281865181518110611ba057611ba06154f6565b60209081029190910101525f5b8551811015611c4157858181518110611bc857611bc86154f6565b6020026020010151838281518110611be257611be26154f6565b60200260200101906001600160a01b031690816001600160a01b031681525050848181518110611c1457611c146154f6565b6020026020010151828281518110611c2e57611c2e6154f6565b6020908102919091010152600101611bad565b509097909650945050505050565b5f6001600160a01b03821615801590611c8157506001600160a01b038083165f818152609a6020526040902054909116145b92915050565b60405163152667d960e31b81526001600160a01b03838116600483015282811660248301525f9182917f0000000000000000000000000000000000000000000000000000000000000000169063a9333ec890604401602060405180830381865afa158015611cf7573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611d1b91906155b6565b9050611d298484835f6134b7565b949350505050565b611d39613692565b6111125f6136ec565b82611d4c816132bc565b611d695760405163932d94f760e01b815260040160405180910390fd5b611d7284611c4f565b611d8f576040516325ec6c1f60e01b815260040160405180910390fd5b836001600160a01b03167f02a919ed0e2acad1dd90f17ef2fa4ae5462ee1339170034a8531cca4b67080908484604051610e95929190615588565b60605f82516001600160401b03811115611de657611de6614a7a565b604051908082528060200260200182016040528015611e0f578160200160208202803683370190505b5090505f5b8351811015611e98576001600160a01b0385165f9081526098602052604081208551909190869084908110611e4b57611e4b6154f6565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020015f2054828281518110611e8557611e856154f6565b6020908102919091010152600101611e14565b509392505050565b606654600290600490811603611ec95760405163840a48d560e01b815260040160405180910390fd5b611ed161373d565b855f5b81811015611f6457611f5c898983818110611ef157611ef16154f6565b9050602002810190611f039190615741565b611f0c90615755565b888884818110611f1e57611f1e6154f6565b9050602002810190611f309190615528565b888886818110611f4257611f426154f6565b9050602002016020810190611f579190615760565b613796565b600101611ed4565b5050610fe1600160c955565b6060611f7b3361236c565b9050610d5a8484846124d2565b6001600160a01b038083165f90815260a260209081526040808320938516835292815282822083519182019093529154825290610d5a90613bd8565b60608082516001600160401b03811115611fe057611fe0614a7a565b604051908082528060200260200182016040528015612009578160200160208202803683370190505b50915082516001600160401b0381111561202557612025614a7a565b60405190808252806020026020018201604052801561204e578160200160208202803683370190505b506001600160a01b038086165f908152609a60205260408120549293509116906120798683876128a0565b90505f5b8551811015612246575f6120a987838151811061209c5761209c6154f6565b60200260200101516135ee565b9050806001600160a01b031663fe243a17898985815181106120cd576120cd6154f6565b60200260200101516040518363ffffffff1660e01b81526004016121079291906001600160a01b0392831681529116602082015260400190565b602060405180830381865afa158015612122573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612146919061572a565b858381518110612158576121586154f6565b6020026020010181815250505f60a25f8a6001600160a01b03166001600160a01b031681526020019081526020015f205f89858151811061219b5761219b6154f6565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020015f206040518060200160405290815f82015481525050905061221f8684815181106121ed576121ed6154f6565b6020026020010151858581518110612207576122076154f6565b6020026020010151836136749092919063ffffffff16565b878481518110612231576122316154f6565b6020908102919091010152505060010161207d565b5050505b9250929050565b5f54610100900460ff161580801561226f57505f54600160ff909116105b806122885750303b15801561228857505f5460ff166001145b6122f05760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b5f805460ff191660011790558015612311575f805461ff0019166101001790555b61231a82612edc565b612323836136ec565b8015611060575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a1505050565b606061237782610fea565b6123945760405163a5c7c44560e01b815260040160405180910390fd5b61239d82611c4f565b156123bb576040516311ca333560e31b815260040160405180910390fd5b336001600160a01b03831614612473576001600160a01b038083165f908152609a6020526040902054166123ee816132bc565b8061241457506001600160a01b038181165f908152609960205260409020600101541633145b61243157604051631e499a2360e11b815260040160405180910390fd5b806001600160a01b0316836001600160a01b03167ff0eddf07e6ea14f388b47e1e94a0f464ecbd9eed4171130e0fc0e99fb4030a8a60405160405180910390a3505b611c8182613bf7565b6066546002906004908116036124a55760405163840a48d560e01b815260040160405180910390fd5b6124ad61373d565b6124c16124b986615755565b858585613796565b6124cb600160c955565b5050505050565b6124db33610fea565b156124f957604051633bf2b50360e11b815260040160405180910390fd5b61250283611c4f565b61251f576040516325ec6c1f60e01b815260040160405180910390fd5b61252b33848484613e56565b6110603384612f99565b60605f83516001600160401b0381111561255157612551614a7a565b60405190808252806020026020018201604052801561258457816020015b606081526020019060019003908161256f5790505b5090505f5b8451811015611e98576125b58582815181106125a7576125a76154f6565b602002602001015185611dca565b8282815181106125c7576125c76154f6565b6020908102919091010152600101612589565b6125e2613692565b6001600160a01b0381166126475760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016122e7565b612650816136ec565b50565b5f7f000000000000000000000000000000000000000000000000000000000000000046146127135750604080518082018252600a81526922b4b3b2b72630bcb2b960b11b60209182015281517f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a866818301527f71b625cfad44bac63b13dba07f2e1d6084ee04b6f8752101ece6126d584ee6ea81840152466060820152306080808301919091528351808303909101815260a0909101909252815191012090565b507f000000000000000000000000000000000000000000000000000000000000000090565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612794573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906127b8919061577b565b6001600160a01b0316336001600160a01b0316146127e95760405163794821ff60e01b815260040160405180910390fd5b606654801982198116146128105760405163c61dca5d60e01b815260040160405180910390fd5b606682905560405182815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c906020015b60405180910390a25050565b6001600160a01b0381165f90815260a360205260409020606090611c8190613f1b565b5f61287b612653565b60405161190160f01b6020820152602281019190915260428101839052606201611126565b60605f82516001600160401b038111156128bc576128bc614a7a565b6040519080825280602002602001820160405280156128e5578160200160208202803683370190505b5090505f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663547afb8786866040518363ffffffff1660e01b8152600401612937929190615796565b5f60405180830381865afa158015612951573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261297891908101906157b9565b90505f5b8451811015610b21576129c28786838151811061299b5761299b6154f6565b60200260200101518484815181106129b5576129b56154f6565b602002602001015161309c565b8382815181106129d4576129d46154f6565b602090810291909101015260010161297c565b5f6001600160a01b038616612a0f576040516339b190bb60e11b815260040160405180910390fd5b83515f03612a305760405163796cc52560e01b815260040160405180910390fd5b5f84516001600160401b03811115612a4a57612a4a614a7a565b604051908082528060200260200182016040528015612a73578160200160208202803683370190505b5090505f85516001600160401b03811115612a9057612a90614a7a565b604051908082528060200260200182016040528015612ab9578160200160208202803683370190505b5090505f5b8651811015612d0f575f612add88838151811061209c5761209c6154f6565b90505f60a25f8c6001600160a01b03166001600160a01b031681526020019081526020015f205f8a8581518110612b1657612b166154f6565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020015f206040518060200160405290815f820154815250509050612b82888481518110612b6857612b686154f6565b6020026020010151888581518110612207576122076154f6565b848481518110612b9457612b946154f6565b602002602001018181525050612bcc888481518110612bb557612bb56154f6565b602002602001015182613f2790919063ffffffff16565b858481518110612bde57612bde6154f6565b60209081029190910101526001600160a01b038a1615612c7357612c358a8a8581518110612c0e57612c0e6154f6565b6020026020010151878681518110612c2857612c286154f6565b6020026020010151613f3b565b612c738a8c8b8681518110612c4c57612c4c6154f6565b6020026020010151878781518110612c6657612c666154f6565b6020026020010151613574565b816001600160a01b031663724af4238c8b8681518110612c9557612c956154f6565b60200260200101518b8781518110612caf57612caf6154f6565b60200260200101516040518463ffffffff1660e01b8152600401612cd593929190615848565b5f604051808303815f87803b158015612cec575f5ffd5b505af1158015612cfe573d5f5f3e3d5ffd5b505050505050806001019050612abe565b506001600160a01b0388165f908152609f60205260408120805491829190612d368361586c565b91905055505f6040518060e001604052808b6001600160a01b031681526020018a6001600160a01b031681526020018b6001600160a01b031681526020018381526020014363ffffffff1681526020018981526020018581525090505f612d9c82611114565b5f818152609e602090815260408083208054600160ff19909116811790915560a4835292819020865181546001600160a01b03199081166001600160a01b039283161783558885015195830180548216968316969096179095559187015160028201805490951692169190911790925560608501516003830155608085015160048301805463ffffffff191663ffffffff90921691909117905560a085015180519394508593612e52926005850192019061486c565b5060c08201518051612e6e9160068401916020909101906148cf565b5050506001600160a01b038b165f90815260a360205260409020612e929082613fc9565b507f26b2aae26516e8719ef50ea2f6831a2efbd4e37dccdf0f6936b27bc08e793e30818386604051612ec693929190615884565b60405180910390a19a9950505050505050505050565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a250565b5f611d2982612f31612f2a87613bd8565b8690613fd4565b90613fd4565b6001600160a01b038281165f8181526099602090815260409182902060010180546001600160a01b0319169486169485179055905192835290917f773b54c04d756fcc5e678111f7d730de3be98192000799eee3d63716055a87c69101612843565b6066545f90600190811603612fc15760405163840a48d560e01b815260040160405180910390fd5b6001600160a01b038381165f818152609a602052604080822080546001600160a01b0319169487169485179055517fc3ee9f2e5fda98e8066a1f745b2df9285f416fe98cf2559cd21484b3d87433049190a35f5f61301e8561194f565b915091505f61302e8686856128a0565b90505f5b8351811015610fe1576130948688868481518110613052576130526154f6565b60200260200101515f87868151811061306d5761306d6154f6565b6020026020010151878781518110613087576130876154f6565b602002602001015161317e565b600101613032565b5f73beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeabf196001600160a01b0384160161316e5760405163a3d75e0960e01b81526001600160a01b0385811660048301525f917f00000000000000000000000000000000000000000000000000000000000000009091169063a3d75e0990602401602060405180830381865afa15801561312a573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061314e91906155b6565b90506131666001600160401b03848116908316613660565b915050610d5a565b506001600160401b031692915050565b805f0361319e57604051630a33bc6960e21b815260040160405180910390fd5b6001600160a01b038086165f90815260a2602090815260408083209388168352929052206131ce81858585613fe8565b6040805160208101909152815481527f8be932bac54561f27260f95463d9b8ab37e06b2842e5ee2404157cc13df6eb8f908790879061320c90613bd8565b60405161321b93929190615848565b60405180910390a161322c86610fea565b15610fe1576001600160a01b038088165f90815260986020908152604080832093891683529290529081208054859290613267908490615601565b92505081905550866001600160a01b03167f1ec042c965e2edd7107b51188ee0f383e22e76179041ab3a9d18ff151405166c8787866040516132ab93929190615848565b60405180910390a250505050505050565b604051631beb2b9760e31b81526001600160a01b0382811660048301523360248301523060448301525f80356001600160e01b0319166064840152917f00000000000000000000000000000000000000000000000000000000000000009091169063df595cb8906084016020604051808303815f875af1158015613342573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611c81919061556d565b60605f83516001600160401b0381111561338257613382614a7a565b6040519080825280602002602001820160405280156133ab578160200160208202803683370190505b5090505f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166394d7d00c8787876040518463ffffffff1660e01b81526004016133ff939291906158ae565b5f60405180830381865afa158015613419573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261344091908101906157b9565b90505f5b8551811015613488576134638887838151811061299b5761299b6154f6565b838281518110613475576134756154f6565b6020908102919091010152600101613444565b50909695505050505050565b5f610d5a8383613660565b5f6134ad8483856001614057565b611d2990856158e7565b6001600160a01b038085165f90815260a560209081526040808320938716835292905290812081906134e8906140b2565b90505f61354e600161351a7f0000000000000000000000000000000000000000000000000000000000000000436158fa565b61352491906158fa565b6001600160a01b03808a165f90815260a560209081526040808320938c16835292905220906140cc565b90505f61355b82846158e7565b90506135688187876140e8565b98975050505050505050565b6001600160a01b038085165f908152609860209081526040808320938616835292905290812080548392906135aa9084906158e7565b92505081905550836001600160a01b03167f6909600037b75d7b4733aedd815442b5ec018a827751c832aaff64eba5d6d2dd848484604051610e9593929190615848565b5f6001600160a01b03821673beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac014613639577f0000000000000000000000000000000000000000000000000000000000000000611c81565b7f000000000000000000000000000000000000000000000000000000000000000092915050565b5f610d5a8383670de0b6b3a7640000614106565b5f611d298261368c61368587613bd8565b8690613660565b90613660565b6033546001600160a01b031633146111125760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016122e7565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b600260c9540361378f5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016122e7565b600260c955565b60a08401515182146137bb576040516343714afd60e01b815260040160405180910390fd5b83604001516001600160a01b0316336001600160a01b0316146137f1576040516316110d3560e21b815260040160405180910390fd5b5f6137fb85611114565b5f818152609e602052604090205490915060ff1661382c576040516387c9d21960e01b815260040160405180910390fd5b60605f7f0000000000000000000000000000000000000000000000000000000000000000876080015161385f91906155e5565b90508063ffffffff164363ffffffff161161388d576040516378f67ae160e11b815260040160405180910390fd5b6138a4875f015188602001518960a0015184613366565b87516001600160a01b03165f90815260a3602052604090209092506138ca9150836141eb565b505f82815260a46020526040812080546001600160a01b031990811682556001820180548216905560028201805490911690556003810182905560048101805463ffffffff19169055906139216005830182614908565b61392e600683015f614908565b50505f828152609e602052604090819020805460ff19169055517f1f40400889274ed07b24845e5054a87a0cab969eb1277aafe61ae352e7c32a00906139779084815260200190565b60405180910390a185516001600160a01b039081165f908152609a6020526040812054885160a08a015191909316926139b19184906128a0565b90505f5b8860a0015151811015613bcd575f6139dc8a60a00151838151811061209c5761209c6154f6565b90505f613a128b60c0015184815181106139f8576139f86154f6565b6020026020010151878581518110611632576116326154f6565b9050805f03613a22575050613bc5565b8715613af057816001600160a01b0316632eae418c8c5f01518d60a001518681518110613a5157613a516154f6565b60200260200101518d8d88818110613a6b57613a6b6154f6565b9050602002016020810190613a809190614da9565b60405160e085901b6001600160e01b03191681526001600160a01b03938416600482015291831660248301529091166044820152606481018490526084015f604051808303815f87803b158015613ad5575f5ffd5b505af1158015613ae7573d5f5f3e3d5ffd5b50505050613bc2565b5f5f836001600160a01b03166350ff72258e5f01518f60a001518881518110613b1b57613b1b6154f6565b6020026020010151866040518463ffffffff1660e01b8152600401613b4293929190615848565b60408051808303815f875af1158015613b5d573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613b819190615916565b91509150613bbf878e5f01518f60a001518881518110613ba357613ba36154f6565b602002602001015185858b8b81518110613087576130876154f6565b50505b50505b6001016139b5565b505050505050505050565b80515f9015613be8578151611c81565b670de0b6b3a764000092915050565b606654606090600190600290811603613c235760405163840a48d560e01b815260040160405180910390fd5b6001600160a01b038084165f818152609a602052604080822080546001600160a01b0319811690915590519316928392917ffee30966a256b71e14bc0ebfc94315e28ef4a97a7131a9e2b7a310a73af4467691a35f5f613c828661194f565b9150915081515f03613c9657505050613e50565b81516001600160401b03811115613caf57613caf614a7a565b604051908082528060200260200182016040528015613cd8578160200160208202803683370190505b5094505f613ce78785856128a0565b90505f5b8351811015613e4a576040805160018082528183019092525f916020808301908036833750506040805160018082528183019092529293505f9291506020808301908036833750506040805160018082528183019092529293505f92915060208083019080368337019050509050868481518110613d6b57613d6b6154f6565b6020026020010151835f81518110613d8557613d856154f6565b60200260200101906001600160a01b031690816001600160a01b031681525050858481518110613db757613db76154f6565b6020026020010151825f81518110613dd157613dd16154f6565b602002602001018181525050848481518110613def57613def6154f6565b6020026020010151815f81518110613e0957613e096154f6565b602002602001018181525050613e228b898585856129e7565b8a8581518110613e3457613e346154f6565b6020908102919091010152505050600101613ceb565b50505050505b50919050565b6001600160a01b038084165f908152609960205260409020600101541680613e7e5750613f15565b6001600160a01b0381165f908152609c6020908152604080832085845290915290205460ff1615613ec257604051630d4c4c9160e21b815260040160405180910390fd5b6001600160a01b0381165f908152609c602090815260408083208584528252909120805460ff191660011790558301516124cb908290613f0990889088908490889061081f565b855160208701516141f6565b50505050565b60605f610d5a83614248565b5f610d5a613f3484613bd8565b8390613660565b6001600160a01b03821673beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac014611060576001600160a01b038084165f90815260a5602090815260408083209386168352929052908120613f8e906140b2565b9050613f1543613f9e8484615601565b6001600160a01b038088165f90815260a560209081526040808320938a1683529290522091906142a1565b5f610d5a83836142ac565b5f610d5a83670de0b6b3a764000084614106565b825f0361400857614001670de0b6b3a764000082613fd4565b8455613f15565b6040805160208101909152845481525f90614024908584613674565b90505f6140318483615601565b90505f61404c84612f31614045888a615601565b8590613fd4565b875550505050505050565b5f5f614064868686614106565b9050600183600281111561407a5761407a615938565b14801561409657505f84806140915761409161594c565b868809115b156140a9576140a6600182615601565b90505b95945050505050565b5f6140bd82826142f8565b6001600160e01b031692915050565b5f6140d883838361433d565b6001600160e01b03169392505050565b5f611d296140f68385615960565b85906001600160401b0316613660565b5f80805f19858709858702925082811083820303915050805f0361413d578382816141335761413361594c565b0492505050610d5a565b8084116141845760405162461bcd60e51b81526020600482015260156024820152744d6174683a206d756c446976206f766572666c6f7760581b60448201526064016122e7565b5f8486880960026001871981018816978890046003810283188082028403028082028403028082028403028082028403028082028403029081029092039091025f889003889004909101858311909403939093029303949094049190911702949350505050565b5f610d5a8383614386565b4281101561421757604051630819bdcd60e01b815260040160405180910390fd5b61422b6001600160a01b0385168484614469565b613f1557604051638baa579f60e01b815260040160405180910390fd5b6060815f0180548060200260200160405190810160405280929190818152602001828054801561429557602002820191905f5260205f20905b815481526020019060010190808311614281575b50505050509050919050565b6110608383836144bd565b5f8181526001830160205260408120546142f157508154600181810184555f848152602080822090930184905584548482528286019093526040902091909155611c81565b505f611c81565b81545f9080156143355761431e846143116001846158e7565b5f91825260209091200190565b5464010000000090046001600160e01b0316611d29565b509092915050565b82545f908161434e868683856145c3565b9050801561437c57614365866143116001846158e7565b5464010000000090046001600160e01b031661089d565b5091949350505050565b5f8181526001830160205260408120548015614460575f6143a86001836158e7565b85549091505f906143bb906001906158e7565b905081811461441a575f865f0182815481106143d9576143d96154f6565b905f5260205f200154905080875f0184815481106143f9576143f96154f6565b5f918252602080832090910192909255918252600188019052604090208390555b855486908061442b5761442b61597f565b600190038181905f5260205f20015f90559055856001015f8681526020019081526020015f205f905560019350505050611c81565b5f915050611c81565b5f5f5f6144768585614616565b90925090505f81600481111561448e5761448e615938565b1480156144ac5750856001600160a01b0316826001600160a01b0316145b8061089d575061089d868686614655565b82548015614575575f6144d5856143116001856158e7565b60408051808201909152905463ffffffff8082168084526401000000009092046001600160e01b0316602084015291925090851610156145285760405163151b8e3f60e11b815260040160405180910390fd5b805163ffffffff8086169116036145735782614549866143116001866158e7565b80546001600160e01b03929092166401000000000263ffffffff9092169190911790555050505050565b505b506040805180820190915263ffffffff92831681526001600160e01b03918216602080830191825285546001810187555f968752952091519051909216640100000000029190921617910155565b5f5b81831015611e98575f6145d8848461473c565b5f8781526020902090915063ffffffff86169082015463ffffffff16111561460257809250614610565b61460d816001615601565b93505b506145c5565b5f5f825160410361464a576020830151604084015160608501515f1a61463e87828585614756565b9450945050505061224a565b505f9050600261224a565b5f5f5f856001600160a01b0316631626ba7e60e01b868660405160240161467d929190615993565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b03199094169390931790925290516146bb91906159cf565b5f60405180830381855afa9150503d805f81146146f3576040519150601f19603f3d011682016040523d82523d5f602084013e6146f8565b606091505b509150915081801561470c57506020815110155b801561089d57508051630b135d3f60e11b90614731908301602090810190840161572a565b149695505050505050565b5f61474a60028484186159e5565b610d5a90848416615601565b5f807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a083111561478b57505f9050600361480a565b604080515f8082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa1580156147dc573d5f5f3e3d5ffd5b5050604051601f1901519150506001600160a01b038116614804575f6001925092505061480a565b91505f90505b94509492505050565b6040518060e001604052805f6001600160a01b031681526020015f6001600160a01b031681526020015f6001600160a01b031681526020015f81526020015f63ffffffff16815260200160608152602001606081525090565b828054828255905f5260205f209081019282156148bf579160200282015b828111156148bf57825182546001600160a01b0319166001600160a01b0390911617825560209092019160019091019061488a565b506148cb92915061491f565b5090565b828054828255905f5260205f209081019282156148bf579160200282015b828111156148bf5782518255916020019190600101906148ed565b5080545f8255905f5260205f209081019061265091905b5b808211156148cb575f8155600101614920565b6001600160a01b0381168114612650575f5ffd5b803561495281614933565b919050565b5f5f5f5f5f60a0868803121561496b575f5ffd5b853561497681614933565b9450602086013561498681614933565b9350604086013561499681614933565b94979396509394606081013594506080013592915050565b5f5f83601f8401126149be575f5ffd5b5081356001600160401b038111156149d4575f5ffd5b6020830191508360208260051b850101111561224a575f5ffd5b5f5f602083850312156149ff575f5ffd5b82356001600160401b03811115614a14575f5ffd5b614a20858286016149ae565b90969095509350505050565b602080825282518282018190525f918401906040840190835b81811015610b21578351835260209384019390920191600101614a45565b5f60208284031215614a73575f5ffd5b5035919050565b634e487b7160e01b5f52604160045260245ffd5b60405160e081016001600160401b0381118282101715614ab057614ab0614a7a565b60405290565b604080519081016001600160401b0381118282101715614ab057614ab0614a7a565b604051601f8201601f191681016001600160401b0381118282101715614b0057614b00614a7a565b604052919050565b5f6001600160401b03821115614b2057614b20614a7a565b5060051b60200190565b5f82601f830112614b39575f5ffd5b8135614b4c614b4782614b08565b614ad8565b8082825260208201915060208360051b860101925085831115614b6d575f5ffd5b602085015b83811015614b93578035614b8581614933565b835260209283019201614b72565b5095945050505050565b5f82601f830112614bac575f5ffd5b8135614bba614b4782614b08565b8082825260208201915060208360051b860101925085831115614bdb575f5ffd5b602085015b83811015614b93578035835260209283019201614be0565b5f5f5f60608486031215614c0a575f5ffd5b8335614c1581614933565b925060208401356001600160401b03811115614c2f575f5ffd5b614c3b86828701614b2a565b92505060408401356001600160401b03811115614c56575f5ffd5b614c6286828701614b9d565b9150509250925092565b5f8151808452602084019350602083015f5b82811015614c9c578151865260209586019590910190600101614c7e565b5093949350505050565b602081525f610d5a6020830184614c6c565b803563ffffffff81168114614952575f5ffd5b5f5f83601f840112614cdb575f5ffd5b5081356001600160401b03811115614cf1575f5ffd5b60208301915083602082850101111561224a575f5ffd5b5f5f5f5f60608587031215614d1b575f5ffd5b8435614d2681614933565b9350614d3460208601614cb8565b925060408501356001600160401b03811115614d4e575f5ffd5b614d5a87828801614ccb565b95989497509550505050565b5f5f5f5f60808587031215614d79575f5ffd5b8435614d8481614933565b93506020850135614d9481614933565b93969395505050506040820135916060013590565b5f60208284031215614db9575f5ffd5b8135610d5a81614933565b5f5f60408385031215614dd5575f5ffd5b8235614de081614933565b91506020830135614df081614933565b809150509250929050565b5f60e08284031215614e0b575f5ffd5b614e13614a8e565b9050614e1e82614947565b8152614e2c60208301614947565b6020820152614e3d60408301614947565b604082015260608281013590820152614e5860808301614cb8565b608082015260a08201356001600160401b03811115614e75575f5ffd5b614e8184828501614b2a565b60a08301525060c08201356001600160401b03811115614e9f575f5ffd5b614eab84828501614b9d565b60c08301525092915050565b5f60208284031215614ec7575f5ffd5b81356001600160401b03811115614edc575f5ffd5b611d2984828501614dfb565b5f60208284031215614ef8575f5ffd5b813560ff81168114610d5a575f5ffd5b5f8151808452602084019350602083015f5b82811015614c9c5781516001600160a01b0316865260209586019590910190600101614f1a565b80516001600160a01b03908116835260208083015182169084015260408083015190911690830152606080820151908301526080808201515f91614f8c9085018263ffffffff169052565b5060a082015160e060a0850152614fa660e0850182614f08565b905060c083015184820360c08601526140a98282614c6c565b602081525f610d5a6020830184614f41565b5f82825180855260208501945060208160051b830101602085015f5b8381101561348857601f19858403018852615009838351614c6c565b6020988901989093509190910190600101614fed565b5f604082016040835280855180835260608501915060608160051b8601019250602087015f5b8281101561507657605f19878603018452615061858351614f41565b94506020938401939190910190600101615045565b5050505082810360208401526140a98185614fd1565b6001600160401b0381168114612650575f5ffd5b5f5f5f5f608085870312156150b3575f5ffd5b84356150be81614933565b935060208501356150ce81614933565b925060408501356150de8161508c565b915060608501356150ee8161508c565b939692955090935050565b5f5f5f6060848603121561510b575f5ffd5b833561511681614933565b925060208401359150604084013561512d8161508c565b809150509250925092565b604081525f61514a6040830185614f08565b82810360208401526140a98185614c6c565b5f5f5f6040848603121561516e575f5ffd5b833561517981614933565b925060208401356001600160401b03811115615193575f5ffd5b61519f86828701614ccb565b9497909650939450505050565b5f5f604083850312156151bd575f5ffd5b82356151c881614933565b915060208301356001600160401b038111156151e2575f5ffd5b6151ee85828601614b2a565b9150509250929050565b5f5f5f5f5f5f6060878903121561520d575f5ffd5b86356001600160401b03811115615222575f5ffd5b61522e89828a016149ae565b90975095505060208701356001600160401b0381111561524c575f5ffd5b61525889828a016149ae565b90955093505060408701356001600160401b03811115615276575f5ffd5b61528289828a016149ae565b979a9699509497509295939492505050565b5f5f5f606084860312156152a6575f5ffd5b83356152b181614933565b925060208401356001600160401b038111156152cb575f5ffd5b8401604081870312156152dc575f5ffd5b6152e4614ab6565b81356001600160401b038111156152f9575f5ffd5b8201601f81018813615309575f5ffd5b80356001600160401b0381111561532257615322614a7a565b615335601f8201601f1916602001614ad8565b818152896020838501011115615349575f5ffd5b816020840160208301375f60209282018301528352928301359282019290925293969395505050506040919091013590565b5f5f6040838503121561538c575f5ffd5b823561539781614933565b946020939093013593505050565b604081525f61514a6040830185614c6c565b8015158114612650575f5ffd5b5f5f5f5f606085870312156153d7575f5ffd5b84356001600160401b038111156153ec575f5ffd5b850160e081880312156153fd575f5ffd5b935060208501356001600160401b03811115615417575f5ffd5b615423878288016149ae565b90945092505060408501356150ee816153b7565b5f5f60408385031215615448575f5ffd5b82356001600160401b0381111561545d575f5ffd5b8301601f8101851361546d575f5ffd5b803561547b614b4782614b08565b8082825260208201915060208360051b85010192508783111561549c575f5ffd5b6020840193505b828410156154c75783356154b681614933565b8252602093840193909101906154a3565b945050505060208301356001600160401b038111156151e2575f5ffd5b602081525f610d5a6020830184614fd1565b634e487b7160e01b5f52603260045260245ffd5b5f8235605e1983360301811261551e575f5ffd5b9190910192915050565b5f5f8335601e1984360301811261553d575f5ffd5b8301803591506001600160401b03821115615556575f5ffd5b6020019150600581901b360382131561224a575f5ffd5b5f6020828403121561557d575f5ffd5b8151610d5a816153b7565b60208152816020820152818360408301375f818301604090810191909152601f909201601f19160101919050565b5f602082840312156155c6575f5ffd5b8151610d5a8161508c565b634e487b7160e01b5f52601160045260245ffd5b63ffffffff8181168382160190811115611c8157611c816155d1565b80820180821115611c8157611c816155d1565b5f82601f830112615623575f5ffd5b8151615631614b4782614b08565b8082825260208201915060208360051b860101925085831115615652575f5ffd5b602085015b83811015614b93578051835260209283019201615657565b5f5f60408385031215615680575f5ffd5b82516001600160401b03811115615695575f5ffd5b8301601f810185136156a5575f5ffd5b80516156b3614b4782614b08565b8082825260208201915060208360051b8501019250878311156156d4575f5ffd5b6020840193505b828410156156ff5783516156ee81614933565b8252602093840193909101906156db565b8095505050505060208301516001600160401b0381111561571e575f5ffd5b6151ee85828601615614565b5f6020828403121561573a575f5ffd5b5051919050565b5f823560de1983360301811261551e575f5ffd5b5f611c813683614dfb565b5f60208284031215615770575f5ffd5b8135610d5a816153b7565b5f6020828403121561578b575f5ffd5b8151610d5a81614933565b6001600160a01b03831681526040602082018190525f90611d2990830184614f08565b5f602082840312156157c9575f5ffd5b81516001600160401b038111156157de575f5ffd5b8201601f810184136157ee575f5ffd5b80516157fc614b4782614b08565b8082825260208201915060208360051b85010192508683111561581d575f5ffd5b6020840193505b8284101561089d5783516158378161508c565b825260209384019390910190615824565b6001600160a01b039384168152919092166020820152604081019190915260600190565b5f6001820161587d5761587d6155d1565b5060010190565b838152606060208201525f61589c6060830185614f41565b828103604084015261089d8185614c6c565b6001600160a01b03841681526060602082018190525f906158d190830185614f08565b905063ffffffff83166040830152949350505050565b81810381811115611c8157611c816155d1565b63ffffffff8281168282160390811115611c8157611c816155d1565b5f5f60408385031215615927575f5ffd5b505080516020909101519092909150565b634e487b7160e01b5f52602160045260245ffd5b634e487b7160e01b5f52601260045260245ffd5b6001600160401b038281168282160390811115611c8157611c816155d1565b634e487b7160e01b5f52603160045260245ffd5b828152604060208201525f82518060408401528060208501606085015e5f606082850101526060601f19601f8301168401019150509392505050565b5f82518060208501845e5f920191825250919050565b5f826159ff57634e487b7160e01b5f52601260045260245ffd5b50049056fea26469706673582212200648457bc5b8ec032001d65839829fcf37fc20846fa51b9624f43ca2de62b2a964736f6c634300081b0033", } // DelegationManagerABI 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 92480a12ae..5662a0b235 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: "0x60a060405234801561000f575f5ffd5b50604051616705380380616705833981810160405281019061003191906101a6565b8073ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff168152505061007361007960201b60201c565b506102a3565b5f60019054906101000a900460ff16156100c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100bf90610251565b60405180910390fd5b60ff80165f5f9054906101000a900460ff1660ff16146101355760ff5f5f6101000a81548160ff021916908360ff1602179055507f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb384740249860ff60405161012c919061028a565b60405180910390a15b565b5f5ffd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6101648261013b565b9050919050565b5f6101758261015a565b9050919050565b6101858161016b565b811461018f575f5ffd5b50565b5f815190506101a08161017c565b92915050565b5f602082840312156101bb576101ba610137565b5b5f6101c884828501610192565b91505092915050565b5f82825260208201905092915050565b7f496e697469616c697a61626c653a20636f6e747261637420697320696e6974695f8201527f616c697a696e6700000000000000000000000000000000000000000000000000602082015250565b5f61023b6027836101d1565b9150610246826101e1565b604082019050919050565b5f6020820190508181035f8301526102688161022f565b9050919050565b5f60ff82169050919050565b6102848161026f565b82525050565b5f60208201905061029d5f83018461027b565b92915050565b6080516164356102d05f395f8181610af901528181610d5401528181611bf10152611cce01526164355ff3fe608060405234801561000f575f5ffd5b506004361061025c575f3560e01c806381b9716111610144578063a9059cbb116100c1578063dd62ed3e11610085578063dd62ed3e14610788578063de0e9a3e146107b8578063ea598cb0146107d4578063eb415f45146107f0578063f1127ed8146107fa578063f2fde38b1461082a5761025c565b8063a9059cbb146106e8578063aad41a4114610718578063b8c2559414610734578063c3cda52014610750578063d505accf1461076c5761025c565b806395d89b411161010857806395d89b41146106305780639ab24eb01461064e5780639aec4bae1461067e578063a457c2d71461069c578063a7d1195d146106cc5761025c565b806381b971611461057057806384b0196e146105a05780638da5cb5b146105c45780638e539e8c146105e257806391ddadf4146106125761025c565b80633a46b1a8116101dd5780635c19a95c116101a15780635c19a95c1461048a5780636fcfff45146104a657806370a08231146104d6578063715018a61461050657806378aa33ba146105105780637ecebe00146105405761025c565b80633a46b1a8146103be5780633f4da4c6146103ee5780634bf5d7e91461040c578063539571251461042a578063587cde1e1461045a5761025c565b80631ffacdef116102245780631ffacdef1461030657806323b872dd14610322578063313ce567146103525780633644e51514610370578063395093511461038e5761025c565b80630455e6941461026057806306fdde0314610290578063095ea7b3146102ae5780631249c58b146102de57806318160ddd146102e8575b5f5ffd5b61027a60048036038101906102759190613ec4565b610846565b6040516102879190613f09565b60405180910390f35b610298610864565b6040516102a59190613f92565b60405180910390f35b6102c860048036038101906102c39190613fe5565b6108f4565b6040516102d59190613f09565b60405180910390f35b6102e6610916565b005b6102f0610af6565b6040516102fd9190614032565b60405180910390f35b610320600480360381019061031b9190614075565b610b89565b005b61033c600480360381019061033791906140b3565b610c38565b6040516103499190613f09565b60405180910390f35b61035a610c66565b604051610367919061411e565b60405180910390f35b610378610c6e565b604051610385919061414f565b60405180910390f35b6103a860048036038101906103a39190613fe5565b610c7c565b6040516103b59190613f09565b60405180910390f35b6103d860048036038101906103d39190613fe5565b610cb2565b6040516103e59190614032565b60405180910390f35b6103f6610d52565b60405161040391906141c3565b60405180910390f35b610414610d76565b6040516104219190613f92565b60405180910390f35b610444600480360381019061043f9190613ec4565b610db3565b6040516104519190614032565b60405180910390f35b610474600480360381019061046f9190613ec4565b610dc9565b60405161048191906141eb565b60405180910390f35b6104a4600480360381019061049f9190613ec4565b610e2e565b005b6104c060048036038101906104bb9190613ec4565b610e42565b6040516104cd9190614222565b60405180910390f35b6104f060048036038101906104eb9190613ec4565b610e93565b6040516104fd9190614032565b60405180910390f35b61050e610ed9565b005b61052a60048036038101906105259190613ec4565b610eec565b6040516105379190613f09565b60405180910390f35b61055a60048036038101906105559190613ec4565b610f0a565b6040516105679190614032565b60405180910390f35b61058a60048036038101906105859190613ec4565b610f57565b6040516105979190614032565b60405180910390f35b6105a8610f6d565b6040516105bb979695949392919061432c565b60405180910390f35b6105cc611067565b6040516105d991906141eb565b60405180910390f35b6105fc60048036038101906105f791906143ae565b61108f565b6040516106099190614032565b60405180910390f35b61061a6110f4565b60405161062791906143f9565b60405180910390f35b610638611103565b6040516106459190613f92565b60405180910390f35b61066860048036038101906106639190613ec4565b611193565b6040516106759190614032565b60405180910390f35b610686611291565b6040516106939190614032565b60405180910390f35b6106b660048036038101906106b19190613fe5565b611298565b6040516106c39190613f09565b60405180910390f35b6106e660048036038101906106e19190614612565b61130d565b005b61070260048036038101906106fd9190613fe5565b611799565b60405161070f9190613f09565b60405180910390f35b610732600480360381019061072d9190614778565b6117bb565b005b61074e60048036038101906107499190614075565b611872565b005b61076a6004803603810190610765919061484a565b611921565b005b610786600480360381019061078191906148d3565b611a24565b005b6107a2600480360381019061079d9190614970565b611b63565b6040516107af9190614032565b60405180910390f35b6107d260048036038101906107cd91906143ae565b611be5565b005b6107ee60048036038101906107e991906143ae565b611ccc565b005b6107f8611db5565b005b610814600480360381019061080f91906149d8565b611e58565b6040516108219190614a88565b60405180910390f35b610844600480360381019061083f9190613ec4565b611f61565b005b610133602052805f5260405f205f915054906101000a900460ff1681565b60606068805461087390614ace565b80601f016020809104026020016040519081016040528092919081815260200182805461089f90614ace565b80156108ea5780601f106108c1576101008083540402835291602001916108ea565b820191905f5260205f20905b8154815290600101906020018083116108cd57829003601f168201915b5050505050905090565b5f5f6108fe611fe3565b905061090b818585611fea565b600191505092915050565b5f6101315f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205411610996576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161098d90614b6e565b60405180910390fd5b6101305f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20544211610a16576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a0d90614bfc565b60405180910390fd5b5f6101315f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205490505f6101315f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550610aa533826121ad565b3373ffffffffffffffffffffffffffffffffffffffff167f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d412139688582604051610aeb9190614032565b60405180910390a250565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b60573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b849190614c2e565b905090565b610b9161223b565b806101335f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff167fcf20b1ecb604b0e8888d579c64e8a3b10e590d45c1c2dddb393bed284362227182604051610c2c9190613f09565b60405180910390a25050565b5f5f610c42611fe3565b9050610c4f8582856122b9565b610c5a858585612344565b60019150509392505050565b5f6012905090565b5f610c776125b3565b905090565b5f5f610c86611fe3565b9050610ca7818585610c988589611b63565b610ca29190614c86565b611fea565b600191505092915050565b5f610cbb6110f4565b65ffffffffffff168210610d04576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cfb90614d03565b60405180910390fd5b610d4a60ff5f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20836125c1565b905092915050565b7f000000000000000000000000000000000000000000000000000000000000000081565b60606040518060400160405280600e81526020017f6d6f64653d74696d657374616d70000000000000000000000000000000000000815250905090565b610130602052805f5260405f205f915090505481565b5f60fe5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b610e3f610e39611fe3565b82612701565b50565b5f610e8c60ff5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2080549050612816565b9050919050565b5f60655f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b610ee161223b565b610eea5f612868565b565b610134602052805f5260405f205f915054906101000a900460ff1681565b5f610f5060cb5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2061292b565b9050919050565b610131602052805f5260405f205f915090505481565b5f6060805f5f5f60605f5f1b609754148015610f8c57505f5f1b609854145b610fcb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fc290614d6b565b60405180910390fd5b610fd3612937565b610fdb6129c7565b46305f5f1b5f67ffffffffffffffff811115610ffa57610ff9614416565b5b6040519080825280602002602001820160405280156110285781602001602082028036833780820191505090505b507f0f00000000000000000000000000000000000000000000000000000000000000959493929190965096509650965096509650965090919293949596565b5f60335f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b5f6110986110f4565b65ffffffffffff1682106110e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110d890614d03565b60405180910390fd5b6110ed610100836125c1565b9050919050565b5f6110fe42612a57565b905090565b60606069805461111290614ace565b80601f016020809104026020016040519081016040528092919081815260200182805461113e90614ace565b80156111895780601f1061116057610100808354040283529160200191611189565b820191905f5260205f20905b81548152906001019060200180831161116c57829003601f168201915b5050505050905090565b5f5f60ff5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f208054905090505f81146112695760ff5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20600182038154811061123157611230614d89565b5b905f5260205f20015f0160049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1661126b565b5f5b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16915050919050565b6101325481565b5f5f6112a2611fe3565b90505f6112af8286611b63565b9050838110156112f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112eb90614e26565b60405180910390fd5b6113018286868403611fea565b60019250505092915050565b5f5f60019054906101000a900460ff1615905080801561133d575060015f5f9054906101000a900460ff1660ff16105b8061136a575061134c30612aab565b158015611369575060015f5f9054906101000a900460ff1660ff16145b5b6113a9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113a090614eb4565b60405180910390fd5b60015f5f6101000a81548160ff021916908360ff16021790555080156113e45760015f60016101000a81548160ff0219169083151502179055505b6113ec612acd565b6114606040518060400160405280600581526020017f456967656e0000000000000000000000000000000000000000000000000000008152506040518060400160405280600581526020017f454947454e000000000000000000000000000000000000000000000000000000815250612b25565b61146985612868565b6114a76040518060400160405280600581526020017f454947454e000000000000000000000000000000000000000000000000000000815250612b81565b82518451146114eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114e290614f68565b60405180910390fd5b815184511461152f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115269061501c565b60405180910390fd5b5f5f90505b8451811015611711578381815181106115505761154f614d89565b5b60200260200101516101315f87848151811061156f5761156e614d89565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508281815181106115c7576115c6614d89565b5b60200260200101516101305f8784815181106115e6576115e5614d89565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f208190555060016101335f87848151811061164457611643614d89565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508481815181106116ae576116ad614d89565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff167fcf20b1ecb604b0e8888d579c64e8a3b10e590d45c1c2dddb393bed284362227160016040516116fc9190613f09565b60405180910390a28080600101915050611534565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff610132819055508015611792575f5f60016101000a81548160ff0219169083151502179055507f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb384740249860016040516117899190615073565b60405180910390a15b5050505050565b5f5f6117a3611fe3565b90506117b0818585612344565b600191505092915050565b818190508484905014611803576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117fa906150fc565b60405180910390fd5b5f5f90505b8484905081101561186b5761185e3386868481811061182a57611829614d89565b5b905060200201602081019061183f9190613ec4565b85858581811061185257611851614d89565b5b90506020020135612344565b8080600101915050611808565b5050505050565b61187a61223b565b806101345f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff167f72a561d1af7409467dae4f1e9fc52590a9335a1dda17727e2b6aa8c4db35109b826040516119159190613f09565b60405180910390a25050565b83421115611964576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161195b90615164565b60405180910390fd5b5f6119c56119bd7fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf8989896040516020016119a29493929190615182565b60405160208183030381529060405280519060200120612c11565b858585612c2a565b90506119d081612c53565b8614611a11576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a089061520f565b60405180910390fd5b611a1b8188612701565b50505050505050565b83421115611a67576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a5e90615277565b60405180910390fd5b5f7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9888888611a958c612c53565b89604051602001611aab96959493929190615295565b6040516020818303038152906040528051906020012090505f611acd82612c11565b90505f611adc82878787612c2a565b90508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611b4c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b439061533e565b60405180910390fd5b611b578a8a8a611fea565b50505050505050505050565b5f60665f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905092915050565b611bef3382612cae565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff1660e01b8152600401611c4a92919061535c565b6020604051808303815f875af1158015611c66573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611c8a9190615397565b611cc9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cc090615432565b60405180910390fd5b50565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166323b872dd3330846040518463ffffffff1660e01b8152600401611d2993929190615450565b6020604051808303815f875af1158015611d45573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611d699190615397565b611da8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d9f906154f5565b60405180910390fd5b611db233826121ad565b50565b611dbd61223b565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6101325414611e22576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e19906155a9565b60405180910390fd5b5f610132819055507f2b18986d3ba809db2f13a5d7bf17f60d357b37d9cbb55dd71cbbac8dc4060f6460405160405180910390a1565b611e60613e1d565b60ff5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f208263ffffffff1681548110611eb557611eb4614d89565b5b905f5260205f20016040518060400160405290815f82015f9054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020015f820160049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1681525050905092915050565b611f6961223b565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611fd7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fce90615637565b60405180910390fd5b611fe081612868565b50565b5f33905090565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612058576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161204f906156c5565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036120c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120bd90615753565b60405180910390fd5b8060665f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516121a09190614032565b60405180910390a3505050565b6121b78282612ccd565b6121bf612e1c565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff166121e5610af6565b1115612226576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161221d906157e1565b60405180910390fd5b612235610100612e3f83612e54565b50505050565b612243611fe3565b73ffffffffffffffffffffffffffffffffffffffff16612261611067565b73ffffffffffffffffffffffffffffffffffffffff16146122b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122ae90615849565b60405180910390fd5b565b5f6122c48484611b63565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811461233e5781811015612330576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612327906158b1565b60405180910390fd5b61233d8484848403611fea565b5b50505050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036123b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123a99061593f565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612420576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612417906159cd565b60405180910390fd5b61242b83838361311d565b5f60655f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050818110156124af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124a690615a5b565b60405180910390fd5b81810360655f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508160655f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161259a9190614032565b60405180910390a36125ad848484613280565b50505050565b5f6125bc6132ab565b905090565b5f5f838054905090505f5f90505f8290506005831115612635575f6125e58461330e565b846125f09190615a79565b9050856125fd8883613404565b5f015f9054906101000a900463ffffffff1663ffffffff16111561262357809150612633565b6001816126309190614c86565b92505b505b5b80821015612692575f6126498383613416565b9050856126568883613404565b5f015f9054906101000a900463ffffffff1663ffffffff16111561267c5780915061268c565b6001816126899190614c86565b92505b50612636565b5f81146126d6576126a68660018303613404565b5f0160049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff166126d8565b5f5b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16935050505092915050565b5f61270b83610dc9565b90505f61271784610e93565b90508260fe5f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f60405160405180910390a461281082848361343b565b50505050565b5f63ffffffff8016821115612860576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161285790615b1c565b60405180910390fd5b819050919050565b5f60335f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160335f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f815f01549050919050565b60606099805461294690614ace565b80601f016020809104026020016040519081016040528092919081815260200182805461297290614ace565b80156129bd5780601f10612994576101008083540402835291602001916129bd565b820191905f5260205f20905b8154815290600101906020018083116129a057829003601f168201915b5050505050905090565b6060609a80546129d690614ace565b80601f0160208091040260200160405190810160405280929190818152602001828054612a0290614ace565b8015612a4d5780601f10612a2457610100808354040283529160200191612a4d565b820191905f5260205f20905b815481529060010190602001808311612a3057829003601f168201915b5050505050905090565b5f65ffffffffffff8016821115612aa3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a9a90615baa565b60405180910390fd5b819050919050565b5f5f8273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b5f60019054906101000a900460ff16612b1b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b1290615c38565b60405180910390fd5b612b2361362b565b565b5f60019054906101000a900460ff16612b73576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b6a90615c38565b60405180910390fd5b612b7d828261368b565b5050565b5f60019054906101000a900460ff16612bcf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bc690615c38565b60405180910390fd5b612c0e816040518060400160405280600181526020017f31000000000000000000000000000000000000000000000000000000000000008152506136fd565b50565b5f612c23612c1d6125b3565b83613781565b9050919050565b5f5f5f612c39878787876137c1565b91509150612c4681613899565b8192505050949350505050565b5f5f60cb5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f209050612c9d8161292b565b9150612ca8816139fe565b50919050565b612cb88282613a12565b612cc7610100613bd783612e54565b50505050565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612d3b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d3290615ca0565b60405180910390fd5b612d465f838361311d565b8060675f828254612d579190614c86565b925050819055508060655f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055508173ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051612e059190614032565b60405180910390a3612e185f8383613280565b5050565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff905090565b5f8183612e4c9190614c86565b905092915050565b5f5f5f858054905090505f5f8214612f1457612e738760018403613404565b6040518060400160405290815f82015f9054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020015f820160049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1681525050612f4e565b60405180604001604052805f63ffffffff1681526020015f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff168152505b905080602001517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff169350612f8384868863ffffffff16565b92505f82118015612fab5750612f976110f4565b65ffffffffffff16815f015163ffffffff16145b1561301b57612fb983613bec565b612fc68860018503613404565b5f0160046101000a8154817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff02191690837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff160217905550613113565b86604051806040016040528061303f6130326110f4565b65ffffffffffff16612816565b63ffffffff16815260200161305386613bec565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16815250908060018154018082558091505060019003905f5260205f20015f909190919091505f820151815f015f6101000a81548163ffffffff021916908363ffffffff1602179055506020820151815f0160046101000a8154817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff02191690837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16021790555050505b5050935093915050565b610132544211613270575f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16148061318c57505f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b806131de57506101335f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff165b8061323057506101345f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff165b61326f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161326690615d2e565b60405180910390fd5b5b61327b838383613c56565b505050565b61328b838383613c5b565b6132a661329784610dc9565b6132a084610dc9565b8361343b565b505050565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f6132d5613c60565b6132dd613cc7565b46306040516020016132f3959493929190615d4c565b60405160208183030381529060405280519060200120905090565b5f5f820361331e575f90506133ff565b5f600161332a84613d2e565b901c6001901b9050600181848161334457613343615d9d565b5b048201901c9050600181848161335d5761335c615d9d565b5b048201901c9050600181848161337657613375615d9d565b5b048201901c9050600181848161338f5761338e615d9d565b5b048201901c905060018184816133a8576133a7615d9d565b5b048201901c905060018184816133c1576133c0615d9d565b5b048201901c905060018184816133da576133d9615d9d565b5b048201901c90506133fb818285816133f5576133f4615d9d565b5b04613e05565b9150505b919050565b5f825f528160205f2001905092915050565b5f60028284186134269190615dca565b8284166134339190614c86565b905092915050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415801561347657505f81115b15613626575f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614613550575f5f6134f960ff5f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20613bd785612e54565b915091508473ffffffffffffffffffffffffffffffffffffffff167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a7248383604051613545929190615dfa565b60405180910390a250505b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614613625575f5f6135ce60ff5f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20612e3f85612e54565b915091508373ffffffffffffffffffffffffffffffffffffffff167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a724838360405161361a929190615dfa565b60405180910390a250505b5b505050565b5f60019054906101000a900460ff16613679576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161367090615c38565b60405180910390fd5b613689613684611fe3565b612868565b565b5f60019054906101000a900460ff166136d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016136d090615c38565b60405180910390fd5b81606890816136e89190615fb8565b5080606990816136f89190615fb8565b505050565b5f60019054906101000a900460ff1661374b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161374290615c38565b60405180910390fd5b816099908161375a9190615fb8565b5080609a908161376a9190615fb8565b505f5f1b6097819055505f5f1b6098819055505050565b5f6040517f190100000000000000000000000000000000000000000000000000000000000081528360028201528260228201526042812091505092915050565b5f5f7f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0835f1c11156137f9575f600391509150613890565b5f6001878787876040515f815260200160405260405161381c9493929190616087565b6020604051602081039080840390855afa15801561383c573d5f5f3e3d5ffd5b5050506020604051035190505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603613888575f60019250925050613890565b805f92509250505b94509492505050565b5f60048111156138ac576138ab6160ca565b5b8160048111156138bf576138be6160ca565b5b03156139fb57600160048111156138d9576138d86160ca565b5b8160048111156138ec576138eb6160ca565b5b0361392c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161392390616141565b60405180910390fd5b600260048111156139405761393f6160ca565b5b816004811115613953576139526160ca565b5b03613993576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161398a906161a9565b60405180910390fd5b600360048111156139a7576139a66160ca565b5b8160048111156139ba576139b96160ca565b5b036139fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016139f190616237565b60405180910390fd5b5b50565b6001815f015f828254019250508190555050565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603613a80576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613a77906162c5565b60405180910390fd5b613a8b825f8361311d565b5f60655f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905081811015613b0f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613b0690616353565b60405180910390fd5b81810360655f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508160675f82825403925050819055505f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051613bbf9190614032565b60405180910390a3613bd2835f84613280565b505050565b5f8183613be49190615a79565b905092915050565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8016821115613c4e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613c45906163e1565b60405180910390fd5b819050919050565b505050565b505050565b5f5f613c6a612937565b90505f81511115613c85578080519060200120915050613cc4565b5f60975490505f5f1b8114613c9e578092505050613cc4565b7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470925050505b90565b5f5f613cd16129c7565b90505f81511115613cec578080519060200120915050613d2b565b5f60985490505f5f1b8114613d05578092505050613d2b565b7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470925050505b90565b5f5f5f90505f608084901c1115613d4d57608083901c92506080810190505b5f604084901c1115613d6757604083901c92506040810190505b5f602084901c1115613d8157602083901c92506020810190505b5f601084901c1115613d9b57601083901c92506010810190505b5f600884901c1115613db557600883901c92506008810190505b5f600484901c1115613dcf57600483901c92506004810190505b5f600284901c1115613de957600283901c92506002810190505b5f600184901c1115613dfc576001810190505b80915050919050565b5f818310613e135781613e15565b825b905092915050565b60405180604001604052805f63ffffffff1681526020015f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1681525090565b5f604051905090565b5f5ffd5b5f5ffd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f613e9382613e6a565b9050919050565b613ea381613e89565b8114613ead575f5ffd5b50565b5f81359050613ebe81613e9a565b92915050565b5f60208284031215613ed957613ed8613e62565b5b5f613ee684828501613eb0565b91505092915050565b5f8115159050919050565b613f0381613eef565b82525050565b5f602082019050613f1c5f830184613efa565b92915050565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f601f19601f8301169050919050565b5f613f6482613f22565b613f6e8185613f2c565b9350613f7e818560208601613f3c565b613f8781613f4a565b840191505092915050565b5f6020820190508181035f830152613faa8184613f5a565b905092915050565b5f819050919050565b613fc481613fb2565b8114613fce575f5ffd5b50565b5f81359050613fdf81613fbb565b92915050565b5f5f60408385031215613ffb57613ffa613e62565b5b5f61400885828601613eb0565b925050602061401985828601613fd1565b9150509250929050565b61402c81613fb2565b82525050565b5f6020820190506140455f830184614023565b92915050565b61405481613eef565b811461405e575f5ffd5b50565b5f8135905061406f8161404b565b92915050565b5f5f6040838503121561408b5761408a613e62565b5b5f61409885828601613eb0565b92505060206140a985828601614061565b9150509250929050565b5f5f5f606084860312156140ca576140c9613e62565b5b5f6140d786828701613eb0565b93505060206140e886828701613eb0565b92505060406140f986828701613fd1565b9150509250925092565b5f60ff82169050919050565b61411881614103565b82525050565b5f6020820190506141315f83018461410f565b92915050565b5f819050919050565b61414981614137565b82525050565b5f6020820190506141625f830184614140565b92915050565b5f819050919050565b5f61418b61418661418184613e6a565b614168565b613e6a565b9050919050565b5f61419c82614171565b9050919050565b5f6141ad82614192565b9050919050565b6141bd816141a3565b82525050565b5f6020820190506141d65f8301846141b4565b92915050565b6141e581613e89565b82525050565b5f6020820190506141fe5f8301846141dc565b92915050565b5f63ffffffff82169050919050565b61421c81614204565b82525050565b5f6020820190506142355f830184614213565b92915050565b5f7fff0000000000000000000000000000000000000000000000000000000000000082169050919050565b61426f8161423b565b82525050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b6142a781613fb2565b82525050565b5f6142b8838361429e565b60208301905092915050565b5f602082019050919050565b5f6142da82614275565b6142e4818561427f565b93506142ef8361428f565b805f5b8381101561431f57815161430688826142ad565b9750614311836142c4565b9250506001810190506142f2565b5085935050505092915050565b5f60e08201905061433f5f83018a614266565b81810360208301526143518189613f5a565b905081810360408301526143658188613f5a565b90506143746060830187614023565b61438160808301866141dc565b61438e60a0830185614140565b81810360c08301526143a081846142d0565b905098975050505050505050565b5f602082840312156143c3576143c2613e62565b5b5f6143d084828501613fd1565b91505092915050565b5f65ffffffffffff82169050919050565b6143f3816143d9565b82525050565b5f60208201905061440c5f8301846143ea565b92915050565b5f5ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b61444c82613f4a565b810181811067ffffffffffffffff8211171561446b5761446a614416565b5b80604052505050565b5f61447d613e59565b90506144898282614443565b919050565b5f67ffffffffffffffff8211156144a8576144a7614416565b5b602082029050602081019050919050565b5f5ffd5b5f6144cf6144ca8461448e565b614474565b905080838252602082019050602084028301858111156144f2576144f16144b9565b5b835b8181101561451b57806145078882613eb0565b8452602084019350506020810190506144f4565b5050509392505050565b5f82601f83011261453957614538614412565b5b81356145498482602086016144bd565b91505092915050565b5f67ffffffffffffffff82111561456c5761456b614416565b5b602082029050602081019050919050565b5f61458f61458a84614552565b614474565b905080838252602082019050602084028301858111156145b2576145b16144b9565b5b835b818110156145db57806145c78882613fd1565b8452602084019350506020810190506145b4565b5050509392505050565b5f82601f8301126145f9576145f8614412565b5b813561460984826020860161457d565b91505092915050565b5f5f5f5f6080858703121561462a57614629613e62565b5b5f61463787828801613eb0565b945050602085013567ffffffffffffffff81111561465857614657613e66565b5b61466487828801614525565b935050604085013567ffffffffffffffff81111561468557614684613e66565b5b614691878288016145e5565b925050606085013567ffffffffffffffff8111156146b2576146b1613e66565b5b6146be878288016145e5565b91505092959194509250565b5f5ffd5b5f5f83601f8401126146e3576146e2614412565b5b8235905067ffffffffffffffff811115614700576146ff6146ca565b5b60208301915083602082028301111561471c5761471b6144b9565b5b9250929050565b5f5f83601f84011261473857614737614412565b5b8235905067ffffffffffffffff811115614755576147546146ca565b5b602083019150836020820283011115614771576147706144b9565b5b9250929050565b5f5f5f5f604085870312156147905761478f613e62565b5b5f85013567ffffffffffffffff8111156147ad576147ac613e66565b5b6147b9878288016146ce565b9450945050602085013567ffffffffffffffff8111156147dc576147db613e66565b5b6147e887828801614723565b925092505092959194509250565b6147ff81614103565b8114614809575f5ffd5b50565b5f8135905061481a816147f6565b92915050565b61482981614137565b8114614833575f5ffd5b50565b5f8135905061484481614820565b92915050565b5f5f5f5f5f5f60c0878903121561486457614863613e62565b5b5f61487189828a01613eb0565b965050602061488289828a01613fd1565b955050604061489389828a01613fd1565b94505060606148a489828a0161480c565b93505060806148b589828a01614836565b92505060a06148c689828a01614836565b9150509295509295509295565b5f5f5f5f5f5f5f60e0888a0312156148ee576148ed613e62565b5b5f6148fb8a828b01613eb0565b975050602061490c8a828b01613eb0565b965050604061491d8a828b01613fd1565b955050606061492e8a828b01613fd1565b945050608061493f8a828b0161480c565b93505060a06149508a828b01614836565b92505060c06149618a828b01614836565b91505092959891949750929550565b5f5f6040838503121561498657614985613e62565b5b5f61499385828601613eb0565b92505060206149a485828601613eb0565b9150509250929050565b6149b781614204565b81146149c1575f5ffd5b50565b5f813590506149d2816149ae565b92915050565b5f5f604083850312156149ee576149ed613e62565b5b5f6149fb85828601613eb0565b9250506020614a0c858286016149c4565b9150509250929050565b614a1f81614204565b82525050565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff82169050919050565b614a5581614a25565b82525050565b604082015f820151614a6f5f850182614a16565b506020820151614a826020850182614a4c565b50505050565b5f604082019050614a9b5f830184614a5b565b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f6002820490506001821680614ae557607f821691505b602082108103614af857614af7614aa1565b5b50919050565b7f456967656e2e6d696e743a206d73672e73656e64657220686173206e6f206d695f8201527f6e74696e6720616c6c6f77616e63650000000000000000000000000000000000602082015250565b5f614b58602f83613f2c565b9150614b6382614afe565b604082019050919050565b5f6020820190508181035f830152614b8581614b4c565b9050919050565b7f456967656e2e6d696e743a206d73672e73656e646572206973206e6f7420616c5f8201527f6c6f77656420746f206d696e7420796574000000000000000000000000000000602082015250565b5f614be6603183613f2c565b9150614bf182614b8c565b604082019050919050565b5f6020820190508181035f830152614c1381614bda565b9050919050565b5f81519050614c2881613fbb565b92915050565b5f60208284031215614c4357614c42613e62565b5b5f614c5084828501614c1a565b91505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f614c9082613fb2565b9150614c9b83613fb2565b9250828201905080821115614cb357614cb2614c59565b5b92915050565b7f4552433230566f7465733a20667574757265206c6f6f6b7570000000000000005f82015250565b5f614ced601983613f2c565b9150614cf882614cb9565b602082019050919050565b5f6020820190508181035f830152614d1a81614ce1565b9050919050565b7f4549503731323a20556e696e697469616c697a656400000000000000000000005f82015250565b5f614d55601583613f2c565b9150614d6082614d21565b602082019050919050565b5f6020820190508181035f830152614d8281614d49565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f775f8201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b5f614e10602583613f2c565b9150614e1b82614db6565b604082019050919050565b5f6020820190508181035f830152614e3d81614e04565b9050919050565b7f496e697469616c697a61626c653a20636f6e747261637420697320616c7265615f8201527f647920696e697469616c697a6564000000000000000000000000000000000000602082015250565b5f614e9e602e83613f2c565b9150614ea982614e44565b604082019050919050565b5f6020820190508181035f830152614ecb81614e92565b9050919050565b7f456967656e2e696e697469616c697a653a206d696e7465727320616e64206d695f8201527f6e74696e67416c6c6f77616e636573206d757374206265207468652073616d6560208201527f206c656e67746800000000000000000000000000000000000000000000000000604082015250565b5f614f52604783613f2c565b9150614f5d82614ed2565b606082019050919050565b5f6020820190508181035f830152614f7f81614f46565b9050919050565b7f456967656e2e696e697469616c697a653a206d696e7465727320616e64206d695f8201527f6e74416c6c6f776564416674657273206d757374206265207468652073616d6560208201527f206c656e67746800000000000000000000000000000000000000000000000000604082015250565b5f615006604783613f2c565b915061501182614f86565b606082019050919050565b5f6020820190508181035f83015261503381614ffa565b9050919050565b5f819050919050565b5f61505d6150586150538461503a565b614168565b614103565b9050919050565b61506d81615043565b82525050565b5f6020820190506150865f830184615064565b92915050565b7f456967656e2e6d756c746973656e643a2072656365697665727320616e6420615f8201527f6d6f756e7473206d757374206265207468652073616d65206c656e6774680000602082015250565b5f6150e6603e83613f2c565b91506150f18261508c565b604082019050919050565b5f6020820190508181035f830152615113816150da565b9050919050565b7f4552433230566f7465733a207369676e617475726520657870697265640000005f82015250565b5f61514e601d83613f2c565b91506151598261511a565b602082019050919050565b5f6020820190508181035f83015261517b81615142565b9050919050565b5f6080820190506151955f830187614140565b6151a260208301866141dc565b6151af6040830185614023565b6151bc6060830184614023565b95945050505050565b7f4552433230566f7465733a20696e76616c6964206e6f6e6365000000000000005f82015250565b5f6151f9601983613f2c565b9150615204826151c5565b602082019050919050565b5f6020820190508181035f830152615226816151ed565b9050919050565b7f45524332305065726d69743a206578706972656420646561646c696e650000005f82015250565b5f615261601d83613f2c565b915061526c8261522d565b602082019050919050565b5f6020820190508181035f83015261528e81615255565b9050919050565b5f60c0820190506152a85f830189614140565b6152b560208301886141dc565b6152c260408301876141dc565b6152cf6060830186614023565b6152dc6080830185614023565b6152e960a0830184614023565b979650505050505050565b7f45524332305065726d69743a20696e76616c6964207369676e617475726500005f82015250565b5f615328601e83613f2c565b9150615333826152f4565b602082019050919050565b5f6020820190508181035f8301526153558161531c565b9050919050565b5f60408201905061536f5f8301856141dc565b61537c6020830184614023565b9392505050565b5f815190506153918161404b565b92915050565b5f602082840312156153ac576153ab613e62565b5b5f6153b984828501615383565b91505092915050565b7f456967656e2e756e777261703a2062454947454e207472616e736665722066615f8201527f696c656400000000000000000000000000000000000000000000000000000000602082015250565b5f61541c602483613f2c565b9150615427826153c2565b604082019050919050565b5f6020820190508181035f83015261544981615410565b9050919050565b5f6060820190506154635f8301866141dc565b61547060208301856141dc565b61547d6040830184614023565b949350505050565b7f456967656e2e777261703a2062454947454e207472616e73666572206661696c5f8201527f6564000000000000000000000000000000000000000000000000000000000000602082015250565b5f6154df602283613f2c565b91506154ea82615485565b604082019050919050565b5f6020820190508181035f83015261550c816154d3565b9050919050565b7f456967656e2e64697361626c655472616e736665725265737472696374696f6e5f8201527f733a207472616e73666572207265737472696374696f6e732061726520616c7260208201527f656164792064697361626c656400000000000000000000000000000000000000604082015250565b5f615593604d83613f2c565b915061559e82615513565b606082019050919050565b5f6020820190508181035f8301526155c081615587565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f20615f8201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b5f615621602683613f2c565b915061562c826155c7565b604082019050919050565b5f6020820190508181035f83015261564e81615615565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f206164645f8201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b5f6156af602483613f2c565b91506156ba82615655565b604082019050919050565b5f6020820190508181035f8301526156dc816156a3565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f2061646472655f8201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b5f61573d602283613f2c565b9150615748826156e3565b604082019050919050565b5f6020820190508181035f83015261576a81615731565b9050919050565b7f4552433230566f7465733a20746f74616c20737570706c79207269736b73206f5f8201527f766572666c6f77696e6720766f74657300000000000000000000000000000000602082015250565b5f6157cb603083613f2c565b91506157d682615771565b604082019050919050565b5f6020820190508181035f8301526157f8816157bf565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65725f82015250565b5f615833602083613f2c565b915061583e826157ff565b602082019050919050565b5f6020820190508181035f83015261586081615827565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000005f82015250565b5f61589b601d83613f2c565b91506158a682615867565b602082019050919050565b5f6020820190508181035f8301526158c88161588f565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f2061645f8201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b5f615929602583613f2c565b9150615934826158cf565b604082019050919050565b5f6020820190508181035f8301526159568161591d565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f20616464725f8201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b5f6159b7602383613f2c565b91506159c28261595d565b604082019050919050565b5f6020820190508181035f8301526159e4816159ab565b9050919050565b7f45524332303a207472616e7366657220616d6f756e74206578636565647320625f8201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b5f615a45602683613f2c565b9150615a50826159eb565b604082019050919050565b5f6020820190508181035f830152615a7281615a39565b9050919050565b5f615a8382613fb2565b9150615a8e83613fb2565b9250828203905081811115615aa657615aa5614c59565b5b92915050565b7f53616665436173743a2076616c756520646f65736e27742066697420696e20335f8201527f3220626974730000000000000000000000000000000000000000000000000000602082015250565b5f615b06602683613f2c565b9150615b1182615aac565b604082019050919050565b5f6020820190508181035f830152615b3381615afa565b9050919050565b7f53616665436173743a2076616c756520646f65736e27742066697420696e20345f8201527f3820626974730000000000000000000000000000000000000000000000000000602082015250565b5f615b94602683613f2c565b9150615b9f82615b3a565b604082019050919050565b5f6020820190508181035f830152615bc181615b88565b9050919050565b7f496e697469616c697a61626c653a20636f6e7472616374206973206e6f7420695f8201527f6e697469616c697a696e67000000000000000000000000000000000000000000602082015250565b5f615c22602b83613f2c565b9150615c2d82615bc8565b604082019050919050565b5f6020820190508181035f830152615c4f81615c16565b9050919050565b7f45524332303a206d696e7420746f20746865207a65726f2061646472657373005f82015250565b5f615c8a601f83613f2c565b9150615c9582615c56565b602082019050919050565b5f6020820190508181035f830152615cb781615c7e565b9050919050565b7f456967656e2e5f6265666f7265546f6b656e5472616e736665723a2066726f6d5f8201527f206f7220746f206d7573742062652077686974656c6973746564000000000000602082015250565b5f615d18603a83613f2c565b9150615d2382615cbe565b604082019050919050565b5f6020820190508181035f830152615d4581615d0c565b9050919050565b5f60a082019050615d5f5f830188614140565b615d6c6020830187614140565b615d796040830186614140565b615d866060830185614023565b615d9360808301846141dc565b9695505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f615dd482613fb2565b9150615ddf83613fb2565b925082615def57615dee615d9d565b5b828204905092915050565b5f604082019050615e0d5f830185614023565b615e1a6020830184614023565b9392505050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f60088302615e7d7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82615e42565b615e878683615e42565b95508019841693508086168417925050509392505050565b5f615eb9615eb4615eaf84613fb2565b614168565b613fb2565b9050919050565b5f819050919050565b615ed283615e9f565b615ee6615ede82615ec0565b848454615e4e565b825550505050565b5f5f905090565b615efd615eee565b615f08818484615ec9565b505050565b5b81811015615f2b57615f205f82615ef5565b600181019050615f0e565b5050565b601f821115615f7057615f4181615e21565b615f4a84615e33565b81016020851015615f59578190505b615f6d615f6585615e33565b830182615f0d565b50505b505050565b5f82821c905092915050565b5f615f905f1984600802615f75565b1980831691505092915050565b5f615fa88383615f81565b9150826002028217905092915050565b615fc182613f22565b67ffffffffffffffff811115615fda57615fd9614416565b5b615fe48254614ace565b615fef828285615f2f565b5f60209050601f831160018114616020575f841561600e578287015190505b6160188582615f9d565b86555061607f565b601f19841661602e86615e21565b5f5b8281101561605557848901518255600182019150602085019450602081019050616030565b86831015616072578489015161606e601f891682615f81565b8355505b6001600288020188555050505b505050505050565b5f60808201905061609a5f830187614140565b6160a7602083018661410f565b6160b46040830185614140565b6160c16060830184614140565b95945050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b7f45434453413a20696e76616c6964207369676e617475726500000000000000005f82015250565b5f61612b601883613f2c565b9150616136826160f7565b602082019050919050565b5f6020820190508181035f8301526161588161611f565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265206c656e677468005f82015250565b5f616193601f83613f2c565b915061619e8261615f565b602082019050919050565b5f6020820190508181035f8301526161c081616187565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c5f8201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b5f616221602283613f2c565b915061622c826161c7565b604082019050919050565b5f6020820190508181035f83015261624e81616215565b9050919050565b7f45524332303a206275726e2066726f6d20746865207a65726f206164647265735f8201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b5f6162af602183613f2c565b91506162ba82616255565b604082019050919050565b5f6020820190508181035f8301526162dc816162a3565b9050919050565b7f45524332303a206275726e20616d6f756e7420657863656564732062616c616e5f8201527f6365000000000000000000000000000000000000000000000000000000000000602082015250565b5f61633d602283613f2c565b9150616348826162e3565b604082019050919050565b5f6020820190508181035f83015261636a81616331565b9050919050565b7f53616665436173743a2076616c756520646f65736e27742066697420696e20325f8201527f3234206269747300000000000000000000000000000000000000000000000000602082015250565b5f6163cb602783613f2c565b91506163d682616371565b604082019050919050565b5f6020820190508181035f8301526163f8816163bf565b905091905056fea26469706673582212201ddb49dc1629c21a42d3991e171afbf28993260ae23b5f726f7391ccccb6b5d364736f6c634300081b0033", + Bin: "0x60a060405234801561000f575f5ffd5b5060405161352938038061352983398101604081905261002e91610105565b6001600160a01b038116608052610043610049565b50610132565b5f54610100900460ff16156100b45760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff90811614610103575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b5f60208284031215610115575f5ffd5b81516001600160a01b038116811461012b575f5ffd5b9392505050565b6080516133ca61015f5f395f81816103410152818161083e0152818161149e015261158a01526133ca5ff3fe608060405234801561000f575f5ffd5b5060043610610255575f3560e01c806381b9716111610140578063a9059cbb116100bf578063dd62ed3e11610084578063dd62ed3e146105b9578063de0e9a3e146105cc578063ea598cb0146105df578063eb415f45146105f2578063f1127ed8146105fa578063f2fde38b14610637575f5ffd5b8063a9059cbb1461055a578063aad41a411461056d578063b8c2559414610580578063c3cda52014610593578063d505accf146105a6575f5ffd5b806395d89b411161010557806395d89b411461050f5780639ab24eb0146105175780639aec4bae1461052a578063a457c2d714610534578063a7d1195d14610547575f5ffd5b806381b971611461049157806384b0196e146104b15780638da5cb5b146104cc5780638e539e8c146104dd57806391ddadf4146104f0575f5ffd5b80633a46b1a8116101d75780635c19a95c1161019c5780635c19a95c146103f05780636fcfff451461040357806370a082311461042b578063715018a61461045357806378aa33ba1461045b5780637ecebe001461047e575f5ffd5b80633a46b1a8146103295780633f4da4c61461033c5780634bf5d7e91461037b57806353957125146103a5578063587cde1e146103c5575f5ffd5b80631ffacdef1161021d5780631ffacdef146102d957806323b872dd146102ec578063313ce567146102ff5780633644e5151461030e5780633950935114610316575f5ffd5b80630455e6941461025957806306fdde0314610291578063095ea7b3146102a65780631249c58b146102b957806318160ddd146102c3575b5f5ffd5b61027c610267366004612c01565b6101336020525f908152604090205460ff1681565b60405190151581526020015b60405180910390f35b61029961064a565b6040516102889190612c48565b61027c6102b4366004612c5a565b6106da565b6102c16106f3565b005b6102cb61083b565b604051908152602001610288565b6102c16102e7366004612c8f565b6108c1565b61027c6102fa366004612cc4565b610929565b60405160128152602001610288565b6102cb61094c565b61027c610324366004612c5a565b610955565b6102cb610337366004612c5a565b610976565b6103637f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610288565b60408051808201909152600e81526d06d6f64653d74696d657374616d760941b6020820152610299565b6102cb6103b3366004612c01565b6101306020525f908152604090205481565b6103636103d3366004612c01565b6001600160a01b039081165f90815260fe60205260409020541690565b6102c16103fe366004612c01565b6109f9565b610416610411366004612c01565b610a06565b60405163ffffffff9091168152602001610288565b6102cb610439366004612c01565b6001600160a01b03165f9081526065602052604090205490565b6102c1610a27565b61027c610469366004612c01565b6101346020525f908152604090205460ff1681565b6102cb61048c366004612c01565b610a3a565b6102cb61049f366004612c01565b6101316020525f908152604090205481565b6104b9610a57565b6040516102889796959493929190612cfe565b6033546001600160a01b0316610363565b6102cb6104eb366004612d94565b610af0565b6104f8610b57565b60405165ffffffffffff9091168152602001610288565b610299610b61565b6102cb610525366004612c01565b610b70565b6102cb6101325481565b61027c610542366004612c5a565b610bed565b6102c1610555366004612e73565b610c67565b61027c610568366004612c5a565b61107b565b6102c161057b366004612fb8565b611088565b6102c161058e366004612c8f565b611158565b6102c16105a1366004613034565b6111b8565b6102c16105b4366004613088565b6112ed565b6102cb6105c73660046130ee565b61144e565b6102c16105da366004612d94565b611478565b6102c16105ed366004612d94565b611568565b6102c161165d565b61060d61060836600461311f565b611724565b60408051825163ffffffff1681526020928301516001600160e01b03169281019290925201610288565b6102c1610645366004612c01565b6117a5565b60606068805461065990613151565b80601f016020809104026020016040519081016040528092919081815260200182805461068590613151565b80156106d05780601f106106a7576101008083540402835291602001916106d0565b820191905f5260205f20905b8154815290600101906020018083116106b357829003601f168201915b5050505050905090565b5f336106e781858561181b565b60019150505b92915050565b335f908152610131602052604090205461076c5760405162461bcd60e51b815260206004820152602f60248201527f456967656e2e6d696e743a206d73672e73656e64657220686173206e6f206d6960448201526e6e74696e6720616c6c6f77616e636560881b60648201526084015b60405180910390fd5b335f908152610130602052604090205442116107e45760405162461bcd60e51b815260206004820152603160248201527f456967656e2e6d696e743a206d73672e73656e646572206973206e6f7420616c6044820152701b1bddd959081d1bc81b5a5b9d081e595d607a1b6064820152608401610763565b335f81815261013160205260408120805491905590610803908261193e565b60405181815233907f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d41213968859060200160405180910390a250565b5f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610898573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108bc9190613183565b905090565b6108c96119d4565b6001600160a01b0382165f8181526101336020908152604091829020805460ff191685151590811790915591519182527fcf20b1ecb604b0e8888d579c64e8a3b10e590d45c1c2dddb393bed284362227191015b60405180910390a25050565b5f33610936858285611a2e565b610941858585611aa0565b506001949350505050565b5f6108bc611c5a565b5f336106e7818585610967838361144e565b61097191906131ae565b61181b565b5f61097f610b57565b65ffffffffffff1682106109d15760405162461bcd60e51b815260206004820152601960248201527804552433230566f7465733a20667574757265206c6f6f6b757603c1b6044820152606401610763565b6001600160a01b0383165f90815260ff602052604090206109f29083611c63565b9392505050565b610a033382611d44565b50565b6001600160a01b0381165f90815260ff60205260408120546106ed90611dbd565b610a2f6119d4565b610a385f611e25565b565b6001600160a01b0381165f90815260cb60205260408120546106ed565b5f6060805f5f5f60606097545f5f1b148015610a735750609854155b610ab75760405162461bcd60e51b81526020600482015260156024820152741152540dcc4c8e88155b9a5b9a5d1a585b1a5e9959605a1b6044820152606401610763565b610abf611e76565b610ac7611e85565b604080515f80825260208201909252600f60f81b9b939a50919850469750309650945092509050565b5f610af9610b57565b65ffffffffffff168210610b4b5760405162461bcd60e51b815260206004820152601960248201527804552433230566f7465733a20667574757265206c6f6f6b757603c1b6044820152606401610763565b6106ed61010083611c63565b5f6108bc42611e94565b60606069805461065990613151565b6001600160a01b0381165f90815260ff60205260408120548015610bdb576001600160a01b0383165f90815260ff6020526040902080545f198301908110610bba57610bba6131c1565b5f9182526020909120015464010000000090046001600160e01b0316610bdd565b5f5b6001600160e01b03169392505050565b5f3381610bfa828661144e565b905083811015610c5a5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610763565b610941828686840361181b565b5f54610100900460ff1615808015610c8557505f54600160ff909116105b80610c9e5750303b158015610c9e57505f5460ff166001145b610d015760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610763565b5f805460ff191660011790558015610d22575f805461ff0019166101001790555b610d2a611efa565b610d6e6040518060400160405280600581526020016422b4b3b2b760d91b8152506040518060400160405280600581526020016422a4a3a2a760d91b815250611f28565b610d7785611e25565b610d9d6040518060400160405280600581526020016422a4a3a2a760d91b815250611f5c565b8251845114610e245760405162461bcd60e51b815260206004820152604760248201527f456967656e2e696e697469616c697a653a206d696e7465727320616e64206d6960448201527f6e74696e67416c6c6f77616e636573206d757374206265207468652073616d65606482015266040d8cadccee8d60cb1b608482015260a401610763565b8151845114610eab5760405162461bcd60e51b815260206004820152604760248201527f456967656e2e696e697469616c697a653a206d696e7465727320616e64206d6960448201527f6e74416c6c6f776564416674657273206d757374206265207468652073616d65606482015266040d8cadccee8d60cb1b608482015260a401610763565b5f5b845181101561102857838181518110610ec857610ec86131c1565b60200260200101516101315f878481518110610ee657610ee66131c1565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020015f2081905550828181518110610f2357610f236131c1565b60200260200101516101305f878481518110610f4157610f416131c1565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020015f208190555060016101335f878481518110610f8457610f846131c1565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020015f205f6101000a81548160ff021916908315150217905550848181518110610fd357610fd36131c1565b60200260200101516001600160a01b03167fcf20b1ecb604b0e8888d579c64e8a3b10e590d45c1c2dddb393bed28436222716001604051611018911515815260200190565b60405180910390a2600101610ead565b505f19610132558015611074575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050505050565b5f336106e7818585611aa0565b8281146110fd5760405162461bcd60e51b815260206004820152603e60248201527f456967656e2e6d756c746973656e643a2072656365697665727320616e64206160448201527f6d6f756e7473206d757374206265207468652073616d65206c656e67746800006064820152608401610763565b5f5b83811015611074576111503386868481811061111d5761111d6131c1565b90506020020160208101906111329190612c01565b858585818110611144576111446131c1565b90506020020135611aa0565b6001016110ff565b6111606119d4565b6001600160a01b0382165f8181526101346020908152604091829020805460ff191685151590811790915591519182527f72a561d1af7409467dae4f1e9fc52590a9335a1dda17727e2b6aa8c4db35109b910161091d565b834211156112085760405162461bcd60e51b815260206004820152601d60248201527f4552433230566f7465733a207369676e617475726520657870697265640000006044820152606401610763565b604080517fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf60208201526001600160a01b0388169181019190915260608101869052608081018590525f90611281906112799060a00160405160208183030381529060405280519060200120611fa5565b858585611fd1565b905061128c81611ff7565b86146112da5760405162461bcd60e51b815260206004820152601960248201527f4552433230566f7465733a20696e76616c6964206e6f6e6365000000000000006044820152606401610763565b6112e48188611d44565b50505050505050565b8342111561133d5760405162461bcd60e51b815260206004820152601d60248201527f45524332305065726d69743a206578706972656420646561646c696e650000006044820152606401610763565b5f7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c988888861136b8c611ff7565b6040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090505f6113c582611fa5565b90505f6113d482878787611fd1565b9050896001600160a01b0316816001600160a01b0316146114375760405162461bcd60e51b815260206004820152601e60248201527f45524332305065726d69743a20696e76616c6964207369676e617475726500006044820152606401610763565b6114428a8a8a61181b565b50505050505050505050565b6001600160a01b039182165f90815260666020908152604080832093909416825291909152205490565b611482338261201e565b60405163a9059cbb60e01b8152336004820152602481018290527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063a9059cbb906044016020604051808303815f875af11580156114ec573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061151091906131d5565b610a035760405162461bcd60e51b8152602060048201526024808201527f456967656e2e756e777261703a2062454947454e207472616e736665722066616044820152631a5b195960e21b6064820152608401610763565b6040516323b872dd60e01b8152336004820152306024820152604481018290527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906323b872dd906064016020604051808303815f875af11580156115d8573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115fc91906131d5565b6116535760405162461bcd60e51b815260206004820152602260248201527f456967656e2e777261703a2062454947454e207472616e73666572206661696c604482015261195960f21b6064820152608401610763565b610a03338261193e565b6116656119d4565b5f1961013254146116f45760405162461bcd60e51b815260206004820152604d60248201527f456967656e2e64697361626c655472616e736665725265737472696374696f6e60448201527f733a207472616e73666572207265737472696374696f6e732061726520616c7260648201526c1958591e48191a5cd8589b1959609a1b608482015260a401610763565b5f6101328190556040517f2b18986d3ba809db2f13a5d7bf17f60d357b37d9cbb55dd71cbbac8dc4060f649190a1565b604080518082019091525f80825260208201526001600160a01b0383165f90815260ff60205260409020805463ffffffff8416908110611766576117666131c1565b5f9182526020918290206040805180820190915291015463ffffffff8116825264010000000090046001600160e01b0316918101919091529392505050565b6117ad6119d4565b6001600160a01b0381166118125760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610763565b610a0381611e25565b6001600160a01b03831661187d5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610763565b6001600160a01b0382166118de5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610763565b6001600160a01b038381165f8181526066602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6119488282612037565b6001600160e01b0361195861083b565b11156119bf5760405162461bcd60e51b815260206004820152603060248201527f4552433230566f7465733a20746f74616c20737570706c79207269736b73206f60448201526f766572666c6f77696e6720766f74657360801b6064820152608401610763565b6119ce61010061210883612113565b50505050565b6033546001600160a01b03163314610a385760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610763565b5f611a39848461144e565b90505f1981146119ce5781811015611a935760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610763565b6119ce848484840361181b565b6001600160a01b038316611b045760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610763565b6001600160a01b038216611b665760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610763565b611b7183838361227f565b6001600160a01b0383165f9081526065602052604090205481811015611be85760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610763565b6001600160a01b038085165f8181526065602052604080822086860390559286168082529083902080548601905591517fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90611c479086815260200190565b60405180910390a36119ce848484612363565b5f6108bc612394565b81545f9081816005811115611cba575f611c7c84612407565b611c8690856131f0565b5f88815260209020909150869082015463ffffffff161115611caa57809150611cb8565b611cb58160016131ae565b92505b505b80821015611d05575f611ccd83836124eb565b5f88815260209020909150869082015463ffffffff161115611cf157809150611cff565b611cfc8160016131ae565b92505b50611cba565b8015611d2f575f8681526020902081015f19015464010000000090046001600160e01b0316611d31565b5f5b6001600160e01b03169695505050505050565b6001600160a01b038281165f81815260fe6020818152604080842080546065845282862054949093528787166001600160a01b03198416811790915590519190951694919391928592917f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f9190a46119ce828483612505565b5f63ffffffff821115611e215760405162461bcd60e51b815260206004820152602660248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203360448201526532206269747360d01b6064820152608401610763565b5090565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b60606099805461065990613151565b6060609a805461065990613151565b5f65ffffffffffff821115611e215760405162461bcd60e51b815260206004820152602660248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203460448201526538206269747360d01b6064820152608401610763565b5f54610100900460ff16611f205760405162461bcd60e51b815260040161076390613203565b610a3861263f565b5f54610100900460ff16611f4e5760405162461bcd60e51b815260040161076390613203565b611f58828261266e565b5050565b5f54610100900460ff16611f825760405162461bcd60e51b815260040161076390613203565b610a0381604051806040016040528060018152602001603160f81b8152506126ad565b5f6106ed611fb1611c5a565b8360405161190160f01b8152600281019290925260228201526042902090565b5f5f5f611fe0878787876126fa565b91509150611fed816127b7565b5095945050505050565b6001600160a01b0381165f90815260cb602052604090208054600181018255905b50919050565b6120288282612900565b6119ce610100612a4383612113565b6001600160a01b03821661208d5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610763565b6120985f838361227f565b8060675f8282546120a991906131ae565b90915550506001600160a01b0382165f818152606560209081526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3611f585f8383612363565b5f6109f282846131ae565b82545f90819081811561215d575f8781526020902082015f190160408051808201909152905463ffffffff8116825264010000000090046001600160e01b03166020820152612171565b604080518082019091525f80825260208201525b905080602001516001600160e01b0316935061219184868863ffffffff16565b92505f821180156121b957506121a5610b57565b65ffffffffffff16815f015163ffffffff16145b156121fc576121c783612a4e565b5f8881526020902083015f190180546001600160e01b03929092166401000000000263ffffffff909216919091179055612275565b866040518060400160405280612220612213610b57565b65ffffffffffff16611dbd565b63ffffffff16815260200161223486612a4e565b6001600160e01b0390811690915282546001810184555f938452602093849020835194909301519091166401000000000263ffffffff909316929092179101555b5050935093915050565b61013254421161235e576001600160a01b03831615806122a657506001600160a01b038216155b806122c957506001600160a01b0383165f908152610133602052604090205460ff165b806122ec57506001600160a01b0382165f908152610134602052604090205460ff165b61235e5760405162461bcd60e51b815260206004820152603a60248201527f456967656e2e5f6265666f7265546f6b656e5472616e736665723a2066726f6d60448201527f206f7220746f206d7573742062652077686974656c69737465640000000000006064820152608401610763565b505050565b6001600160a01b038381165f90815260fe602052604080822054858416835291205461235e92918216911683612505565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f6123be612ab6565b6123c6612b0e565b60408051602081019490945283019190915260608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b5f815f0361241657505f919050565b5f600161242284612b3e565b901c6001901b9050600181848161243b5761243b61324e565b048201901c905060018184816124535761245361324e565b048201901c9050600181848161246b5761246b61324e565b048201901c905060018184816124835761248361324e565b048201901c9050600181848161249b5761249b61324e565b048201901c905060018184816124b3576124b361324e565b048201901c905060018184816124cb576124cb61324e565b048201901c90506109f2818285816124e5576124e561324e565b04612bd1565b5f6124f96002848418613262565b6109f2908484166131ae565b816001600160a01b0316836001600160a01b03161415801561252657505f81115b1561235e576001600160a01b038316156125b3576001600160a01b0383165f90815260ff60205260408120819061256090612a4385612113565b91509150846001600160a01b03167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a72483836040516125a8929190918252602082015260400190565b60405180910390a250505b6001600160a01b0382161561235e576001600160a01b0382165f90815260ff6020526040812081906125e89061210885612113565b91509150836001600160a01b03167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a7248383604051612630929190918252602082015260400190565b60405180910390a25050505050565b5f54610100900460ff166126655760405162461bcd60e51b815260040161076390613203565b610a3833611e25565b5f54610100900460ff166126945760405162461bcd60e51b815260040161076390613203565b60686126a083826132c5565b50606961235e82826132c5565b5f54610100900460ff166126d35760405162461bcd60e51b815260040161076390613203565b60996126df83826132c5565b50609a6126ec82826132c5565b50505f609781905560985550565b5f807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a083111561272f57505f905060036127ae565b604080515f8082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015612780573d5f5f3e3d5ffd5b5050604051601f1901519150506001600160a01b0381166127a8575f600192509250506127ae565b91505f90505b94509492505050565b5f8160048111156127ca576127ca613380565b036127d25750565b60018160048111156127e6576127e6613380565b036128335760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610763565b600281600481111561284757612847613380565b036128945760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610763565b60038160048111156128a8576128a8613380565b03610a035760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401610763565b6001600160a01b0382166129605760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401610763565b61296b825f8361227f565b6001600160a01b0382165f90815260656020526040902054818110156129de5760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b6064820152608401610763565b6001600160a01b0383165f8181526065602090815260408083208686039055606780548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a361235e835f84612363565b5f6109f282846131f0565b5f6001600160e01b03821115611e215760405162461bcd60e51b815260206004820152602760248201527f53616665436173743a2076616c756520646f65736e27742066697420696e20326044820152663234206269747360c81b6064820152608401610763565b5f5f612ac0611e76565b805190915015612ad7578051602090910120919050565b6097548015612ae65792915050565b7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4709250505090565b5f5f612b18611e85565b805190915015612b2f578051602090910120919050565b6098548015612ae65792915050565b5f80608083901c15612b5257608092831c92015b604083901c15612b6457604092831c92015b602083901c15612b7657602092831c92015b601083901c15612b8857601092831c92015b600883901c15612b9a57600892831c92015b600483901c15612bac57600492831c92015b600283901c15612bbe57600292831c92015b600183901c156106ed5760010192915050565b5f818310612bdf57816109f2565b5090919050565b80356001600160a01b0381168114612bfc575f5ffd5b919050565b5f60208284031215612c11575f5ffd5b6109f282612be6565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f6109f26020830184612c1a565b5f5f60408385031215612c6b575f5ffd5b612c7483612be6565b946020939093013593505050565b8015158114610a03575f5ffd5b5f5f60408385031215612ca0575f5ffd5b612ca983612be6565b91506020830135612cb981612c82565b809150509250929050565b5f5f5f60608486031215612cd6575f5ffd5b612cdf84612be6565b9250612ced60208501612be6565b929592945050506040919091013590565b60ff60f81b8816815260e060208201525f612d1c60e0830189612c1a565b8281036040840152612d2e8189612c1a565b606084018890526001600160a01b038716608085015260a0840186905283810360c0850152845180825260208087019350909101905f5b81811015612d83578351835260209384019390920191600101612d65565b50909b9a5050505050505050505050565b5f60208284031215612da4575f5ffd5b5035919050565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f1916810167ffffffffffffffff81118282101715612de857612de8612dab565b604052919050565b5f67ffffffffffffffff821115612e0957612e09612dab565b5060051b60200190565b5f82601f830112612e22575f5ffd5b8135612e35612e3082612df0565b612dbf565b8082825260208201915060208360051b860101925085831115612e56575f5ffd5b602085015b83811015611fed578035835260209283019201612e5b565b5f5f5f5f60808587031215612e86575f5ffd5b612e8f85612be6565b9350602085013567ffffffffffffffff811115612eaa575f5ffd5b8501601f81018713612eba575f5ffd5b8035612ec8612e3082612df0565b8082825260208201915060208360051b850101925089831115612ee9575f5ffd5b6020840193505b82841015612f1257612f0184612be6565b825260209384019390910190612ef0565b9550505050604085013567ffffffffffffffff811115612f30575f5ffd5b612f3c87828801612e13565b925050606085013567ffffffffffffffff811115612f58575f5ffd5b612f6487828801612e13565b91505092959194509250565b5f5f83601f840112612f80575f5ffd5b50813567ffffffffffffffff811115612f97575f5ffd5b6020830191508360208260051b8501011115612fb1575f5ffd5b9250929050565b5f5f5f5f60408587031215612fcb575f5ffd5b843567ffffffffffffffff811115612fe1575f5ffd5b612fed87828801612f70565b909550935050602085013567ffffffffffffffff81111561300c575f5ffd5b61301887828801612f70565b95989497509550505050565b803560ff81168114612bfc575f5ffd5b5f5f5f5f5f5f60c08789031215613049575f5ffd5b61305287612be6565b9550602087013594506040870135935061306e60608801613024565b9598949750929560808101359460a0909101359350915050565b5f5f5f5f5f5f5f60e0888a03121561309e575f5ffd5b6130a788612be6565b96506130b560208901612be6565b955060408801359450606088013593506130d160808901613024565b9699959850939692959460a0840135945060c09093013592915050565b5f5f604083850312156130ff575f5ffd5b61310883612be6565b915061311660208401612be6565b90509250929050565b5f5f60408385031215613130575f5ffd5b61313983612be6565b9150602083013563ffffffff81168114612cb9575f5ffd5b600181811c9082168061316557607f821691505b60208210810361201857634e487b7160e01b5f52602260045260245ffd5b5f60208284031215613193575f5ffd5b5051919050565b634e487b7160e01b5f52601160045260245ffd5b808201808211156106ed576106ed61319a565b634e487b7160e01b5f52603260045260245ffd5b5f602082840312156131e5575f5ffd5b81516109f281612c82565b818103818111156106ed576106ed61319a565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b634e487b7160e01b5f52601260045260245ffd5b5f8261327c57634e487b7160e01b5f52601260045260245ffd5b500490565b601f82111561235e57805f5260205f20601f840160051c810160208510156132a65750805b601f840160051c820191505b81811015611074575f81556001016132b2565b815167ffffffffffffffff8111156132df576132df612dab565b6132f3816132ed8454613151565b84613281565b6020601f821160018114613325575f831561330e5750848201515b5f19600385901b1c1916600184901b178455611074565b5f84815260208120601f198516915b828110156133545787850151825560209485019460019092019101613334565b508482101561337157868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b634e487b7160e01b5f52602160045260245ffdfea264697066735822122087556507a13c767e1ac5fae7a99abc6e15a1498b1060ca1cde8c320d6d57627664736f6c634300081b0033", } // 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 ab79926845..085cd0e8cc 100644 --- a/pkg/bindings/EigenPod/binding.go +++ b/pkg/bindings/EigenPod/binding.go @@ -74,7 +74,7 @@ type IEigenPodTypesValidatorInfo struct { // EigenPodMetaData contains all meta data concerning the EigenPod contract. var EigenPodMetaData = &bind.MetaData{ ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"_ethPOS\",\"type\":\"address\",\"internalType\":\"contractIETHPOSDeposit\"},{\"name\":\"_eigenPodManager\",\"type\":\"address\",\"internalType\":\"contractIEigenPodManager\"},{\"name\":\"_GENESIS_TIME\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"receive\",\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"GENESIS_TIME\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidatorCount\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"checkpointBalanceExitedGwei\",\"inputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"currentCheckpoint\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIEigenPodTypes.Checkpoint\",\"components\":[{\"name\":\"beaconBlockRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"proofsRemaining\",\"type\":\"uint24\",\"internalType\":\"uint24\"},{\"name\":\"podBalanceGwei\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"balanceDeltasGwei\",\"type\":\"int64\",\"internalType\":\"int64\"},{\"name\":\"prevBeaconBalanceGwei\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"currentCheckpointTimestamp\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"eigenPodManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIEigenPodManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"ethPOS\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIETHPOSDeposit\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getParentBlockRoot\",\"inputs\":[{\"name\":\"timestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"_podOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"lastCheckpointTimestamp\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"podOwner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"proofSubmitter\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"recoverTokens\",\"inputs\":[{\"name\":\"tokenList\",\"type\":\"address[]\",\"internalType\":\"contractIERC20[]\"},{\"name\":\"amountsToWithdraw\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"},{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setProofSubmitter\",\"inputs\":[{\"name\":\"newProofSubmitter\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"stake\",\"inputs\":[{\"name\":\"pubkey\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"depositDataRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"startCheckpoint\",\"inputs\":[{\"name\":\"revertIfNoBalance\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"validatorPubkeyHashToInfo\",\"inputs\":[{\"name\":\"validatorPubkeyHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIEigenPodTypes.ValidatorInfo\",\"components\":[{\"name\":\"validatorIndex\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"restakedBalanceGwei\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"lastCheckpointedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumIEigenPodTypes.VALIDATOR_STATUS\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"validatorPubkeyToInfo\",\"inputs\":[{\"name\":\"validatorPubkey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIEigenPodTypes.ValidatorInfo\",\"components\":[{\"name\":\"validatorIndex\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"restakedBalanceGwei\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"lastCheckpointedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumIEigenPodTypes.VALIDATOR_STATUS\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"validatorStatus\",\"inputs\":[{\"name\":\"validatorPubkey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"enumIEigenPodTypes.VALIDATOR_STATUS\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"validatorStatus\",\"inputs\":[{\"name\":\"pubkeyHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"enumIEigenPodTypes.VALIDATOR_STATUS\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"verifyCheckpointProofs\",\"inputs\":[{\"name\":\"balanceContainerProof\",\"type\":\"tuple\",\"internalType\":\"structBeaconChainProofs.BalanceContainerProof\",\"components\":[{\"name\":\"balanceContainerRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"proof\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"proofs\",\"type\":\"tuple[]\",\"internalType\":\"structBeaconChainProofs.BalanceProof[]\",\"components\":[{\"name\":\"pubkeyHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"balanceRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"proof\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"verifyStaleBalance\",\"inputs\":[{\"name\":\"beaconTimestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"stateRootProof\",\"type\":\"tuple\",\"internalType\":\"structBeaconChainProofs.StateRootProof\",\"components\":[{\"name\":\"beaconStateRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"proof\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"proof\",\"type\":\"tuple\",\"internalType\":\"structBeaconChainProofs.ValidatorProof\",\"components\":[{\"name\":\"validatorFields\",\"type\":\"bytes32[]\",\"internalType\":\"bytes32[]\"},{\"name\":\"proof\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"verifyWithdrawalCredentials\",\"inputs\":[{\"name\":\"beaconTimestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"stateRootProof\",\"type\":\"tuple\",\"internalType\":\"structBeaconChainProofs.StateRootProof\",\"components\":[{\"name\":\"beaconStateRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"proof\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"validatorIndices\",\"type\":\"uint40[]\",\"internalType\":\"uint40[]\"},{\"name\":\"validatorFieldsProofs\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"},{\"name\":\"validatorFields\",\"type\":\"bytes32[][]\",\"internalType\":\"bytes32[][]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"withdrawRestakedBeaconChainETH\",\"inputs\":[{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amountWei\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"withdrawableRestakedExecutionLayerGwei\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"event\",\"name\":\"CheckpointCreated\",\"inputs\":[{\"name\":\"checkpointTimestamp\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"beaconBlockRoot\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"validatorCount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"CheckpointFinalized\",\"inputs\":[{\"name\":\"checkpointTimestamp\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"totalShareDeltaWei\",\"type\":\"int256\",\"indexed\":false,\"internalType\":\"int256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"EigenPodStaked\",\"inputs\":[{\"name\":\"pubkey\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"NonBeaconChainETHReceived\",\"inputs\":[{\"name\":\"amountReceived\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ProofSubmitterUpdated\",\"inputs\":[{\"name\":\"prevProofSubmitter\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"newProofSubmitter\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RestakedBeaconChainETHWithdrawn\",\"inputs\":[{\"name\":\"recipient\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorBalanceUpdated\",\"inputs\":[{\"name\":\"validatorIndex\",\"type\":\"uint40\",\"indexed\":false,\"internalType\":\"uint40\"},{\"name\":\"balanceTimestamp\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"newValidatorBalanceGwei\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorCheckpointed\",\"inputs\":[{\"name\":\"checkpointTimestamp\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorIndex\",\"type\":\"uint40\",\"indexed\":true,\"internalType\":\"uint40\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorRestaked\",\"inputs\":[{\"name\":\"validatorIndex\",\"type\":\"uint40\",\"indexed\":false,\"internalType\":\"uint40\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorWithdrawn\",\"inputs\":[{\"name\":\"checkpointTimestamp\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorIndex\",\"type\":\"uint40\",\"indexed\":true,\"internalType\":\"uint40\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"BeaconTimestampTooFarInPast\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"CannotCheckpointTwiceInSingleBlock\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"CheckpointAlreadyActive\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"CredentialsAlreadyVerified\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"CurrentlyPaused\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InputAddressZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InputArrayLengthMismatch\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InsufficientWithdrawableBalance\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidEIP4788Response\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidProof\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidProofLength\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidProofLength\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidPubKeyLength\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidValidatorFieldsLength\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"MsgValueNot32ETH\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NoActiveCheckpoint\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NoBalanceToCheckpoint\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyEigenPodManager\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyEigenPodOwner\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyEigenPodOwnerOrProofSubmitter\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"TimestampOutOfRange\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ValidatorInactiveOnBeaconChain\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ValidatorIsExitingBeaconChain\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ValidatorNotActiveInPod\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ValidatorNotSlashedOnBeaconChain\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"WithdrawalCredentialsNotForEigenPod\",\"inputs\":[]}]", - Bin: "0x60e060405234801561000f575f5ffd5b50604051613c7c380380613c7c83398101604081905261002e91610131565b6001600160a01b03808416608052821660a0526001600160401b03811660c05261005661005e565b505050610186565b5f54610100900460ff16156100c95760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff90811614610118575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b038116811461012e575f5ffd5b50565b5f5f5f60608486031215610143575f5ffd5b835161014e8161011a565b602085015190935061015f8161011a565b60408501519092506001600160401b038116811461017b575f5ffd5b809150509250925092565b60805160a05160c051613a7f6101fd5f395f61060401525f81816102a90152818161063f015281816106e7015281816109ab01528181610b7501528181610e4e01528181610ef50152818161112b01528181611479015281816115ad01526127bb01525f81816104c60152610f5e0152613a7f5ff3fe608060405260043610610164575f3560e01c80636fcd0e53116100cd578063c490744211610087578063dda3346c11610062578063dda3346c14610596578063ee94d67c146105b5578063f074ba62146105d4578063f2882461146105f3575f5ffd5b8063c490744214610539578063c4d66de814610558578063d06d558714610577575f5ffd5b80636fcd0e53146104545780637439841f1461048057806374cdd798146104b557806388676cad146104e85780639b4e463414610507578063b522538a1461051a575f5ffd5b80634665bcda1161011e5780634665bcda1461029857806347d28372146102cb57806352396a59146103b657806358753357146103ea57806358eaee79146104095780636c0d2d5a14610435575f5ffd5b8063039157d2146101a25780630b18ff66146101c35780632340e8d3146101ff5780633474aa16146102225780633f65cf191461025357806342ecff2a14610272575f5ffd5b3661019e576040513481527f6fdd3dbdb173299608c0aa9f368735857c8842b581f8389238bf05bd04b3bf499060200160405180910390a1005b5f5ffd5b3480156101ad575f5ffd5b506101c16101bc366004612ff3565b610626565b005b3480156101ce575f5ffd5b506033546101e2906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b34801561020a575f5ffd5b5061021460395481565b6040519081526020016101f6565b34801561022d575f5ffd5b506034546001600160401b03165b6040516001600160401b0390911681526020016101f6565b34801561025e575f5ffd5b506101c161026d3660046130ac565b610952565b34801561027d575f5ffd5b50603a5461023b90600160401b90046001600160401b031681565b3480156102a3575f5ffd5b506101e27f000000000000000000000000000000000000000000000000000000000000000081565b3480156102d6575f5ffd5b5061035b6040805160a0810182525f80825260208201819052918101829052606081018290526080810191909152506040805160a081018252603c548152603d5462ffffff811660208301526001600160401b0363010000008204811693830193909352600160581b810460070b6060830152600160981b9004909116608082015290565b6040516101f691905f60a0820190508251825262ffffff60208401511660208301526001600160401b036040840151166040830152606083015160070b60608301526001600160401b03608084015116608083015292915050565b3480156103c1575f5ffd5b5061023b6103d0366004613181565b603b6020525f90815260409020546001600160401b031681565b3480156103f5575f5ffd5b50603e546101e2906001600160a01b031681565b348015610414575f5ffd5b506104286104233660046131de565b610bda565b6040516101f69190613250565b348015610440575f5ffd5b5061021461044f366004613181565b610c3c565b34801561045f575f5ffd5b5061047361046e36600461325e565b610d4a565b6040516101f69190613275565b34801561048b575f5ffd5b5061042861049a36600461325e565b5f90815260366020526040902054600160c01b900460ff1690565b3480156104c0575f5ffd5b506101e27f000000000000000000000000000000000000000000000000000000000000000081565b3480156104f3575f5ffd5b506101c16105023660046132d8565b610df5565b6101c16105153660046132f3565b610eea565b348015610525575f5ffd5b506104736105343660046131de565b611031565b348015610544575f5ffd5b506101c1610553366004613383565b611120565b348015610563575f5ffd5b506101c16105723660046133ad565b611257565b348015610582575f5ffd5b506101c16105913660046133ad565b6113a1565b3480156105a1575f5ffd5b506101c16105b0366004613498565b611435565b3480156105c0575f5ffd5b50603a5461023b906001600160401b031681565b3480156105df575f5ffd5b506101c16105ee36600461356a565b611594565b3480156105fe575f5ffd5b5061023b7f000000000000000000000000000000000000000000000000000000000000000081565b604051635ac86ab760e01b8152600660048201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635ac86ab790602401602060405180830381865afa15801561068c573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106b091906135d1565b156106ce5760405163840a48d560e01b815260040160405180910390fd5b604051635ac86ab760e01b8152600860048201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635ac86ab790602401602060405180830381865afa158015610734573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061075891906135d1565b156107765760405163840a48d560e01b815260040160405180910390fd5b5f6107ba61078485806135ec565b808060200260200160405190810160405280939291908181526020018383602002808284375f9201919091525061199192505050565b5f818152603660209081526040808320815160808101835281546001600160401b038082168352600160401b8204811695830195909552600160801b8104909416928101929092529394509192906060830190600160c01b900460ff1660028111156108285761082861321c565b60028111156108395761083961321c565b81525050905080604001516001600160401b0316876001600160401b031611610875576040516337e07ffd60e01b815260040160405180910390fd5b60018160600151600281111561088d5761088d61321c565b146108ab5760405163d49e19a760e01b815260040160405180910390fd5b6108ee6108b886806135ec565b808060200260200160405190810160405280939291908181526020018383602002808284375f920191909152506119b392505050565b61090b5760405163161ce5ed60e31b815260040160405180910390fd5b61091d61091788610c3c565b876119db565b610940863561092c87806135ec565b61093960208a018a613631565b8651611a80565b6109495f611ba7565b50505050505050565b6033546001600160a01b03163314806109755750603e546001600160a01b031633145b6109925760405163427a777960e01b815260040160405180910390fd5b604051635ac86ab760e01b8152600260048201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635ac86ab790602401602060405180830381865afa1580156109f8573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a1c91906135d1565b15610a3a5760405163840a48d560e01b815260040160405180910390fd5b8584148015610a4857508382145b610a65576040516343714afd60e01b815260040160405180910390fd5b603a546001600160401b03600160401b9091048116908a1611610a9b576040516337e07ffd60e01b815260040160405180910390fd5b610aad610aa78a610c3c565b896119db565b5f805b87811015610b4557610b318a358a8a84818110610acf57610acf613673565b9050602002016020810190610ae49190613687565b898985818110610af657610af6613673565b9050602002810190610b089190613631565b898987818110610b1a57610b1a613673565b9050602002810190610b2c91906135ec565b611d27565b610b3b90836136bf565b9150600101610ab0565b5060335460405163a1ca780b60e01b81526001600160a01b0391821660048201525f6024820152604481018390527f00000000000000000000000000000000000000000000000000000000000000009091169063a1ca780b906064015f604051808303815f87803b158015610bb8575f5ffd5b505af1158015610bca573d5f5f3e3d5ffd5b5050505050505050505050505050565b5f5f610c1a84848080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152506121dc92505050565b5f90815260366020526040902054600160c01b900460ff169150505b92915050565b5f610c4a611fff600c6136d2565b610c5d6001600160401b038416426136e9565b10610c7b57604051637944e66d60e11b815260040160405180910390fd5b604080516001600160401b03841660208201525f918291720f3df6d732807ef1319fb7b8bb8522d0beac02910160408051601f1981840301815290829052610cc291613713565b5f60405180830381855afa9150503d805f8114610cfa576040519150601f19603f3d011682016040523d82523d5f602084013e610cff565b606091505b5091509150818015610d1157505f8151115b610d2e5760405163558ad0a360e01b815260040160405180910390fd5b80806020019051810190610d42919061371e565b949350505050565b610d71604080516080810182525f8082526020820181905291810182905290606082015290565b5f82815260366020908152604091829020825160808101845281546001600160401b038082168352600160401b8204811694830194909452600160801b810490931693810193909352906060830190600160c01b900460ff166002811115610ddb57610ddb61321c565b6002811115610dec57610dec61321c565b90525092915050565b6033546001600160a01b0316331480610e185750603e546001600160a01b031633145b610e355760405163427a777960e01b815260040160405180910390fd5b604051635ac86ab760e01b8152600660048201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635ac86ab790602401602060405180830381865afa158015610e9b573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ebf91906135d1565b15610edd5760405163840a48d560e01b815260040160405180910390fd5b610ee682611ba7565b5050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610f3357604051633213a66160e21b815260040160405180910390fd5b346801bc16d674ec80000014610f5c5760405163049696b360e31b815260040160405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663228951186801bc16d674ec8000008787610f9f61226d565b8888886040518863ffffffff1660e01b8152600401610fc39695949392919061378b565b5f604051808303818588803b158015610fda575f5ffd5b505af1158015610fec573d5f5f3e3d5ffd5b50505050507f606865b7934a25d4aed43f6cdb426403353fa4b3009c4d228407474581b01e2385856040516110229291906137d9565b60405180910390a15050505050565b611058604080516080810182525f8082526020820181905291810182905290606082015290565b60365f61109985858080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152506121dc92505050565b815260208082019290925260409081015f20815160808101835281546001600160401b038082168352600160401b8204811695830195909552600160801b81049094169281019290925290916060830190600160c01b900460ff1660028111156111055761110561321c565b60028111156111165761111661321c565b9052509392505050565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461116957604051633213a66160e21b815260040160405180910390fd5b5f611178633b9aca0083613800565b9050611191633b9aca006001600160401b0383166136d2565b6034549092506001600160401b0390811690821611156111c4576040516302c6f54760e21b815260040160405180910390fd5b603480548291905f906111e19084906001600160401b0316613813565b92506101000a8154816001600160401b0302191690836001600160401b03160217905550826001600160a01b03167f8947fd2ce07ef9cc302c4e8f0461015615d91ce851564839e91cc804c2f49d8e8360405161124091815260200190565b60405180910390a261125283836122b1565b505050565b5f54610100900460ff161580801561127557505f54600160ff909116105b8061128e5750303b15801561128e57505f5460ff166001145b6112f65760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b5f805460ff191660011790558015611317575f805461ff0019166101001790555b6001600160a01b03821661133e576040516339b190bb60e11b815260040160405180910390fd5b603380546001600160a01b0319166001600160a01b0384161790558015610ee6575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15050565b6033546001600160a01b031633146113cc5760405163719f370360e11b815260040160405180910390fd5b603e54604080516001600160a01b03928316815291831660208301527ffb8129080a19d34dceac04ba253fc50304dc86c729bd63cdca4a969ad19a5eac910160405180910390a1603e80546001600160a01b0319166001600160a01b0392909216919091179055565b6033546001600160a01b031633146114605760405163719f370360e11b815260040160405180910390fd5b604051635ac86ab760e01b8152600560048201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635ac86ab790602401602060405180830381865afa1580156114c6573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114ea91906135d1565b156115085760405163840a48d560e01b815260040160405180910390fd5b825184511461152a576040516343714afd60e01b815260040160405180910390fd5b5f5b845181101561158d576115858385838151811061154b5761154b613673565b602002602001015187848151811061156557611565613673565b60200260200101516001600160a01b03166123c69092919063ffffffff16565b60010161152c565b5050505050565b604051635ac86ab760e01b8152600760048201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635ac86ab790602401602060405180830381865afa1580156115fa573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061161e91906135d1565b1561163c5760405163840a48d560e01b815260040160405180910390fd5b603a54600160401b90046001600160401b03165f81900361167057604051631a544f4960e01b815260040160405180910390fd5b6040805160a081018252603c54808252603d5462ffffff811660208401526001600160401b0363010000008204811694840194909452600160581b810460070b6060840152600160981b90049092166080820152906116cf9087612418565b5f805b8581101561193857368787838181106116ed576116ed613673565b90506020028101906116ff9190613832565b80355f908152603660209081526040808320815160808101835281546001600160401b038082168352600160401b8204811695830195909552600160801b8104909416928101929092529394509192906060830190600160c01b900460ff16600281111561176f5761176f61321c565b60028111156117805761178061321c565b905250905060018160600151600281111561179d5761179d61321c565b146117a9575050611930565b856001600160401b031681604001516001600160401b0316106117cd575050611930565b5f80806117dd848a8f35886124c9565b60208b01805193965091945092506117f482613850565b62ffffff1690525060808801805184919061181090839061386d565b6001600160401b031690525060608801805183919061183090839061388c565b60070b905250611840818861386d565b85355f908152603660209081526040918290208751815492890151938901516001600160401b03908116600160801b0267ffffffffffffffff60801b19958216600160401b026001600160801b0319909516919092161792909217928316821781556060880151939a50879390929091839160ff60c01b1990911668ffffffffffffffffff60801b1990911617600160c01b8360028111156118e4576118e461321c565b021790555050845160405164ffffffffff90911691506001600160401b038b16907fa91c59033c3423e18b54d0acecebb4972f9ea95aedf5f4cae3b677b02eaf3a3f905f90a350505050505b6001016116d2565b506001600160401b038084165f908152603b60205260408120805484939192916119649185911661386d565b92506101000a8154816001600160401b0302191690836001600160401b03160217905550610949826125ec565b5f815f815181106119a4576119a4613673565b60200260200101519050919050565b5f816003815181106119c7576119c7613673565b60200260200101515f5f1b14159050919050565b6119e7600360206136d2565b6119f46020830183613631565b905014611a14576040516313717da960e21b815260040160405180910390fd5b611a63611a246020830183613631565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152508692505084359050600361281b565b610ee6576040516309bde33960e01b815260040160405180910390fd5b60088414611aa15760405163200591bd60e01b815260040160405180910390fd5b6005611aaf602860016136bf565b611ab991906136bf565b611ac49060206136d2565b8214611ae3576040516313717da960e21b815260040160405180910390fd5b5f611b1f8686808060200260200160405190810160405280939291908181526020018383602002808284375f9201919091525061283292505050565b90505f64ffffffffff8316611b36602860016136bf565b600b901b179050611b8085858080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152508c925086915085905061281b565b611b9d576040516309bde33960e01b815260040160405180910390fd5b5050505050505050565b603a54600160401b90046001600160401b031615611bd75760405162be9bc360e81b815260040160405180910390fd5b603a546001600160401b03428116911603611c05576040516367db5b8b60e01b815260040160405180910390fd5b6034545f906001600160401b0316611c21633b9aca0047613800565b611c2b9190613813565b9050818015611c4157506001600160401b038116155b15611c5f576040516332dea95960e21b815260040160405180910390fd5b5f6040518060a00160405280611c7442610c3c565b815260395462ffffff1660208201526001600160401b0380851660408301525f60608301819052608090920191909152603a805442909216600160401b026fffffffffffffffff0000000000000000199092169190911790559050611cd8816125ec565b805160208083015160405162ffffff90911681526001600160401b034216917f575796133bbed337e5b39aa49a30dc2556a91e0c6c2af4b7b886ae77ebef1076910160405180910390a3505050565b5f5f611d648484808060200260200160405190810160405280939291908181526020018383602002808284375f9201919091525061199192505050565b5f818152603660209081526040808320815160808101835281546001600160401b038082168352600160401b8204811695830195909552600160801b8104909416928101929092529394509192906060830190600160c01b900460ff166002811115611dd257611dd261321c565b6002811115611de357611de361321c565b90525090505f81606001516002811115611dff57611dff61321c565b14611e1d576040516335e09e9d60e01b815260040160405180910390fd5b6001600160401b038016611e628686808060200260200160405190810160405280939291908181526020018383602002808284375f92019190915250612ac292505050565b6001600160401b031603611e8957604051631958236d60e21b815260040160405180910390fd5b6001600160401b038016611ece8686808060200260200160405190810160405280939291908181526020018383602002808284375f92019190915250612ae692505050565b6001600160401b031614611ef557604051632eade63760e01b815260040160405180910390fd5b611efd61226d565b611f06906138bb565b611f418686808060200260200160405190810160405280939291908181526020018383602002808284375f92019190915250612afd92505050565b14611f5f57604051633772dd5360e11b815260040160405180910390fd5b5f611f9b8686808060200260200160405190810160405280939291908181526020018383602002808284375f92019190915250612b1192505050565b9050611fab8a87878b8b8e611a80565b60398054905f611fba836138de565b9091555050603a545f90600160401b90046001600160401b031615611ff157603a54600160401b90046001600160401b0316611ffe565b603a546001600160401b03165b6040805160808101825264ffffffffff8d1681526001600160401b03858116602083015283169181019190915290915060608101600190525f858152603660209081526040918290208351815492850151938501516001600160401b03908116600160801b0267ffffffffffffffff60801b19958216600160401b026001600160801b031990951691909216179290921792831682178155606084015190929091839160ff60c01b1990911668ffffffffffffffffff60801b1990911617600160c01b8360028111156120d3576120d361321c565b021790555050603d80548492506013906120fe908490600160981b90046001600160401b031661386d565b92506101000a8154816001600160401b0302191690836001600160401b031602179055507f2d0800bbc377ea54a08c5db6a87aafff5e3e9c8fead0eda110e40e0c104414498a60405161215e919064ffffffffff91909116815260200190565b60405180910390a16040805164ffffffffff8c1681526001600160401b03838116602083015284168183015290517f0e5fac175b83177cc047381e030d8fb3b42b37bd1c025e22c280facad62c32df9181900360600190a16121cd633b9aca006001600160401b0384166136d2565b9b9a5050505050505050505050565b5f81516030146121ff57604051634f88323960e11b815260040160405180910390fd5b6040516002906122159084905f906020016138f6565b60408051601f198184030181529082905261222f91613713565b602060405180830381855afa15801561224a573d5f5f3e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610c36919061371e565b60408051600160f81b60208201525f602182015230606090811b6bffffffffffffffffffffffff1916602c8301529101604051602081830303815290604052905090565b804710156123015760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e636500000060448201526064016112ed565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f811461234a576040519150601f19603f3d011682016040523d82523d5f602084013e61234f565b606091505b50509050806112525760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d6179206861766520726576657274656400000000000060648201526084016112ed565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052611252908490612b28565b612424600560036136bf565b61242f9060206136d2565b61243c6020830183613631565b90501461245c576040516313717da960e21b815260040160405180910390fd5b606c6124ac61246e6020840184613631565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525087925050853590508461281b565b611252576040516309bde33960e01b815260040160405180910390fd5b83516020850151905f908190816124e1878388612bfb565b9050846001600160401b0316816001600160401b03161461255b57612506858261391a565b6040805164ffffffffff851681526001600160401b038b8116602083015284168183015290519195507f0e5fac175b83177cc047381e030d8fb3b42b37bd1c025e22c280facad62c32df919081900360600190a15b6001600160401b0380821660208b0181905290891660408b01525f036125e05760398054905f61258a83613949565b9091555050600260608a015261259f8461395e565b92508164ffffffffff16886001600160401b03167f2a02361ffa66cf2c2da4682c2355a6adcaa9f6c227b6e6563e68480f9587626a60405160405180910390a35b50509450945094915050565b602081015162ffffff161561268c578051603c556020810151603d80546040840151606085015160809095015162ffffff9094166affffffffffffffffffffff199092169190911763010000006001600160401b0392831602176fffffffffffffffffffffffffffffffff60581b1916600160581b9482169490940267ffffffffffffffff60981b191693909317600160981b9390921692909202179055565b60808101516034545f916126a8916001600160401b031661386d565b90505f826060015183604001516126bf919061388c565b60408401516034805492935090915f906126e39084906001600160401b031661386d565b82546101009290920a6001600160401b03818102199093169183160217909155603a8054600160401b810483166001600160801b03199091161790555f915061273390633b9aca009085166136d2565b90505f612748633b9aca00600785900b613983565b603a546040518281529192506001600160401b0316907f525408c201bc1576eb44116f6478f1c2a54775b19a043bcfdc708364f74f8e449060200160405180910390a260335460405163a1ca780b60e01b81526001600160a01b03918216600482015260248101849052604481018390527f00000000000000000000000000000000000000000000000000000000000000009091169063a1ca780b906064015f604051808303815f87803b1580156127fe575f5ffd5b505af1158015612810573d5f5f3e3d5ffd5b505050505050505050565b5f83612828868585612cd9565b1495945050505050565b5f5f600283516128429190613800565b90505f816001600160401b0381111561285d5761285d6133c8565b604051908082528060200260200182016040528015612886578160200160208202803683370190505b5090505f5b82811015612980576002856128a083836136d2565b815181106128b0576128b0613673565b6020026020010151868360026128c691906136d2565b6128d19060016136bf565b815181106128e1576128e1613673565b6020026020010151604051602001612903929190918252602082015260400190565b60408051601f198184030181529082905261291d91613713565b602060405180830381855afa158015612938573d5f5f3e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061295b919061371e565b82828151811061296d5761296d613673565b602090810291909101015260010161288b565b5061298c600283613800565b91505b8115612a9f575f5b82811015612a8c576002826129ac83836136d2565b815181106129bc576129bc613673565b6020026020010151838360026129d291906136d2565b6129dd9060016136bf565b815181106129ed576129ed613673565b6020026020010151604051602001612a0f929190918252602082015260400190565b60408051601f1981840301815290829052612a2991613713565b602060405180830381855afa158015612a44573d5f5f3e3d5ffd5b5050506040513d601f19601f82011682018060405250810190612a67919061371e565b828281518110612a7957612a79613673565b6020908102919091010152600101612997565b50612a98600283613800565b915061298f565b805f81518110612ab157612ab1613673565b602002602001015192505050919050565b5f610c3682600581518110612ad957612ad9613673565b6020026020010151612dad565b5f610c3682600681518110612ad957612ad9613673565b5f816001815181106119a4576119a4613673565b5f610c3682600281518110612ad957612ad9613673565b5f612b7c826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316612e149092919063ffffffff16565b905080515f1480612b9c575080806020019051810190612b9c91906135d1565b6112525760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016112ed565b5f612c08602660016136bf565b612c139060206136d2565b612c206040840184613631565b905014612c40576040516313717da960e21b815260040160405180910390fd5b5f612c4c6004856139b2565b64ffffffffff169050612ca5612c656040850185613631565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250899250505060208601358461281b565b612cc2576040516309bde33960e01b815260040160405180910390fd5b612cd0836020013585612e22565b95945050505050565b5f83515f14158015612cf6575060208451612cf491906139db565b155b612d13576040516313717da960e21b815260040160405180910390fd5b604080516020808201909252848152905b85518111612da357612d376002856139db565b5f03612d695781515f528086015160205260208260405f60026107d05a03fa612d5e575f5ffd5b600284049350612d91565b808601515f52815160205260208260405f60026107d05a03fa612d8a575f5ffd5b6002840493505b612d9c6020826136bf565b9050612d24565b5051949350505050565b60f881901c60e882901c61ff00161760d882901c62ff0000161760c882901c63ff000000161764ff0000000060b883901c161765ff000000000060a883901c161766ff000000000000609883901c161767ff0000000000000060889290921c919091161790565b6060610d4284845f85612e4e565b5f80612e2f6004846139ee565b612e3a906040613a17565b64ffffffffff169050610d4284821b612dad565b606082471015612eaf5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b60648201526084016112ed565b5f5f866001600160a01b03168587604051612eca9190613713565b5f6040518083038185875af1925050503d805f8114612f04576040519150601f19603f3d011682016040523d82523d5f602084013e612f09565b606091505b5091509150612f1a87838387612f25565b979650505050505050565b60608315612f935782515f03612f8c576001600160a01b0385163b612f8c5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016112ed565b5081610d42565b610d428383815115612fa85781518083602001fd5b8060405162461bcd60e51b81526004016112ed9190613a37565b80356001600160401b0381168114612fd8575f5ffd5b919050565b5f60408284031215612fed575f5ffd5b50919050565b5f5f5f60608486031215613005575f5ffd5b61300e84612fc2565b925060208401356001600160401b03811115613028575f5ffd5b61303486828701612fdd565b92505060408401356001600160401b0381111561304f575f5ffd5b61305b86828701612fdd565b9150509250925092565b5f5f83601f840112613075575f5ffd5b5081356001600160401b0381111561308b575f5ffd5b6020830191508360208260051b85010111156130a5575f5ffd5b9250929050565b5f5f5f5f5f5f5f5f60a0898b0312156130c3575f5ffd5b6130cc89612fc2565b975060208901356001600160401b038111156130e6575f5ffd5b6130f28b828c01612fdd565b97505060408901356001600160401b0381111561310d575f5ffd5b6131198b828c01613065565b90975095505060608901356001600160401b03811115613137575f5ffd5b6131438b828c01613065565b90955093505060808901356001600160401b03811115613161575f5ffd5b61316d8b828c01613065565b999c989b5096995094979396929594505050565b5f60208284031215613191575f5ffd5b61319a82612fc2565b9392505050565b5f5f83601f8401126131b1575f5ffd5b5081356001600160401b038111156131c7575f5ffd5b6020830191508360208285010111156130a5575f5ffd5b5f5f602083850312156131ef575f5ffd5b82356001600160401b03811115613204575f5ffd5b613210858286016131a1565b90969095509350505050565b634e487b7160e01b5f52602160045260245ffd5b6003811061324c57634e487b7160e01b5f52602160045260245ffd5b9052565b60208101610c368284613230565b5f6020828403121561326e575f5ffd5b5035919050565b5f6080820190506001600160401b0383511682526001600160401b0360208401511660208301526001600160401b03604084015116604083015260608301516132c16060840182613230565b5092915050565b80151581146132d5575f5ffd5b50565b5f602082840312156132e8575f5ffd5b813561319a816132c8565b5f5f5f5f5f60608688031215613307575f5ffd5b85356001600160401b0381111561331c575f5ffd5b613328888289016131a1565b90965094505060208601356001600160401b03811115613346575f5ffd5b613352888289016131a1565b96999598509660400135949350505050565b6001600160a01b03811681146132d5575f5ffd5b8035612fd881613364565b5f5f60408385031215613394575f5ffd5b823561339f81613364565b946020939093013593505050565b5f602082840312156133bd575f5ffd5b813561319a81613364565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f191681016001600160401b0381118282101715613404576134046133c8565b604052919050565b5f6001600160401b03821115613424576134246133c8565b5060051b60200190565b5f82601f83011261343d575f5ffd5b813561345061344b8261340c565b6133dc565b8082825260208201915060208360051b860101925085831115613471575f5ffd5b602085015b8381101561348e578035835260209283019201613476565b5095945050505050565b5f5f5f606084860312156134aa575f5ffd5b83356001600160401b038111156134bf575f5ffd5b8401601f810186136134cf575f5ffd5b80356134dd61344b8261340c565b8082825260208201915060208360051b8501019250888311156134fe575f5ffd5b6020840193505b8284101561352957833561351881613364565b825260209384019390910190613505565b955050505060208401356001600160401b03811115613546575f5ffd5b6135528682870161342e565b92505061356160408501613378565b90509250925092565b5f5f5f6040848603121561357c575f5ffd5b83356001600160401b03811115613591575f5ffd5b61359d86828701612fdd565b93505060208401356001600160401b038111156135b8575f5ffd5b6135c486828701613065565b9497909650939450505050565b5f602082840312156135e1575f5ffd5b815161319a816132c8565b5f5f8335601e19843603018112613601575f5ffd5b8301803591506001600160401b0382111561361a575f5ffd5b6020019150600581901b36038213156130a5575f5ffd5b5f5f8335601e19843603018112613646575f5ffd5b8301803591506001600160401b0382111561365f575f5ffd5b6020019150368190038213156130a5575f5ffd5b634e487b7160e01b5f52603260045260245ffd5b5f60208284031215613697575f5ffd5b813564ffffffffff8116811461319a575f5ffd5b634e487b7160e01b5f52601160045260245ffd5b80820180821115610c3657610c366136ab565b8082028115828204841417610c3657610c366136ab565b81810381811115610c3657610c366136ab565b5f81518060208401855e5f93019283525090919050565b5f61319a82846136fc565b5f6020828403121561372e575f5ffd5b5051919050565b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b608081525f61379e60808301888a613735565b82810360208401526137b0818861375d565b905082810360408401526137c5818688613735565b915050826060830152979650505050505050565b602081525f610d42602083018486613735565b634e487b7160e01b5f52601260045260245ffd5b5f8261380e5761380e6137ec565b500490565b6001600160401b038281168282160390811115610c3657610c366136ab565b5f8235605e19833603018112613846575f5ffd5b9190910192915050565b5f62ffffff821680613864576138646136ab565b5f190192915050565b6001600160401b038181168382160190811115610c3657610c366136ab565b600781810b9083900b01677fffffffffffffff8113677fffffffffffffff1982121715610c3657610c366136ab565b80516020808301519190811015612fed575f1960209190910360031b1b16919050565b5f600182016138ef576138ef6136ab565b5060010190565b5f61390182856136fc565b6001600160801b03199390931683525050601001919050565b600782810b9082900b03677fffffffffffffff198112677fffffffffffffff82131715610c3657610c366136ab565b5f81613957576139576136ab565b505f190190565b5f8160070b677fffffffffffffff19810361397b5761397b6136ab565b5f0392915050565b8082025f8212600160ff1b8414161561399e5761399e6136ab565b8181058314821517610c3657610c366136ab565b5f64ffffffffff8316806139c8576139c86137ec565b8064ffffffffff84160491505092915050565b5f826139e9576139e96137ec565b500690565b5f64ffffffffff831680613a0457613a046137ec565b8064ffffffffff84160691505092915050565b64ffffffffff81811683821602908116908181146132c1576132c16136ab565b602081525f61319a602083018461375d56fea2646970667358221220e0bd062ebd23c46fb6b2fc3f9c259882aac254262e5eea0343761357f4d9595264736f6c634300081b0033", + Bin: "0x60e060405234801561000f575f5ffd5b50604051613c7c380380613c7c83398101604081905261002e91610131565b6001600160a01b03808416608052821660a0526001600160401b03811660c05261005661005e565b505050610186565b5f54610100900460ff16156100c95760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff90811614610118575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b038116811461012e575f5ffd5b50565b5f5f5f60608486031215610143575f5ffd5b835161014e8161011a565b602085015190935061015f8161011a565b60408501519092506001600160401b038116811461017b575f5ffd5b809150509250925092565b60805160a05160c051613a7f6101fd5f395f61060401525f81816102a90152818161063f015281816106e7015281816109ab01528181610b7501528181610e4e01528181610ef50152818161112b01528181611479015281816115ad01526127bb01525f81816104c60152610f5e0152613a7f5ff3fe608060405260043610610164575f3560e01c80636fcd0e53116100cd578063c490744211610087578063dda3346c11610062578063dda3346c14610596578063ee94d67c146105b5578063f074ba62146105d4578063f2882461146105f3575f5ffd5b8063c490744214610539578063c4d66de814610558578063d06d558714610577575f5ffd5b80636fcd0e53146104545780637439841f1461048057806374cdd798146104b557806388676cad146104e85780639b4e463414610507578063b522538a1461051a575f5ffd5b80634665bcda1161011e5780634665bcda1461029857806347d28372146102cb57806352396a59146103b657806358753357146103ea57806358eaee79146104095780636c0d2d5a14610435575f5ffd5b8063039157d2146101a25780630b18ff66146101c35780632340e8d3146101ff5780633474aa16146102225780633f65cf191461025357806342ecff2a14610272575f5ffd5b3661019e576040513481527f6fdd3dbdb173299608c0aa9f368735857c8842b581f8389238bf05bd04b3bf499060200160405180910390a1005b5f5ffd5b3480156101ad575f5ffd5b506101c16101bc366004612ff3565b610626565b005b3480156101ce575f5ffd5b506033546101e2906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b34801561020a575f5ffd5b5061021460395481565b6040519081526020016101f6565b34801561022d575f5ffd5b506034546001600160401b03165b6040516001600160401b0390911681526020016101f6565b34801561025e575f5ffd5b506101c161026d3660046130ac565b610952565b34801561027d575f5ffd5b50603a5461023b90600160401b90046001600160401b031681565b3480156102a3575f5ffd5b506101e27f000000000000000000000000000000000000000000000000000000000000000081565b3480156102d6575f5ffd5b5061035b6040805160a0810182525f80825260208201819052918101829052606081018290526080810191909152506040805160a081018252603c548152603d5462ffffff811660208301526001600160401b0363010000008204811693830193909352600160581b810460070b6060830152600160981b9004909116608082015290565b6040516101f691905f60a0820190508251825262ffffff60208401511660208301526001600160401b036040840151166040830152606083015160070b60608301526001600160401b03608084015116608083015292915050565b3480156103c1575f5ffd5b5061023b6103d0366004613181565b603b6020525f90815260409020546001600160401b031681565b3480156103f5575f5ffd5b50603e546101e2906001600160a01b031681565b348015610414575f5ffd5b506104286104233660046131de565b610bda565b6040516101f69190613250565b348015610440575f5ffd5b5061021461044f366004613181565b610c3c565b34801561045f575f5ffd5b5061047361046e36600461325e565b610d4a565b6040516101f69190613275565b34801561048b575f5ffd5b5061042861049a36600461325e565b5f90815260366020526040902054600160c01b900460ff1690565b3480156104c0575f5ffd5b506101e27f000000000000000000000000000000000000000000000000000000000000000081565b3480156104f3575f5ffd5b506101c16105023660046132d8565b610df5565b6101c16105153660046132f3565b610eea565b348015610525575f5ffd5b506104736105343660046131de565b611031565b348015610544575f5ffd5b506101c1610553366004613383565b611120565b348015610563575f5ffd5b506101c16105723660046133ad565b611257565b348015610582575f5ffd5b506101c16105913660046133ad565b6113a1565b3480156105a1575f5ffd5b506101c16105b0366004613498565b611435565b3480156105c0575f5ffd5b50603a5461023b906001600160401b031681565b3480156105df575f5ffd5b506101c16105ee36600461356a565b611594565b3480156105fe575f5ffd5b5061023b7f000000000000000000000000000000000000000000000000000000000000000081565b604051635ac86ab760e01b8152600660048201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635ac86ab790602401602060405180830381865afa15801561068c573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106b091906135d1565b156106ce5760405163840a48d560e01b815260040160405180910390fd5b604051635ac86ab760e01b8152600860048201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635ac86ab790602401602060405180830381865afa158015610734573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061075891906135d1565b156107765760405163840a48d560e01b815260040160405180910390fd5b5f6107ba61078485806135ec565b808060200260200160405190810160405280939291908181526020018383602002808284375f9201919091525061199192505050565b5f818152603660209081526040808320815160808101835281546001600160401b038082168352600160401b8204811695830195909552600160801b8104909416928101929092529394509192906060830190600160c01b900460ff1660028111156108285761082861321c565b60028111156108395761083961321c565b81525050905080604001516001600160401b0316876001600160401b031611610875576040516337e07ffd60e01b815260040160405180910390fd5b60018160600151600281111561088d5761088d61321c565b146108ab5760405163d49e19a760e01b815260040160405180910390fd5b6108ee6108b886806135ec565b808060200260200160405190810160405280939291908181526020018383602002808284375f920191909152506119b392505050565b61090b5760405163161ce5ed60e31b815260040160405180910390fd5b61091d61091788610c3c565b876119db565b610940863561092c87806135ec565b61093960208a018a613631565b8651611a80565b6109495f611ba7565b50505050505050565b6033546001600160a01b03163314806109755750603e546001600160a01b031633145b6109925760405163427a777960e01b815260040160405180910390fd5b604051635ac86ab760e01b8152600260048201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635ac86ab790602401602060405180830381865afa1580156109f8573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a1c91906135d1565b15610a3a5760405163840a48d560e01b815260040160405180910390fd5b8584148015610a4857508382145b610a65576040516343714afd60e01b815260040160405180910390fd5b603a546001600160401b03600160401b9091048116908a1611610a9b576040516337e07ffd60e01b815260040160405180910390fd5b610aad610aa78a610c3c565b896119db565b5f805b87811015610b4557610b318a358a8a84818110610acf57610acf613673565b9050602002016020810190610ae49190613687565b898985818110610af657610af6613673565b9050602002810190610b089190613631565b898987818110610b1a57610b1a613673565b9050602002810190610b2c91906135ec565b611d27565b610b3b90836136bf565b9150600101610ab0565b5060335460405163a1ca780b60e01b81526001600160a01b0391821660048201525f6024820152604481018390527f00000000000000000000000000000000000000000000000000000000000000009091169063a1ca780b906064015f604051808303815f87803b158015610bb8575f5ffd5b505af1158015610bca573d5f5f3e3d5ffd5b5050505050505050505050505050565b5f5f610c1a84848080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152506121dc92505050565b5f90815260366020526040902054600160c01b900460ff169150505b92915050565b5f610c4a611fff600c6136d2565b610c5d6001600160401b038416426136e9565b10610c7b57604051637944e66d60e11b815260040160405180910390fd5b604080516001600160401b03841660208201525f918291720f3df6d732807ef1319fb7b8bb8522d0beac02910160408051601f1981840301815290829052610cc291613713565b5f60405180830381855afa9150503d805f8114610cfa576040519150601f19603f3d011682016040523d82523d5f602084013e610cff565b606091505b5091509150818015610d1157505f8151115b610d2e5760405163558ad0a360e01b815260040160405180910390fd5b80806020019051810190610d42919061371e565b949350505050565b610d71604080516080810182525f8082526020820181905291810182905290606082015290565b5f82815260366020908152604091829020825160808101845281546001600160401b038082168352600160401b8204811694830194909452600160801b810490931693810193909352906060830190600160c01b900460ff166002811115610ddb57610ddb61321c565b6002811115610dec57610dec61321c565b90525092915050565b6033546001600160a01b0316331480610e185750603e546001600160a01b031633145b610e355760405163427a777960e01b815260040160405180910390fd5b604051635ac86ab760e01b8152600660048201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635ac86ab790602401602060405180830381865afa158015610e9b573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ebf91906135d1565b15610edd5760405163840a48d560e01b815260040160405180910390fd5b610ee682611ba7565b5050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610f3357604051633213a66160e21b815260040160405180910390fd5b346801bc16d674ec80000014610f5c5760405163049696b360e31b815260040160405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663228951186801bc16d674ec8000008787610f9f61226d565b8888886040518863ffffffff1660e01b8152600401610fc39695949392919061378b565b5f604051808303818588803b158015610fda575f5ffd5b505af1158015610fec573d5f5f3e3d5ffd5b50505050507f606865b7934a25d4aed43f6cdb426403353fa4b3009c4d228407474581b01e2385856040516110229291906137d9565b60405180910390a15050505050565b611058604080516080810182525f8082526020820181905291810182905290606082015290565b60365f61109985858080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152506121dc92505050565b815260208082019290925260409081015f20815160808101835281546001600160401b038082168352600160401b8204811695830195909552600160801b81049094169281019290925290916060830190600160c01b900460ff1660028111156111055761110561321c565b60028111156111165761111661321c565b9052509392505050565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461116957604051633213a66160e21b815260040160405180910390fd5b5f611178633b9aca0083613800565b9050611191633b9aca006001600160401b0383166136d2565b6034549092506001600160401b0390811690821611156111c4576040516302c6f54760e21b815260040160405180910390fd5b603480548291905f906111e19084906001600160401b0316613813565b92506101000a8154816001600160401b0302191690836001600160401b03160217905550826001600160a01b03167f8947fd2ce07ef9cc302c4e8f0461015615d91ce851564839e91cc804c2f49d8e8360405161124091815260200190565b60405180910390a261125283836122b1565b505050565b5f54610100900460ff161580801561127557505f54600160ff909116105b8061128e5750303b15801561128e57505f5460ff166001145b6112f65760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b5f805460ff191660011790558015611317575f805461ff0019166101001790555b6001600160a01b03821661133e576040516339b190bb60e11b815260040160405180910390fd5b603380546001600160a01b0319166001600160a01b0384161790558015610ee6575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15050565b6033546001600160a01b031633146113cc5760405163719f370360e11b815260040160405180910390fd5b603e54604080516001600160a01b03928316815291831660208301527ffb8129080a19d34dceac04ba253fc50304dc86c729bd63cdca4a969ad19a5eac910160405180910390a1603e80546001600160a01b0319166001600160a01b0392909216919091179055565b6033546001600160a01b031633146114605760405163719f370360e11b815260040160405180910390fd5b604051635ac86ab760e01b8152600560048201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635ac86ab790602401602060405180830381865afa1580156114c6573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114ea91906135d1565b156115085760405163840a48d560e01b815260040160405180910390fd5b825184511461152a576040516343714afd60e01b815260040160405180910390fd5b5f5b845181101561158d576115858385838151811061154b5761154b613673565b602002602001015187848151811061156557611565613673565b60200260200101516001600160a01b03166123c69092919063ffffffff16565b60010161152c565b5050505050565b604051635ac86ab760e01b8152600760048201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635ac86ab790602401602060405180830381865afa1580156115fa573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061161e91906135d1565b1561163c5760405163840a48d560e01b815260040160405180910390fd5b603a54600160401b90046001600160401b03165f81900361167057604051631a544f4960e01b815260040160405180910390fd5b6040805160a081018252603c54808252603d5462ffffff811660208401526001600160401b0363010000008204811694840194909452600160581b810460070b6060840152600160981b90049092166080820152906116cf9087612418565b5f805b8581101561193857368787838181106116ed576116ed613673565b90506020028101906116ff9190613832565b80355f908152603660209081526040808320815160808101835281546001600160401b038082168352600160401b8204811695830195909552600160801b8104909416928101929092529394509192906060830190600160c01b900460ff16600281111561176f5761176f61321c565b60028111156117805761178061321c565b905250905060018160600151600281111561179d5761179d61321c565b146117a9575050611930565b856001600160401b031681604001516001600160401b0316106117cd575050611930565b5f80806117dd848a8f35886124c9565b60208b01805193965091945092506117f482613850565b62ffffff1690525060808801805184919061181090839061386d565b6001600160401b031690525060608801805183919061183090839061388c565b60070b905250611840818861386d565b85355f908152603660209081526040918290208751815492890151938901516001600160401b03908116600160801b0267ffffffffffffffff60801b19958216600160401b026001600160801b0319909516919092161792909217928316821781556060880151939a50879390929091839160ff60c01b1990911668ffffffffffffffffff60801b1990911617600160c01b8360028111156118e4576118e461321c565b021790555050845160405164ffffffffff90911691506001600160401b038b16907fa91c59033c3423e18b54d0acecebb4972f9ea95aedf5f4cae3b677b02eaf3a3f905f90a350505050505b6001016116d2565b506001600160401b038084165f908152603b60205260408120805484939192916119649185911661386d565b92506101000a8154816001600160401b0302191690836001600160401b03160217905550610949826125ec565b5f815f815181106119a4576119a4613673565b60200260200101519050919050565b5f816003815181106119c7576119c7613673565b60200260200101515f5f1b14159050919050565b6119e7600360206136d2565b6119f46020830183613631565b905014611a14576040516313717da960e21b815260040160405180910390fd5b611a63611a246020830183613631565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152508692505084359050600361281b565b610ee6576040516309bde33960e01b815260040160405180910390fd5b60088414611aa15760405163200591bd60e01b815260040160405180910390fd5b6005611aaf602860016136bf565b611ab991906136bf565b611ac49060206136d2565b8214611ae3576040516313717da960e21b815260040160405180910390fd5b5f611b1f8686808060200260200160405190810160405280939291908181526020018383602002808284375f9201919091525061283292505050565b90505f64ffffffffff8316611b36602860016136bf565b600b901b179050611b8085858080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152508c925086915085905061281b565b611b9d576040516309bde33960e01b815260040160405180910390fd5b5050505050505050565b603a54600160401b90046001600160401b031615611bd75760405162be9bc360e81b815260040160405180910390fd5b603a546001600160401b03428116911603611c05576040516367db5b8b60e01b815260040160405180910390fd5b6034545f906001600160401b0316611c21633b9aca0047613800565b611c2b9190613813565b9050818015611c4157506001600160401b038116155b15611c5f576040516332dea95960e21b815260040160405180910390fd5b5f6040518060a00160405280611c7442610c3c565b815260395462ffffff1660208201526001600160401b0380851660408301525f60608301819052608090920191909152603a805442909216600160401b026fffffffffffffffff0000000000000000199092169190911790559050611cd8816125ec565b805160208083015160405162ffffff90911681526001600160401b034216917f575796133bbed337e5b39aa49a30dc2556a91e0c6c2af4b7b886ae77ebef1076910160405180910390a3505050565b5f5f611d648484808060200260200160405190810160405280939291908181526020018383602002808284375f9201919091525061199192505050565b5f818152603660209081526040808320815160808101835281546001600160401b038082168352600160401b8204811695830195909552600160801b8104909416928101929092529394509192906060830190600160c01b900460ff166002811115611dd257611dd261321c565b6002811115611de357611de361321c565b90525090505f81606001516002811115611dff57611dff61321c565b14611e1d576040516335e09e9d60e01b815260040160405180910390fd5b6001600160401b038016611e628686808060200260200160405190810160405280939291908181526020018383602002808284375f92019190915250612ac292505050565b6001600160401b031603611e8957604051631958236d60e21b815260040160405180910390fd5b6001600160401b038016611ece8686808060200260200160405190810160405280939291908181526020018383602002808284375f92019190915250612ae692505050565b6001600160401b031614611ef557604051632eade63760e01b815260040160405180910390fd5b611efd61226d565b611f06906138bb565b611f418686808060200260200160405190810160405280939291908181526020018383602002808284375f92019190915250612afd92505050565b14611f5f57604051633772dd5360e11b815260040160405180910390fd5b5f611f9b8686808060200260200160405190810160405280939291908181526020018383602002808284375f92019190915250612b1192505050565b9050611fab8a87878b8b8e611a80565b60398054905f611fba836138de565b9091555050603a545f90600160401b90046001600160401b031615611ff157603a54600160401b90046001600160401b0316611ffe565b603a546001600160401b03165b6040805160808101825264ffffffffff8d1681526001600160401b03858116602083015283169181019190915290915060608101600190525f858152603660209081526040918290208351815492850151938501516001600160401b03908116600160801b0267ffffffffffffffff60801b19958216600160401b026001600160801b031990951691909216179290921792831682178155606084015190929091839160ff60c01b1990911668ffffffffffffffffff60801b1990911617600160c01b8360028111156120d3576120d361321c565b021790555050603d80548492506013906120fe908490600160981b90046001600160401b031661386d565b92506101000a8154816001600160401b0302191690836001600160401b031602179055507f2d0800bbc377ea54a08c5db6a87aafff5e3e9c8fead0eda110e40e0c104414498a60405161215e919064ffffffffff91909116815260200190565b60405180910390a16040805164ffffffffff8c1681526001600160401b03838116602083015284168183015290517f0e5fac175b83177cc047381e030d8fb3b42b37bd1c025e22c280facad62c32df9181900360600190a16121cd633b9aca006001600160401b0384166136d2565b9b9a5050505050505050505050565b5f81516030146121ff57604051634f88323960e11b815260040160405180910390fd5b6040516002906122159084905f906020016138f6565b60408051601f198184030181529082905261222f91613713565b602060405180830381855afa15801561224a573d5f5f3e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610c36919061371e565b60408051600160f81b60208201525f602182015230606090811b6bffffffffffffffffffffffff1916602c8301529101604051602081830303815290604052905090565b804710156123015760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e636500000060448201526064016112ed565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f811461234a576040519150601f19603f3d011682016040523d82523d5f602084013e61234f565b606091505b50509050806112525760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d6179206861766520726576657274656400000000000060648201526084016112ed565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052611252908490612b28565b612424600560036136bf565b61242f9060206136d2565b61243c6020830183613631565b90501461245c576040516313717da960e21b815260040160405180910390fd5b606c6124ac61246e6020840184613631565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525087925050853590508461281b565b611252576040516309bde33960e01b815260040160405180910390fd5b83516020850151905f908190816124e1878388612bfb565b9050846001600160401b0316816001600160401b03161461255b57612506858261391a565b6040805164ffffffffff851681526001600160401b038b8116602083015284168183015290519195507f0e5fac175b83177cc047381e030d8fb3b42b37bd1c025e22c280facad62c32df919081900360600190a15b6001600160401b0380821660208b0181905290891660408b01525f036125e05760398054905f61258a83613949565b9091555050600260608a015261259f8461395e565b92508164ffffffffff16886001600160401b03167f2a02361ffa66cf2c2da4682c2355a6adcaa9f6c227b6e6563e68480f9587626a60405160405180910390a35b50509450945094915050565b602081015162ffffff161561268c578051603c556020810151603d80546040840151606085015160809095015162ffffff9094166affffffffffffffffffffff199092169190911763010000006001600160401b0392831602176fffffffffffffffffffffffffffffffff60581b1916600160581b9482169490940267ffffffffffffffff60981b191693909317600160981b9390921692909202179055565b60808101516034545f916126a8916001600160401b031661386d565b90505f826060015183604001516126bf919061388c565b60408401516034805492935090915f906126e39084906001600160401b031661386d565b82546101009290920a6001600160401b03818102199093169183160217909155603a8054600160401b810483166001600160801b03199091161790555f915061273390633b9aca009085166136d2565b90505f612748633b9aca00600785900b613983565b603a546040518281529192506001600160401b0316907f525408c201bc1576eb44116f6478f1c2a54775b19a043bcfdc708364f74f8e449060200160405180910390a260335460405163a1ca780b60e01b81526001600160a01b03918216600482015260248101849052604481018390527f00000000000000000000000000000000000000000000000000000000000000009091169063a1ca780b906064015f604051808303815f87803b1580156127fe575f5ffd5b505af1158015612810573d5f5f3e3d5ffd5b505050505050505050565b5f83612828868585612cd9565b1495945050505050565b5f5f600283516128429190613800565b90505f816001600160401b0381111561285d5761285d6133c8565b604051908082528060200260200182016040528015612886578160200160208202803683370190505b5090505f5b82811015612980576002856128a083836136d2565b815181106128b0576128b0613673565b6020026020010151868360026128c691906136d2565b6128d19060016136bf565b815181106128e1576128e1613673565b6020026020010151604051602001612903929190918252602082015260400190565b60408051601f198184030181529082905261291d91613713565b602060405180830381855afa158015612938573d5f5f3e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061295b919061371e565b82828151811061296d5761296d613673565b602090810291909101015260010161288b565b5061298c600283613800565b91505b8115612a9f575f5b82811015612a8c576002826129ac83836136d2565b815181106129bc576129bc613673565b6020026020010151838360026129d291906136d2565b6129dd9060016136bf565b815181106129ed576129ed613673565b6020026020010151604051602001612a0f929190918252602082015260400190565b60408051601f1981840301815290829052612a2991613713565b602060405180830381855afa158015612a44573d5f5f3e3d5ffd5b5050506040513d601f19601f82011682018060405250810190612a67919061371e565b828281518110612a7957612a79613673565b6020908102919091010152600101612997565b50612a98600283613800565b915061298f565b805f81518110612ab157612ab1613673565b602002602001015192505050919050565b5f610c3682600581518110612ad957612ad9613673565b6020026020010151612dad565b5f610c3682600681518110612ad957612ad9613673565b5f816001815181106119a4576119a4613673565b5f610c3682600281518110612ad957612ad9613673565b5f612b7c826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316612e149092919063ffffffff16565b905080515f1480612b9c575080806020019051810190612b9c91906135d1565b6112525760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016112ed565b5f612c08602660016136bf565b612c139060206136d2565b612c206040840184613631565b905014612c40576040516313717da960e21b815260040160405180910390fd5b5f612c4c6004856139b2565b64ffffffffff169050612ca5612c656040850185613631565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250899250505060208601358461281b565b612cc2576040516309bde33960e01b815260040160405180910390fd5b612cd0836020013585612e22565b95945050505050565b5f83515f14158015612cf6575060208451612cf491906139db565b155b612d13576040516313717da960e21b815260040160405180910390fd5b604080516020808201909252848152905b85518111612da357612d376002856139db565b5f03612d695781515f528086015160205260208260405f60026107d05a03fa612d5e575f5ffd5b600284049350612d91565b808601515f52815160205260208260405f60026107d05a03fa612d8a575f5ffd5b6002840493505b612d9c6020826136bf565b9050612d24565b5051949350505050565b60f881901c60e882901c61ff00161760d882901c62ff0000161760c882901c63ff000000161764ff0000000060b883901c161765ff000000000060a883901c161766ff000000000000609883901c161767ff0000000000000060889290921c919091161790565b6060610d4284845f85612e4e565b5f80612e2f6004846139ee565b612e3a906040613a17565b64ffffffffff169050610d4284821b612dad565b606082471015612eaf5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b60648201526084016112ed565b5f5f866001600160a01b03168587604051612eca9190613713565b5f6040518083038185875af1925050503d805f8114612f04576040519150601f19603f3d011682016040523d82523d5f602084013e612f09565b606091505b5091509150612f1a87838387612f25565b979650505050505050565b60608315612f935782515f03612f8c576001600160a01b0385163b612f8c5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016112ed565b5081610d42565b610d428383815115612fa85781518083602001fd5b8060405162461bcd60e51b81526004016112ed9190613a37565b80356001600160401b0381168114612fd8575f5ffd5b919050565b5f60408284031215612fed575f5ffd5b50919050565b5f5f5f60608486031215613005575f5ffd5b61300e84612fc2565b925060208401356001600160401b03811115613028575f5ffd5b61303486828701612fdd565b92505060408401356001600160401b0381111561304f575f5ffd5b61305b86828701612fdd565b9150509250925092565b5f5f83601f840112613075575f5ffd5b5081356001600160401b0381111561308b575f5ffd5b6020830191508360208260051b85010111156130a5575f5ffd5b9250929050565b5f5f5f5f5f5f5f5f60a0898b0312156130c3575f5ffd5b6130cc89612fc2565b975060208901356001600160401b038111156130e6575f5ffd5b6130f28b828c01612fdd565b97505060408901356001600160401b0381111561310d575f5ffd5b6131198b828c01613065565b90975095505060608901356001600160401b03811115613137575f5ffd5b6131438b828c01613065565b90955093505060808901356001600160401b03811115613161575f5ffd5b61316d8b828c01613065565b999c989b5096995094979396929594505050565b5f60208284031215613191575f5ffd5b61319a82612fc2565b9392505050565b5f5f83601f8401126131b1575f5ffd5b5081356001600160401b038111156131c7575f5ffd5b6020830191508360208285010111156130a5575f5ffd5b5f5f602083850312156131ef575f5ffd5b82356001600160401b03811115613204575f5ffd5b613210858286016131a1565b90969095509350505050565b634e487b7160e01b5f52602160045260245ffd5b6003811061324c57634e487b7160e01b5f52602160045260245ffd5b9052565b60208101610c368284613230565b5f6020828403121561326e575f5ffd5b5035919050565b5f6080820190506001600160401b0383511682526001600160401b0360208401511660208301526001600160401b03604084015116604083015260608301516132c16060840182613230565b5092915050565b80151581146132d5575f5ffd5b50565b5f602082840312156132e8575f5ffd5b813561319a816132c8565b5f5f5f5f5f60608688031215613307575f5ffd5b85356001600160401b0381111561331c575f5ffd5b613328888289016131a1565b90965094505060208601356001600160401b03811115613346575f5ffd5b613352888289016131a1565b96999598509660400135949350505050565b6001600160a01b03811681146132d5575f5ffd5b8035612fd881613364565b5f5f60408385031215613394575f5ffd5b823561339f81613364565b946020939093013593505050565b5f602082840312156133bd575f5ffd5b813561319a81613364565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f191681016001600160401b0381118282101715613404576134046133c8565b604052919050565b5f6001600160401b03821115613424576134246133c8565b5060051b60200190565b5f82601f83011261343d575f5ffd5b813561345061344b8261340c565b6133dc565b8082825260208201915060208360051b860101925085831115613471575f5ffd5b602085015b8381101561348e578035835260209283019201613476565b5095945050505050565b5f5f5f606084860312156134aa575f5ffd5b83356001600160401b038111156134bf575f5ffd5b8401601f810186136134cf575f5ffd5b80356134dd61344b8261340c565b8082825260208201915060208360051b8501019250888311156134fe575f5ffd5b6020840193505b8284101561352957833561351881613364565b825260209384019390910190613505565b955050505060208401356001600160401b03811115613546575f5ffd5b6135528682870161342e565b92505061356160408501613378565b90509250925092565b5f5f5f6040848603121561357c575f5ffd5b83356001600160401b03811115613591575f5ffd5b61359d86828701612fdd565b93505060208401356001600160401b038111156135b8575f5ffd5b6135c486828701613065565b9497909650939450505050565b5f602082840312156135e1575f5ffd5b815161319a816132c8565b5f5f8335601e19843603018112613601575f5ffd5b8301803591506001600160401b0382111561361a575f5ffd5b6020019150600581901b36038213156130a5575f5ffd5b5f5f8335601e19843603018112613646575f5ffd5b8301803591506001600160401b0382111561365f575f5ffd5b6020019150368190038213156130a5575f5ffd5b634e487b7160e01b5f52603260045260245ffd5b5f60208284031215613697575f5ffd5b813564ffffffffff8116811461319a575f5ffd5b634e487b7160e01b5f52601160045260245ffd5b80820180821115610c3657610c366136ab565b8082028115828204841417610c3657610c366136ab565b81810381811115610c3657610c366136ab565b5f81518060208401855e5f93019283525090919050565b5f61319a82846136fc565b5f6020828403121561372e575f5ffd5b5051919050565b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b608081525f61379e60808301888a613735565b82810360208401526137b0818861375d565b905082810360408401526137c5818688613735565b915050826060830152979650505050505050565b602081525f610d42602083018486613735565b634e487b7160e01b5f52601260045260245ffd5b5f8261380e5761380e6137ec565b500490565b6001600160401b038281168282160390811115610c3657610c366136ab565b5f8235605e19833603018112613846575f5ffd5b9190910192915050565b5f62ffffff821680613864576138646136ab565b5f190192915050565b6001600160401b038181168382160190811115610c3657610c366136ab565b600781810b9083900b01677fffffffffffffff8113677fffffffffffffff1982121715610c3657610c366136ab565b80516020808301519190811015612fed575f1960209190910360031b1b16919050565b5f600182016138ef576138ef6136ab565b5060010190565b5f61390182856136fc565b6001600160801b03199390931683525050601001919050565b600782810b9082900b03677fffffffffffffff198112677fffffffffffffff82131715610c3657610c366136ab565b5f81613957576139576136ab565b505f190190565b5f8160070b677fffffffffffffff19810361397b5761397b6136ab565b5f0392915050565b8082025f8212600160ff1b8414161561399e5761399e6136ab565b8181058314821517610c3657610c366136ab565b5f64ffffffffff8316806139c8576139c86137ec565b8064ffffffffff84160491505092915050565b5f826139e9576139e96137ec565b500690565b5f64ffffffffff831680613a0457613a046137ec565b8064ffffffffff84160691505092915050565b64ffffffffff81811683821602908116908181146132c1576132c16136ab565b602081525f61319a602083018461375d56fea264697066735822122007815605a1d21d99dfb435f0a8187ba9bf7f85f2c035861388eafeb2f157218d64736f6c634300081b0033", } // 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 8af51abafd..5647956988 100644 --- a/pkg/bindings/EigenPodManager/binding.go +++ b/pkg/bindings/EigenPodManager/binding.go @@ -32,7 +32,7 @@ var ( // EigenPodManagerMetaData contains all meta data concerning the EigenPodManager contract. var EigenPodManagerMetaData = &bind.MetaData{ ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"_ethPOS\",\"type\":\"address\",\"internalType\":\"contractIETHPOSDeposit\"},{\"name\":\"_eigenPodBeacon\",\"type\":\"address\",\"internalType\":\"contractIBeacon\"},{\"name\":\"_delegationManager\",\"type\":\"address\",\"internalType\":\"contractIDelegationManager\"},{\"name\":\"_pauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"addShares\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"shares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"beaconChainETHStrategy\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"beaconChainSlashingFactor\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"burnableETHShares\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"createPod\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"delegationManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIDelegationManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"eigenPodBeacon\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIBeacon\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"ethPOS\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIETHPOSDeposit\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getPod\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIEigenPod\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"hasPod\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"increaseBurnableShares\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"addedSharesToBurn\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"initialOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_initPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"numPods\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"ownerToPod\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIEigenPod\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"pauseAll\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[{\"name\":\"index\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pauserRegistry\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"podOwnerDepositShares\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"shares\",\"type\":\"int256\",\"internalType\":\"int256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"recordBeaconChainETHBalanceUpdate\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"prevRestakedBalanceWei\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"balanceDeltaWei\",\"type\":\"int256\",\"internalType\":\"int256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"removeDepositShares\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"depositSharesToRemove\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"stake\",\"inputs\":[{\"name\":\"pubkey\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"depositDataRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"stakerDepositShares\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"depositShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"withdrawSharesAsTokens\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"shares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"BeaconChainETHDeposited\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BeaconChainETHWithdrawalCompleted\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"shares\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"nonce\",\"type\":\"uint96\",\"indexed\":false,\"internalType\":\"uint96\"},{\"name\":\"delegatedAddress\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"withdrawer\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"withdrawalRoot\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BeaconChainSlashingFactorDecreased\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"prevBeaconChainSlashingFactor\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"newBeaconChainSlashingFactor\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BurnableETHSharesIncreased\",\"inputs\":[{\"name\":\"shares\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"NewTotalShares\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newTotalShares\",\"type\":\"int256\",\"indexed\":false,\"internalType\":\"int256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"PodDeployed\",\"inputs\":[{\"name\":\"eigenPod\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"podOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"PodSharesUpdated\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"sharesDelta\",\"type\":\"int256\",\"indexed\":false,\"internalType\":\"int256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"CurrentlyPaused\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"EigenPodAlreadyExists\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InputAddressZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidNewPausedStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidStrategy\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"LegacyWithdrawalsNotCompleted\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyDelegationManager\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyEigenPod\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyPauser\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyUnpauser\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SharesNegative\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SharesNotMultipleOfGwei\",\"inputs\":[]}]", - Bin: "0x610100604052348015610010575f5ffd5b50604051612a80380380612a8083398101604081905261002f9161015c565b838383836001600160a01b03811661005a576040516339b190bb60e11b815260040160405180910390fd5b6001600160a01b0390811660805292831660a05290821660c0521660e052610080610089565b505050506101b8565b5f54610100900460ff16156100f45760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff90811614610143575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b0381168114610159575f5ffd5b50565b5f5f5f5f6080858703121561016f575f5ffd5b845161017a81610145565b602086015190945061018b81610145565b604086015190935061019c81610145565b60608601519092506101ad81610145565b939692955090935050565b60805160a05160c05160e0516128486102385f395f8181610530015281816106dd0152818161092501528181610a8101528181610df801528181610ea5015261116c01525f81816101f001528181610f6b015261167001525f61033701525f818161037e01528181610612015281816109cb015261127201526128485ff3fe6080604052600436106101ba575f3560e01c80639b4e4634116100f2578063d48e889411610092578063f5d4fed311610062578063f5d4fed314610571578063f6848d2414610586578063fabc1cbc146105bf578063fe243a17146105de575f5ffd5b8063d48e8894146104d5578063debe1eab14610500578063ea4d3c9b1461051f578063f2fde38b14610552575f5ffd5b8063a38406a3116100cd578063a38406a31461044a578063a3d75e0914610469578063a6a509be146104a1578063cd6dc687146104b6575f5ffd5b80639b4e4634146103e45780639ba06275146103f7578063a1ca780b1461042b575f5ffd5b8063715018a61161015d57806384d810621161013857806384d8106214610359578063886f11951461036d5780638da5cb5b146103a05780639104c319146103bd575f5ffd5b8063715018a6146102f3578063724af4231461030757806374cdd79814610326575f5ffd5b806350ff72251161019857806350ff72251461024e578063595c6a67146102825780635ac86ab7146102965780635c975abb146102d5575f5ffd5b8063136439dd146101be578063292b7b2b146101df5780632eae418c1461022f575b5f5ffd5b3480156101c9575f5ffd5b506101dd6101d8366004611af4565b6105fd565b005b3480156101ea575f5ffd5b506102127f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020015b60405180910390f35b34801561023a575f5ffd5b506101dd610249366004611b1f565b6106d2565b348015610259575f5ffd5b5061026d610268366004611b6d565b610918565b60408051928352602083019190915201610226565b34801561028d575f5ffd5b506101dd6109b6565b3480156102a1575f5ffd5b506102c56102b0366004611bab565b606654600160ff9092169190911b9081161490565b6040519015158152602001610226565b3480156102e0575f5ffd5b506066545b604051908152602001610226565b3480156102fe575f5ffd5b506101dd610a65565b348015610312575f5ffd5b506101dd610321366004611b6d565b610a76565b348015610331575f5ffd5b506102127f000000000000000000000000000000000000000000000000000000000000000081565b348015610364575f5ffd5b50610212610b9c565b348015610378575f5ffd5b506102127f000000000000000000000000000000000000000000000000000000000000000081565b3480156103ab575f5ffd5b506033546001600160a01b0316610212565b3480156103c8575f5ffd5b5061021273beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac081565b6101dd6103f2366004611c09565b610c0c565b348015610402575f5ffd5b50610212610411366004611c7c565b60986020525f90815260409020546001600160a01b031681565b348015610436575f5ffd5b506101dd610445366004611c97565b610cc9565b348015610455575f5ffd5b50610212610464366004611c7c565b610f11565b348015610474575f5ffd5b50610488610483366004611c7c565b610fe2565b60405167ffffffffffffffff9091168152602001610226565b3480156104ac575f5ffd5b506102e560995481565b3480156104c1575f5ffd5b506101dd6104d0366004611cc9565b611045565b3480156104e0575f5ffd5b506102e56104ef366004611c7c565b609b6020525f908152604090205481565b34801561050b575f5ffd5b506101dd61051a366004611cc9565b611161565b34801561052a575f5ffd5b506102127f000000000000000000000000000000000000000000000000000000000000000081565b34801561055d575f5ffd5b506101dd61056c366004611c7c565b6111f7565b34801561057c575f5ffd5b506102e5609e5481565b348015610591575f5ffd5b506102c56105a0366004611c7c565b6001600160a01b039081165f9081526098602052604090205416151590565b3480156105ca575f5ffd5b506101dd6105d9366004611af4565b611270565b3480156105e9575f5ffd5b506102e56105f8366004611cf3565b611386565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa15801561065f573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106839190611d2a565b6106a057604051631d77d47760e21b815260040160405180910390fd5b60665481811681146106c55760405163c61dca5d60e01b815260040160405180910390fd5b6106ce82611406565b5050565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461071b5760405163f739589b60e01b815260040160405180910390fd5b6001600160a01b03831673beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac01461075857604051632711b74d60e11b815260040160405180910390fd5b6001600160a01b03841661077f576040516339b190bb60e11b815260040160405180910390fd5b5f811361079f5760405163ef147de160e01b815260040160405180910390fd5b6001600160a01b0384165f908152609b6020526040812054908290821215610899575f6107cb83611d5d565b90505f818511156107e95750806107e28186611d77565b92506107ef565b505f9150835b5f6107fa8286611d8a565b6001600160a01b038a165f818152609b60205260409081902083905551919250907f4e2b791dedccd9fb30141b088cabf5c14a8912b52f59375c95c010700b8c61939061084a9085815260200190565b60405180910390a2886001600160a01b03167fd4def76d6d2bed6f14d5cd9af73cc2913d618d00edde42432e81c09bfe0770988260405161088d91815260200190565b60405180910390a25050505b8015610910576001600160a01b038681165f81815260986020526040908190205490516362483a2160e11b81526004810192909252602482018490529091169063c4907442906044015f604051808303815f87803b1580156108f9575f5ffd5b505af115801561090b573d5f5f3e3d5ffd5b505050505b505050505050565b5f80336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146109635760405163f739589b60e01b815260040160405180910390fd5b6001600160a01b03841673beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac0146109a057604051632711b74d60e11b815260040160405180910390fd5b6109aa8584611443565b91509150935093915050565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa158015610a18573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a3c9190611d2a565b610a5957604051631d77d47760e21b815260040160405180910390fd5b610a635f19611406565b565b610a6d611580565b610a635f6115da565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610abf5760405163f739589b60e01b815260040160405180910390fd5b6001600160a01b03821673beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac014610afc57604051632711b74d60e11b815260040160405180910390fd5b6001600160a01b0383165f908152609b6020526040812054610b1f908390611db1565b90505f811215610b425760405163ef147de160e01b815260040160405180910390fd5b6001600160a01b0384165f818152609b602052604090819020839055517fd4def76d6d2bed6f14d5cd9af73cc2913d618d00edde42432e81c09bfe07709890610b8e9084815260200190565b60405180910390a250505050565b6066545f908190600190811603610bc65760405163840a48d560e01b815260040160405180910390fd5b335f908152609860205260409020546001600160a01b031615610bfc5760405163031a852160e21b815260040160405180910390fd5b5f610c0561162b565b9250505090565b6066545f90600190811603610c345760405163840a48d560e01b815260040160405180910390fd5b335f908152609860205260409020546001600160a01b031680610c5c57610c5961162b565b90505b6040516326d3918d60e21b81526001600160a01b03821690639b4e4634903490610c92908b908b908b908b908b90600401611dff565b5f604051808303818588803b158015610ca9575f5ffd5b505af1158015610cbb573d5f5f3e3d5ffd5b505050505050505050505050565b6001600160a01b038084165f908152609860205260409020548491163314610d04576040516312e16d7160e11b815260040160405180910390fd5b610d0c611786565b6001600160a01b038416610d33576040516339b190bb60e11b815260040160405180910390fd5b610d41633b9aca0083611e4c565b15610d5f576040516347d072bb60e11b815260040160405180910390fd5b6001600160a01b0384165f908152609b602052604081205490811215610d9857604051634b692bcf60e01b815260040160405180910390fd5b5f8312610e58575f5f610dab8786611443565b604051631e328e7960e11b81526001600160a01b038a8116600483015273beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac0602483015260448201849052606482018390529294509092507f000000000000000000000000000000000000000000000000000000000000000090911690633c651cf2906084015f604051808303815f87803b158015610e3b575f5ffd5b505af1158015610e4d573d5f5f3e3d5ffd5b505050505050610f00565b5f610e6c8686610e6787611d5d565b6117df565b60405163305068e760e11b81526001600160a01b0388811660048301526024820185905267ffffffffffffffff831660448301529192507f0000000000000000000000000000000000000000000000000000000000000000909116906360a0d1ce906064015f604051808303815f87803b158015610ee8575f5ffd5b505af1158015610efa573d5f5f3e3d5ffd5b50505050505b50610f0b600160c955565b50505050565b6001600160a01b038082165f9081526098602052604081205490911680610fdc57610fd9836001600160a01b03165f1b60405180610940016040528061090e8152602001611f0561090e9139604080516001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000166020820152808201919091525f606082015260800160408051601f1981840301815290829052610fbe9291602001611e82565b604051602081830303815290604052805190602001206118d8565b90505b92915050565b6001600160a01b0381165f908152609d6020908152604080832081518083019092525460ff8116151580835261010090910467ffffffffffffffff16928201929092529061103857670de0b6b3a764000061103e565b80602001515b9392505050565b5f54610100900460ff161580801561106357505f54600160ff909116105b8061107c5750303b15801561107c57505f5460ff166001145b6110e45760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b5f805460ff191660011790558015611105575f805461ff0019166101001790555b61110e836115da565b61111782611406565b801561115c575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146111aa5760405163f739589b60e01b815260040160405180910390fd5b80609e5f8282546111bb9190611e9e565b90915550506040518181527f1ed04b7fd262c0d9e50fa02957f32a81a151f03baaa367faeedc7521b001c4a49060200160405180910390a15050565b6111ff611580565b6001600160a01b0381166112645760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016110db565b61126d816115da565b50565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156112cc573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906112f09190611eb1565b6001600160a01b0316336001600160a01b0316146113215760405163794821ff60e01b815260040160405180910390fd5b606654801982198116146113485760405163c61dca5d60e01b815260040160405180910390fd5b606682905560405182815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c9060200160405180910390a25050565b5f6001600160a01b03821673beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac0146113c457604051632711b74d60e11b815260040160405180910390fd5b6001600160a01b0383165f908152609b6020526040812054126113fe576001600160a01b0383165f908152609b6020526040902054610fd9565b505f92915050565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a250565b5f806001600160a01b03841661146c576040516339b190bb60e11b815260040160405180910390fd5b5f83121561148d5760405163ef147de160e01b815260040160405180910390fd5b6001600160a01b0384165f908152609b602052604081205484916114b18383611d8a565b6001600160a01b0388165f818152609b60205260409081902083905551919250907f4e2b791dedccd9fb30141b088cabf5c14a8912b52f59375c95c010700b8c6193906115019086815260200190565b60405180910390a2866001600160a01b03167fd4def76d6d2bed6f14d5cd9af73cc2913d618d00edde42432e81c09bfe0770988260405161154491815260200190565b60405180910390a25f8113611561575f5f94509450505050611579565b5f821261156e5781611570565b5f5b86945094505050505b9250929050565b6033546001600160a01b03163314610a635760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016110db565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b5f60995f815461163a90611ecc565b9091555060408051610940810190915261090e8082525f916116d79183913391611f056020830139604080516001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000166020820152808201919091525f606082015260800160408051601f19818403018152908290526116c39291602001611e82565b6040516020818303038152906040526118e4565b60405163189acdbd60e31b81523360048201529091506001600160a01b0382169063c4d66de8906024015f604051808303815f87803b158015611718575f5ffd5b505af115801561172a573d5f5f3e3d5ffd5b5050335f8181526098602052604080822080546001600160a01b0319166001600160a01b038816908117909155905192945092507f21c99d0db02213c32fff5b05cf0a718ab5f858802b91498f80d82270289d856a91a3919050565b600260c954036117d85760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016110db565b600260c955565b5f806117eb8385611d77565b90505f6117f786610fe2565b90505f61180f67ffffffffffffffff831684886119e6565b90505f61181c8284611ee4565b6040805180820182526001815267ffffffffffffffff85811660208084018281526001600160a01b038f165f818152609d845287902095518654925168ffffffffffffffffff1990931690151568ffffffffffffffff001916176101009286169290920291909117909455845193845291881691830191909152918101919091529091507fb160ab8589bf47dc04ea11b50d46678d21590cea2ed3e454e7bd3e41510f98cf9060600160405180910390a1979650505050505050565b5f610fd9838330611acb565b5f834710156119355760405162461bcd60e51b815260206004820152601d60248201527f437265617465323a20696e73756666696369656e742062616c616e636500000060448201526064016110db565b81515f036119855760405162461bcd60e51b815260206004820181905260248201527f437265617465323a2062797465636f6465206c656e677468206973207a65726f60448201526064016110db565b8282516020840186f590506001600160a01b03811661103e5760405162461bcd60e51b815260206004820152601960248201527f437265617465323a204661696c6564206f6e206465706c6f790000000000000060448201526064016110db565b5f80805f19858709858702925082811083820303915050805f03611a1d57838281611a1357611a13611e38565b049250505061103e565b808411611a645760405162461bcd60e51b81526020600482015260156024820152744d6174683a206d756c446976206f766572666c6f7760581b60448201526064016110db565b5f8486880960026001871981018816978890046003810283188082028403028082028403028082028403028082028403028082028403029081029092039091025f889003889004909101858311909403939093029303949094049190911702949350505050565b5f604051836040820152846020820152828152600b8101905060ff815360559020949350505050565b5f60208284031215611b04575f5ffd5b5035919050565b6001600160a01b038116811461126d575f5ffd5b5f5f5f5f60808587031215611b32575f5ffd5b8435611b3d81611b0b565b93506020850135611b4d81611b0b565b92506040850135611b5d81611b0b565b9396929550929360600135925050565b5f5f5f60608486031215611b7f575f5ffd5b8335611b8a81611b0b565b92506020840135611b9a81611b0b565b929592945050506040919091013590565b5f60208284031215611bbb575f5ffd5b813560ff8116811461103e575f5ffd5b5f5f83601f840112611bdb575f5ffd5b50813567ffffffffffffffff811115611bf2575f5ffd5b602083019150836020828501011115611579575f5ffd5b5f5f5f5f5f60608688031215611c1d575f5ffd5b853567ffffffffffffffff811115611c33575f5ffd5b611c3f88828901611bcb565b909650945050602086013567ffffffffffffffff811115611c5e575f5ffd5b611c6a88828901611bcb565b96999598509660400135949350505050565b5f60208284031215611c8c575f5ffd5b813561103e81611b0b565b5f5f5f60608486031215611ca9575f5ffd5b8335611cb481611b0b565b95602085013595506040909401359392505050565b5f5f60408385031215611cda575f5ffd5b8235611ce581611b0b565b946020939093013593505050565b5f5f60408385031215611d04575f5ffd5b8235611d0f81611b0b565b91506020830135611d1f81611b0b565b809150509250929050565b5f60208284031215611d3a575f5ffd5b8151801515811461103e575f5ffd5b634e487b7160e01b5f52601160045260245ffd5b5f600160ff1b8201611d7157611d71611d49565b505f0390565b81810381811115610fdc57610fdc611d49565b8082018281125f831280158216821582161715611da957611da9611d49565b505092915050565b8181035f831280158383131683831282161715611dd057611dd0611d49565b5092915050565b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b606081525f611e12606083018789611dd7565b8281036020840152611e25818688611dd7565b9150508260408301529695505050505050565b634e487b7160e01b5f52601260045260245ffd5b5f82611e6657634e487b7160e01b5f52601260045260245ffd5b500790565b5f81518060208401855e5f93019283525090919050565b5f611e96611e908386611e6b565b84611e6b565b949350505050565b80820180821115610fdc57610fdc611d49565b5f60208284031215611ec1575f5ffd5b815161103e81611b0b565b5f60018201611edd57611edd611d49565b5060010190565b67ffffffffffffffff8281168282160390811115610fdc57610fdc611d4956fe608060405260405161090e38038061090e83398101604081905261002291610460565b61002e82826000610035565b505061058a565b61003e83610100565b6040516001600160a01b038416907f1cf3b03a6cf19fa2baba4df148e9dcabedea7f8a5c07840e207e5c089be95d3e90600090a260008251118061007f5750805b156100fb576100f9836001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156100c5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906100e99190610520565b836102a360201b6100291760201c565b505b505050565b610113816102cf60201b6100551760201c565b6101725760405162461bcd60e51b815260206004820152602560248201527f455243313936373a206e657720626561636f6e206973206e6f74206120636f6e6044820152641d1c9858dd60da1b60648201526084015b60405180910390fd5b6101e6816001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156101b3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101d79190610520565b6102cf60201b6100551760201c565b61024b5760405162461bcd60e51b815260206004820152603060248201527f455243313936373a20626561636f6e20696d706c656d656e746174696f6e206960448201526f1cc81b9bdd08184818dbdb9d1c9858dd60821b6064820152608401610169565b806102827fa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d5060001b6102de60201b6100641760201c565b80546001600160a01b0319166001600160a01b039290921691909117905550565b60606102c883836040518060600160405280602781526020016108e7602791396102e1565b9392505050565b6001600160a01b03163b151590565b90565b6060600080856001600160a01b0316856040516102fe919061053b565b600060405180830381855af49150503d8060008114610339576040519150601f19603f3d011682016040523d82523d6000602084013e61033e565b606091505b5090925090506103508683838761035a565b9695505050505050565b606083156103c65782516103bf576001600160a01b0385163b6103bf5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610169565b50816103d0565b6103d083836103d8565b949350505050565b8151156103e85781518083602001fd5b8060405162461bcd60e51b81526004016101699190610557565b80516001600160a01b038116811461041957600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b60005b8381101561044f578181015183820152602001610437565b838111156100f95750506000910152565b6000806040838503121561047357600080fd5b61047c83610402565b60208401519092506001600160401b038082111561049957600080fd5b818501915085601f8301126104ad57600080fd5b8151818111156104bf576104bf61041e565b604051601f8201601f19908116603f011681019083821181831017156104e7576104e761041e565b8160405282815288602084870101111561050057600080fd5b610511836020830160208801610434565b80955050505050509250929050565b60006020828403121561053257600080fd5b6102c882610402565b6000825161054d818460208701610434565b9190910192915050565b6020815260008251806020840152610576816040850160208701610434565b601f01601f19169190910160400192915050565b61034e806105996000396000f3fe60806040523661001357610011610017565b005b6100115b610027610022610067565b610100565b565b606061004e83836040518060600160405280602781526020016102f260279139610124565b9392505050565b6001600160a01b03163b151590565b90565b600061009a7fa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50546001600160a01b031690565b6001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156100d7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906100fb9190610249565b905090565b3660008037600080366000845af43d6000803e80801561011f573d6000f35b3d6000fd5b6060600080856001600160a01b03168560405161014191906102a2565b600060405180830381855af49150503d806000811461017c576040519150601f19603f3d011682016040523d82523d6000602084013e610181565b606091505b50915091506101928683838761019c565b9695505050505050565b6060831561020d578251610206576001600160a01b0385163b6102065760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064015b60405180910390fd5b5081610217565b610217838361021f565b949350505050565b81511561022f5781518083602001fd5b8060405162461bcd60e51b81526004016101fd91906102be565b60006020828403121561025b57600080fd5b81516001600160a01b038116811461004e57600080fd5b60005b8381101561028d578181015183820152602001610275565b8381111561029c576000848401525b50505050565b600082516102b4818460208701610272565b9190910192915050565b60208152600082518060208401526102dd816040850160208701610272565b601f01601f1916919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220d51e81d3bc5ed20a26aeb05dce7e825c503b2061aa78628027300c8d65b9d89a64736f6c634300080c0033416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220c10753c1588e150a208dc7d0ab8d62bffcd4a69283e4546798037820234d43be64736f6c634300081b0033", + Bin: "0x610100604052348015610010575f5ffd5b50604051612a80380380612a8083398101604081905261002f9161015c565b838383836001600160a01b03811661005a576040516339b190bb60e11b815260040160405180910390fd5b6001600160a01b0390811660805292831660a05290821660c0521660e052610080610089565b505050506101b8565b5f54610100900460ff16156100f45760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff90811614610143575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b0381168114610159575f5ffd5b50565b5f5f5f5f6080858703121561016f575f5ffd5b845161017a81610145565b602086015190945061018b81610145565b604086015190935061019c81610145565b60608601519092506101ad81610145565b939692955090935050565b60805160a05160c05160e0516128486102385f395f8181610530015281816106dd0152818161092501528181610a8101528181610df801528181610ea5015261116c01525f81816101f001528181610f6b015261167001525f61033701525f818161037e01528181610612015281816109cb015261127201526128485ff3fe6080604052600436106101ba575f3560e01c80639b4e4634116100f2578063d48e889411610092578063f5d4fed311610062578063f5d4fed314610571578063f6848d2414610586578063fabc1cbc146105bf578063fe243a17146105de575f5ffd5b8063d48e8894146104d5578063debe1eab14610500578063ea4d3c9b1461051f578063f2fde38b14610552575f5ffd5b8063a38406a3116100cd578063a38406a31461044a578063a3d75e0914610469578063a6a509be146104a1578063cd6dc687146104b6575f5ffd5b80639b4e4634146103e45780639ba06275146103f7578063a1ca780b1461042b575f5ffd5b8063715018a61161015d57806384d810621161013857806384d8106214610359578063886f11951461036d5780638da5cb5b146103a05780639104c319146103bd575f5ffd5b8063715018a6146102f3578063724af4231461030757806374cdd79814610326575f5ffd5b806350ff72251161019857806350ff72251461024e578063595c6a67146102825780635ac86ab7146102965780635c975abb146102d5575f5ffd5b8063136439dd146101be578063292b7b2b146101df5780632eae418c1461022f575b5f5ffd5b3480156101c9575f5ffd5b506101dd6101d8366004611af4565b6105fd565b005b3480156101ea575f5ffd5b506102127f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020015b60405180910390f35b34801561023a575f5ffd5b506101dd610249366004611b1f565b6106d2565b348015610259575f5ffd5b5061026d610268366004611b6d565b610918565b60408051928352602083019190915201610226565b34801561028d575f5ffd5b506101dd6109b6565b3480156102a1575f5ffd5b506102c56102b0366004611bab565b606654600160ff9092169190911b9081161490565b6040519015158152602001610226565b3480156102e0575f5ffd5b506066545b604051908152602001610226565b3480156102fe575f5ffd5b506101dd610a65565b348015610312575f5ffd5b506101dd610321366004611b6d565b610a76565b348015610331575f5ffd5b506102127f000000000000000000000000000000000000000000000000000000000000000081565b348015610364575f5ffd5b50610212610b9c565b348015610378575f5ffd5b506102127f000000000000000000000000000000000000000000000000000000000000000081565b3480156103ab575f5ffd5b506033546001600160a01b0316610212565b3480156103c8575f5ffd5b5061021273beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac081565b6101dd6103f2366004611c09565b610c0c565b348015610402575f5ffd5b50610212610411366004611c7c565b60986020525f90815260409020546001600160a01b031681565b348015610436575f5ffd5b506101dd610445366004611c97565b610cc9565b348015610455575f5ffd5b50610212610464366004611c7c565b610f11565b348015610474575f5ffd5b50610488610483366004611c7c565b610fe2565b60405167ffffffffffffffff9091168152602001610226565b3480156104ac575f5ffd5b506102e560995481565b3480156104c1575f5ffd5b506101dd6104d0366004611cc9565b611045565b3480156104e0575f5ffd5b506102e56104ef366004611c7c565b609b6020525f908152604090205481565b34801561050b575f5ffd5b506101dd61051a366004611cc9565b611161565b34801561052a575f5ffd5b506102127f000000000000000000000000000000000000000000000000000000000000000081565b34801561055d575f5ffd5b506101dd61056c366004611c7c565b6111f7565b34801561057c575f5ffd5b506102e5609e5481565b348015610591575f5ffd5b506102c56105a0366004611c7c565b6001600160a01b039081165f9081526098602052604090205416151590565b3480156105ca575f5ffd5b506101dd6105d9366004611af4565b611270565b3480156105e9575f5ffd5b506102e56105f8366004611cf3565b611386565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa15801561065f573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106839190611d2a565b6106a057604051631d77d47760e21b815260040160405180910390fd5b60665481811681146106c55760405163c61dca5d60e01b815260040160405180910390fd5b6106ce82611406565b5050565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461071b5760405163f739589b60e01b815260040160405180910390fd5b6001600160a01b03831673beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac01461075857604051632711b74d60e11b815260040160405180910390fd5b6001600160a01b03841661077f576040516339b190bb60e11b815260040160405180910390fd5b5f811361079f5760405163ef147de160e01b815260040160405180910390fd5b6001600160a01b0384165f908152609b6020526040812054908290821215610899575f6107cb83611d5d565b90505f818511156107e95750806107e28186611d77565b92506107ef565b505f9150835b5f6107fa8286611d8a565b6001600160a01b038a165f818152609b60205260409081902083905551919250907f4e2b791dedccd9fb30141b088cabf5c14a8912b52f59375c95c010700b8c61939061084a9085815260200190565b60405180910390a2886001600160a01b03167fd4def76d6d2bed6f14d5cd9af73cc2913d618d00edde42432e81c09bfe0770988260405161088d91815260200190565b60405180910390a25050505b8015610910576001600160a01b038681165f81815260986020526040908190205490516362483a2160e11b81526004810192909252602482018490529091169063c4907442906044015f604051808303815f87803b1580156108f9575f5ffd5b505af115801561090b573d5f5f3e3d5ffd5b505050505b505050505050565b5f80336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146109635760405163f739589b60e01b815260040160405180910390fd5b6001600160a01b03841673beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac0146109a057604051632711b74d60e11b815260040160405180910390fd5b6109aa8584611443565b91509150935093915050565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa158015610a18573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a3c9190611d2a565b610a5957604051631d77d47760e21b815260040160405180910390fd5b610a635f19611406565b565b610a6d611580565b610a635f6115da565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610abf5760405163f739589b60e01b815260040160405180910390fd5b6001600160a01b03821673beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac014610afc57604051632711b74d60e11b815260040160405180910390fd5b6001600160a01b0383165f908152609b6020526040812054610b1f908390611db1565b90505f811215610b425760405163ef147de160e01b815260040160405180910390fd5b6001600160a01b0384165f818152609b602052604090819020839055517fd4def76d6d2bed6f14d5cd9af73cc2913d618d00edde42432e81c09bfe07709890610b8e9084815260200190565b60405180910390a250505050565b6066545f908190600190811603610bc65760405163840a48d560e01b815260040160405180910390fd5b335f908152609860205260409020546001600160a01b031615610bfc5760405163031a852160e21b815260040160405180910390fd5b5f610c0561162b565b9250505090565b6066545f90600190811603610c345760405163840a48d560e01b815260040160405180910390fd5b335f908152609860205260409020546001600160a01b031680610c5c57610c5961162b565b90505b6040516326d3918d60e21b81526001600160a01b03821690639b4e4634903490610c92908b908b908b908b908b90600401611dff565b5f604051808303818588803b158015610ca9575f5ffd5b505af1158015610cbb573d5f5f3e3d5ffd5b505050505050505050505050565b6001600160a01b038084165f908152609860205260409020548491163314610d04576040516312e16d7160e11b815260040160405180910390fd5b610d0c611786565b6001600160a01b038416610d33576040516339b190bb60e11b815260040160405180910390fd5b610d41633b9aca0083611e4c565b15610d5f576040516347d072bb60e11b815260040160405180910390fd5b6001600160a01b0384165f908152609b602052604081205490811215610d9857604051634b692bcf60e01b815260040160405180910390fd5b5f8312610e58575f5f610dab8786611443565b604051631e328e7960e11b81526001600160a01b038a8116600483015273beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac0602483015260448201849052606482018390529294509092507f000000000000000000000000000000000000000000000000000000000000000090911690633c651cf2906084015f604051808303815f87803b158015610e3b575f5ffd5b505af1158015610e4d573d5f5f3e3d5ffd5b505050505050610f00565b5f610e6c8686610e6787611d5d565b6117df565b60405163305068e760e11b81526001600160a01b0388811660048301526024820185905267ffffffffffffffff831660448301529192507f0000000000000000000000000000000000000000000000000000000000000000909116906360a0d1ce906064015f604051808303815f87803b158015610ee8575f5ffd5b505af1158015610efa573d5f5f3e3d5ffd5b50505050505b50610f0b600160c955565b50505050565b6001600160a01b038082165f9081526098602052604081205490911680610fdc57610fd9836001600160a01b03165f1b60405180610940016040528061090e8152602001611f0561090e9139604080516001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000166020820152808201919091525f606082015260800160408051601f1981840301815290829052610fbe9291602001611e82565b604051602081830303815290604052805190602001206118d8565b90505b92915050565b6001600160a01b0381165f908152609d6020908152604080832081518083019092525460ff8116151580835261010090910467ffffffffffffffff16928201929092529061103857670de0b6b3a764000061103e565b80602001515b9392505050565b5f54610100900460ff161580801561106357505f54600160ff909116105b8061107c5750303b15801561107c57505f5460ff166001145b6110e45760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b5f805460ff191660011790558015611105575f805461ff0019166101001790555b61110e836115da565b61111782611406565b801561115c575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146111aa5760405163f739589b60e01b815260040160405180910390fd5b80609e5f8282546111bb9190611e9e565b90915550506040518181527f1ed04b7fd262c0d9e50fa02957f32a81a151f03baaa367faeedc7521b001c4a49060200160405180910390a15050565b6111ff611580565b6001600160a01b0381166112645760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016110db565b61126d816115da565b50565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156112cc573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906112f09190611eb1565b6001600160a01b0316336001600160a01b0316146113215760405163794821ff60e01b815260040160405180910390fd5b606654801982198116146113485760405163c61dca5d60e01b815260040160405180910390fd5b606682905560405182815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c9060200160405180910390a25050565b5f6001600160a01b03821673beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac0146113c457604051632711b74d60e11b815260040160405180910390fd5b6001600160a01b0383165f908152609b6020526040812054126113fe576001600160a01b0383165f908152609b6020526040902054610fd9565b505f92915050565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a250565b5f806001600160a01b03841661146c576040516339b190bb60e11b815260040160405180910390fd5b5f83121561148d5760405163ef147de160e01b815260040160405180910390fd5b6001600160a01b0384165f908152609b602052604081205484916114b18383611d8a565b6001600160a01b0388165f818152609b60205260409081902083905551919250907f4e2b791dedccd9fb30141b088cabf5c14a8912b52f59375c95c010700b8c6193906115019086815260200190565b60405180910390a2866001600160a01b03167fd4def76d6d2bed6f14d5cd9af73cc2913d618d00edde42432e81c09bfe0770988260405161154491815260200190565b60405180910390a25f8113611561575f5f94509450505050611579565b5f821261156e5781611570565b5f5b86945094505050505b9250929050565b6033546001600160a01b03163314610a635760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016110db565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b5f60995f815461163a90611ecc565b9091555060408051610940810190915261090e8082525f916116d79183913391611f056020830139604080516001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000166020820152808201919091525f606082015260800160408051601f19818403018152908290526116c39291602001611e82565b6040516020818303038152906040526118e4565b60405163189acdbd60e31b81523360048201529091506001600160a01b0382169063c4d66de8906024015f604051808303815f87803b158015611718575f5ffd5b505af115801561172a573d5f5f3e3d5ffd5b5050335f8181526098602052604080822080546001600160a01b0319166001600160a01b038816908117909155905192945092507f21c99d0db02213c32fff5b05cf0a718ab5f858802b91498f80d82270289d856a91a3919050565b600260c954036117d85760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016110db565b600260c955565b5f806117eb8385611d77565b90505f6117f786610fe2565b90505f61180f67ffffffffffffffff831684886119e6565b90505f61181c8284611ee4565b6040805180820182526001815267ffffffffffffffff85811660208084018281526001600160a01b038f165f818152609d845287902095518654925168ffffffffffffffffff1990931690151568ffffffffffffffff001916176101009286169290920291909117909455845193845291881691830191909152918101919091529091507fb160ab8589bf47dc04ea11b50d46678d21590cea2ed3e454e7bd3e41510f98cf9060600160405180910390a1979650505050505050565b5f610fd9838330611acb565b5f834710156119355760405162461bcd60e51b815260206004820152601d60248201527f437265617465323a20696e73756666696369656e742062616c616e636500000060448201526064016110db565b81515f036119855760405162461bcd60e51b815260206004820181905260248201527f437265617465323a2062797465636f6465206c656e677468206973207a65726f60448201526064016110db565b8282516020840186f590506001600160a01b03811661103e5760405162461bcd60e51b815260206004820152601960248201527f437265617465323a204661696c6564206f6e206465706c6f790000000000000060448201526064016110db565b5f80805f19858709858702925082811083820303915050805f03611a1d57838281611a1357611a13611e38565b049250505061103e565b808411611a645760405162461bcd60e51b81526020600482015260156024820152744d6174683a206d756c446976206f766572666c6f7760581b60448201526064016110db565b5f8486880960026001871981018816978890046003810283188082028403028082028403028082028403028082028403028082028403029081029092039091025f889003889004909101858311909403939093029303949094049190911702949350505050565b5f604051836040820152846020820152828152600b8101905060ff815360559020949350505050565b5f60208284031215611b04575f5ffd5b5035919050565b6001600160a01b038116811461126d575f5ffd5b5f5f5f5f60808587031215611b32575f5ffd5b8435611b3d81611b0b565b93506020850135611b4d81611b0b565b92506040850135611b5d81611b0b565b9396929550929360600135925050565b5f5f5f60608486031215611b7f575f5ffd5b8335611b8a81611b0b565b92506020840135611b9a81611b0b565b929592945050506040919091013590565b5f60208284031215611bbb575f5ffd5b813560ff8116811461103e575f5ffd5b5f5f83601f840112611bdb575f5ffd5b50813567ffffffffffffffff811115611bf2575f5ffd5b602083019150836020828501011115611579575f5ffd5b5f5f5f5f5f60608688031215611c1d575f5ffd5b853567ffffffffffffffff811115611c33575f5ffd5b611c3f88828901611bcb565b909650945050602086013567ffffffffffffffff811115611c5e575f5ffd5b611c6a88828901611bcb565b96999598509660400135949350505050565b5f60208284031215611c8c575f5ffd5b813561103e81611b0b565b5f5f5f60608486031215611ca9575f5ffd5b8335611cb481611b0b565b95602085013595506040909401359392505050565b5f5f60408385031215611cda575f5ffd5b8235611ce581611b0b565b946020939093013593505050565b5f5f60408385031215611d04575f5ffd5b8235611d0f81611b0b565b91506020830135611d1f81611b0b565b809150509250929050565b5f60208284031215611d3a575f5ffd5b8151801515811461103e575f5ffd5b634e487b7160e01b5f52601160045260245ffd5b5f600160ff1b8201611d7157611d71611d49565b505f0390565b81810381811115610fdc57610fdc611d49565b8082018281125f831280158216821582161715611da957611da9611d49565b505092915050565b8181035f831280158383131683831282161715611dd057611dd0611d49565b5092915050565b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b606081525f611e12606083018789611dd7565b8281036020840152611e25818688611dd7565b9150508260408301529695505050505050565b634e487b7160e01b5f52601260045260245ffd5b5f82611e6657634e487b7160e01b5f52601260045260245ffd5b500790565b5f81518060208401855e5f93019283525090919050565b5f611e96611e908386611e6b565b84611e6b565b949350505050565b80820180821115610fdc57610fdc611d49565b5f60208284031215611ec1575f5ffd5b815161103e81611b0b565b5f60018201611edd57611edd611d49565b5060010190565b67ffffffffffffffff8281168282160390811115610fdc57610fdc611d4956fe608060405260405161090e38038061090e83398101604081905261002291610460565b61002e82826000610035565b505061058a565b61003e83610100565b6040516001600160a01b038416907f1cf3b03a6cf19fa2baba4df148e9dcabedea7f8a5c07840e207e5c089be95d3e90600090a260008251118061007f5750805b156100fb576100f9836001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156100c5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906100e99190610520565b836102a360201b6100291760201c565b505b505050565b610113816102cf60201b6100551760201c565b6101725760405162461bcd60e51b815260206004820152602560248201527f455243313936373a206e657720626561636f6e206973206e6f74206120636f6e6044820152641d1c9858dd60da1b60648201526084015b60405180910390fd5b6101e6816001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156101b3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101d79190610520565b6102cf60201b6100551760201c565b61024b5760405162461bcd60e51b815260206004820152603060248201527f455243313936373a20626561636f6e20696d706c656d656e746174696f6e206960448201526f1cc81b9bdd08184818dbdb9d1c9858dd60821b6064820152608401610169565b806102827fa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d5060001b6102de60201b6100641760201c565b80546001600160a01b0319166001600160a01b039290921691909117905550565b60606102c883836040518060600160405280602781526020016108e7602791396102e1565b9392505050565b6001600160a01b03163b151590565b90565b6060600080856001600160a01b0316856040516102fe919061053b565b600060405180830381855af49150503d8060008114610339576040519150601f19603f3d011682016040523d82523d6000602084013e61033e565b606091505b5090925090506103508683838761035a565b9695505050505050565b606083156103c65782516103bf576001600160a01b0385163b6103bf5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610169565b50816103d0565b6103d083836103d8565b949350505050565b8151156103e85781518083602001fd5b8060405162461bcd60e51b81526004016101699190610557565b80516001600160a01b038116811461041957600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b60005b8381101561044f578181015183820152602001610437565b838111156100f95750506000910152565b6000806040838503121561047357600080fd5b61047c83610402565b60208401519092506001600160401b038082111561049957600080fd5b818501915085601f8301126104ad57600080fd5b8151818111156104bf576104bf61041e565b604051601f8201601f19908116603f011681019083821181831017156104e7576104e761041e565b8160405282815288602084870101111561050057600080fd5b610511836020830160208801610434565b80955050505050509250929050565b60006020828403121561053257600080fd5b6102c882610402565b6000825161054d818460208701610434565b9190910192915050565b6020815260008251806020840152610576816040850160208701610434565b601f01601f19169190910160400192915050565b61034e806105996000396000f3fe60806040523661001357610011610017565b005b6100115b610027610022610067565b610100565b565b606061004e83836040518060600160405280602781526020016102f260279139610124565b9392505050565b6001600160a01b03163b151590565b90565b600061009a7fa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50546001600160a01b031690565b6001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156100d7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906100fb9190610249565b905090565b3660008037600080366000845af43d6000803e80801561011f573d6000f35b3d6000fd5b6060600080856001600160a01b03168560405161014191906102a2565b600060405180830381855af49150503d806000811461017c576040519150601f19603f3d011682016040523d82523d6000602084013e610181565b606091505b50915091506101928683838761019c565b9695505050505050565b6060831561020d578251610206576001600160a01b0385163b6102065760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064015b60405180910390fd5b5081610217565b610217838361021f565b949350505050565b81511561022f5781518083602001fd5b8060405162461bcd60e51b81526004016101fd91906102be565b60006020828403121561025b57600080fd5b81516001600160a01b038116811461004e57600080fd5b60005b8381101561028d578181015183820152602001610275565b8381111561029c576000848401525b50505050565b600082516102b4818460208701610272565b9190910192915050565b60208152600082518060208401526102dd816040850160208701610272565b601f01601f1916919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220d51e81d3bc5ed20a26aeb05dce7e825c503b2061aa78628027300c8d65b9d89a64736f6c634300080c0033416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a264697066735822122026e4ca77dbd21a235eab6803258d25d7f72c1fe0d91d73a37779c4d6847423fd64736f6c634300081b0033", } // EigenPodManagerABI is the input ABI used to generate the binding from. diff --git a/pkg/bindings/EigenStrategy/binding.go b/pkg/bindings/EigenStrategy/binding.go index db85d6297b..1b2b0002e2 100644 --- a/pkg/bindings/EigenStrategy/binding.go +++ b/pkg/bindings/EigenStrategy/binding.go @@ -32,7 +32,7 @@ var ( // EigenStrategyMetaData contains all meta data concerning the EigenStrategy contract. var EigenStrategyMetaData = &bind.MetaData{ ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"_strategyManager\",\"type\":\"address\",\"internalType\":\"contractIStrategyManager\"},{\"name\":\"_pauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"EIGEN\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIEigen\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"deposit\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"newShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"explanation\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"_EIGEN\",\"type\":\"address\",\"internalType\":\"contractIEigen\"},{\"name\":\"_bEIGEN\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"_underlyingToken\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"pauseAll\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[{\"name\":\"index\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pauserRegistry\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"shares\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"sharesToUnderlying\",\"inputs\":[{\"name\":\"amountShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"sharesToUnderlyingView\",\"inputs\":[{\"name\":\"amountShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"strategyManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategyManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"totalShares\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"underlyingToShares\",\"inputs\":[{\"name\":\"amountUnderlying\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"underlyingToSharesView\",\"inputs\":[{\"name\":\"amountUnderlying\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"underlyingToken\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"userUnderlying\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"userUnderlyingView\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"withdraw\",\"inputs\":[{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amountShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"ExchangeRateEmitted\",\"inputs\":[{\"name\":\"rate\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StrategyTokenSet\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIERC20\"},{\"name\":\"decimals\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"BalanceExceedsMaxTotalDeposits\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"CurrentlyPaused\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InputAddressZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidNewPausedStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"MaxPerDepositExceedsMax\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NewSharesZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyPauser\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyStrategyManager\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyUnderlyingToken\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyUnpauser\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"TotalSharesExceedsMax\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"WithdrawalAmountExceedsTotalDeposits\",\"inputs\":[]}]", - Bin: "0x60c060405234801561000f575f5ffd5b5060405161168d38038061168d83398101604081905261002e9161014f565b8181806001600160a01b038116610058576040516339b190bb60e11b815260040160405180910390fd5b6001600160a01b03908116608052821660a05261007361007c565b50505050610187565b5f54610100900460ff16156100e75760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff90811614610136575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b038116811461014c575f5ffd5b50565b5f5f60408385031215610160575f5ffd5b825161016b81610138565b602084015190925061017c81610138565b809150509250929050565b60805160a0516114bb6101d25f395f818161018b0152818161043e01528181610871015261090e01525f81816102540152818161034b0152818161066a0152610a3c01526114bb5ff3fe608060405234801561000f575f5ffd5b506004361061013d575f3560e01c8063886f1195116100b4578063ce7c2ac211610079578063ce7c2ac2146102c4578063d9caed12146102d7578063e3dae51c146102ea578063f3e73875146102fd578063fabc1cbc14610310578063fdc371ce14610323575f5ffd5b8063886f11951461024f5780638c871019146102765780638f6a624014610289578063ab5921e11461029c578063c4d66de8146102b1575f5ffd5b8063485cc95511610105578063485cc955146101d7578063553ca5f8146101ea578063595c6a67146101fd5780635ac86ab7146102055780635c975abb146102345780637a8b26371461023c575f5ffd5b8063136439dd146101415780632495a5991461015657806339b70e38146101865780633a98ef39146101ad57806347e7ef24146101c4575b5f5ffd5b61015461014f3660046111ab565b610336565b005b603254610169906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b6101697f000000000000000000000000000000000000000000000000000000000000000081565b6101b660335481565b60405190815260200161017d565b6101b66101d23660046111d9565b61040b565b6101546101e5366004611203565b610557565b6101b66101f836600461123a565b610642565b610154610655565b61022461021336600461126a565b6001805460ff9092161b9081161490565b604051901515815260200161017d565b6001546101b6565b6101b661024a3660046111ab565b610704565b6101697f000000000000000000000000000000000000000000000000000000000000000081565b6101b66102843660046111ab565b61074d565b6101b661029736600461123a565b610757565b6102a4610764565b60405161017d9190611285565b6101546102bf36600461123a565b610784565b6101b66102d236600461123a565b61084a565b6101546102e53660046112ba565b6108dc565b6101b66102f83660046111ab565b6109f9565b6101b661030b3660046111ab565b610a30565b61015461031e3660046111ab565b610a3a565b606454610169906001600160a01b031681565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa158015610398573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103bc91906112f8565b6103d957604051631d77d47760e21b815260040160405180910390fd5b60015481811681146103fe5760405163c61dca5d60e01b815260040160405180910390fd5b61040782610b50565b5050565b600180545f9182918116036104335760405163840a48d560e01b815260040160405180910390fd5b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461047c576040516348da714f60e01b815260040160405180910390fd5b6104868484610b8d565b6033545f6104966103e88361132b565b90505f6103e86104a4610c46565b6104ae919061132b565b90505f6104bb878361133e565b9050806104c88489611351565b6104d29190611368565b9550855f036104f457604051630c392ed360e11b815260040160405180910390fd5b6104fe868561132b565b60338190556f4b3b4ca85a86c47a098a223fffffffff101561053357604051632f14e8a360e11b815260040160405180910390fd5b61054c826103e8603354610547919061132b565b610cb5565b505050505092915050565b5f54610100900460ff161580801561057557505f54600160ff909116105b8061058e5750303b15801561058e57505f5460ff166001145b6105b35760405162461bcd60e51b81526004016105aa90611387565b60405180910390fd5b5f805460ff1916600117905580156105d4575f805461ff0019166101001790555b606480546001600160a01b0319166001600160a01b0385161790556105f882610d01565b801561063d575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050565b5f61064f61024a8361084a565b92915050565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa1580156106b7573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106db91906112f8565b6106f857604051631d77d47760e21b815260040160405180910390fd5b6107025f19610b50565b565b5f5f6103e8603354610716919061132b565b90505f6103e8610724610c46565b61072e919061132b565b90508161073b8583611351565b6107459190611368565b949350505050565b5f61064f826109f9565b5f61064f61030b8361084a565b60606040518060800160405280604d8152602001611439604d9139905090565b5f54610100900460ff16158080156107a257505f54600160ff909116105b806107bb5750303b1580156107bb57505f5460ff166001145b6107d75760405162461bcd60e51b81526004016105aa90611387565b5f805460ff1916600117905580156107f8575f805461ff0019166101001790555b61080182610d01565b8015610407575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498906020015b60405180910390a15050565b60405163fe243a1760e01b81526001600160a01b0382811660048301523060248301525f917f00000000000000000000000000000000000000000000000000000000000000009091169063fe243a1790604401602060405180830381865afa1580156108b8573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061064f91906113d5565b600180546002908116036109035760405163840a48d560e01b815260040160405180910390fd5b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461094c576040516348da714f60e01b815260040160405180910390fd5b610957848484610e4c565b6033548083111561097b57604051630b469df360e41b815260040160405180910390fd5b5f6109886103e88361132b565b90505f6103e8610996610c46565b6109a0919061132b565b90505f826109ae8784611351565b6109b89190611368565b90506109c4868561133e565b6033556109e46109d4828461133e565b6103e8603354610547919061132b565b6109ef888883610e92565b5050505050505050565b5f5f6103e8603354610a0b919061132b565b90505f6103e8610a19610c46565b610a23919061132b565b90508061073b8386611351565b5f61064f82610704565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610a96573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610aba91906113ec565b6001600160a01b0316336001600160a01b031614610aeb5760405163794821ff60e01b815260040160405180910390fd5b60015480198219811614610b125760405163c61dca5d60e01b815260040160405180910390fd5b600182905560405182815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c9060200160405180910390a25050565b600181905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a250565b6032546001600160a01b0383811691161480610bb657506064546001600160a01b038381169116145b610bd357604051630312abdd60e61b815260040160405180910390fd5b6064546001600160a01b039081169083160361040757606454604051636f074d1f60e11b8152600481018390526001600160a01b039091169063de0e9a3e906024015f604051808303815f87803b158015610c2c575f5ffd5b505af1158015610c3e573d5f5f3e3d5ffd5b505050505050565b6032546040516370a0823160e01b81523060048201525f916001600160a01b0316906370a0823190602401602060405180830381865afa158015610c8c573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610cb091906113d5565b905090565b7fd2494f3479e5da49d386657c292c610b5b01df313d07c62eb0cfa49924a31be881610ce984670de0b6b3a7640000611351565b610cf39190611368565b60405190815260200161083e565b5f54610100900460ff16610d6b5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b60648201526084016105aa565b603280546001600160a01b0319166001600160a01b038316179055610d8f5f610b50565b7f1c540707b00eb5427b6b774fc799d756516a54aee108b64b327acc55af55750760325f9054906101000a90046001600160a01b0316826001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e01573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e259190611407565b604080516001600160a01b03909316835260ff90911660208301520160405180910390a150565b6032546001600160a01b0383811691161480610e7557506064546001600160a01b038381169116145b61063d57604051630312abdd60e61b815260040160405180910390fd5b6064546001600160a01b0390811690831603610f775760325460405163095ea7b360e01b81526001600160a01b038481166004830152602482018490529091169063095ea7b3906044016020604051808303815f875af1158015610ef8573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f1c91906112f8565b50606454604051630ea598cb60e41b8152600481018390526001600160a01b039091169063ea598cb0906024015f604051808303815f87803b158015610f60575f5ffd5b505af1158015610f72573d5f5f3e3d5ffd5b505050505b604080516001600160a01b03858116602483015260448083018590528351808403909101815260649092018352602080830180516001600160e01b031663a9059cbb60e01b17905283518085019094528084527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65649084015261063d92908516918691859185918591905f9061100f908490849061108e565b905080515f148061102f57508080602001905181019061102f91906112f8565b61063d5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016105aa565b606061074584845f85855f5f866001600160a01b031685876040516110b39190611422565b5f6040518083038185875af1925050503d805f81146110ed576040519150601f19603f3d011682016040523d82523d5f602084013e6110f2565b606091505b50915091506111038783838761110e565b979650505050505050565b6060831561117c5782515f03611175576001600160a01b0385163b6111755760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016105aa565b5081610745565b61074583838151156111915781518083602001fd5b8060405162461bcd60e51b81526004016105aa9190611285565b5f602082840312156111bb575f5ffd5b5035919050565b6001600160a01b03811681146111d6575f5ffd5b50565b5f5f604083850312156111ea575f5ffd5b82356111f5816111c2565b946020939093013593505050565b5f5f60408385031215611214575f5ffd5b823561121f816111c2565b9150602083013561122f816111c2565b809150509250929050565b5f6020828403121561124a575f5ffd5b8135611255816111c2565b9392505050565b60ff811681146111d6575f5ffd5b5f6020828403121561127a575f5ffd5b81356112558161125c565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b5f5f5f606084860312156112cc575f5ffd5b83356112d7816111c2565b925060208401356112e7816111c2565b929592945050506040919091013590565b5f60208284031215611308575f5ffd5b81518015158114611255575f5ffd5b634e487b7160e01b5f52601160045260245ffd5b8082018082111561064f5761064f611317565b8181038181111561064f5761064f611317565b808202811582820484141761064f5761064f611317565b5f8261138257634e487b7160e01b5f52601260045260245ffd5b500490565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b5f602082840312156113e5575f5ffd5b5051919050565b5f602082840312156113fc575f5ffd5b8151611255816111c2565b5f60208284031215611417575f5ffd5b81516112558161125c565b5f82518060208501845e5f92019182525091905056fe4261736520537472617465677920696d706c656d656e746174696f6e20746f20696e68657269742066726f6d20666f72206d6f726520636f6d706c657820696d706c656d656e746174696f6e73a26469706673582212203edc3fd87868d09c295783bf240f3e101b46de41ff8da366fe440e78926982ad64736f6c634300081b0033", + Bin: "0x60c060405234801561000f575f5ffd5b5060405161168d38038061168d83398101604081905261002e9161014f565b8181806001600160a01b038116610058576040516339b190bb60e11b815260040160405180910390fd5b6001600160a01b03908116608052821660a05261007361007c565b50505050610187565b5f54610100900460ff16156100e75760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff90811614610136575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b038116811461014c575f5ffd5b50565b5f5f60408385031215610160575f5ffd5b825161016b81610138565b602084015190925061017c81610138565b809150509250929050565b60805160a0516114bb6101d25f395f818161018b0152818161043e01528181610871015261090e01525f81816102540152818161034b0152818161066a0152610a3c01526114bb5ff3fe608060405234801561000f575f5ffd5b506004361061013d575f3560e01c8063886f1195116100b4578063ce7c2ac211610079578063ce7c2ac2146102c4578063d9caed12146102d7578063e3dae51c146102ea578063f3e73875146102fd578063fabc1cbc14610310578063fdc371ce14610323575f5ffd5b8063886f11951461024f5780638c871019146102765780638f6a624014610289578063ab5921e11461029c578063c4d66de8146102b1575f5ffd5b8063485cc95511610105578063485cc955146101d7578063553ca5f8146101ea578063595c6a67146101fd5780635ac86ab7146102055780635c975abb146102345780637a8b26371461023c575f5ffd5b8063136439dd146101415780632495a5991461015657806339b70e38146101865780633a98ef39146101ad57806347e7ef24146101c4575b5f5ffd5b61015461014f3660046111ab565b610336565b005b603254610169906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b6101697f000000000000000000000000000000000000000000000000000000000000000081565b6101b660335481565b60405190815260200161017d565b6101b66101d23660046111d9565b61040b565b6101546101e5366004611203565b610557565b6101b66101f836600461123a565b610642565b610154610655565b61022461021336600461126a565b6001805460ff9092161b9081161490565b604051901515815260200161017d565b6001546101b6565b6101b661024a3660046111ab565b610704565b6101697f000000000000000000000000000000000000000000000000000000000000000081565b6101b66102843660046111ab565b61074d565b6101b661029736600461123a565b610757565b6102a4610764565b60405161017d9190611285565b6101546102bf36600461123a565b610784565b6101b66102d236600461123a565b61084a565b6101546102e53660046112ba565b6108dc565b6101b66102f83660046111ab565b6109f9565b6101b661030b3660046111ab565b610a30565b61015461031e3660046111ab565b610a3a565b606454610169906001600160a01b031681565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa158015610398573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103bc91906112f8565b6103d957604051631d77d47760e21b815260040160405180910390fd5b60015481811681146103fe5760405163c61dca5d60e01b815260040160405180910390fd5b61040782610b50565b5050565b600180545f9182918116036104335760405163840a48d560e01b815260040160405180910390fd5b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461047c576040516348da714f60e01b815260040160405180910390fd5b6104868484610b8d565b6033545f6104966103e88361132b565b90505f6103e86104a4610c46565b6104ae919061132b565b90505f6104bb878361133e565b9050806104c88489611351565b6104d29190611368565b9550855f036104f457604051630c392ed360e11b815260040160405180910390fd5b6104fe868561132b565b60338190556f4b3b4ca85a86c47a098a223fffffffff101561053357604051632f14e8a360e11b815260040160405180910390fd5b61054c826103e8603354610547919061132b565b610cb5565b505050505092915050565b5f54610100900460ff161580801561057557505f54600160ff909116105b8061058e5750303b15801561058e57505f5460ff166001145b6105b35760405162461bcd60e51b81526004016105aa90611387565b60405180910390fd5b5f805460ff1916600117905580156105d4575f805461ff0019166101001790555b606480546001600160a01b0319166001600160a01b0385161790556105f882610d01565b801561063d575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050565b5f61064f61024a8361084a565b92915050565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa1580156106b7573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106db91906112f8565b6106f857604051631d77d47760e21b815260040160405180910390fd5b6107025f19610b50565b565b5f5f6103e8603354610716919061132b565b90505f6103e8610724610c46565b61072e919061132b565b90508161073b8583611351565b6107459190611368565b949350505050565b5f61064f826109f9565b5f61064f61030b8361084a565b60606040518060800160405280604d8152602001611439604d9139905090565b5f54610100900460ff16158080156107a257505f54600160ff909116105b806107bb5750303b1580156107bb57505f5460ff166001145b6107d75760405162461bcd60e51b81526004016105aa90611387565b5f805460ff1916600117905580156107f8575f805461ff0019166101001790555b61080182610d01565b8015610407575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498906020015b60405180910390a15050565b60405163fe243a1760e01b81526001600160a01b0382811660048301523060248301525f917f00000000000000000000000000000000000000000000000000000000000000009091169063fe243a1790604401602060405180830381865afa1580156108b8573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061064f91906113d5565b600180546002908116036109035760405163840a48d560e01b815260040160405180910390fd5b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461094c576040516348da714f60e01b815260040160405180910390fd5b610957848484610e4c565b6033548083111561097b57604051630b469df360e41b815260040160405180910390fd5b5f6109886103e88361132b565b90505f6103e8610996610c46565b6109a0919061132b565b90505f826109ae8784611351565b6109b89190611368565b90506109c4868561133e565b6033556109e46109d4828461133e565b6103e8603354610547919061132b565b6109ef888883610e92565b5050505050505050565b5f5f6103e8603354610a0b919061132b565b90505f6103e8610a19610c46565b610a23919061132b565b90508061073b8386611351565b5f61064f82610704565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610a96573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610aba91906113ec565b6001600160a01b0316336001600160a01b031614610aeb5760405163794821ff60e01b815260040160405180910390fd5b60015480198219811614610b125760405163c61dca5d60e01b815260040160405180910390fd5b600182905560405182815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c9060200160405180910390a25050565b600181905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a250565b6032546001600160a01b0383811691161480610bb657506064546001600160a01b038381169116145b610bd357604051630312abdd60e61b815260040160405180910390fd5b6064546001600160a01b039081169083160361040757606454604051636f074d1f60e11b8152600481018390526001600160a01b039091169063de0e9a3e906024015f604051808303815f87803b158015610c2c575f5ffd5b505af1158015610c3e573d5f5f3e3d5ffd5b505050505050565b6032546040516370a0823160e01b81523060048201525f916001600160a01b0316906370a0823190602401602060405180830381865afa158015610c8c573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610cb091906113d5565b905090565b7fd2494f3479e5da49d386657c292c610b5b01df313d07c62eb0cfa49924a31be881610ce984670de0b6b3a7640000611351565b610cf39190611368565b60405190815260200161083e565b5f54610100900460ff16610d6b5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b60648201526084016105aa565b603280546001600160a01b0319166001600160a01b038316179055610d8f5f610b50565b7f1c540707b00eb5427b6b774fc799d756516a54aee108b64b327acc55af55750760325f9054906101000a90046001600160a01b0316826001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e01573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e259190611407565b604080516001600160a01b03909316835260ff90911660208301520160405180910390a150565b6032546001600160a01b0383811691161480610e7557506064546001600160a01b038381169116145b61063d57604051630312abdd60e61b815260040160405180910390fd5b6064546001600160a01b0390811690831603610f775760325460405163095ea7b360e01b81526001600160a01b038481166004830152602482018490529091169063095ea7b3906044016020604051808303815f875af1158015610ef8573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f1c91906112f8565b50606454604051630ea598cb60e41b8152600481018390526001600160a01b039091169063ea598cb0906024015f604051808303815f87803b158015610f60575f5ffd5b505af1158015610f72573d5f5f3e3d5ffd5b505050505b604080516001600160a01b03858116602483015260448083018590528351808403909101815260649092018352602080830180516001600160e01b031663a9059cbb60e01b17905283518085019094528084527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65649084015261063d92908516918691859185918591905f9061100f908490849061108e565b905080515f148061102f57508080602001905181019061102f91906112f8565b61063d5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016105aa565b606061074584845f85855f5f866001600160a01b031685876040516110b39190611422565b5f6040518083038185875af1925050503d805f81146110ed576040519150601f19603f3d011682016040523d82523d5f602084013e6110f2565b606091505b50915091506111038783838761110e565b979650505050505050565b6060831561117c5782515f03611175576001600160a01b0385163b6111755760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016105aa565b5081610745565b61074583838151156111915781518083602001fd5b8060405162461bcd60e51b81526004016105aa9190611285565b5f602082840312156111bb575f5ffd5b5035919050565b6001600160a01b03811681146111d6575f5ffd5b50565b5f5f604083850312156111ea575f5ffd5b82356111f5816111c2565b946020939093013593505050565b5f5f60408385031215611214575f5ffd5b823561121f816111c2565b9150602083013561122f816111c2565b809150509250929050565b5f6020828403121561124a575f5ffd5b8135611255816111c2565b9392505050565b60ff811681146111d6575f5ffd5b5f6020828403121561127a575f5ffd5b81356112558161125c565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b5f5f5f606084860312156112cc575f5ffd5b83356112d7816111c2565b925060208401356112e7816111c2565b929592945050506040919091013590565b5f60208284031215611308575f5ffd5b81518015158114611255575f5ffd5b634e487b7160e01b5f52601160045260245ffd5b8082018082111561064f5761064f611317565b8181038181111561064f5761064f611317565b808202811582820484141761064f5761064f611317565b5f8261138257634e487b7160e01b5f52601260045260245ffd5b500490565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b5f602082840312156113e5575f5ffd5b5051919050565b5f602082840312156113fc575f5ffd5b8151611255816111c2565b5f60208284031215611417575f5ffd5b81516112558161125c565b5f82518060208501845e5f92019182525091905056fe4261736520537472617465677920696d706c656d656e746174696f6e20746f20696e68657269742066726f6d20666f72206d6f726520636f6d706c657820696d706c656d656e746174696f6e73a264697066735822122076f7e98368e74126349ea5d562a11c4c3acea991bef004fc2d3c9aeb09c1789064736f6c634300081b0033", } // 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 3783c512c8..e2995571cc 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: "0x6055604b600b8282823980515f1a607314603f577f4e487b71000000000000000000000000000000000000000000000000000000005f525f60045260245ffd5b305f52607381538281f3fe730000000000000000000000000000000000000000301460806040525f5ffdfea2646970667358221220f0e2b6d8f51c7ffaab5e2ad771893da2e6df099524d52b9ed8e5f46dccb9d26e64736f6c634300081b0033", + Bin: "0x60556032600b8282823980515f1a607314602657634e487b7160e01b5f525f60045260245ffd5b305f52607381538281f3fe730000000000000000000000000000000000000000301460806040525f5ffdfea264697066735822122065de58e62fc0153ec81e59074101ab95f4a50a4dc9b195d91698d58ec6e19dcb64736f6c634300081b0033", } // EndianABI is the input ABI used to generate the binding from. diff --git a/pkg/bindings/Merkle/binding.go b/pkg/bindings/Merkle/binding.go index 1ae6fbf85f..d1795f6605 100644 --- a/pkg/bindings/Merkle/binding.go +++ b/pkg/bindings/Merkle/binding.go @@ -32,7 +32,7 @@ var ( // MerkleMetaData contains all meta data concerning the Merkle contract. var MerkleMetaData = &bind.MetaData{ ABI: "[{\"type\":\"error\",\"name\":\"InvalidProofLength\",\"inputs\":[]}]", - Bin: "0x6055604b600b8282823980515f1a607314603f577f4e487b71000000000000000000000000000000000000000000000000000000005f525f60045260245ffd5b305f52607381538281f3fe730000000000000000000000000000000000000000301460806040525f5ffdfea2646970667358221220c42c36c4a77d17b2eaba81f883518752b5335ef110f10184a7f75e0c3c1ca2e364736f6c634300081b0033", + Bin: "0x60556032600b8282823980515f1a607314602657634e487b7160e01b5f525f60045260245ffd5b305f52607381538281f3fe730000000000000000000000000000000000000000301460806040525f5ffdfea26469706673582212208de82ea7f1a22cc126cdf4c3791b57f420fcc4ed980bdbddf119e15f4a112e8964736f6c634300081b0033", } // MerkleABI is the input ABI used to generate the binding from. diff --git a/pkg/bindings/OperatorSetLib/binding.go b/pkg/bindings/OperatorSetLib/binding.go index 638122dc72..a48c2cefdd 100644 --- a/pkg/bindings/OperatorSetLib/binding.go +++ b/pkg/bindings/OperatorSetLib/binding.go @@ -32,7 +32,7 @@ var ( // OperatorSetLibMetaData contains all meta data concerning the OperatorSetLib contract. var OperatorSetLibMetaData = &bind.MetaData{ ABI: "[]", - Bin: "0x6055604b600b8282823980515f1a607314603f577f4e487b71000000000000000000000000000000000000000000000000000000005f525f60045260245ffd5b305f52607381538281f3fe730000000000000000000000000000000000000000301460806040525f5ffdfea264697066735822122024731478a4329a39d9f783a1f71c24d64037cecf0ac3467dbc721be4400a463d64736f6c634300081b0033", + Bin: "0x60556032600b8282823980515f1a607314602657634e487b7160e01b5f525f60045260245ffd5b305f52607381538281f3fe730000000000000000000000000000000000000000301460806040525f5ffdfea264697066735822122023e8e6cb91eee2d3c43ff6cfc219a624b12892e20fd5158ca2b4e1484806bb9c64736f6c634300081b0033", } // OperatorSetLibABI is the input ABI used to generate the binding from. diff --git a/pkg/bindings/PauserRegistry/binding.go b/pkg/bindings/PauserRegistry/binding.go index 784be9c258..a77ccb9e9d 100644 --- a/pkg/bindings/PauserRegistry/binding.go +++ b/pkg/bindings/PauserRegistry/binding.go @@ -32,7 +32,7 @@ var ( // PauserRegistryMetaData contains all meta data concerning the PauserRegistry contract. var PauserRegistryMetaData = &bind.MetaData{ ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"_pausers\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"_unpauser\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"isPauser\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"setIsPauser\",\"inputs\":[{\"name\":\"newPauser\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"canPause\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setUnpauser\",\"inputs\":[{\"name\":\"newUnpauser\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unpauser\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"event\",\"name\":\"PauserStatusChanged\",\"inputs\":[{\"name\":\"pauser\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"canPause\",\"type\":\"bool\",\"indexed\":false,\"internalType\":\"bool\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"UnpauserChanged\",\"inputs\":[{\"name\":\"previousUnpauser\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"newUnpauser\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"InputAddressZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyUnpauser\",\"inputs\":[]}]", - Bin: "0x608060405234801561000f575f5ffd5b50604051610b4d380380610b4d83398181016040528101906100319190610440565b5f5f90505b82518110156100775761006a8382815181106100555761005461049a565b5b6020026020010151600161008e60201b60201c565b8080600101915050610036565b506100878161018360201b60201c565b505061053e565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036100f3576040517f7363217600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805f5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055507f65d3a1fd4c13f05cba164f80d03ce90fb4b5e21946bfc3ab7dbd434c2d0b915282826040516101779291906104f0565b60405180910390a15050565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036101e8576040517f7363217600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f06b4167a2528887a1e97a366eefe8549bfbf1ea3e6ac81cb2564a934d20e889260015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff168260405161023a929190610517565b60405180910390a18060015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b5f604051905090565b5f5ffd5b5f5ffd5b5f5ffd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6102e08261029a565b810181811067ffffffffffffffff821117156102ff576102fe6102aa565b5b80604052505050565b5f610311610285565b905061031d82826102d7565b919050565b5f67ffffffffffffffff82111561033c5761033b6102aa565b5b602082029050602081019050919050565b5f5ffd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f61037a82610351565b9050919050565b61038a81610370565b8114610394575f5ffd5b50565b5f815190506103a581610381565b92915050565b5f6103bd6103b884610322565b610308565b905080838252602082019050602084028301858111156103e0576103df61034d565b5b835b8181101561040957806103f58882610397565b8452602084019350506020810190506103e2565b5050509392505050565b5f82601f83011261042757610426610296565b5b81516104378482602086016103ab565b91505092915050565b5f5f604083850312156104565761045561028e565b5b5f83015167ffffffffffffffff81111561047357610472610292565b5b61047f85828601610413565b925050602061049085828601610397565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b6104d081610370565b82525050565b5f8115159050919050565b6104ea816104d6565b82525050565b5f6040820190506105035f8301856104c7565b61051060208301846104e1565b9392505050565b5f60408201905061052a5f8301856104c7565b61053760208301846104c7565b9392505050565b6106028061054b5f395ff3fe608060405234801561000f575f5ffd5b506004361061004a575f3560e01c806346fbf68e1461004e578063856852061461007e578063ce5484281461009a578063eab66d7a146100b6575b5f5ffd5b61006860048036038101906100639190610490565b6100d4565b60405161007591906104d5565b60405180910390f35b61009860048036038101906100939190610518565b6100f0565b005b6100b460048036038101906100af9190610490565b610184565b005b6100be610216565b6040516100cb9190610565565b60405180910390f35b5f602052805f5260405f205f915054906101000a900460ff1681565b60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610176576040517f794821ff00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610180828261023b565b5050565b60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461020a576040517f794821ff00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61021381610330565b50565b60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036102a0576040517f7363217600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805f5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055507f65d3a1fd4c13f05cba164f80d03ce90fb4b5e21946bfc3ab7dbd434c2d0b9152828260405161032492919061057e565b60405180910390a15050565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610395576040517f7363217600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f06b4167a2528887a1e97a366eefe8549bfbf1ea3e6ac81cb2564a934d20e889260015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16826040516103e79291906105a5565b60405180910390a18060015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b5f5ffd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f61045f82610436565b9050919050565b61046f81610455565b8114610479575f5ffd5b50565b5f8135905061048a81610466565b92915050565b5f602082840312156104a5576104a4610432565b5b5f6104b28482850161047c565b91505092915050565b5f8115159050919050565b6104cf816104bb565b82525050565b5f6020820190506104e85f8301846104c6565b92915050565b6104f7816104bb565b8114610501575f5ffd5b50565b5f81359050610512816104ee565b92915050565b5f5f6040838503121561052e5761052d610432565b5b5f61053b8582860161047c565b925050602061054c85828601610504565b9150509250929050565b61055f81610455565b82525050565b5f6020820190506105785f830184610556565b92915050565b5f6040820190506105915f830185610556565b61059e60208301846104c6565b9392505050565b5f6040820190506105b85f830185610556565b6105c56020830184610556565b939250505056fea26469706673582212208eb48f096bf58e6151bd2afec5787523e61c66bb95654d16b49aeed459f3377e64736f6c634300081b0033", + Bin: "0x608060405234801561000f575f5ffd5b506040516105c83803806105c883398101604081905261002e916101c2565b5f5b825181101561006b5761006383828151811061004e5761004e61029e565b6020026020010151600161007c60201b60201c565b600101610030565b5061007581610103565b50506102b2565b6001600160a01b0382166100a3576040516339b190bb60e11b815260040160405180910390fd5b6001600160a01b0382165f8181526020818152604091829020805460ff19168515159081179091558251938452908301527f65d3a1fd4c13f05cba164f80d03ce90fb4b5e21946bfc3ab7dbd434c2d0b9152910160405180910390a15050565b6001600160a01b03811661012a576040516339b190bb60e11b815260040160405180910390fd5b600154604080516001600160a01b03928316815291831660208301527f06b4167a2528887a1e97a366eefe8549bfbf1ea3e6ac81cb2564a934d20e8892910160405180910390a1600180546001600160a01b0319166001600160a01b0392909216919091179055565b634e487b7160e01b5f52604160045260245ffd5b80516001600160a01b03811681146101bd575f5ffd5b919050565b5f5f604083850312156101d3575f5ffd5b82516001600160401b038111156101e8575f5ffd5b8301601f810185136101f8575f5ffd5b80516001600160401b0381111561021157610211610193565b604051600582901b90603f8201601f191681016001600160401b038111828210171561023f5761023f610193565b60405291825260208184018101929081018884111561025c575f5ffd5b6020850194505b8385101561028257610274856101a7565b815260209485019401610263565b50945061029592505050602084016101a7565b90509250929050565b634e487b7160e01b5f52603260045260245ffd5b610309806102bf5f395ff3fe608060405234801561000f575f5ffd5b506004361061004a575f3560e01c806346fbf68e1461004e5780638568520614610085578063ce5484281461009a578063eab66d7a146100ad575b5f5ffd5b61007061005c36600461027a565b5f6020819052908152604090205460ff1681565b60405190151581526020015b60405180910390f35b61009861009336600461029a565b6100d8565b005b6100986100a836600461027a565b610111565b6001546100c0906001600160a01b031681565b6040516001600160a01b03909116815260200161007c565b6001546001600160a01b031633146101035760405163794821ff60e01b815260040160405180910390fd5b61010d8282610148565b5050565b6001546001600160a01b0316331461013c5760405163794821ff60e01b815260040160405180910390fd5b610145816101cf565b50565b6001600160a01b03821661016f576040516339b190bb60e11b815260040160405180910390fd5b6001600160a01b0382165f8181526020818152604091829020805460ff19168515159081179091558251938452908301527f65d3a1fd4c13f05cba164f80d03ce90fb4b5e21946bfc3ab7dbd434c2d0b9152910160405180910390a15050565b6001600160a01b0381166101f6576040516339b190bb60e11b815260040160405180910390fd5b600154604080516001600160a01b03928316815291831660208301527f06b4167a2528887a1e97a366eefe8549bfbf1ea3e6ac81cb2564a934d20e8892910160405180910390a1600180546001600160a01b0319166001600160a01b0392909216919091179055565b80356001600160a01b0381168114610275575f5ffd5b919050565b5f6020828403121561028a575f5ffd5b6102938261025f565b9392505050565b5f5f604083850312156102ab575f5ffd5b6102b48361025f565b9150602083013580151581146102c8575f5ffd5b80915050925092905056fea264697066735822122009d8ba5b235f31c96a07127caff39f4f0438590d75b714b9d6de67448091f19864736f6c634300081b0033", } // PauserRegistryABI is the input ABI used to generate the binding from. diff --git a/pkg/bindings/PermissionController/binding.go b/pkg/bindings/PermissionController/binding.go index 3fa5899427..21f037d593 100644 --- a/pkg/bindings/PermissionController/binding.go +++ b/pkg/bindings/PermissionController/binding.go @@ -32,7 +32,7 @@ var ( // PermissionControllerMetaData contains all meta data concerning the PermissionController contract. var PermissionControllerMetaData = &bind.MetaData{ ABI: "[{\"type\":\"constructor\",\"inputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"acceptAdmin\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"addPendingAdmin\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"admin\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"canCall\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"caller\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"target\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"selector\",\"type\":\"bytes4\",\"internalType\":\"bytes4\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAdmins\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAppointeePermissions\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"appointee\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"\",\"type\":\"bytes4[]\",\"internalType\":\"bytes4[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAppointees\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"target\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"selector\",\"type\":\"bytes4\",\"internalType\":\"bytes4\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getPendingAdmins\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isAdmin\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"caller\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isPendingAdmin\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"pendingAdmin\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"removeAdmin\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"admin\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"removeAppointee\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"appointee\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"target\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"selector\",\"type\":\"bytes4\",\"internalType\":\"bytes4\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"removePendingAdmin\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"admin\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setAppointee\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"appointee\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"target\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"selector\",\"type\":\"bytes4\",\"internalType\":\"bytes4\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"AdminRemoved\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"admin\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"AdminSet\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"admin\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"AppointeeRemoved\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"appointee\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"target\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"selector\",\"type\":\"bytes4\",\"indexed\":false,\"internalType\":\"bytes4\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"AppointeeSet\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"appointee\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"target\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"selector\",\"type\":\"bytes4\",\"indexed\":false,\"internalType\":\"bytes4\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"PendingAdminAdded\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"admin\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"PendingAdminRemoved\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"admin\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"AdminAlreadyPending\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"AdminAlreadySet\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"AdminNotPending\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"AdminNotSet\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"AppointeeAlreadySet\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"AppointeeNotSet\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"CannotHaveZeroAdmins\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotAdmin\",\"inputs\":[]}]", - Bin: "0x608060405234801561000f575f5ffd5b5061001e61002360201b60201c565b6101b3565b5f60019054906101000a900460ff1615610072576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161006990610161565b60405180910390fd5b60ff80165f5f9054906101000a900460ff1660ff16146100df5760ff5f5f6101000a81548160ff021916908360ff1602179055507f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb384740249860ff6040516100d6919061019a565b60405180910390a15b565b5f82825260208201905092915050565b7f496e697469616c697a61626c653a20636f6e747261637420697320696e6974695f8201527f616c697a696e6700000000000000000000000000000000000000000000000000602082015250565b5f61014b6027836100e1565b9150610156826100f1565b604082019050919050565b5f6020820190508181035f8301526101788161013f565b9050919050565b5f60ff82169050919050565b6101948161017f565b82525050565b5f6020820190506101ad5f83018461018b565b92915050565b611a8c806101c05f395ff3fe608060405234801561000f575f5ffd5b50600436106100cd575f3560e01c8063910067451161008a578063ad8aca7711610064578063ad8aca771461021e578063df595cb81461024e578063eb5a4e871461027e578063fddbdefd1461029a576100cd565b806391006745146101a2578063950d806e146101d2578063ad5f2210146101ee576100cd565b806306641201146100d1578063268959e5146100ed5780634f906cf914610109578063628806ef146101255780636bddfa1f14610141578063882a3b3814610171575b5f5ffd5b6100eb60048036038101906100e691906115f5565b6102ca565b005b61010760048036038101906101029190611659565b6104c7565b005b610123600480360381019061011e9190611659565b61062a565b005b61013f600480360381019061013a9190611697565b61074a565b005b61015b60048036038101906101569190611697565b61083e565b6040516101689190611779565b60405180910390f35b61018b60048036038101906101869190611659565b61088e565b604051610199929190611850565b60405180910390f35b6101bc60048036038101906101b79190611659565b610aa0565b6040516101c9919061189f565b60405180910390f35b6101ec60048036038101906101e791906115f5565b610b80565b005b61020860048036038101906102039190611697565b610d7e565b6040516102159190611779565b60405180910390f35b61023860048036038101906102339190611659565b610ec2565b604051610245919061189f565b60405180910390f35b610268600480360381019061026391906115f5565b610f1c565b604051610275919061189f565b60405180910390f35b61029860048036038101906102939190611659565b610fce565b005b6102b460048036038101906102af91906118b8565b61113b565b6040516102c19190611779565b60405180910390f35b836102d58133610aa0565b61030b576040517f7bfa4b9f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f60015f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2090505f61035685856111ab565b90506103a981836004015f8973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206111ea90919063ffffffff16565b6103df576040517f262118cd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61043081836004015f8973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206111ff90919063ffffffff16565b5061045686836005015f8481526020019081526020015f2061121490919063ffffffff16565b508573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167f18242326b6b862126970679759169f01f646bd55ec5bfcab85ba9f337a74e0c687876040516104b6929190611926565b60405180910390a350505050505050565b816104d28133610aa0565b610508576040517f7bfa4b9f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f60015f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206002019050600161055682611241565b1161058d576040517f8674495800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6105a0838261121490919063ffffffff16565b6105d6576040517fe2db036000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8373ffffffffffffffffffffffffffffffffffffffff167fdb9d5d31320daf5bc7181d565b6da4d12e30f0f4d5aa324a992426c14a1d19ce8460405161061c919061194d565b60405180910390a250505050565b816106358133610aa0565b61066b576040517f7bfa4b9f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f60015f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f0190506106c0838261121490919063ffffffff16565b6106f6576040517fbed8295f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8373ffffffffffffffffffffffffffffffffffffffff167fd706ed7ae044d795b49e54c9f519f663053951011985f663a862cd9ee72a9ac78460405161073c919061194d565b60405180910390a250505050565b5f60015f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20905061079f33825f0161121490919063ffffffff16565b6107d5576040517fbed8295f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6107eb338260020161125490919063ffffffff16565b508173ffffffffffffffffffffffffffffffffffffffff167fbf265e8326285a2747e33e54d5945f7111f2b5edb826eb8c08d4677779b3ff9733604051610832919061194d565b60405180910390a25050565b606061088760015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f01611281565b9050919050565b6060805f60015f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206004015f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2090505f610919826112a0565b90505f8167ffffffffffffffff81111561093657610935611966565b5b6040519080825280602002602001820160405280156109645781602001602082028036833780820191505090505b5090505f8267ffffffffffffffff81111561098257610981611966565b5b6040519080825280602002602001820160405280156109b05781602001602082028036833780820191505090505b5090505f5f90505b83811015610a8e576109db6109d682876112b390919063ffffffff16565b6112c8565b8483815181106109ee576109ed611993565b5b60200260200101848481518110610a0857610a07611993565b5b60200260200101827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168152508273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681525050508060010190506109b8565b50818195509550505050509250929050565b5f5f610aea60015f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20600201611241565b03610b25578173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16149050610b7a565b610b778260015f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206002016112ee90919063ffffffff16565b90505b92915050565b83610b8b8133610aa0565b610bc1576040517f7bfa4b9f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f60015f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2090505f610c0c85856111ab565b9050610c5f81836004015f8973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206111ea90919063ffffffff16565b15610c96576040517fad8efeb700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610ce781836004015f8973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2061131b90919063ffffffff16565b50610d0d86836005015f8481526020019081526020015f2061125490919063ffffffff16565b508573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167f037f03a2ad6b967df4a01779b6d2b4c85950df83925d9e31362b519422fc01698787604051610d6d929190611926565b60405180910390a350505050505050565b60605f610dc960015f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20600201611241565b03610e72575f600167ffffffffffffffff811115610dea57610de9611966565b5b604051908082528060200260200182016040528015610e185781602001602082028036833780820191505090505b50905082815f81518110610e2f57610e2e611993565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505080915050610ebd565b610eba60015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20600201611281565b90505b919050565b5f610f148260015f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f016112ee90919063ffffffff16565b905092915050565b5f610f278585610aa0565b80610fc45750610fc3610f3a84846111ab565b60015f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206004015f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206111ea90919063ffffffff16565b5b9050949350505050565b81610fd98133610aa0565b61100f576040517f7bfa4b9f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f60015f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20905061106583826002016112ee90919063ffffffff16565b1561109c576040517f980b072800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6110b183825f0161125490919063ffffffff16565b6110e7576040517f3357dbc600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8373ffffffffffffffffffffffffffffffffffffffff167fb14b9a3d448c5b04f0e5b087b6f5193390db7955482a6ffb841e7b3ba61a460c8460405161112d919061194d565b60405180910390a250505050565b60605f61114884846111ab565b90506111a160015f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206005015f8381526020019081526020015f20611281565b9150509392505050565b5f5f60608473ffffffffffffffffffffffffffffffffffffffff16901b90505f60408460e01c63ffffffff16901b90508082175f1b9250505092915050565b5f6111f7835f0183611330565b905092915050565b5f61120c835f0183611350565b905092915050565b5f611239835f018373ffffffffffffffffffffffffffffffffffffffff165f1b611350565b905092915050565b5f61124d825f0161144c565b9050919050565b5f611279835f018373ffffffffffffffffffffffffffffffffffffffff165f1b61145b565b905092915050565b60605f61128f835f016114c2565b905060608190508092505050919050565b5f6112ac825f0161144c565b9050919050565b5f6112c0835f018361151b565b905092915050565b5f5f5f6060845f1c901c90505f6040855f1c901c60e01b90508181935093505050915091565b5f611313835f018373ffffffffffffffffffffffffffffffffffffffff165f1b611330565b905092915050565b5f611328835f018361145b565b905092915050565b5f5f836001015f8481526020019081526020015f20541415905092915050565b5f5f836001015f8481526020019081526020015f205490505f8114611441575f60018261137d91906119f6565b90505f6001865f018054905061139391906119f6565b90508181146113f9575f865f0182815481106113b2576113b1611993565b5b905f5260205f200154905080875f0184815481106113d3576113d2611993565b5b905f5260205f20018190555083876001015f8381526020019081526020015f2081905550505b855f0180548061140c5761140b611a29565b5b600190038181905f5260205f20015f90559055856001015f8681526020019081526020015f205f905560019350505050611446565b5f9150505b92915050565b5f815f01805490509050919050565b5f6114668383611330565b6114b857825f0182908060018154018082558091505060019003905f5260205f20015f9091909190915055825f0180549050836001015f8481526020019081526020015f2081905550600190506114bc565b5f90505b92915050565b6060815f0180548060200260200160405190810160405280929190818152602001828054801561150f57602002820191905f5260205f20905b8154815260200190600101908083116114fb575b50505050509050919050565b5f825f01828154811061153157611530611993565b5b905f5260205f200154905092915050565b5f5ffd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f61156f82611546565b9050919050565b61157f81611565565b8114611589575f5ffd5b50565b5f8135905061159a81611576565b92915050565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6115d4816115a0565b81146115de575f5ffd5b50565b5f813590506115ef816115cb565b92915050565b5f5f5f5f6080858703121561160d5761160c611542565b5b5f61161a8782880161158c565b945050602061162b8782880161158c565b935050604061163c8782880161158c565b925050606061164d878288016115e1565b91505092959194509250565b5f5f6040838503121561166f5761166e611542565b5b5f61167c8582860161158c565b925050602061168d8582860161158c565b9150509250929050565b5f602082840312156116ac576116ab611542565b5b5f6116b98482850161158c565b91505092915050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b6116f481611565565b82525050565b5f61170583836116eb565b60208301905092915050565b5f602082019050919050565b5f611727826116c2565b61173181856116cc565b935061173c836116dc565b805f5b8381101561176c57815161175388826116fa565b975061175e83611711565b92505060018101905061173f565b5085935050505092915050565b5f6020820190508181035f830152611791818461171d565b905092915050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b6117cb816115a0565b82525050565b5f6117dc83836117c2565b60208301905092915050565b5f602082019050919050565b5f6117fe82611799565b61180881856117a3565b9350611813836117b3565b805f5b8381101561184357815161182a88826117d1565b9750611835836117e8565b925050600181019050611816565b5085935050505092915050565b5f6040820190508181035f830152611868818561171d565b9050818103602083015261187c81846117f4565b90509392505050565b5f8115159050919050565b61189981611885565b82525050565b5f6020820190506118b25f830184611890565b92915050565b5f5f5f606084860312156118cf576118ce611542565b5b5f6118dc8682870161158c565b93505060206118ed8682870161158c565b92505060406118fe868287016115e1565b9150509250925092565b61191181611565565b82525050565b611920816115a0565b82525050565b5f6040820190506119395f830185611908565b6119466020830184611917565b9392505050565b5f6020820190506119605f830184611908565b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f819050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f611a00826119c0565b9150611a0b836119c0565b9250828203905081811115611a2357611a226119c9565b5b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603160045260245ffdfea26469706673582212204d34614385038f370eaea1f99b8449ed39bdab47f6b52761b1136c9f7bb7b1d664736f6c634300081b0033", + Bin: "0x6080604052348015600e575f5ffd5b5060156019565b60d3565b5f54610100900460ff161560835760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff9081161460d1575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b610f40806100e05f395ff3fe608060405234801561000f575f5ffd5b50600436106100cb575f3560e01c80639100674511610088578063ad8aca7711610063578063ad8aca77146101b0578063df595cb8146101c3578063eb5a4e87146101d6578063fddbdefd146101e9575f5ffd5b80639100674514610167578063950d806e1461018a578063ad5f22101461019d575f5ffd5b806306641201146100cf578063268959e5146100e45780634f906cf9146100f7578063628806ef1461010a5780636bddfa1f1461011d578063882a3b3814610146575b5f5ffd5b6100e26100dd366004610cfa565b6101fc565b005b6100e26100f2366004610d4b565b61031d565b6100e2610105366004610d4b565b6103f8565b6100e2610118366004610d7c565b61049b565b61013061012b366004610d7c565b610529565b60405161013d9190610dd8565b60405180910390f35b610159610154366004610d4b565b610552565b60405161013d929190610dea565b61017a610175366004610d4b565b6106b3565b604051901515815260200161013d565b6100e2610198366004610cfa565b610723565b6101306101ab366004610d7c565b610834565b61017a6101be366004610d4b565b6108da565b61017a6101d1366004610cfa565b6108fb565b6100e26101e4366004610d4b565b610950565b6101306101f7366004610e4c565b610a1e565b8361020781336106b3565b61022457604051637bfa4b9f60e01b815260040160405180910390fd5b6001600160a01b0385165f908152600160205260408120906102468585610a5c565b6001600160a01b0387165f908152600484016020526040902090915061026c9082610a89565b6102895760405163262118cd60e01b815260040160405180910390fd5b6001600160a01b0386165f90815260048301602052604090206102ac9082610aa0565b505f81815260058301602052604090206102c69087610aab565b50856001600160a01b0316876001600160a01b03167f18242326b6b862126970679759169f01f646bd55ec5bfcab85ba9f337a74e0c6878760405161030c929190610e8c565b60405180910390a350505050505050565b8161032881336106b3565b61034557604051637bfa4b9f60e01b815260040160405180910390fd5b6001600160a01b0383165f9081526001602081905260409091206002019061036c82610abf565b1161038a576040516310ce892b60e31b815260040160405180910390fd5b6103948184610aab565b6103b157604051630716d81b60e51b815260040160405180910390fd5b6040516001600160a01b0384811682528516907fdb9d5d31320daf5bc7181d565b6da4d12e30f0f4d5aa324a992426c14a1d19ce906020015b60405180910390a250505050565b8161040381336106b3565b61042057604051637bfa4b9f60e01b815260040160405180910390fd5b6001600160a01b0383165f9081526001602052604090206104418184610aab565b61045e5760405163bed8295f60e01b815260040160405180910390fd5b6040516001600160a01b0384811682528516907fd706ed7ae044d795b49e54c9f519f663053951011985f663a862cd9ee72a9ac7906020016103ea565b6001600160a01b0381165f9081526001602052604090206104bc8133610aab565b6104d95760405163bed8295f60e01b815260040160405180910390fd5b6104e66002820133610ac8565b506040513381526001600160a01b038316907fbf265e8326285a2747e33e54d5945f7111f2b5edb826eb8c08d4677779b3ff979060200160405180910390a25050565b6001600160a01b0381165f90815260016020526040902060609061054c90610adc565b92915050565b6001600160a01b038083165f90815260016020908152604080832093851683526004909301905290812060609182919061058b82610abf565b90505f8167ffffffffffffffff8111156105a7576105a7610eaf565b6040519080825280602002602001820160405280156105d0578160200160208202803683370190505b5090505f8267ffffffffffffffff8111156105ed576105ed610eaf565b604051908082528060200260200182016040528015610616578160200160208202803683370190505b5090505f5b838110156106a5576106496106308683610ae8565b606081901c9160a09190911b6001600160e01b03191690565b84838151811061065b5761065b610ec3565b6020026020010184848151811061067457610674610ec3565b6001600160e01b0319909316602093840291909101909201919091526001600160a01b03909116905260010161061b565b509097909650945050505050565b6001600160a01b0382165f9081526001602052604081206106d690600201610abf565b5f036106f857816001600160a01b0316836001600160a01b031614905061054c565b6001600160a01b0383165f90815260016020526040902061071c9060020183610af3565b9392505050565b8361072e81336106b3565b61074b57604051637bfa4b9f60e01b815260040160405180910390fd5b6001600160a01b0385165f9081526001602052604081209061076d8585610a5c565b6001600160a01b0387165f90815260048401602052604090209091506107939082610a89565b156107b15760405163ad8efeb760e01b815260040160405180910390fd5b6001600160a01b0386165f90815260048301602052604090206107d49082610b14565b505f81815260058301602052604090206107ee9087610ac8565b50856001600160a01b0316876001600160a01b03167f037f03a2ad6b967df4a01779b6d2b4c85950df83925d9e31362b519422fc0169878760405161030c929190610e8c565b6001600160a01b0381165f90815260016020526040902060609061085a90600201610abf565b5f036108b2576040805160018082528183019092525f916020808301908036833701905050905082815f8151811061089457610894610ec3565b6001600160a01b039092166020928302919091019091015292915050565b6001600160a01b0382165f90815260016020526040902061054c90600201610adc565b919050565b6001600160a01b0382165f90815260016020526040812061071c9083610af3565b5f61090685856106b3565b8061094757506109476109198484610a5c565b6001600160a01b038088165f908152600160209081526040808320938a168352600490930190522090610a89565b95945050505050565b8161095b81336106b3565b61097857604051637bfa4b9f60e01b815260040160405180910390fd5b6001600160a01b0383165f90815260016020526040902061099c6002820184610af3565b156109ba5760405163130160e560e31b815260040160405180910390fd5b6109c48184610ac8565b6109e1576040516319abede360e11b815260040160405180910390fd5b6040516001600160a01b0384811682528516907fb14b9a3d448c5b04f0e5b087b6f5193390db7955482a6ffb841e7b3ba61a460c906020016103ea565b60605f610a2b8484610a5c565b6001600160a01b0386165f908152600160209081526040808320848452600501909152902090915061094790610adc565b60609190911b6bffffffffffffffffffffffff191660a09190911c6bffffffff0000000000000000161790565b5f818152600183016020526040812054151561071c565b5f61071c8383610b1f565b5f61071c836001600160a01b038416610b1f565b5f61054c825490565b5f61071c836001600160a01b038416610c02565b60605f61071c83610c4e565b5f61071c8383610ca7565b6001600160a01b0381165f908152600183016020526040812054151561071c565b5f61071c8383610c02565b5f8181526001830160205260408120548015610bf9575f610b41600183610ed7565b85549091505f90610b5490600190610ed7565b9050818114610bb3575f865f018281548110610b7257610b72610ec3565b905f5260205f200154905080875f018481548110610b9257610b92610ec3565b5f918252602080832090910192909255918252600188019052604090208390555b8554869080610bc457610bc4610ef6565b600190038181905f5260205f20015f90559055856001015f8681526020019081526020015f205f90556001935050505061054c565b5f91505061054c565b5f818152600183016020526040812054610c4757508154600181810184555f84815260208082209093018490558454848252828601909352604090209190915561054c565b505f61054c565b6060815f01805480602002602001604051908101604052809291908181526020018280548015610c9b57602002820191905f5260205f20905b815481526020019060010190808311610c87575b50505050509050919050565b5f825f018281548110610cbc57610cbc610ec3565b905f5260205f200154905092915050565b80356001600160a01b03811681146108d5575f5ffd5b80356001600160e01b0319811681146108d5575f5ffd5b5f5f5f5f60808587031215610d0d575f5ffd5b610d1685610ccd565b9350610d2460208601610ccd565b9250610d3260408601610ccd565b9150610d4060608601610ce3565b905092959194509250565b5f5f60408385031215610d5c575f5ffd5b610d6583610ccd565b9150610d7360208401610ccd565b90509250929050565b5f60208284031215610d8c575f5ffd5b61071c82610ccd565b5f8151808452602084019350602083015f5b82811015610dce5781516001600160a01b0316865260209586019590910190600101610da7565b5093949350505050565b602081525f61071c6020830184610d95565b604081525f610dfc6040830185610d95565b82810360208401528084518083526020830191506020860192505f5b81811015610e405783516001600160e01b031916835260209384019390920191600101610e18565b50909695505050505050565b5f5f5f60608486031215610e5e575f5ffd5b610e6784610ccd565b9250610e7560208501610ccd565b9150610e8360408501610ce3565b90509250925092565b6001600160a01b039290921682526001600160e01b031916602082015260400190565b634e487b7160e01b5f52604160045260245ffd5b634e487b7160e01b5f52603260045260245ffd5b8181038181111561054c57634e487b7160e01b5f52601160045260245ffd5b634e487b7160e01b5f52603160045260245ffdfea2646970667358221220b63ce7fd361f505a43fbbc1e192d669b57efb369c86636afa2dd2f0c28075a1264736f6c634300081b0033", } // PermissionControllerABI 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 4718bdccd5..491ad3fa54 100644 --- a/pkg/bindings/RewardsCoordinator/binding.go +++ b/pkg/bindings/RewardsCoordinator/binding.go @@ -104,12 +104,16 @@ var RewardsCoordinatorMetaData = &bind.MetaData{ Bin: "0x6101c0604052348015610010575f5ffd5b50604051614a90380380614a9083398101604081905261002f91610211565b858a8a8a88888888888f6001600160a01b038116610060576040516339b190bb60e11b815260040160405180910390fd5b6001600160a01b031660805261007685826102d3565b63ffffffff161561009a57604051630e06bd3160e01b815260040160405180910390fd5b6100a762015180866102d3565b63ffffffff16156100cb5760405163223c7b3960e11b815260040160405180910390fd5b6001600160a01b0397881660a05295871660c05293861660e05263ffffffff9283166101005290821661012052811661014052908116610160521661018052166101a052610117610126565b50505050505050505050610306565b5f54610100900460ff16156101915760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff908116146101e0575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b03811681146101f6575f5ffd5b50565b805163ffffffff8116811461020c575f5ffd5b919050565b5f5f5f5f5f5f5f5f5f5f6101408b8d03121561022b575f5ffd5b8a51610236816101e2565b60208c0151909a50610247816101e2565b60408c0151909950610258816101e2565b60608c0151909850610269816101e2565b60808c015190975061027a816101e2565b955061028860a08c016101f9565b945061029660c08c016101f9565b93506102a460e08c016101f9565b92506102b36101008c016101f9565b91506102c26101208c016101f9565b90509295989b9194979a5092959850565b5f63ffffffff8316806102f457634e487b7160e01b5f52601260045260245ffd5b8063ffffffff84160691505092915050565b60805160a05160c05160e05161010051610120516101405161016051610180516101a0516146b26103de5f395f81816105e5015261278101525f8181610499015261352801525f81816103e80152612bc301525f818161054701526134e601525f818161085e01526133f601525f818161079f01528181613446015261349401525f81816108b201528181610adb01528181611dd6015261208201525f818161056e01526135c301525f81816109250152611d4601525f818161073101528181610eb9015281816114bb015261236101526146b25ff3fe608060405234801561000f575f5ffd5b50600436106103a8575f3560e01c80638da5cb5b116101ea578063de02e50311610114578063f6efbb59116100a9578063fabc1cbc11610079578063fabc1cbc14610a13578063fbf1e2c114610a26578063fce36c7d14610a39578063ff9f6cce14610a4c575f5ffd5b8063f6efbb59146109c7578063f74e8eac146109da578063f8cd8448146109ed578063f96abf2e14610a00575f5ffd5b8063ed71e6a2116100e4578063ed71e6a214610947578063f22cef8514610974578063f2f07ab414610987578063f2fde38b146109b4575f5ffd5b8063de02e503146108e7578063e063f81f146108fa578063e810ce211461090d578063ea4d3c9b14610920575f5ffd5b8063a50a1d9c1161018a578063bf21a8aa1161015a578063bf21a8aa14610859578063c46db60614610880578063ca8aa7c7146108ad578063dcbb03b3146108d4575f5ffd5b8063a50a1d9c146107e7578063aebd8bae146107fa578063b3dbb0e014610827578063bb7e451f1461083a575f5ffd5b80639cb9a5fa116101c55780639cb9a5fa146107875780639d45c2811461079a5780639de4b35f146107c1578063a0169ddd146107d4575f5ffd5b80638da5cb5b146107535780639104c319146107645780639be3d4e41461077f575f5ffd5b80634596021c116102d65780635e9d83481161026b5780637b8f8b051161023b5780637b8f8b05146106e7578063863cb9a9146106ef578063865c695314610702578063886f11951461072c575f5ffd5b80635e9d83481461068a57806363f6a7981461069d5780636d21117e146106b2578063715018a6146106df575f5ffd5b806358baaa3e116102a657806358baaa3e14610644578063595c6a67146106575780635ac86ab71461065f5780635c975abb14610682575f5ffd5b80634596021c146105cd5780634657e26a146105e05780634b943960146106075780634d18cc351461062d575f5ffd5b8063149bc8721161034c57806339b70e381161031c57806339b70e38146105695780633a8c0786146105905780633ccc861d146105a75780633efe1db6146105ba575f5ffd5b8063149bc872146104ce5780632b9f64a4146104ef57806336af41fa1461052f57806337838ed014610542575f5ffd5b80630e9a53cf116103875780630e9a53cf146104345780630eb3834514610481578063131433b414610494578063136439dd146104bb575f5ffd5b806218572c146103ac57806304a0c502146103e35780630ca298991461041f575b5f5ffd5b6103ce6103ba366004613adf565b60d16020525f908152604090205460ff1681565b60405190151581526020015b60405180910390f35b61040a7f000000000000000000000000000000000000000000000000000000000000000081565b60405163ffffffff90911681526020016103da565b61043261042d366004613b57565b610a5f565b005b61043c610d24565b6040516103da91905f6080820190508251825263ffffffff602084015116602083015263ffffffff604084015116604083015260608301511515606083015292915050565b61043261048f366004613bb3565b610e24565b61040a7f000000000000000000000000000000000000000000000000000000000000000081565b6104326104c9366004613bea565b610ea4565b6104e16104dc366004613c01565b610f79565b6040519081526020016103da565b6105176104fd366004613adf565b60cc6020525f90815260409020546001600160a01b031681565b6040516001600160a01b0390911681526020016103da565b61043261053d366004613c1b565b610fee565b61040a7f000000000000000000000000000000000000000000000000000000000000000081565b6105177f000000000000000000000000000000000000000000000000000000000000000081565b60cb5461040a90600160a01b900463ffffffff1681565b6104326105b5366004613c6a565b61117d565b6104326105c8366004613cc0565b6111c2565b6104326105db366004613cea565b6113b6565b6105177f000000000000000000000000000000000000000000000000000000000000000081565b61061a610615366004613adf565b611437565b60405161ffff90911681526020016103da565b60cb5461040a90600160c01b900463ffffffff1681565b610432610652366004613d3c565b611492565b6104326114a6565b6103ce61066d366004613d55565b606654600160ff9092169190911b9081161490565b6066546104e1565b6103ce610698366004613d75565b611555565b60cb5461061a90600160e01b900461ffff1681565b6103ce6106c0366004613da6565b60cf60209081525f928352604080842090915290825290205460ff1681565b6104326115e0565b60ca546104e1565b6104326106fd366004613adf565b6115f1565b6104e1610710366004613dd0565b60cd60209081525f928352604080842090915290825290205481565b6105177f000000000000000000000000000000000000000000000000000000000000000081565b6033546001600160a01b0316610517565b61051773beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac081565b61043c611602565b610432610795366004613dfc565b61169e565b61040a7f000000000000000000000000000000000000000000000000000000000000000081565b61061a6107cf366004613e33565b611837565b6104326107e2366004613adf565b6118ba565b6104326107f5366004613e6f565b6118c5565b6103ce610808366004613da6565b60d260209081525f928352604080842090915290825290205460ff1681565b610432610835366004613e88565b6118d6565b6104e1610848366004613adf565b60ce6020525f908152604090205481565b61040a7f000000000000000000000000000000000000000000000000000000000000000081565b6103ce61088e366004613da6565b60d060209081525f928352604080842090915290825290205460ff1681565b6105177f000000000000000000000000000000000000000000000000000000000000000081565b6104326108e2366004613eb2565b611a1f565b61043c6108f5366004613bea565b611b8a565b61061a610908366004613dd0565b611c1a565b61040a61091b366004613bea565b611c7f565b6105177f000000000000000000000000000000000000000000000000000000000000000081565b6103ce610955366004613da6565b60d360209081525f928352604080842090915290825290205460ff1681565b610432610982366004613dd0565b611d00565b6103ce610995366004613da6565b60d760209081525f928352604080842090915290825290205460ff1681565b6104326109c2366004613adf565b611e6a565b6104326109d5366004613ef6565b611ee5565b6104326109e8366004613f54565b61201a565b6104e16109fb366004613c01565b612200565b610432610a0e366004613d3c565b612210565b610432610a21366004613bea565b61235f565b60cb54610517906001600160a01b031681565b610432610a47366004613c1b565b612475565b610432610a5a366004613c1b565b6125c4565b60665460099061020090811603610a895760405163840a48d560e01b815260040160405180910390fd5b610a966020850185613adf565b610a9f81612743565b610abc5760405163932d94f760e01b815260040160405180910390fd5b610ac46127ed565b6040516304c1b8eb60e31b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063260dc75890610b10908890600401613fbf565b602060405180830381865afa158015610b2b573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b4f9190613fcd565b610b6c57604051631fb1705560e21b815260040160405180910390fd5b5f5b83811015610d125736858583818110610b8957610b89613fe8565b9050602002810190610b9b9190613ffc565b90505f60ce81610bae60208b018b613adf565b6001600160a01b031681526020808201929092526040015f90812054925090610bd9908a018a613adf565b8284604051602001610bed93929190614224565b6040516020818303038152906040528051906020012090505f610c0f84612846565b9050600160d75f610c2360208e018e613adf565b6001600160a01b0316815260208082019290925260409081015f9081208682529092529020805460ff1916911515919091179055610c62836001614267565b60ce5f610c7260208e018e613adf565b6001600160a01b03166001600160a01b031681526020019081526020015f208190555081336001600160a01b03167ffff0759ccb371dfb5691798724e70b4fa61cb3bfe730a33ac19fb86a48efc7568c8688604051610cd39392919061427a565b60405180910390a3610d02333083610cf16040890160208a01613adf565b6001600160a01b0316929190612a31565b505060019092019150610b6e9050565b50610d1d6001609755565b5050505050565b604080516080810182525f80825260208201819052918101829052606081019190915260ca545b8015610dfc575f60ca610d5f60018461429f565b81548110610d6f57610d6f613fe8565b5f91825260209182902060408051608081018252600293909302909101805483526001015463ffffffff80821694840194909452600160201b810490931690820152600160401b90910460ff161580156060830181905291925090610dde5750806040015163ffffffff164210155b15610de95792915050565b5080610df4816142b2565b915050610d4b565b5050604080516080810182525f80825260208201819052918101829052606081019190915290565b610e2c612a9c565b6001600160a01b0382165f81815260d1602052604080822054905160ff9091169284151592841515927f4de6293e668df1398422e1def12118052c1539a03cbfedc145895d48d7685f1c9190a4506001600160a01b03919091165f90815260d160205260409020805460ff1916911515919091179055565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa158015610f06573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f2a9190613fcd565b610f4757604051631d77d47760e21b815260040160405180910390fd5b6066548181168114610f6c5760405163c61dca5d60e01b815260040160405180910390fd5b610f7582612af6565b5050565b5f80610f886020840184613adf565b8360200135604051602001610fd19392919060f89390931b6001600160f81b031916835260609190911b6bffffffffffffffffffffffff19166001830152601582015260350190565b604051602081830303815290604052805190602001209050919050565b6066546001906002908116036110175760405163840a48d560e01b815260040160405180910390fd5b335f90815260d1602052604090205460ff1661104657604051635c427cd960e01b815260040160405180910390fd5b61104e6127ed565b5f5b8281101561116d573684848381811061106b5761106b613fe8565b905060200281019061107d91906142c7565b335f81815260ce602090815260408083205490519495509391926110a79290918591879101614359565b6040516020818303038152906040528051906020012090506110c883612b33565b335f90815260d0602090815260408083208484529091529020805460ff191660019081179091556110fa908390614267565b335f81815260ce602052604090819020929092559051829184917f51088b8c89628df3a8174002c2a034d0152fce6af8415d651b2a4734bf2704829061114190889061437f565b60405180910390a4611162333060408601803590610cf19060208901613adf565b505050600101611050565b506111786001609755565b505050565b6066546002906004908116036111a65760405163840a48d560e01b815260040160405180910390fd5b6111ae6127ed565b6111b88383612c1e565b6111786001609755565b6066546003906008908116036111eb5760405163840a48d560e01b815260040160405180910390fd5b60cb546001600160a01b0316331461121657604051635c427cd960e01b815260040160405180910390fd5b60cb5463ffffffff600160c01b90910481169083161161124957604051631ca7e50b60e21b815260040160405180910390fd5b428263ffffffff161061126f576040516306957c9160e11b815260040160405180910390fd5b60ca5460cb545f9061128e90600160a01b900463ffffffff1642614391565b6040805160808101825287815263ffffffff87811660208084018281528684168587018181525f6060880181815260ca8054600181018255925297517f42d72674974f694b5f5159593243114d38a5c39c89d6b62fee061ff523240ee160029092029182015592517f42d72674974f694b5f5159593243114d38a5c39c89d6b62fee061ff523240ee290930180549151975193871667ffffffffffffffff1990921691909117600160201b978716979097029690961760ff60401b1916600160401b921515929092029190911790945560cb805463ffffffff60c01b1916600160c01b840217905593519283529394508892908616917fecd866c3c158fa00bf34d803d5f6023000b57080bcb48af004c2b4b46b3afd08910160405180910390a45050505050565b6066546002906004908116036113df5760405163840a48d560e01b815260040160405180910390fd5b6113e76127ed565b5f5b838110156114265761141e85858381811061140657611406613fe8565b905060200281019061141891906143ad565b84612c1e565b6001016113e9565b506114316001609755565b50505050565b6001600160a01b0381165f90815260d5602090815260408083208151606081018352905461ffff80821683526201000082041693820193909352600160201b90920463ffffffff169082015261148c90612ea6565b92915050565b61149a612a9c565b6114a381612f16565b50565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa158015611508573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061152c9190613fcd565b61154957604051631d77d47760e21b815260040160405180910390fd5b6115535f19612af6565b565b5f6115d88260ca6115696020830183613d3c565b63ffffffff168154811061157f5761157f613fe8565b5f91825260209182902060408051608081018252600293909302909101805483526001015463ffffffff80821694840194909452600160201b810490931690820152600160401b90910460ff1615156060820152612f87565b506001919050565b6115e8612a9c565b6115535f61312a565b6115f9612a9c565b6114a38161317b565b604080516080810182525f80825260208201819052918101829052606081019190915260ca80546116359060019061429f565b8154811061164557611645613fe8565b5f91825260209182902060408051608081018252600293909302909101805483526001015463ffffffff80821694840194909452600160201b810490931690820152600160401b90910460ff1615156060820152919050565b6066546005906020908116036116c75760405163840a48d560e01b815260040160405180910390fd5b836116d181612743565b6116ee5760405163932d94f760e01b815260040160405180910390fd5b6116f66127ed565b5f5b83811015610d12573685858381811061171357611713613fe8565b90506020028101906117259190613ffc565b6001600160a01b0388165f90815260ce6020908152604080832054905193945092611756918b918591879101614224565b6040516020818303038152906040528051906020012090505f61177884612846565b6001600160a01b038b165f90815260d3602090815260408083208684529091529020805460ff191660019081179091559091506117b6908490614267565b6001600160a01b038b165f81815260ce60205260409081902092909255905183919033907ffc8888bffd711da60bc5092b33f677d81896fe80ecc677b84cfab8184462b6e0906118099088908a906143c1565b60405180910390a4611827333083610cf16040890160208a01613adf565b5050600190920191506116f89050565b6001600160a01b0382165f90815260d6602052604081206118b3908261186a611865368790038701876143d9565b6131d6565b815260208082019290925260409081015f208151606081018352905461ffff80821683526201000082041693820193909352600160201b90920463ffffffff1690820152612ea6565b9392505050565b33610f758183613239565b6118cd612a9c565b6114a38161329c565b6066546007906080908116036118ff5760405163840a48d560e01b815260040160405180910390fd5b8261190981612743565b6119265760405163932d94f760e01b815260040160405180910390fd5b60cb545f9061194290600160a01b900463ffffffff1642614391565b6001600160a01b0386165f90815260d5602090815260408083208151606081018352905461ffff80821683526201000082041693820193909352600160201b90920463ffffffff16908201529192509061199b90612ea6565b6001600160a01b0387165f90815260d5602052604090209091506119c0908684613307565b6040805163ffffffff8416815261ffff838116602083015287168183015290516001600160a01b0388169133917fd1e028bd664486a46ad26040e999cd2d22e1e9a094ee6afe19fcf64678f16f749181900360600190a3505050505050565b606654600690604090811603611a485760405163840a48d560e01b815260040160405180910390fd5b83611a5281612743565b611a6f5760405163932d94f760e01b815260040160405180910390fd5b60cb545f90611a8b90600160a01b900463ffffffff1642614391565b6001600160a01b038781165f90815260d460209081526040808320938a1683529281528282208351606081018552905461ffff80821683526201000082041692820192909252600160201b90910463ffffffff1692810192909252919250611af290612ea6565b6001600160a01b038089165f90815260d460209081526040808320938b16835292905220909150611b24908684613307565b6040805163ffffffff8416815261ffff838116602083015287168183015290516001600160a01b0388811692908a169133917f48e198b6ae357e529204ee53a8e514c470ff77d9cc8e4f7207f8b5d490ae6934919081900360600190a450505050505050565b604080516080810182525f80825260208201819052918101829052606081019190915260ca8281548110611bc057611bc0613fe8565b5f91825260209182902060408051608081018252600293909302909101805483526001015463ffffffff80821694840194909452600160201b810490931690820152600160401b90910460ff161515606082015292915050565b6001600160a01b038281165f90815260d46020908152604080832093851683529281528282208351606081018552905461ffff80821683526201000082041692820192909252600160201b90910463ffffffff1692810192909252906118b390612ea6565b60ca545f905b63ffffffff811615611ce6578260ca611c9f600184614441565b63ffffffff1681548110611cb557611cb5613fe8565b905f5260205f2090600202015f015403611cd4576118b3600182614441565b80611cde8161445d565b915050611c85565b5060405163504570e360e01b815260040160405180910390fd5b81611d0a81612743565b611d275760405163932d94f760e01b815260040160405180910390fd5b6040516336b87bd760e11b81526001600160a01b0384811660048301527f00000000000000000000000000000000000000000000000000000000000000001690636d70f7ae90602401602060405180830381865afa158015611d8b573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611daf9190613fcd565b80611e43575060405163ba1a84e560e01b81526001600160a01b0384811660048301525f917f00000000000000000000000000000000000000000000000000000000000000009091169063ba1a84e590602401602060405180830381865afa158015611e1d573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611e41919061447b565b115b611e605760405163fb494ea160e01b815260040160405180910390fd5b6111788383613239565b611e72612a9c565b6001600160a01b038116611edc5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084015b60405180910390fd5b6114a38161312a565b5f54610100900460ff1615808015611f0357505f54600160ff909116105b80611f1c5750303b158015611f1c57505f5460ff166001145b611f7f5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401611ed3565b5f805460ff191660011790558015611fa0575f805461ff0019166101001790555b611fa985612af6565b611fb28661312a565b611fbb8461317b565b611fc483612f16565b611fcd8261329c565b8015612012575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050505050565b606654600890610100908116036120445760405163840a48d560e01b815260040160405180910390fd5b8361204e81612743565b61206b5760405163932d94f760e01b815260040160405180910390fd5b6040516304c1b8eb60e31b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063260dc758906120b7908790600401613fbf565b602060405180830381865afa1580156120d2573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906120f69190613fcd565b61211357604051631fb1705560e21b815260040160405180910390fd5b60cb545f9061212f90600160a01b900463ffffffff1642614391565b6001600160a01b0387165f90815260d66020526040812091925090612161908261186a611865368b90038b018b6143d9565b6001600160a01b0388165f90815260d6602052604081209192506121a69190612192611865368b90038b018b6143d9565b81526020019081526020015f208684613307565b866001600160a01b0316336001600160a01b03167f14918b3834ab6752eb2e1b489b6663a67810efb5f56f3944a97ede8ecf1fd9f18885858a6040516121ef9493929190614492565b60405180910390a350505050505050565b5f6001610f886020840184613adf565b6066546003906008908116036122395760405163840a48d560e01b815260040160405180910390fd5b60cb546001600160a01b0316331461226457604051635c427cd960e01b815260040160405180910390fd5b60ca5463ffffffff83161061228c576040516394a8d38960e01b815260040160405180910390fd5b5f60ca8363ffffffff16815481106122a6576122a6613fe8565b905f5260205f20906002020190508060010160089054906101000a900460ff16156122e457604051631b14174b60e01b815260040160405180910390fd5b6001810154600160201b900463ffffffff16421061231557604051630c36f66560e21b815260040160405180910390fd5b60018101805460ff60401b1916600160401b17905560405163ffffffff8416907fd850e6e5dfa497b72661fa73df2923464eaed9dc2ff1d3cb82bccbfeabe5c41e905f90a2505050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156123bb573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906123df91906144c6565b6001600160a01b0316336001600160a01b0316146124105760405163794821ff60e01b815260040160405180910390fd5b606654801982198116146124375760405163c61dca5d60e01b815260040160405180910390fd5b606682905560405182815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c9060200160405180910390a25050565b6066545f9060019081160361249d5760405163840a48d560e01b815260040160405180910390fd5b6124a56127ed565b5f5b8281101561116d57368484838181106124c2576124c2613fe8565b90506020028101906124d491906142c7565b335f81815260ce602090815260408083205490519495509391926124fe9290918591879101614359565b60405160208183030381529060405280519060200120905061251f83612b33565b335f90815260cf602090815260408083208484529091529020805460ff19166001908117909155612551908390614267565b335f81815260ce602052604090819020929092559051829184917f450a367a380c4e339e5ae7340c8464ef27af7781ad9945cfe8abd828f89e62819061259890889061437f565b60405180910390a46125b9333060408601803590610cf19060208901613adf565b5050506001016124a7565b6066546004906010908116036125ed5760405163840a48d560e01b815260040160405180910390fd5b335f90815260d1602052604090205460ff1661261c57604051635c427cd960e01b815260040160405180910390fd5b6126246127ed565b5f5b8281101561116d573684848381811061264157612641613fe8565b905060200281019061265391906142c7565b335f81815260ce6020908152604080832054905194955093919261267d9290918591879101614359565b60405160208183030381529060405280519060200120905061269e83612b33565b335f90815260d2602090815260408083208484529091529020805460ff191660019081179091556126d0908390614267565b335f81815260ce602052604090819020929092559051829184917f5251b6fdefcb5d81144e735f69ea4c695fd43b0289ca53dc075033f5fc80068b9061271790889061437f565b60405180910390a4612738333060408601803590610cf19060208901613adf565b505050600101612626565b604051631beb2b9760e31b81526001600160a01b0382811660048301523360248301523060448301525f80356001600160e01b0319166064840152917f00000000000000000000000000000000000000000000000000000000000000009091169063df595cb8906084016020604051808303815f875af11580156127c9573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061148c9190613fcd565b60026097540361283f5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401611ed3565b6002609755565b5f61287961285483806144e1565b6128646080860160608701613d3c565b61287460a0870160808801613d3c565b6133d6565b5f61288760408401846144e1565b9050116128a75760405163796cc52560e01b815260040160405180910390fd5b426128b860a0840160808501613d3c565b6128c86080850160608601613d3c565b6128d29190614391565b63ffffffff16106128f65760405163150358a160e21b815260040160405180910390fd5b5f80805b61290760408601866144e1565b90508110156129f8573661291e60408701876144e1565b8381811061292e5761292e613fe8565b6040029190910191505f90506129476020830183613adf565b6001600160a01b03160361296e57604051630863a45360e11b815260040160405180910390fd5b61297b6020820182613adf565b6001600160a01b0316836001600160a01b0316106129ac576040516310fb47f160e31b815260040160405180910390fd5b5f8160200135116129d0576040516310eb483f60e21b815260040160405180910390fd5b6129dd6020820182613adf565b92506129ed602082013585614267565b9350506001016128fa565b506f4b3b4ca85a86c47a098a223fffffffff821115612a2a5760405163070b5a6f60e21b815260040160405180910390fd5b5092915050565b6040516001600160a01b03808516602483015283166044820152606481018290526114319085906323b872dd60e01b906084015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b0319909316929092179091526136ae565b6033546001600160a01b031633146115535760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401611ed3565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a250565b612b60612b4082806144e1565b612b506080850160608601613d3c565b61287460a0860160808701613d3c565b5f816040013511612b84576040516310eb483f60e21b815260040160405180910390fd5b6f4b3b4ca85a86c47a098a223fffffffff81604001351115612bb95760405163070b5a6f60e21b815260040160405180910390fd5b612be963ffffffff7f00000000000000000000000000000000000000000000000000000000000000001642614267565b612bf96080830160608401613d3c565b63ffffffff1611156114a357604051637ee2b44360e01b815260040160405180910390fd5b5f60ca612c2e6020850185613d3c565b63ffffffff1681548110612c4457612c44613fe8565b5f91825260209182902060408051608081018252600293909302909101805483526001015463ffffffff80821694840194909452600160201b810490931690820152600160401b90910460ff16151560608201529050612ca48382612f87565b5f612cb56080850160608601613adf565b6001600160a01b038082165f90815260cc60205260409020549192501680612cda5750805b336001600160a01b03821614612d0357604051635c427cd960e01b815260040160405180910390fd5b5f5b612d1260a0870187614526565b90508110156120125736612d2960e08801886144e1565b83818110612d3957612d39613fe8565b6001600160a01b0387165f90815260cd602090815260408083209302949094019450929091508290612d6d90850185613adf565b6001600160a01b03166001600160a01b031681526020019081526020015f2054905080826020013511612db35760405163aa385e8160e01b815260040160405180910390fd5b5f612dc282602085013561429f565b6001600160a01b0387165f90815260cd60209081526040822092935085018035929190612def9087613adf565b6001600160a01b031681526020808201929092526040015f2091909155612e309089908390612e2090870187613adf565b6001600160a01b03169190613781565b86516001600160a01b03808a1691878216918916907f9543dbd55580842586a951f0386e24d68a5df99ae29e3b216588b45fd684ce3190612e746020890189613adf565b604080519283526001600160a01b039091166020830152810186905260600160405180910390a4505050600101612d05565b5f816040015163ffffffff165f1480612ed85750815161ffff908116148015612ed85750816040015163ffffffff1642105b15612ef057505060cb54600160e01b900461ffff1690565b816040015163ffffffff16421015612f0957815161148c565b506020015190565b919050565b60cb546040805163ffffffff600160a01b9093048316815291831660208301527faf557c6c02c208794817a705609cfa935f827312a1adfdd26494b6b95dd2b4b3910160405180910390a160cb805463ffffffff909216600160a01b0263ffffffff60a01b19909216919091179055565b806060015115612faa57604051631b14174b60e01b815260040160405180910390fd5b806040015163ffffffff16421015612fd557604051631437a2bb60e31b815260040160405180910390fd5b612fe260c0830183614526565b9050612ff160a0840184614526565b905014613011576040516343714afd60e01b815260040160405180910390fd5b61301e60e08301836144e1565b905061302d60c0840184614526565b90501461304d576040516343714afd60e01b815260040160405180910390fd5b8051613079906130636040850160208601613d3c565b613070604086018661456b565b866060016137b1565b5f5b61308860a0840184614526565b90508110156111785761312260808401356130a660a0860186614526565b848181106130b6576130b6613fe8565b90506020020160208101906130cb9190613d3c565b6130d860c0870187614526565b858181106130e8576130e8613fe8565b90506020028101906130fa919061456b565b61310760e08901896144e1565b8781811061311757613117613fe8565b905060400201613855565b60010161307b565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b60cb546040516001600160a01b038084169216907f237b82f438d75fc568ebab484b75b01d9287b9e98b490b7c23221623b6705dbb905f90a360cb80546001600160a01b0319166001600160a01b0392909216919091179055565b5f815f0151826020015163ffffffff1660405160200161322192919060609290921b6bffffffffffffffffffffffff1916825260a01b6001600160a01b031916601482015260200190565b60405160208183030381529060405261148c906145ad565b6001600160a01b038083165f81815260cc602052604080822080548686166001600160a01b0319821681179092559151919094169392849290917fbab947934d42e0ad206f25c9cab18b5bb6ae144acfb00f40b4e3aa59590ca3129190a4505050565b60cb546040805161ffff600160e01b9093048316815291831660208301527fe6cd4edfdcc1f6d130ab35f73d72378f3a642944fb4ee5bd84b7807a81ea1c4e910160405180910390a160cb805461ffff909216600160e01b0261ffff60e01b19909216919091179055565b61271061ffff8316111561332e5760405163891c63df60e01b815260040160405180910390fd5b8254600160201b900463ffffffff16421161335c57604051637b1e25c560e01b815260040160405180910390fd5b8254600160201b900463ffffffff165f0361338357825461ffff191661ffff17835561339a565b825462010000810461ffff1661ffff199091161783555b825463ffffffff909116600160201b0267ffffffff000000001961ffff90931662010000029290921667ffffffffffff00001990911617179055565b826133f45760405163796cc52560e01b815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000063ffffffff168163ffffffff16111561344157604051630dd0b9f560e21b815260040160405180910390fd5b61346b7f0000000000000000000000000000000000000000000000000000000000000000826145e4565b63ffffffff161561348f5760405163ee66470560e01b815260040160405180910390fd5b6134b97f0000000000000000000000000000000000000000000000000000000000000000836145e4565b63ffffffff16156134dd57604051633c1a94f160e21b815260040160405180910390fd5b8163ffffffff167f000000000000000000000000000000000000000000000000000000000000000063ffffffff1642613516919061429f565b1115801561355057508163ffffffff167f000000000000000000000000000000000000000000000000000000000000000063ffffffff1611155b61356d5760405163041aa75760e11b815260040160405180910390fd5b5f805b84811015612012575f86868381811061358b5761358b613fe8565b6135a19260206040909202019081019150613adf565b60405163198f077960e21b81526001600160a01b0380831660048301529192507f00000000000000000000000000000000000000000000000000000000000000009091169063663c1de490602401602060405180830381865afa15801561360a573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061362e9190613fcd565b8061365557506001600160a01b03811673beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac0145b61367257604051632efd965160e11b815260040160405180910390fd5b806001600160a01b0316836001600160a01b0316106136a45760405163dfad9ca160e01b815260040160405180910390fd5b9150600101613570565b5f613702826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166138939092919063ffffffff16565b905080515f14806137225750808060200190518101906137229190613fcd565b6111785760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401611ed3565b6040516001600160a01b03831660248201526044810182905261117890849063a9059cbb60e01b90606401612a65565b6137bc60208361460b565b6001901b8463ffffffff16106137e45760405162c6c39d60e71b815260040160405180910390fd5b5f6137ee82610f79565b905061383884848080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152508a92508591505063ffffffff89166138a9565b612012576040516369ca16c960e01b815260040160405180910390fd5b61386060208361460b565b6001901b8463ffffffff16106138895760405163054ff4df60e51b815260040160405180910390fd5b5f6137ee82612200565b60606138a184845f856138c0565b949350505050565b5f836138b6868585613997565b1495945050505050565b6060824710156139215760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401611ed3565b5f5f866001600160a01b0316858760405161393c919061461e565b5f6040518083038185875af1925050503d805f8114613976576040519150601f19603f3d011682016040523d82523d5f602084013e61397b565b606091505b509150915061398c87838387613a2e565b979650505050505050565b5f602084516139a69190614634565b156139c4576040516313717da960e21b815260040160405180910390fd5b8260205b85518111613a25576139db600285614634565b5f036139fc57815f528086015160205260405f209150600284049350613a13565b808601515f528160205260405f2091506002840493505b613a1e602082614267565b90506139c8565b50949350505050565b60608315613a9c5782515f03613a95576001600160a01b0385163b613a955760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401611ed3565b50816138a1565b6138a18383815115613ab15781518083602001fd5b8060405162461bcd60e51b8152600401611ed39190614647565b6001600160a01b03811681146114a3575f5ffd5b5f60208284031215613aef575f5ffd5b81356118b381613acb565b5f60408284031215613b0a575f5ffd5b50919050565b5f5f83601f840112613b20575f5ffd5b5081356001600160401b03811115613b36575f5ffd5b6020830191508360208260051b8501011115613b50575f5ffd5b9250929050565b5f5f5f60608486031215613b69575f5ffd5b613b738585613afa565b925060408401356001600160401b03811115613b8d575f5ffd5b613b9986828701613b10565b9497909650939450505050565b80151581146114a3575f5ffd5b5f5f60408385031215613bc4575f5ffd5b8235613bcf81613acb565b91506020830135613bdf81613ba6565b809150509250929050565b5f60208284031215613bfa575f5ffd5b5035919050565b5f60408284031215613c11575f5ffd5b6118b38383613afa565b5f5f60208385031215613c2c575f5ffd5b82356001600160401b03811115613c41575f5ffd5b613c4d85828601613b10565b90969095509350505050565b5f6101008284031215613b0a575f5ffd5b5f5f60408385031215613c7b575f5ffd5b82356001600160401b03811115613c90575f5ffd5b613c9c85828601613c59565b9250506020830135613bdf81613acb565b803563ffffffff81168114612f11575f5ffd5b5f5f60408385031215613cd1575f5ffd5b82359150613ce160208401613cad565b90509250929050565b5f5f5f60408486031215613cfc575f5ffd5b83356001600160401b03811115613d11575f5ffd5b613d1d86828701613b10565b9094509250506020840135613d3181613acb565b809150509250925092565b5f60208284031215613d4c575f5ffd5b6118b382613cad565b5f60208284031215613d65575f5ffd5b813560ff811681146118b3575f5ffd5b5f60208284031215613d85575f5ffd5b81356001600160401b03811115613d9a575f5ffd5b6138a184828501613c59565b5f5f60408385031215613db7575f5ffd5b8235613dc281613acb565b946020939093013593505050565b5f5f60408385031215613de1575f5ffd5b8235613dec81613acb565b91506020830135613bdf81613acb565b5f5f5f60408486031215613e0e575f5ffd5b8335613e1981613acb565b925060208401356001600160401b03811115613b8d575f5ffd5b5f5f60608385031215613e44575f5ffd5b8235613e4f81613acb565b9150613ce18460208501613afa565b803561ffff81168114612f11575f5ffd5b5f60208284031215613e7f575f5ffd5b6118b382613e5e565b5f5f60408385031215613e99575f5ffd5b8235613ea481613acb565b9150613ce160208401613e5e565b5f5f5f60608486031215613ec4575f5ffd5b8335613ecf81613acb565b92506020840135613edf81613acb565b9150613eed60408501613e5e565b90509250925092565b5f5f5f5f5f60a08688031215613f0a575f5ffd5b8535613f1581613acb565b9450602086013593506040860135613f2c81613acb565b9250613f3a60608701613cad565b9150613f4860808701613e5e565b90509295509295909350565b5f5f5f60808486031215613f66575f5ffd5b8335613f7181613acb565b9250613f808560208601613afa565b9150613eed60608501613e5e565b8035613f9981613acb565b6001600160a01b0316825263ffffffff613fb560208301613cad565b1660208301525050565b6040810161148c8284613f8e565b5f60208284031215613fdd575f5ffd5b81516118b381613ba6565b634e487b7160e01b5f52603260045260245ffd5b5f823560be19833603018112614010575f5ffd5b9190910192915050565b5f5f8335601e1984360301811261402f575f5ffd5b83016020810192503590506001600160401b0381111561404d575f5ffd5b8060061b3603821315613b50575f5ffd5b8183526020830192505f815f5b848110156140c157813561407e81613acb565b6001600160a01b0316865260208201356bffffffffffffffffffffffff81168082146140a8575f5ffd5b602088015250604095860195919091019060010161406b565b5093949350505050565b5f5f8335601e198436030181126140e0575f5ffd5b83016020810192503590506001600160401b038111156140fe575f5ffd5b803603821315613b50575f5ffd5b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b5f61413f828361401a565b60c0855261415160c08601828461405e565b915050602083013561416281613acb565b6001600160a01b0316602085015261417d604084018461401a565b858303604087015280835290915f91906020015b818310156141cc5783356141a481613acb565b6001600160a01b03168152602084810135908201526040938401936001939093019201614191565b6141d860608701613cad565b63ffffffff8116606089015293506141f260808701613cad565b63ffffffff81166080890152935061420d60a08701876140cb565b9450925086810360a088015261398c81858561410c565b60018060a01b0384168152826020820152606060408201525f61424a6060830184614134565b95945050505050565b634e487b7160e01b5f52601160045260245ffd5b8082018082111561148c5761148c614253565b6142848185613f8e565b826040820152608060608201525f61424a6080830184614134565b8181038181111561148c5761148c614253565b5f816142c0576142c0614253565b505f190190565b5f8235609e19833603018112614010575f5ffd5b5f6142e6828361401a565b60a085526142f860a08601828461405e565b915050602083013561430981613acb565b6001600160a01b031660208501526040838101359085015263ffffffff61433260608501613cad565b16606085015263ffffffff61434960808501613cad565b1660808501528091505092915050565b60018060a01b0384168152826020820152606060408201525f61424a60608301846142db565b602081525f6118b360208301846142db565b63ffffffff818116838216019081111561148c5761148c614253565b5f823560fe19833603018112614010575f5ffd5b828152604060208201525f6138a16040830184614134565b5f60408284031280156143ea575f5ffd5b50604080519081016001600160401b038111828210171561441957634e487b7160e01b5f52604160045260245ffd5b604052823561442781613acb565b815261443560208401613cad565b60208201529392505050565b63ffffffff828116828216039081111561148c5761148c614253565b5f63ffffffff82168061447257614472614253565b5f190192915050565b5f6020828403121561448b575f5ffd5b5051919050565b60a081016144a08287613f8e565b63ffffffff94909416604082015261ffff92831660608201529116608090910152919050565b5f602082840312156144d6575f5ffd5b81516118b381613acb565b5f5f8335601e198436030181126144f6575f5ffd5b8301803591506001600160401b0382111561450f575f5ffd5b6020019150600681901b3603821315613b50575f5ffd5b5f5f8335601e1984360301811261453b575f5ffd5b8301803591506001600160401b03821115614554575f5ffd5b6020019150600581901b3603821315613b50575f5ffd5b5f5f8335601e19843603018112614580575f5ffd5b8301803591506001600160401b03821115614599575f5ffd5b602001915036819003821315613b50575f5ffd5b80516020808301519190811015613b0a575f1960209190910360031b1b16919050565b634e487b7160e01b5f52601260045260245ffd5b5f63ffffffff8316806145f9576145f96145d0565b8063ffffffff84160691505092915050565b5f82614619576146196145d0565b500490565b5f82518060208501845e5f920191825250919050565b5f82614642576146426145d0565b500690565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f8301168401019150509291505056fea26469706673582212207c67616836c6a7c795552d9e8dfc776d40881dc1498dda9812cc4c094c4ad5f464736f6c634300081b0033", ======= ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"_delegationManager\",\"type\":\"address\",\"internalType\":\"contractIDelegationManager\"},{\"name\":\"_strategyManager\",\"type\":\"address\",\"internalType\":\"contractIStrategyManager\"},{\"name\":\"_allocationManager\",\"type\":\"address\",\"internalType\":\"contractIAllocationManager\"},{\"name\":\"_pauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"},{\"name\":\"_permissionController\",\"type\":\"address\",\"internalType\":\"contractIPermissionController\"},{\"name\":\"_CALCULATION_INTERVAL_SECONDS\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"_MAX_REWARDS_DURATION\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"_MAX_RETROACTIVE_LENGTH\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"_MAX_FUTURE_LENGTH\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"_GENESIS_REWARDS_TIMESTAMP\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"CALCULATION_INTERVAL_SECONDS\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"GENESIS_REWARDS_TIMESTAMP\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAX_FUTURE_LENGTH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAX_RETROACTIVE_LENGTH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAX_REWARDS_DURATION\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activationDelay\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"allocationManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIAllocationManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"beaconChainETHStrategy\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"calculateEarnerLeafHash\",\"inputs\":[{\"name\":\"leaf\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinatorTypes.EarnerTreeMerkleLeaf\",\"components\":[{\"name\":\"earner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"earnerTokenRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"calculateTokenLeafHash\",\"inputs\":[{\"name\":\"leaf\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinatorTypes.TokenTreeMerkleLeaf\",\"components\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"cumulativeEarnings\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"checkClaim\",\"inputs\":[{\"name\":\"claim\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinatorTypes.RewardsMerkleClaim\",\"components\":[{\"name\":\"rootIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"earnerIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"earnerTreeProof\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"earnerLeaf\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinatorTypes.EarnerTreeMerkleLeaf\",\"components\":[{\"name\":\"earner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"earnerTokenRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"tokenIndices\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"},{\"name\":\"tokenTreeProofs\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"},{\"name\":\"tokenLeaves\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.TokenTreeMerkleLeaf[]\",\"components\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"cumulativeEarnings\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"claimerFor\",\"inputs\":[{\"name\":\"earner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"claimer\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"createAVSRewardsSubmission\",\"inputs\":[{\"name\":\"rewardsSubmissions\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.RewardsSubmission[]\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.StrategyAndMultiplier[]\",\"components\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"multiplier\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"duration\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"createOperatorDirectedAVSRewardsSubmission\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorDirectedRewardsSubmissions\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.OperatorDirectedRewardsSubmission[]\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.StrategyAndMultiplier[]\",\"components\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"multiplier\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"operatorRewards\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.OperatorReward[]\",\"components\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"startTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"duration\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"description\",\"type\":\"string\",\"internalType\":\"string\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"createRewardsForAllEarners\",\"inputs\":[{\"name\":\"rewardsSubmissions\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.RewardsSubmission[]\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.StrategyAndMultiplier[]\",\"components\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"multiplier\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"duration\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"createRewardsForAllSubmission\",\"inputs\":[{\"name\":\"rewardsSubmissions\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.RewardsSubmission[]\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.StrategyAndMultiplier[]\",\"components\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"multiplier\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"duration\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"cumulativeClaimed\",\"inputs\":[{\"name\":\"earner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"outputs\":[{\"name\":\"totalClaimed\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"currRewardsCalculationEndTimestamp\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"defaultOperatorSplitBips\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"delegationManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIDelegationManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"disableRoot\",\"inputs\":[{\"name\":\"rootIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"getCurrentClaimableDistributionRoot\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinatorTypes.DistributionRoot\",\"components\":[{\"name\":\"root\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"rewardsCalculationEndTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"activatedAt\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"disabled\",\"type\":\"bool\",\"internalType\":\"bool\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getCurrentDistributionRoot\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinatorTypes.DistributionRoot\",\"components\":[{\"name\":\"root\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"rewardsCalculationEndTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"activatedAt\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"disabled\",\"type\":\"bool\",\"internalType\":\"bool\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getDistributionRootAtIndex\",\"inputs\":[{\"name\":\"index\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinatorTypes.DistributionRoot\",\"components\":[{\"name\":\"root\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"rewardsCalculationEndTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"activatedAt\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"disabled\",\"type\":\"bool\",\"internalType\":\"bool\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getDistributionRootsLength\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getOperatorAVSSplit\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getOperatorPISplit\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getRootIndexFromHash\",\"inputs\":[{\"name\":\"rootHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"initialOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"initialPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_rewardsUpdater\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_activationDelay\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"_defaultSplitBips\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"isAVSRewardsSubmissionHash\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"hash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"valid\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isOperatorDirectedAVSRewardsSubmissionHash\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isRewardsForAllSubmitter\",\"inputs\":[{\"name\":\"submitter\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"valid\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isRewardsSubmissionForAllEarnersHash\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"hash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"valid\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isRewardsSubmissionForAllHash\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"hash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"valid\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"pauseAll\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[{\"name\":\"index\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pauserRegistry\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"permissionController\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIPermissionController\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"processClaim\",\"inputs\":[{\"name\":\"claim\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinatorTypes.RewardsMerkleClaim\",\"components\":[{\"name\":\"rootIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"earnerIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"earnerTreeProof\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"earnerLeaf\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinatorTypes.EarnerTreeMerkleLeaf\",\"components\":[{\"name\":\"earner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"earnerTokenRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"tokenIndices\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"},{\"name\":\"tokenTreeProofs\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"},{\"name\":\"tokenLeaves\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.TokenTreeMerkleLeaf[]\",\"components\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"cumulativeEarnings\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}]},{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"processClaims\",\"inputs\":[{\"name\":\"claims\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.RewardsMerkleClaim[]\",\"components\":[{\"name\":\"rootIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"earnerIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"earnerTreeProof\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"earnerLeaf\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinatorTypes.EarnerTreeMerkleLeaf\",\"components\":[{\"name\":\"earner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"earnerTokenRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"tokenIndices\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"},{\"name\":\"tokenTreeProofs\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"},{\"name\":\"tokenLeaves\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.TokenTreeMerkleLeaf[]\",\"components\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"cumulativeEarnings\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}]},{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"rewardsUpdater\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"setActivationDelay\",\"inputs\":[{\"name\":\"_activationDelay\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setClaimerFor\",\"inputs\":[{\"name\":\"claimer\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setClaimerFor\",\"inputs\":[{\"name\":\"earner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"claimer\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setDefaultOperatorSplit\",\"inputs\":[{\"name\":\"split\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setOperatorAVSSplit\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"split\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setOperatorPISplit\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"split\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setRewardsForAllSubmitter\",\"inputs\":[{\"name\":\"_submitter\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_newValue\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setRewardsUpdater\",\"inputs\":[{\"name\":\"_rewardsUpdater\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"strategyManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategyManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"submissionNonce\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"nonce\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"submitRoot\",\"inputs\":[{\"name\":\"root\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"rewardsCalculationEndTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"AVSRewardsSubmissionCreated\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"submissionNonce\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"rewardsSubmissionHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"rewardsSubmission\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIRewardsCoordinatorTypes.RewardsSubmission\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.StrategyAndMultiplier[]\",\"components\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"multiplier\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"duration\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ActivationDelaySet\",\"inputs\":[{\"name\":\"oldActivationDelay\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"},{\"name\":\"newActivationDelay\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ClaimerForSet\",\"inputs\":[{\"name\":\"earner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"oldClaimer\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"claimer\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DefaultOperatorSplitBipsSet\",\"inputs\":[{\"name\":\"oldDefaultOperatorSplitBips\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"},{\"name\":\"newDefaultOperatorSplitBips\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DistributionRootDisabled\",\"inputs\":[{\"name\":\"rootIndex\",\"type\":\"uint32\",\"indexed\":true,\"internalType\":\"uint32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DistributionRootSubmitted\",\"inputs\":[{\"name\":\"rootIndex\",\"type\":\"uint32\",\"indexed\":true,\"internalType\":\"uint32\"},{\"name\":\"root\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"rewardsCalculationEndTimestamp\",\"type\":\"uint32\",\"indexed\":true,\"internalType\":\"uint32\"},{\"name\":\"activatedAt\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorAVSSplitBipsSet\",\"inputs\":[{\"name\":\"caller\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"avs\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"activatedAt\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"},{\"name\":\"oldOperatorAVSSplitBips\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"},{\"name\":\"newOperatorAVSSplitBips\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorDirectedAVSRewardsSubmissionCreated\",\"inputs\":[{\"name\":\"caller\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"avs\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"operatorDirectedRewardsSubmissionHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"submissionNonce\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"operatorDirectedRewardsSubmission\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIRewardsCoordinatorTypes.OperatorDirectedRewardsSubmission\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.StrategyAndMultiplier[]\",\"components\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"multiplier\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"operatorRewards\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.OperatorReward[]\",\"components\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"startTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"duration\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"description\",\"type\":\"string\",\"internalType\":\"string\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorPISplitBipsSet\",\"inputs\":[{\"name\":\"caller\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"activatedAt\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"},{\"name\":\"oldOperatorPISplitBips\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"},{\"name\":\"newOperatorPISplitBips\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RewardsClaimed\",\"inputs\":[{\"name\":\"root\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"},{\"name\":\"earner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"claimer\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"recipient\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"token\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIERC20\"},{\"name\":\"claimedAmount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RewardsForAllSubmitterSet\",\"inputs\":[{\"name\":\"rewardsForAllSubmitter\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"oldValue\",\"type\":\"bool\",\"indexed\":true,\"internalType\":\"bool\"},{\"name\":\"newValue\",\"type\":\"bool\",\"indexed\":true,\"internalType\":\"bool\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RewardsSubmissionForAllCreated\",\"inputs\":[{\"name\":\"submitter\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"submissionNonce\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"rewardsSubmissionHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"rewardsSubmission\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIRewardsCoordinatorTypes.RewardsSubmission\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.StrategyAndMultiplier[]\",\"components\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"multiplier\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"duration\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RewardsSubmissionForAllEarnersCreated\",\"inputs\":[{\"name\":\"tokenHopper\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"submissionNonce\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"rewardsSubmissionHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"rewardsSubmission\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIRewardsCoordinatorTypes.RewardsSubmission\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.StrategyAndMultiplier[]\",\"components\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"multiplier\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"duration\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RewardsUpdaterSet\",\"inputs\":[{\"name\":\"oldRewardsUpdater\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newRewardsUpdater\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"AmountExceedsMax\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"AmountIsZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"CurrentlyPaused\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"DurationExceedsMax\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"EarningsNotGreaterThanClaimed\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InputAddressZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InputArrayLengthMismatch\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InputArrayLengthZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidAddressZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidCalculationIntervalSecondsRemainder\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidClaimProof\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidDurationRemainder\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidEarner\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidEarnerLeafIndex\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidGenesisRewardsTimestampRemainder\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidNewPausedStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidPermissions\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidProofLength\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidRoot\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidRootIndex\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidStartTimestampRemainder\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidTokenLeafIndex\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NewRootMustBeForNewCalculatedPeriod\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyPauser\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyUnpauser\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OperatorsNotInAscendingOrder\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"PreviousSplitPending\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RewardsEndTimestampNotElapsed\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RootAlreadyActivated\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RootDisabled\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RootNotActivated\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SplitExceedsMax\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StartTimestampTooFarInFuture\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StartTimestampTooFarInPast\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StrategiesNotInAscendingOrder\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StrategyNotWhitelisted\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SubmissionNotRetroactive\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"UnauthorizedCaller\",\"inputs\":[]}]", +<<<<<<< HEAD <<<<<<< HEAD Bin: "0x6101c0604052348015610010575f5ffd5b506040516142d63803806142d683398101604081905261002f91610211565b858a8a8a88888888888f6001600160a01b038116610060576040516339b190bb60e11b815260040160405180910390fd5b6001600160a01b031660805261007685826102d3565b63ffffffff161561009a57604051630e06bd3160e01b815260040160405180910390fd5b6100a762015180866102d3565b63ffffffff16156100cb5760405163223c7b3960e11b815260040160405180910390fd5b6001600160a01b0397881660a05295871660c05293861660e05263ffffffff9283166101005290821661012052811661014052908116610160521661018052166101a052610117610126565b50505050505050505050610306565b5f54610100900460ff16156101915760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff908116146101e0575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b03811681146101f6575f5ffd5b50565b805163ffffffff8116811461020c575f5ffd5b919050565b5f5f5f5f5f5f5f5f5f5f6101408b8d03121561022b575f5ffd5b8a51610236816101e2565b60208c0151909a50610247816101e2565b60408c0151909950610258816101e2565b60608c0151909850610269816101e2565b60808c015190975061027a816101e2565b955061028860a08c016101f9565b945061029660c08c016101f9565b93506102a460e08c016101f9565b92506102b36101008c016101f9565b91506102c26101208c016101f9565b90509295989b9194979a5092959850565b5f63ffffffff8316806102f457634e487b7160e01b5f52601260045260245ffd5b8063ffffffff84160691505092915050565b60805160a05160c05160e05161010051610120516101405161016051610180516101a051613f066103d05f395f81816105a601526129ee01525f818161045a0152612f2f01525f81816103bc015261233201525f81816105080152612eed01525f818161080c0152612dfd01525f818161076001528181612e4d0152612e9b01525f81816108600152611a2601525f818161052f0152612fca01525f81816108d3015261199601525f81816106f201528181610b62015281816111750152611dcb0152613f065ff3fe608060405234801561000f575f5ffd5b506004361061037c575f3560e01c8063886f1195116101d4578063dcbb03b311610109578063f2fde38b116100a9578063fabc1cbc11610079578063fabc1cbc14610981578063fbf1e2c114610994578063fce36c7d146109a7578063ff9f6cce146109ba575f5ffd5b8063f2fde38b14610935578063f6efbb5914610948578063f8cd84481461095b578063f96abf2e1461096e575f5ffd5b8063e810ce21116100e4578063e810ce21146108bb578063ea4d3c9b146108ce578063ed71e6a2146108f5578063f22cef8514610922575f5ffd5b8063dcbb03b314610882578063de02e50314610895578063e063f81f146108a8575f5ffd5b8063a50a1d9c11610174578063bb7e451f1161014f578063bb7e451f146107e8578063bf21a8aa14610807578063c46db6061461082e578063ca8aa7c71461085b575f5ffd5b8063a50a1d9c14610795578063aebd8bae146107a8578063b3dbb0e0146107d5575f5ffd5b80639be3d4e4116101af5780639be3d4e4146107405780639cb9a5fa146107485780639d45c2811461075b578063a0169ddd14610782575f5ffd5b8063886f1195146106ed5780638da5cb5b146107145780639104c31914610725575f5ffd5b80634596021c116102b55780635c975abb11610255578063715018a611610225578063715018a6146106a05780637b8f8b05146106a8578063863cb9a9146106b0578063865c6953146106c3575f5ffd5b80635c975abb146106435780635e9d83481461064b57806363f6a7981461065e5780636d21117e14610673575f5ffd5b80634d18cc35116102905780634d18cc35146105ee57806358baaa3e14610605578063595c6a67146106185780635ac86ab714610620575f5ffd5b80634596021c1461058e5780634657e26a146105a15780634b943960146105c8575f5ffd5b80632b9f64a41161032057806339b70e38116102fb57806339b70e381461052a5780633a8c0786146105515780633ccc861d146105685780633efe1db61461057b575f5ffd5b80632b9f64a4146104b057806336af41fa146104f057806337838ed014610503575f5ffd5b80630eb383451161035b5780630eb3834514610440578063131433b414610455578063136439dd1461047c578063149bc8721461048f575f5ffd5b806218572c1461038057806304a0c502146103b75780630e9a53cf146103f3575b5f5ffd5b6103a261038e3660046134e6565b60d16020525f908152604090205460ff1681565b60405190151581526020015b60405180910390f35b6103de7f000000000000000000000000000000000000000000000000000000000000000081565b60405163ffffffff90911681526020016103ae565b6103fb6109cd565b6040516103ae91905f6080820190508251825263ffffffff602084015116602083015263ffffffff604084015116604083015260608301511515606083015292915050565b61045361044e36600461350e565b610acd565b005b6103de7f000000000000000000000000000000000000000000000000000000000000000081565b61045361048a366004613545565b610b4d565b6104a261049d366004613572565b610c22565b6040519081526020016103ae565b6104d86104be3660046134e6565b60cc6020525f90815260409020546001600160a01b031681565b6040516001600160a01b0390911681526020016103ae565b6104536104fe3660046135d4565b610c97565b6103de7f000000000000000000000000000000000000000000000000000000000000000081565b6104d87f000000000000000000000000000000000000000000000000000000000000000081565b60cb546103de90600160a01b900463ffffffff1681565b610453610576366004613624565b610e37565b61045361058936600461367b565b610e7c565b61045361059c3660046136a5565b611070565b6104d87f000000000000000000000000000000000000000000000000000000000000000081565b6105db6105d63660046134e6565b6110f1565b60405161ffff90911681526020016103ae565b60cb546103de90600160c01b900463ffffffff1681565b6104536106133660046136f8565b61114c565b610453611160565b6103a261062e366004613711565b606654600160ff9092169190911b9081161490565b6066546104a2565b6103a2610659366004613731565b61120f565b60cb546105db90600160e01b900461ffff1681565b6103a2610681366004613763565b60cf60209081525f928352604080842090915290825290205460ff1681565b61045361129a565b60ca546104a2565b6104536106be3660046134e6565b6112ab565b6104a26106d136600461378d565b60cd60209081525f928352604080842090915290825290205481565b6104d87f000000000000000000000000000000000000000000000000000000000000000081565b6033546001600160a01b03166104d8565b6104d873beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac081565b6103fb6112bc565b6104536107563660046137b9565b611358565b6103de7f000000000000000000000000000000000000000000000000000000000000000081565b6104536107903660046134e6565b611503565b6104536107a336600461381b565b61150e565b6103a26107b6366004613763565b60d260209081525f928352604080842090915290825290205460ff1681565b6104536107e3366004613834565b61151f565b6104a26107f63660046134e6565b60ce6020525f908152604090205481565b6103de7f000000000000000000000000000000000000000000000000000000000000000081565b6103a261083c366004613763565b60d060209081525f928352604080842090915290825290205460ff1681565b6104d87f000000000000000000000000000000000000000000000000000000000000000081565b61045361089036600461385e565b611668565b6103fb6108a3366004613545565b6117d3565b6105db6108b636600461378d565b611863565b6103de6108c9366004613545565b6118cf565b6104d87f000000000000000000000000000000000000000000000000000000000000000081565b6103a2610903366004613763565b60d360209081525f928352604080842090915290825290205460ff1681565b61045361093036600461378d565b611950565b6104536109433660046134e6565b611aba565b6104536109563660046138a2565b611b35565b6104a2610969366004613572565b611c6a565b61045361097c3660046136f8565b611c7a565b61045361098f366004613545565b611dc9565b60cb546104d8906001600160a01b031681565b6104536109b53660046135d4565b611edf565b6104536109c83660046135d4565b61202e565b604080516080810182525f80825260208201819052918101829052606081019190915260ca545b8015610aa5575f60ca610a08600184613914565b81548110610a1857610a18613927565b5f91825260209182902060408051608081018252600293909302909101805483526001015463ffffffff80821694840194909452600160201b810490931690820152600160401b90910460ff161580156060830181905291925090610a875750806040015163ffffffff164210155b15610a925792915050565b5080610a9d8161393b565b9150506109f4565b5050604080516080810182525f80825260208201819052918101829052606081019190915290565b610ad56121ad565b6001600160a01b0382165f81815260d1602052604080822054905160ff9091169284151592841515927f4de6293e668df1398422e1def12118052c1539a03cbfedc145895d48d7685f1c9190a4506001600160a01b03919091165f90815260d160205260409020805460ff1916911515919091179055565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa158015610baf573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610bd39190613950565b610bf057604051631d77d47760e21b815260040160405180910390fd5b6066548181168114610c155760405163c61dca5d60e01b815260040160405180910390fd5b610c1e82612207565b5050565b5f80610c3160208401846134e6565b8360200135604051602001610c7a9392919060f89390931b6001600160f81b031916835260609190911b6bffffffffffffffffffffffff19166001830152601582015260350190565b604051602081830303815290604052805190602001209050919050565b606654600190600290811603610cc05760405163840a48d560e01b815260040160405180910390fd5b335f90815260d1602052604090205460ff16610cef57604051635c427cd960e01b815260040160405180910390fd5b610cf7612244565b5f5b82811015610e275736848483818110610d1457610d14613927565b9050602002810190610d26919061396b565b335f81815260ce60209081526040808320549051949550939192610d509290918591879101613ab9565b604051602081830303815290604052805190602001209050610d718361229d565b335f90815260d0602090815260408083208484529091529020805460ff19166001908117909155610da3908390613ae8565b335f81815260ce602052604090819020929092559051829184917f51088b8c89628df3a8174002c2a034d0152fce6af8415d651b2a4734bf27048290610dea908890613afb565b60405180910390a4610e1c333060408601803590610e0b90602089016134e6565b6001600160a01b031692919061238d565b505050600101610cf9565b50610e326001609755565b505050565b606654600290600490811603610e605760405163840a48d560e01b815260040160405180910390fd5b610e68612244565b610e7283836123f8565b610e326001609755565b606654600390600890811603610ea55760405163840a48d560e01b815260040160405180910390fd5b60cb546001600160a01b03163314610ed057604051635c427cd960e01b815260040160405180910390fd5b60cb5463ffffffff600160c01b909104811690831611610f0357604051631ca7e50b60e21b815260040160405180910390fd5b428263ffffffff1610610f29576040516306957c9160e11b815260040160405180910390fd5b60ca5460cb545f90610f4890600160a01b900463ffffffff1642613b0d565b6040805160808101825287815263ffffffff87811660208084018281528684168587018181525f6060880181815260ca8054600181018255925297517f42d72674974f694b5f5159593243114d38a5c39c89d6b62fee061ff523240ee160029092029182015592517f42d72674974f694b5f5159593243114d38a5c39c89d6b62fee061ff523240ee290930180549151975193871667ffffffffffffffff1990921691909117600160201b978716979097029690961760ff60401b1916600160401b921515929092029190911790945560cb805463ffffffff60c01b1916600160c01b840217905593519283529394508892908616917fecd866c3c158fa00bf34d803d5f6023000b57080bcb48af004c2b4b46b3afd08910160405180910390a45050505050565b6066546002906004908116036110995760405163840a48d560e01b815260040160405180910390fd5b6110a1612244565b5f5b838110156110e0576110d88585838181106110c0576110c0613927565b90506020028101906110d29190613b29565b846123f8565b6001016110a3565b506110eb6001609755565b50505050565b6001600160a01b0381165f90815260d5602090815260408083208151606081018352905461ffff80821683526201000082041693820193909352600160201b90920463ffffffff169082015261114690612680565b92915050565b6111546121ad565b61115d816126f0565b50565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa1580156111c2573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111e69190613950565b61120357604051631d77d47760e21b815260040160405180910390fd5b61120d5f19612207565b565b5f6112928260ca61122360208301836136f8565b63ffffffff168154811061123957611239613927565b5f91825260209182902060408051608081018252600293909302909101805483526001015463ffffffff80821694840194909452600160201b810490931690820152600160401b90910460ff1615156060820152612761565b506001919050565b6112a26121ad565b61120d5f612904565b6112b36121ad565b61115d81612955565b604080516080810182525f80825260208201819052918101829052606081019190915260ca80546112ef90600190613914565b815481106112ff576112ff613927565b5f91825260209182902060408051608081018252600293909302909101805483526001015463ffffffff80821694840194909452600160201b810490931690820152600160401b90910460ff1615156060820152919050565b6066546005906020908116036113815760405163840a48d560e01b815260040160405180910390fd5b8361138b816129b0565b6113a85760405163932d94f760e01b815260040160405180910390fd5b6113b0612244565b5f5b838110156114f157368585838181106113cd576113cd613927565b90506020028101906113df9190613b3d565b6001600160a01b0388165f90815260ce6020908152604080832054905193945092611410918b918591879101613cab565b6040516020818303038152906040528051906020012090505f61143284612a5a565b6001600160a01b038b165f90815260d3602090815260408083208684529091529020805460ff19166001908117909155909150611470908490613ae8565b6001600160a01b038b165f81815260ce60205260409081902092909255905183919033907ffc8888bffd711da60bc5092b33f677d81896fe80ecc677b84cfab8184462b6e0906114c39088908a90613cd1565b60405180910390a46114e1333083610e0b6040890160208a016134e6565b5050600190920191506113b29050565b506114fc6001609755565b5050505050565b33610c1e8183612c40565b6115166121ad565b61115d81612ca3565b6066546007906080908116036115485760405163840a48d560e01b815260040160405180910390fd5b82611552816129b0565b61156f5760405163932d94f760e01b815260040160405180910390fd5b60cb545f9061158b90600160a01b900463ffffffff1642613b0d565b6001600160a01b0386165f90815260d5602090815260408083208151606081018352905461ffff80821683526201000082041693820193909352600160201b90920463ffffffff1690820152919250906115e490612680565b6001600160a01b0387165f90815260d560205260409020909150611609908684612d0e565b6040805163ffffffff8416815261ffff838116602083015287168183015290516001600160a01b0388169133917fd1e028bd664486a46ad26040e999cd2d22e1e9a094ee6afe19fcf64678f16f749181900360600190a3505050505050565b6066546006906040908116036116915760405163840a48d560e01b815260040160405180910390fd5b8361169b816129b0565b6116b85760405163932d94f760e01b815260040160405180910390fd5b60cb545f906116d490600160a01b900463ffffffff1642613b0d565b6001600160a01b038781165f90815260d460209081526040808320938a1683529281528282208351606081018552905461ffff80821683526201000082041692820192909252600160201b90910463ffffffff169281019290925291925061173b90612680565b6001600160a01b038089165f90815260d460209081526040808320938b1683529290522090915061176d908684612d0e565b6040805163ffffffff8416815261ffff838116602083015287168183015290516001600160a01b0388811692908a169133917f48e198b6ae357e529204ee53a8e514c470ff77d9cc8e4f7207f8b5d490ae6934919081900360600190a450505050505050565b604080516080810182525f80825260208201819052918101829052606081019190915260ca828154811061180957611809613927565b5f91825260209182902060408051608081018252600293909302909101805483526001015463ffffffff80821694840194909452600160201b810490931690820152600160401b90910460ff161515606082015292915050565b6001600160a01b038281165f90815260d46020908152604080832093851683529281528282208351606081018552905461ffff80821683526201000082041692820192909252600160201b90910463ffffffff1692810192909252906118c890612680565b9392505050565b60ca545f905b63ffffffff811615611936578260ca6118ef600184613ce9565b63ffffffff168154811061190557611905613927565b905f5260205f2090600202015f015403611924576118c8600182613ce9565b8061192e81613d05565b9150506118d5565b5060405163504570e360e01b815260040160405180910390fd5b8161195a816129b0565b6119775760405163932d94f760e01b815260040160405180910390fd5b6040516336b87bd760e11b81526001600160a01b0384811660048301527f00000000000000000000000000000000000000000000000000000000000000001690636d70f7ae90602401602060405180830381865afa1580156119db573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906119ff9190613950565b80611a93575060405163ba1a84e560e01b81526001600160a01b0384811660048301525f917f00000000000000000000000000000000000000000000000000000000000000009091169063ba1a84e590602401602060405180830381865afa158015611a6d573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a919190613d23565b115b611ab05760405163fb494ea160e01b815260040160405180910390fd5b610e328383612c40565b611ac26121ad565b6001600160a01b038116611b2c5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084015b60405180910390fd5b61115d81612904565b5f54610100900460ff1615808015611b5357505f54600160ff909116105b80611b6c5750303b158015611b6c57505f5460ff166001145b611bcf5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401611b23565b5f805460ff191660011790558015611bf0575f805461ff0019166101001790555b611bf985612207565b611c0286612904565b611c0b84612955565b611c14836126f0565b611c1d82612ca3565b8015611c62575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050505050565b5f6001610c3160208401846134e6565b606654600390600890811603611ca35760405163840a48d560e01b815260040160405180910390fd5b60cb546001600160a01b03163314611cce57604051635c427cd960e01b815260040160405180910390fd5b60ca5463ffffffff831610611cf6576040516394a8d38960e01b815260040160405180910390fd5b5f60ca8363ffffffff1681548110611d1057611d10613927565b905f5260205f20906002020190508060010160089054906101000a900460ff1615611d4e57604051631b14174b60e01b815260040160405180910390fd5b6001810154600160201b900463ffffffff164210611d7f57604051630c36f66560e21b815260040160405180910390fd5b60018101805460ff60401b1916600160401b17905560405163ffffffff8416907fd850e6e5dfa497b72661fa73df2923464eaed9dc2ff1d3cb82bccbfeabe5c41e905f90a2505050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611e25573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611e499190613d3a565b6001600160a01b0316336001600160a01b031614611e7a5760405163794821ff60e01b815260040160405180910390fd5b60665480198219811614611ea15760405163c61dca5d60e01b815260040160405180910390fd5b606682905560405182815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c9060200160405180910390a25050565b6066545f90600190811603611f075760405163840a48d560e01b815260040160405180910390fd5b611f0f612244565b5f5b82811015610e275736848483818110611f2c57611f2c613927565b9050602002810190611f3e919061396b565b335f81815260ce60209081526040808320549051949550939192611f689290918591879101613ab9565b604051602081830303815290604052805190602001209050611f898361229d565b335f90815260cf602090815260408083208484529091529020805460ff19166001908117909155611fbb908390613ae8565b335f81815260ce602052604090819020929092559051829184917f450a367a380c4e339e5ae7340c8464ef27af7781ad9945cfe8abd828f89e628190612002908890613afb565b60405180910390a4612023333060408601803590610e0b90602089016134e6565b505050600101611f11565b6066546004906010908116036120575760405163840a48d560e01b815260040160405180910390fd5b335f90815260d1602052604090205460ff1661208657604051635c427cd960e01b815260040160405180910390fd5b61208e612244565b5f5b82811015610e2757368484838181106120ab576120ab613927565b90506020028101906120bd919061396b565b335f81815260ce602090815260408083205490519495509391926120e79290918591879101613ab9565b6040516020818303038152906040528051906020012090506121088361229d565b335f90815260d2602090815260408083208484529091529020805460ff1916600190811790915561213a908390613ae8565b335f81815260ce602052604090819020929092559051829184917f5251b6fdefcb5d81144e735f69ea4c695fd43b0289ca53dc075033f5fc80068b90612181908890613afb565b60405180910390a46121a2333060408601803590610e0b90602089016134e6565b505050600101612090565b6033546001600160a01b0316331461120d5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401611b23565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a250565b6002609754036122965760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401611b23565b6002609755565b6122cf6122aa8280613d55565b6122ba60808501606086016136f8565b6122ca60a08601608087016136f8565b612ddd565b5f8160400135116122f3576040516310eb483f60e21b815260040160405180910390fd5b6f4b3b4ca85a86c47a098a223fffffffff816040013511156123285760405163070b5a6f60e21b815260040160405180910390fd5b61235863ffffffff7f00000000000000000000000000000000000000000000000000000000000000001642613ae8565b61236860808301606084016136f8565b63ffffffff16111561115d57604051637ee2b44360e01b815260040160405180910390fd5b6040516001600160a01b03808516602483015283166044820152606481018290526110eb9085906323b872dd60e01b906084015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b0319909316929092179091526130b5565b5f60ca61240860208501856136f8565b63ffffffff168154811061241e5761241e613927565b5f91825260209182902060408051608081018252600293909302909101805483526001015463ffffffff80821694840194909452600160201b810490931690820152600160401b90910460ff1615156060820152905061247e8382612761565b5f61248f60808501606086016134e6565b6001600160a01b038082165f90815260cc602052604090205491925016806124b45750805b336001600160a01b038216146124dd57604051635c427cd960e01b815260040160405180910390fd5b5f5b6124ec60a0870187613d9b565b9050811015611c62573661250360e0880188613d55565b8381811061251357612513613927565b6001600160a01b0387165f90815260cd602090815260408083209302949094019450929091508290612547908501856134e6565b6001600160a01b03166001600160a01b031681526020019081526020015f205490508082602001351161258d5760405163aa385e8160e01b815260040160405180910390fd5b5f61259c826020850135613914565b6001600160a01b0387165f90815260cd602090815260408220929350850180359291906125c990876134e6565b6001600160a01b031681526020808201929092526040015f209190915561260a90899083906125fa908701876134e6565b6001600160a01b03169190613188565b86516001600160a01b03808a1691878216918916907f9543dbd55580842586a951f0386e24d68a5df99ae29e3b216588b45fd684ce319061264e60208901896134e6565b604080519283526001600160a01b039091166020830152810186905260600160405180910390a45050506001016124df565b5f816040015163ffffffff165f14806126b25750815161ffff9081161480156126b25750816040015163ffffffff1642105b156126ca57505060cb54600160e01b900461ffff1690565b816040015163ffffffff164210156126e3578151611146565b506020015190565b919050565b60cb546040805163ffffffff600160a01b9093048316815291831660208301527faf557c6c02c208794817a705609cfa935f827312a1adfdd26494b6b95dd2b4b3910160405180910390a160cb805463ffffffff909216600160a01b0263ffffffff60a01b19909216919091179055565b80606001511561278457604051631b14174b60e01b815260040160405180910390fd5b806040015163ffffffff164210156127af57604051631437a2bb60e31b815260040160405180910390fd5b6127bc60c0830183613d9b565b90506127cb60a0840184613d9b565b9050146127eb576040516343714afd60e01b815260040160405180910390fd5b6127f860e0830183613d55565b905061280760c0840184613d9b565b905014612827576040516343714afd60e01b815260040160405180910390fd5b80516128539061283d60408501602086016136f8565b61284a6040860186613de1565b866060016131b8565b5f5b61286260a0840184613d9b565b9050811015610e32576128fc608084013561288060a0860186613d9b565b8481811061289057612890613927565b90506020020160208101906128a591906136f8565b6128b260c0870187613d9b565b858181106128c2576128c2613927565b90506020028101906128d49190613de1565b6128e160e0890189613d55565b878181106128f1576128f1613927565b90506040020161325c565b600101612855565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b60cb546040516001600160a01b038084169216907f237b82f438d75fc568ebab484b75b01d9287b9e98b490b7c23221623b6705dbb905f90a360cb80546001600160a01b0319166001600160a01b0392909216919091179055565b604051631beb2b9760e31b81526001600160a01b0382811660048301523360248301523060448301525f80356001600160e01b0319166064840152917f00000000000000000000000000000000000000000000000000000000000000009091169063df595cb8906084016020604051808303815f875af1158015612a36573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111469190613950565b5f612a88612a688380613d55565b612a7860808601606087016136f8565b6122ca60a08701608088016136f8565b5f612a966040840184613d55565b905011612ab65760405163796cc52560e01b815260040160405180910390fd5b42612ac760a08401608085016136f8565b612ad760808501606086016136f8565b612ae19190613b0d565b63ffffffff1610612b055760405163150358a160e21b815260040160405180910390fd5b5f80805b612b166040860186613d55565b9050811015612c075736612b2d6040870187613d55565b83818110612b3d57612b3d613927565b6040029190910191505f9050612b5660208301836134e6565b6001600160a01b031603612b7d57604051630863a45360e11b815260040160405180910390fd5b612b8a60208201826134e6565b6001600160a01b0316836001600160a01b031610612bbb576040516310fb47f160e31b815260040160405180910390fd5b5f816020013511612bdf576040516310eb483f60e21b815260040160405180910390fd5b612bec60208201826134e6565b9250612bfc602082013585613ae8565b935050600101612b09565b506f4b3b4ca85a86c47a098a223fffffffff821115612c395760405163070b5a6f60e21b815260040160405180910390fd5b5092915050565b6001600160a01b038083165f81815260cc602052604080822080548686166001600160a01b0319821681179092559151919094169392849290917fbab947934d42e0ad206f25c9cab18b5bb6ae144acfb00f40b4e3aa59590ca3129190a4505050565b60cb546040805161ffff600160e01b9093048316815291831660208301527fe6cd4edfdcc1f6d130ab35f73d72378f3a642944fb4ee5bd84b7807a81ea1c4e910160405180910390a160cb805461ffff909216600160e01b0261ffff60e01b19909216919091179055565b61271061ffff83161115612d355760405163891c63df60e01b815260040160405180910390fd5b8254600160201b900463ffffffff164211612d6357604051637b1e25c560e01b815260040160405180910390fd5b8254600160201b900463ffffffff165f03612d8a57825461ffff191661ffff178355612da1565b825462010000810461ffff1661ffff199091161783555b825463ffffffff909116600160201b0267ffffffff000000001961ffff90931662010000029290921667ffffffffffff00001990911617179055565b82612dfb5760405163796cc52560e01b815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000063ffffffff168163ffffffff161115612e4857604051630dd0b9f560e21b815260040160405180910390fd5b612e727f000000000000000000000000000000000000000000000000000000000000000082613e38565b63ffffffff1615612e965760405163ee66470560e01b815260040160405180910390fd5b612ec07f000000000000000000000000000000000000000000000000000000000000000083613e38565b63ffffffff1615612ee457604051633c1a94f160e21b815260040160405180910390fd5b8163ffffffff167f000000000000000000000000000000000000000000000000000000000000000063ffffffff1642612f1d9190613914565b11158015612f5757508163ffffffff167f000000000000000000000000000000000000000000000000000000000000000063ffffffff1611155b612f745760405163041aa75760e11b815260040160405180910390fd5b5f805b84811015611c62575f868683818110612f9257612f92613927565b612fa892602060409092020190810191506134e6565b60405163198f077960e21b81526001600160a01b0380831660048301529192507f00000000000000000000000000000000000000000000000000000000000000009091169063663c1de490602401602060405180830381865afa158015613011573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906130359190613950565b8061305c57506001600160a01b03811673beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac0145b61307957604051632efd965160e11b815260040160405180910390fd5b806001600160a01b0316836001600160a01b0316106130ab5760405163dfad9ca160e01b815260040160405180910390fd5b9150600101612f77565b5f613109826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b031661329a9092919063ffffffff16565b905080515f14806131295750808060200190518101906131299190613950565b610e325760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401611b23565b6040516001600160a01b038316602482015260448101829052610e3290849063a9059cbb60e01b906064016123c1565b6131c3602083613e5f565b6001901b8463ffffffff16106131eb5760405162c6c39d60e71b815260040160405180910390fd5b5f6131f582610c22565b905061323f84848080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152508a92508591505063ffffffff89166132b0565b611c62576040516369ca16c960e01b815260040160405180910390fd5b613267602083613e5f565b6001901b8463ffffffff16106132905760405163054ff4df60e51b815260040160405180910390fd5b5f6131f582611c6a565b60606132a884845f856132c7565b949350505050565b5f836132bd86858561339e565b1495945050505050565b6060824710156133285760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401611b23565b5f5f866001600160a01b031685876040516133439190613e72565b5f6040518083038185875af1925050503d805f811461337d576040519150601f19603f3d011682016040523d82523d5f602084013e613382565b606091505b509150915061339387838387613435565b979650505050505050565b5f602084516133ad9190613e88565b156133cb576040516313717da960e21b815260040160405180910390fd5b8260205b8551811161342c576133e2600285613e88565b5f0361340357815f528086015160205260405f20915060028404935061341a565b808601515f528160205260405f2091506002840493505b613425602082613ae8565b90506133cf565b50949350505050565b606083156134a35782515f0361349c576001600160a01b0385163b61349c5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401611b23565b50816132a8565b6132a883838151156134b85781518083602001fd5b8060405162461bcd60e51b8152600401611b239190613e9b565b6001600160a01b038116811461115d575f5ffd5b5f602082840312156134f6575f5ffd5b81356118c8816134d2565b801515811461115d575f5ffd5b5f5f6040838503121561351f575f5ffd5b823561352a816134d2565b9150602083013561353a81613501565b809150509250929050565b5f60208284031215613555575f5ffd5b5035919050565b5f6040828403121561356c575f5ffd5b50919050565b5f60408284031215613582575f5ffd5b6118c8838361355c565b5f5f83601f84011261359c575f5ffd5b50813567ffffffffffffffff8111156135b3575f5ffd5b6020830191508360208260051b85010111156135cd575f5ffd5b9250929050565b5f5f602083850312156135e5575f5ffd5b823567ffffffffffffffff8111156135fb575f5ffd5b6136078582860161358c565b90969095509350505050565b5f610100828403121561356c575f5ffd5b5f5f60408385031215613635575f5ffd5b823567ffffffffffffffff81111561364b575f5ffd5b61365785828601613613565b925050602083013561353a816134d2565b803563ffffffff811681146126eb575f5ffd5b5f5f6040838503121561368c575f5ffd5b8235915061369c60208401613668565b90509250929050565b5f5f5f604084860312156136b7575f5ffd5b833567ffffffffffffffff8111156136cd575f5ffd5b6136d98682870161358c565b90945092505060208401356136ed816134d2565b809150509250925092565b5f60208284031215613708575f5ffd5b6118c882613668565b5f60208284031215613721575f5ffd5b813560ff811681146118c8575f5ffd5b5f60208284031215613741575f5ffd5b813567ffffffffffffffff811115613757575f5ffd5b6132a884828501613613565b5f5f60408385031215613774575f5ffd5b823561377f816134d2565b946020939093013593505050565b5f5f6040838503121561379e575f5ffd5b82356137a9816134d2565b9150602083013561353a816134d2565b5f5f5f604084860312156137cb575f5ffd5b83356137d6816134d2565b9250602084013567ffffffffffffffff8111156137f1575f5ffd5b6137fd8682870161358c565b9497909650939450505050565b803561ffff811681146126eb575f5ffd5b5f6020828403121561382b575f5ffd5b6118c88261380a565b5f5f60408385031215613845575f5ffd5b8235613850816134d2565b915061369c6020840161380a565b5f5f5f60608486031215613870575f5ffd5b833561387b816134d2565b9250602084013561388b816134d2565b91506138996040850161380a565b90509250925092565b5f5f5f5f5f60a086880312156138b6575f5ffd5b85356138c1816134d2565b94506020860135935060408601356138d8816134d2565b92506138e660608701613668565b91506138f46080870161380a565b90509295509295909350565b634e487b7160e01b5f52601160045260245ffd5b8181038181111561114657611146613900565b634e487b7160e01b5f52603260045260245ffd5b5f8161394957613949613900565b505f190190565b5f60208284031215613960575f5ffd5b81516118c881613501565b5f8235609e1983360301811261397f575f5ffd5b9190910192915050565b5f5f8335601e1984360301811261399e575f5ffd5b830160208101925035905067ffffffffffffffff8111156139bd575f5ffd5b8060061b36038213156135cd575f5ffd5b8183526020830192505f815f5b84811015613a315781356139ee816134d2565b6001600160a01b0316865260208201356bffffffffffffffffffffffff8116808214613a18575f5ffd5b60208801525060409586019591909101906001016139db565b5093949350505050565b5f613a468283613989565b60a08552613a5860a0860182846139ce565b9150506020830135613a69816134d2565b6001600160a01b031660208501526040838101359085015263ffffffff613a9260608501613668565b16606085015263ffffffff613aa960808501613668565b1660808501528091505092915050565b60018060a01b0384168152826020820152606060408201525f613adf6060830184613a3b565b95945050505050565b8082018082111561114657611146613900565b602081525f6118c86020830184613a3b565b63ffffffff818116838216019081111561114657611146613900565b5f823560fe1983360301811261397f575f5ffd5b5f823560be1983360301811261397f575f5ffd5b5f5f8335601e19843603018112613b66575f5ffd5b830160208101925035905067ffffffffffffffff811115613b85575f5ffd5b8036038213156135cd575f5ffd5b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b5f613bc68283613989565b60c08552613bd860c0860182846139ce565b9150506020830135613be9816134d2565b6001600160a01b03166020850152613c046040840184613989565b858303604087015280835290915f91906020015b81831015613c53578335613c2b816134d2565b6001600160a01b03168152602084810135908201526040938401936001939093019201613c18565b613c5f60608701613668565b63ffffffff811660608901529350613c7960808701613668565b63ffffffff811660808901529350613c9460a0870187613b51565b9450925086810360a0880152613393818585613b93565b60018060a01b0384168152826020820152606060408201525f613adf6060830184613bbb565b828152604060208201525f6132a86040830184613bbb565b63ffffffff828116828216039081111561114657611146613900565b5f63ffffffff821680613d1a57613d1a613900565b5f190192915050565b5f60208284031215613d33575f5ffd5b5051919050565b5f60208284031215613d4a575f5ffd5b81516118c8816134d2565b5f5f8335601e19843603018112613d6a575f5ffd5b83018035915067ffffffffffffffff821115613d84575f5ffd5b6020019150600681901b36038213156135cd575f5ffd5b5f5f8335601e19843603018112613db0575f5ffd5b83018035915067ffffffffffffffff821115613dca575f5ffd5b6020019150600581901b36038213156135cd575f5ffd5b5f5f8335601e19843603018112613df6575f5ffd5b83018035915067ffffffffffffffff821115613e10575f5ffd5b6020019150368190038213156135cd575f5ffd5b634e487b7160e01b5f52601260045260245ffd5b5f63ffffffff831680613e4d57613e4d613e24565b8063ffffffff84160691505092915050565b5f82613e6d57613e6d613e24565b500490565b5f82518060208501845e5f920191825250919050565b5f82613e9657613e96613e24565b500690565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f8301168401019150509291505056fea264697066735822122038b85e072953498a6772816d5247c44e56b614c9fdac6ebf7b0e16c898f84d4b64736f6c634300081b0033", >>>>>>> 7da92a53 (fix: remove token param from Deposit event and related APIs (#1013)) ======= Bin: "0x6101c0604052348015610010575f5ffd5b506040516142d63803806142d683398101604081905261002f91610211565b858a8a8a88888888888f6001600160a01b038116610060576040516339b190bb60e11b815260040160405180910390fd5b6001600160a01b031660805261007685826102d3565b63ffffffff161561009a57604051630e06bd3160e01b815260040160405180910390fd5b6100a762015180866102d3565b63ffffffff16156100cb5760405163223c7b3960e11b815260040160405180910390fd5b6001600160a01b0397881660a05295871660c05293861660e05263ffffffff9283166101005290821661012052811661014052908116610160521661018052166101a052610117610126565b50505050505050505050610306565b5f54610100900460ff16156101915760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff908116146101e0575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b03811681146101f6575f5ffd5b50565b805163ffffffff8116811461020c575f5ffd5b919050565b5f5f5f5f5f5f5f5f5f5f6101408b8d03121561022b575f5ffd5b8a51610236816101e2565b60208c0151909a50610247816101e2565b60408c0151909950610258816101e2565b60608c0151909850610269816101e2565b60808c015190975061027a816101e2565b955061028860a08c016101f9565b945061029660c08c016101f9565b93506102a460e08c016101f9565b92506102b36101008c016101f9565b91506102c26101208c016101f9565b90509295989b9194979a5092959850565b5f63ffffffff8316806102f457634e487b7160e01b5f52601260045260245ffd5b8063ffffffff84160691505092915050565b60805160a05160c05160e05161010051610120516101405161016051610180516101a051613f066103d05f395f81816105a601526129ee01525f818161045a0152612f2f01525f81816103bc015261233201525f81816105080152612eed01525f818161080c0152612dfd01525f818161076001528181612e4d0152612e9b01525f81816108600152611a2601525f818161052f0152612fca01525f81816108d3015261199601525f81816106f201528181610b62015281816111750152611dcb0152613f065ff3fe608060405234801561000f575f5ffd5b506004361061037c575f3560e01c8063886f1195116101d4578063dcbb03b311610109578063f2fde38b116100a9578063fabc1cbc11610079578063fabc1cbc14610981578063fbf1e2c114610994578063fce36c7d146109a7578063ff9f6cce146109ba575f5ffd5b8063f2fde38b14610935578063f6efbb5914610948578063f8cd84481461095b578063f96abf2e1461096e575f5ffd5b8063e810ce21116100e4578063e810ce21146108bb578063ea4d3c9b146108ce578063ed71e6a2146108f5578063f22cef8514610922575f5ffd5b8063dcbb03b314610882578063de02e50314610895578063e063f81f146108a8575f5ffd5b8063a50a1d9c11610174578063bb7e451f1161014f578063bb7e451f146107e8578063bf21a8aa14610807578063c46db6061461082e578063ca8aa7c71461085b575f5ffd5b8063a50a1d9c14610795578063aebd8bae146107a8578063b3dbb0e0146107d5575f5ffd5b80639be3d4e4116101af5780639be3d4e4146107405780639cb9a5fa146107485780639d45c2811461075b578063a0169ddd14610782575f5ffd5b8063886f1195146106ed5780638da5cb5b146107145780639104c31914610725575f5ffd5b80634596021c116102b55780635c975abb11610255578063715018a611610225578063715018a6146106a05780637b8f8b05146106a8578063863cb9a9146106b0578063865c6953146106c3575f5ffd5b80635c975abb146106435780635e9d83481461064b57806363f6a7981461065e5780636d21117e14610673575f5ffd5b80634d18cc35116102905780634d18cc35146105ee57806358baaa3e14610605578063595c6a67146106185780635ac86ab714610620575f5ffd5b80634596021c1461058e5780634657e26a146105a15780634b943960146105c8575f5ffd5b80632b9f64a41161032057806339b70e38116102fb57806339b70e381461052a5780633a8c0786146105515780633ccc861d146105685780633efe1db61461057b575f5ffd5b80632b9f64a4146104b057806336af41fa146104f057806337838ed014610503575f5ffd5b80630eb383451161035b5780630eb3834514610440578063131433b414610455578063136439dd1461047c578063149bc8721461048f575f5ffd5b806218572c1461038057806304a0c502146103b75780630e9a53cf146103f3575b5f5ffd5b6103a261038e3660046134e6565b60d16020525f908152604090205460ff1681565b60405190151581526020015b60405180910390f35b6103de7f000000000000000000000000000000000000000000000000000000000000000081565b60405163ffffffff90911681526020016103ae565b6103fb6109cd565b6040516103ae91905f6080820190508251825263ffffffff602084015116602083015263ffffffff604084015116604083015260608301511515606083015292915050565b61045361044e36600461350e565b610acd565b005b6103de7f000000000000000000000000000000000000000000000000000000000000000081565b61045361048a366004613545565b610b4d565b6104a261049d366004613572565b610c22565b6040519081526020016103ae565b6104d86104be3660046134e6565b60cc6020525f90815260409020546001600160a01b031681565b6040516001600160a01b0390911681526020016103ae565b6104536104fe3660046135d4565b610c97565b6103de7f000000000000000000000000000000000000000000000000000000000000000081565b6104d87f000000000000000000000000000000000000000000000000000000000000000081565b60cb546103de90600160a01b900463ffffffff1681565b610453610576366004613624565b610e37565b61045361058936600461367b565b610e7c565b61045361059c3660046136a5565b611070565b6104d87f000000000000000000000000000000000000000000000000000000000000000081565b6105db6105d63660046134e6565b6110f1565b60405161ffff90911681526020016103ae565b60cb546103de90600160c01b900463ffffffff1681565b6104536106133660046136f8565b61114c565b610453611160565b6103a261062e366004613711565b606654600160ff9092169190911b9081161490565b6066546104a2565b6103a2610659366004613731565b61120f565b60cb546105db90600160e01b900461ffff1681565b6103a2610681366004613763565b60cf60209081525f928352604080842090915290825290205460ff1681565b61045361129a565b60ca546104a2565b6104536106be3660046134e6565b6112ab565b6104a26106d136600461378d565b60cd60209081525f928352604080842090915290825290205481565b6104d87f000000000000000000000000000000000000000000000000000000000000000081565b6033546001600160a01b03166104d8565b6104d873beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac081565b6103fb6112bc565b6104536107563660046137b9565b611358565b6103de7f000000000000000000000000000000000000000000000000000000000000000081565b6104536107903660046134e6565b611503565b6104536107a336600461381b565b61150e565b6103a26107b6366004613763565b60d260209081525f928352604080842090915290825290205460ff1681565b6104536107e3366004613834565b61151f565b6104a26107f63660046134e6565b60ce6020525f908152604090205481565b6103de7f000000000000000000000000000000000000000000000000000000000000000081565b6103a261083c366004613763565b60d060209081525f928352604080842090915290825290205460ff1681565b6104d87f000000000000000000000000000000000000000000000000000000000000000081565b61045361089036600461385e565b611668565b6103fb6108a3366004613545565b6117d3565b6105db6108b636600461378d565b611863565b6103de6108c9366004613545565b6118cf565b6104d87f000000000000000000000000000000000000000000000000000000000000000081565b6103a2610903366004613763565b60d360209081525f928352604080842090915290825290205460ff1681565b61045361093036600461378d565b611950565b6104536109433660046134e6565b611aba565b6104536109563660046138a2565b611b35565b6104a2610969366004613572565b611c6a565b61045361097c3660046136f8565b611c7a565b61045361098f366004613545565b611dc9565b60cb546104d8906001600160a01b031681565b6104536109b53660046135d4565b611edf565b6104536109c83660046135d4565b61202e565b604080516080810182525f80825260208201819052918101829052606081019190915260ca545b8015610aa5575f60ca610a08600184613914565b81548110610a1857610a18613927565b5f91825260209182902060408051608081018252600293909302909101805483526001015463ffffffff80821694840194909452600160201b810490931690820152600160401b90910460ff161580156060830181905291925090610a875750806040015163ffffffff164210155b15610a925792915050565b5080610a9d8161393b565b9150506109f4565b5050604080516080810182525f80825260208201819052918101829052606081019190915290565b610ad56121ad565b6001600160a01b0382165f81815260d1602052604080822054905160ff9091169284151592841515927f4de6293e668df1398422e1def12118052c1539a03cbfedc145895d48d7685f1c9190a4506001600160a01b03919091165f90815260d160205260409020805460ff1916911515919091179055565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa158015610baf573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610bd39190613950565b610bf057604051631d77d47760e21b815260040160405180910390fd5b6066548181168114610c155760405163c61dca5d60e01b815260040160405180910390fd5b610c1e82612207565b5050565b5f80610c3160208401846134e6565b8360200135604051602001610c7a9392919060f89390931b6001600160f81b031916835260609190911b6bffffffffffffffffffffffff19166001830152601582015260350190565b604051602081830303815290604052805190602001209050919050565b606654600190600290811603610cc05760405163840a48d560e01b815260040160405180910390fd5b335f90815260d1602052604090205460ff16610cef57604051635c427cd960e01b815260040160405180910390fd5b610cf7612244565b5f5b82811015610e275736848483818110610d1457610d14613927565b9050602002810190610d26919061396b565b335f81815260ce60209081526040808320549051949550939192610d509290918591879101613ab9565b604051602081830303815290604052805190602001209050610d718361229d565b335f90815260d0602090815260408083208484529091529020805460ff19166001908117909155610da3908390613ae8565b335f81815260ce602052604090819020929092559051829184917f51088b8c89628df3a8174002c2a034d0152fce6af8415d651b2a4734bf27048290610dea908890613afb565b60405180910390a4610e1c333060408601803590610e0b90602089016134e6565b6001600160a01b031692919061238d565b505050600101610cf9565b50610e326001609755565b505050565b606654600290600490811603610e605760405163840a48d560e01b815260040160405180910390fd5b610e68612244565b610e7283836123f8565b610e326001609755565b606654600390600890811603610ea55760405163840a48d560e01b815260040160405180910390fd5b60cb546001600160a01b03163314610ed057604051635c427cd960e01b815260040160405180910390fd5b60cb5463ffffffff600160c01b909104811690831611610f0357604051631ca7e50b60e21b815260040160405180910390fd5b428263ffffffff1610610f29576040516306957c9160e11b815260040160405180910390fd5b60ca5460cb545f90610f4890600160a01b900463ffffffff1642613b0d565b6040805160808101825287815263ffffffff87811660208084018281528684168587018181525f6060880181815260ca8054600181018255925297517f42d72674974f694b5f5159593243114d38a5c39c89d6b62fee061ff523240ee160029092029182015592517f42d72674974f694b5f5159593243114d38a5c39c89d6b62fee061ff523240ee290930180549151975193871667ffffffffffffffff1990921691909117600160201b978716979097029690961760ff60401b1916600160401b921515929092029190911790945560cb805463ffffffff60c01b1916600160c01b840217905593519283529394508892908616917fecd866c3c158fa00bf34d803d5f6023000b57080bcb48af004c2b4b46b3afd08910160405180910390a45050505050565b6066546002906004908116036110995760405163840a48d560e01b815260040160405180910390fd5b6110a1612244565b5f5b838110156110e0576110d88585838181106110c0576110c0613927565b90506020028101906110d29190613b29565b846123f8565b6001016110a3565b506110eb6001609755565b50505050565b6001600160a01b0381165f90815260d5602090815260408083208151606081018352905461ffff80821683526201000082041693820193909352600160201b90920463ffffffff169082015261114690612680565b92915050565b6111546121ad565b61115d816126f0565b50565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa1580156111c2573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111e69190613950565b61120357604051631d77d47760e21b815260040160405180910390fd5b61120d5f19612207565b565b5f6112928260ca61122360208301836136f8565b63ffffffff168154811061123957611239613927565b5f91825260209182902060408051608081018252600293909302909101805483526001015463ffffffff80821694840194909452600160201b810490931690820152600160401b90910460ff1615156060820152612761565b506001919050565b6112a26121ad565b61120d5f612904565b6112b36121ad565b61115d81612955565b604080516080810182525f80825260208201819052918101829052606081019190915260ca80546112ef90600190613914565b815481106112ff576112ff613927565b5f91825260209182902060408051608081018252600293909302909101805483526001015463ffffffff80821694840194909452600160201b810490931690820152600160401b90910460ff1615156060820152919050565b6066546005906020908116036113815760405163840a48d560e01b815260040160405180910390fd5b8361138b816129b0565b6113a85760405163932d94f760e01b815260040160405180910390fd5b6113b0612244565b5f5b838110156114f157368585838181106113cd576113cd613927565b90506020028101906113df9190613b3d565b6001600160a01b0388165f90815260ce6020908152604080832054905193945092611410918b918591879101613cab565b6040516020818303038152906040528051906020012090505f61143284612a5a565b6001600160a01b038b165f90815260d3602090815260408083208684529091529020805460ff19166001908117909155909150611470908490613ae8565b6001600160a01b038b165f81815260ce60205260409081902092909255905183919033907ffc8888bffd711da60bc5092b33f677d81896fe80ecc677b84cfab8184462b6e0906114c39088908a90613cd1565b60405180910390a46114e1333083610e0b6040890160208a016134e6565b5050600190920191506113b29050565b506114fc6001609755565b5050505050565b33610c1e8183612c40565b6115166121ad565b61115d81612ca3565b6066546007906080908116036115485760405163840a48d560e01b815260040160405180910390fd5b82611552816129b0565b61156f5760405163932d94f760e01b815260040160405180910390fd5b60cb545f9061158b90600160a01b900463ffffffff1642613b0d565b6001600160a01b0386165f90815260d5602090815260408083208151606081018352905461ffff80821683526201000082041693820193909352600160201b90920463ffffffff1690820152919250906115e490612680565b6001600160a01b0387165f90815260d560205260409020909150611609908684612d0e565b6040805163ffffffff8416815261ffff838116602083015287168183015290516001600160a01b0388169133917fd1e028bd664486a46ad26040e999cd2d22e1e9a094ee6afe19fcf64678f16f749181900360600190a3505050505050565b6066546006906040908116036116915760405163840a48d560e01b815260040160405180910390fd5b8361169b816129b0565b6116b85760405163932d94f760e01b815260040160405180910390fd5b60cb545f906116d490600160a01b900463ffffffff1642613b0d565b6001600160a01b038781165f90815260d460209081526040808320938a1683529281528282208351606081018552905461ffff80821683526201000082041692820192909252600160201b90910463ffffffff169281019290925291925061173b90612680565b6001600160a01b038089165f90815260d460209081526040808320938b1683529290522090915061176d908684612d0e565b6040805163ffffffff8416815261ffff838116602083015287168183015290516001600160a01b0388811692908a169133917f48e198b6ae357e529204ee53a8e514c470ff77d9cc8e4f7207f8b5d490ae6934919081900360600190a450505050505050565b604080516080810182525f80825260208201819052918101829052606081019190915260ca828154811061180957611809613927565b5f91825260209182902060408051608081018252600293909302909101805483526001015463ffffffff80821694840194909452600160201b810490931690820152600160401b90910460ff161515606082015292915050565b6001600160a01b038281165f90815260d46020908152604080832093851683529281528282208351606081018552905461ffff80821683526201000082041692820192909252600160201b90910463ffffffff1692810192909252906118c890612680565b9392505050565b60ca545f905b63ffffffff811615611936578260ca6118ef600184613ce9565b63ffffffff168154811061190557611905613927565b905f5260205f2090600202015f015403611924576118c8600182613ce9565b8061192e81613d05565b9150506118d5565b5060405163504570e360e01b815260040160405180910390fd5b8161195a816129b0565b6119775760405163932d94f760e01b815260040160405180910390fd5b6040516336b87bd760e11b81526001600160a01b0384811660048301527f00000000000000000000000000000000000000000000000000000000000000001690636d70f7ae90602401602060405180830381865afa1580156119db573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906119ff9190613950565b80611a93575060405163ba1a84e560e01b81526001600160a01b0384811660048301525f917f00000000000000000000000000000000000000000000000000000000000000009091169063ba1a84e590602401602060405180830381865afa158015611a6d573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a919190613d23565b115b611ab05760405163fb494ea160e01b815260040160405180910390fd5b610e328383612c40565b611ac26121ad565b6001600160a01b038116611b2c5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084015b60405180910390fd5b61115d81612904565b5f54610100900460ff1615808015611b5357505f54600160ff909116105b80611b6c5750303b158015611b6c57505f5460ff166001145b611bcf5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401611b23565b5f805460ff191660011790558015611bf0575f805461ff0019166101001790555b611bf985612207565b611c0286612904565b611c0b84612955565b611c14836126f0565b611c1d82612ca3565b8015611c62575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050505050565b5f6001610c3160208401846134e6565b606654600390600890811603611ca35760405163840a48d560e01b815260040160405180910390fd5b60cb546001600160a01b03163314611cce57604051635c427cd960e01b815260040160405180910390fd5b60ca5463ffffffff831610611cf6576040516394a8d38960e01b815260040160405180910390fd5b5f60ca8363ffffffff1681548110611d1057611d10613927565b905f5260205f20906002020190508060010160089054906101000a900460ff1615611d4e57604051631b14174b60e01b815260040160405180910390fd5b6001810154600160201b900463ffffffff164210611d7f57604051630c36f66560e21b815260040160405180910390fd5b60018101805460ff60401b1916600160401b17905560405163ffffffff8416907fd850e6e5dfa497b72661fa73df2923464eaed9dc2ff1d3cb82bccbfeabe5c41e905f90a2505050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611e25573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611e499190613d3a565b6001600160a01b0316336001600160a01b031614611e7a5760405163794821ff60e01b815260040160405180910390fd5b60665480198219811614611ea15760405163c61dca5d60e01b815260040160405180910390fd5b606682905560405182815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c9060200160405180910390a25050565b6066545f90600190811603611f075760405163840a48d560e01b815260040160405180910390fd5b611f0f612244565b5f5b82811015610e275736848483818110611f2c57611f2c613927565b9050602002810190611f3e919061396b565b335f81815260ce60209081526040808320549051949550939192611f689290918591879101613ab9565b604051602081830303815290604052805190602001209050611f898361229d565b335f90815260cf602090815260408083208484529091529020805460ff19166001908117909155611fbb908390613ae8565b335f81815260ce602052604090819020929092559051829184917f450a367a380c4e339e5ae7340c8464ef27af7781ad9945cfe8abd828f89e628190612002908890613afb565b60405180910390a4612023333060408601803590610e0b90602089016134e6565b505050600101611f11565b6066546004906010908116036120575760405163840a48d560e01b815260040160405180910390fd5b335f90815260d1602052604090205460ff1661208657604051635c427cd960e01b815260040160405180910390fd5b61208e612244565b5f5b82811015610e2757368484838181106120ab576120ab613927565b90506020028101906120bd919061396b565b335f81815260ce602090815260408083205490519495509391926120e79290918591879101613ab9565b6040516020818303038152906040528051906020012090506121088361229d565b335f90815260d2602090815260408083208484529091529020805460ff1916600190811790915561213a908390613ae8565b335f81815260ce602052604090819020929092559051829184917f5251b6fdefcb5d81144e735f69ea4c695fd43b0289ca53dc075033f5fc80068b90612181908890613afb565b60405180910390a46121a2333060408601803590610e0b90602089016134e6565b505050600101612090565b6033546001600160a01b0316331461120d5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401611b23565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a250565b6002609754036122965760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401611b23565b6002609755565b6122cf6122aa8280613d55565b6122ba60808501606086016136f8565b6122ca60a08601608087016136f8565b612ddd565b5f8160400135116122f3576040516310eb483f60e21b815260040160405180910390fd5b6f4b3b4ca85a86c47a098a223fffffffff816040013511156123285760405163070b5a6f60e21b815260040160405180910390fd5b61235863ffffffff7f00000000000000000000000000000000000000000000000000000000000000001642613ae8565b61236860808301606084016136f8565b63ffffffff16111561115d57604051637ee2b44360e01b815260040160405180910390fd5b6040516001600160a01b03808516602483015283166044820152606481018290526110eb9085906323b872dd60e01b906084015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b0319909316929092179091526130b5565b5f60ca61240860208501856136f8565b63ffffffff168154811061241e5761241e613927565b5f91825260209182902060408051608081018252600293909302909101805483526001015463ffffffff80821694840194909452600160201b810490931690820152600160401b90910460ff1615156060820152905061247e8382612761565b5f61248f60808501606086016134e6565b6001600160a01b038082165f90815260cc602052604090205491925016806124b45750805b336001600160a01b038216146124dd57604051635c427cd960e01b815260040160405180910390fd5b5f5b6124ec60a0870187613d9b565b9050811015611c62573661250360e0880188613d55565b8381811061251357612513613927565b6001600160a01b0387165f90815260cd602090815260408083209302949094019450929091508290612547908501856134e6565b6001600160a01b03166001600160a01b031681526020019081526020015f205490508082602001351161258d5760405163aa385e8160e01b815260040160405180910390fd5b5f61259c826020850135613914565b6001600160a01b0387165f90815260cd602090815260408220929350850180359291906125c990876134e6565b6001600160a01b031681526020808201929092526040015f209190915561260a90899083906125fa908701876134e6565b6001600160a01b03169190613188565b86516001600160a01b03808a1691878216918916907f9543dbd55580842586a951f0386e24d68a5df99ae29e3b216588b45fd684ce319061264e60208901896134e6565b604080519283526001600160a01b039091166020830152810186905260600160405180910390a45050506001016124df565b5f816040015163ffffffff165f14806126b25750815161ffff9081161480156126b25750816040015163ffffffff1642105b156126ca57505060cb54600160e01b900461ffff1690565b816040015163ffffffff164210156126e3578151611146565b506020015190565b919050565b60cb546040805163ffffffff600160a01b9093048316815291831660208301527faf557c6c02c208794817a705609cfa935f827312a1adfdd26494b6b95dd2b4b3910160405180910390a160cb805463ffffffff909216600160a01b0263ffffffff60a01b19909216919091179055565b80606001511561278457604051631b14174b60e01b815260040160405180910390fd5b806040015163ffffffff164210156127af57604051631437a2bb60e31b815260040160405180910390fd5b6127bc60c0830183613d9b565b90506127cb60a0840184613d9b565b9050146127eb576040516343714afd60e01b815260040160405180910390fd5b6127f860e0830183613d55565b905061280760c0840184613d9b565b905014612827576040516343714afd60e01b815260040160405180910390fd5b80516128539061283d60408501602086016136f8565b61284a6040860186613de1565b866060016131b8565b5f5b61286260a0840184613d9b565b9050811015610e32576128fc608084013561288060a0860186613d9b565b8481811061289057612890613927565b90506020020160208101906128a591906136f8565b6128b260c0870187613d9b565b858181106128c2576128c2613927565b90506020028101906128d49190613de1565b6128e160e0890189613d55565b878181106128f1576128f1613927565b90506040020161325c565b600101612855565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b60cb546040516001600160a01b038084169216907f237b82f438d75fc568ebab484b75b01d9287b9e98b490b7c23221623b6705dbb905f90a360cb80546001600160a01b0319166001600160a01b0392909216919091179055565b604051631beb2b9760e31b81526001600160a01b0382811660048301523360248301523060448301525f80356001600160e01b0319166064840152917f00000000000000000000000000000000000000000000000000000000000000009091169063df595cb8906084016020604051808303815f875af1158015612a36573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111469190613950565b5f612a88612a688380613d55565b612a7860808601606087016136f8565b6122ca60a08701608088016136f8565b5f612a966040840184613d55565b905011612ab65760405163796cc52560e01b815260040160405180910390fd5b42612ac760a08401608085016136f8565b612ad760808501606086016136f8565b612ae19190613b0d565b63ffffffff1610612b055760405163150358a160e21b815260040160405180910390fd5b5f80805b612b166040860186613d55565b9050811015612c075736612b2d6040870187613d55565b83818110612b3d57612b3d613927565b6040029190910191505f9050612b5660208301836134e6565b6001600160a01b031603612b7d57604051630863a45360e11b815260040160405180910390fd5b612b8a60208201826134e6565b6001600160a01b0316836001600160a01b031610612bbb576040516310fb47f160e31b815260040160405180910390fd5b5f816020013511612bdf576040516310eb483f60e21b815260040160405180910390fd5b612bec60208201826134e6565b9250612bfc602082013585613ae8565b935050600101612b09565b506f4b3b4ca85a86c47a098a223fffffffff821115612c395760405163070b5a6f60e21b815260040160405180910390fd5b5092915050565b6001600160a01b038083165f81815260cc602052604080822080548686166001600160a01b0319821681179092559151919094169392849290917fbab947934d42e0ad206f25c9cab18b5bb6ae144acfb00f40b4e3aa59590ca3129190a4505050565b60cb546040805161ffff600160e01b9093048316815291831660208301527fe6cd4edfdcc1f6d130ab35f73d72378f3a642944fb4ee5bd84b7807a81ea1c4e910160405180910390a160cb805461ffff909216600160e01b0261ffff60e01b19909216919091179055565b61271061ffff83161115612d355760405163891c63df60e01b815260040160405180910390fd5b8254600160201b900463ffffffff164211612d6357604051637b1e25c560e01b815260040160405180910390fd5b8254600160201b900463ffffffff165f03612d8a57825461ffff191661ffff178355612da1565b825462010000810461ffff1661ffff199091161783555b825463ffffffff909116600160201b0267ffffffff000000001961ffff90931662010000029290921667ffffffffffff00001990911617179055565b82612dfb5760405163796cc52560e01b815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000063ffffffff168163ffffffff161115612e4857604051630dd0b9f560e21b815260040160405180910390fd5b612e727f000000000000000000000000000000000000000000000000000000000000000082613e38565b63ffffffff1615612e965760405163ee66470560e01b815260040160405180910390fd5b612ec07f000000000000000000000000000000000000000000000000000000000000000083613e38565b63ffffffff1615612ee457604051633c1a94f160e21b815260040160405180910390fd5b8163ffffffff167f000000000000000000000000000000000000000000000000000000000000000063ffffffff1642612f1d9190613914565b11158015612f5757508163ffffffff167f000000000000000000000000000000000000000000000000000000000000000063ffffffff1611155b612f745760405163041aa75760e11b815260040160405180910390fd5b5f805b84811015611c62575f868683818110612f9257612f92613927565b612fa892602060409092020190810191506134e6565b60405163198f077960e21b81526001600160a01b0380831660048301529192507f00000000000000000000000000000000000000000000000000000000000000009091169063663c1de490602401602060405180830381865afa158015613011573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906130359190613950565b8061305c57506001600160a01b03811673beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac0145b61307957604051632efd965160e11b815260040160405180910390fd5b806001600160a01b0316836001600160a01b0316106130ab5760405163dfad9ca160e01b815260040160405180910390fd5b9150600101612f77565b5f613109826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b031661329a9092919063ffffffff16565b905080515f14806131295750808060200190518101906131299190613950565b610e325760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401611b23565b6040516001600160a01b038316602482015260448101829052610e3290849063a9059cbb60e01b906064016123c1565b6131c3602083613e5f565b6001901b8463ffffffff16106131eb5760405162c6c39d60e71b815260040160405180910390fd5b5f6131f582610c22565b905061323f84848080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152508a92508591505063ffffffff89166132b0565b611c62576040516369ca16c960e01b815260040160405180910390fd5b613267602083613e5f565b6001901b8463ffffffff16106132905760405163054ff4df60e51b815260040160405180910390fd5b5f6131f582611c6a565b60606132a884845f856132c7565b949350505050565b5f836132bd86858561339e565b1495945050505050565b6060824710156133285760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401611b23565b5f5f866001600160a01b031685876040516133439190613e72565b5f6040518083038185875af1925050503d805f811461337d576040519150601f19603f3d011682016040523d82523d5f602084013e613382565b606091505b509150915061339387838387613435565b979650505050505050565b5f602084516133ad9190613e88565b156133cb576040516313717da960e21b815260040160405180910390fd5b8260205b8551811161342c576133e2600285613e88565b5f0361340357815f528086015160205260405f20915060028404935061341a565b808601515f528160205260405f2091506002840493505b613425602082613ae8565b90506133cf565b50949350505050565b606083156134a35782515f0361349c576001600160a01b0385163b61349c5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401611b23565b50816132a8565b6132a883838151156134b85781518083602001fd5b8060405162461bcd60e51b8152600401611b239190613e9b565b6001600160a01b038116811461115d575f5ffd5b5f602082840312156134f6575f5ffd5b81356118c8816134d2565b801515811461115d575f5ffd5b5f5f6040838503121561351f575f5ffd5b823561352a816134d2565b9150602083013561353a81613501565b809150509250929050565b5f60208284031215613555575f5ffd5b5035919050565b5f6040828403121561356c575f5ffd5b50919050565b5f60408284031215613582575f5ffd5b6118c8838361355c565b5f5f83601f84011261359c575f5ffd5b50813567ffffffffffffffff8111156135b3575f5ffd5b6020830191508360208260051b85010111156135cd575f5ffd5b9250929050565b5f5f602083850312156135e5575f5ffd5b823567ffffffffffffffff8111156135fb575f5ffd5b6136078582860161358c565b90969095509350505050565b5f610100828403121561356c575f5ffd5b5f5f60408385031215613635575f5ffd5b823567ffffffffffffffff81111561364b575f5ffd5b61365785828601613613565b925050602083013561353a816134d2565b803563ffffffff811681146126eb575f5ffd5b5f5f6040838503121561368c575f5ffd5b8235915061369c60208401613668565b90509250929050565b5f5f5f604084860312156136b7575f5ffd5b833567ffffffffffffffff8111156136cd575f5ffd5b6136d98682870161358c565b90945092505060208401356136ed816134d2565b809150509250925092565b5f60208284031215613708575f5ffd5b6118c882613668565b5f60208284031215613721575f5ffd5b813560ff811681146118c8575f5ffd5b5f60208284031215613741575f5ffd5b813567ffffffffffffffff811115613757575f5ffd5b6132a884828501613613565b5f5f60408385031215613774575f5ffd5b823561377f816134d2565b946020939093013593505050565b5f5f6040838503121561379e575f5ffd5b82356137a9816134d2565b9150602083013561353a816134d2565b5f5f5f604084860312156137cb575f5ffd5b83356137d6816134d2565b9250602084013567ffffffffffffffff8111156137f1575f5ffd5b6137fd8682870161358c565b9497909650939450505050565b803561ffff811681146126eb575f5ffd5b5f6020828403121561382b575f5ffd5b6118c88261380a565b5f5f60408385031215613845575f5ffd5b8235613850816134d2565b915061369c6020840161380a565b5f5f5f60608486031215613870575f5ffd5b833561387b816134d2565b9250602084013561388b816134d2565b91506138996040850161380a565b90509250925092565b5f5f5f5f5f60a086880312156138b6575f5ffd5b85356138c1816134d2565b94506020860135935060408601356138d8816134d2565b92506138e660608701613668565b91506138f46080870161380a565b90509295509295909350565b634e487b7160e01b5f52601160045260245ffd5b8181038181111561114657611146613900565b634e487b7160e01b5f52603260045260245ffd5b5f8161394957613949613900565b505f190190565b5f60208284031215613960575f5ffd5b81516118c881613501565b5f8235609e1983360301811261397f575f5ffd5b9190910192915050565b5f5f8335601e1984360301811261399e575f5ffd5b830160208101925035905067ffffffffffffffff8111156139bd575f5ffd5b8060061b36038213156135cd575f5ffd5b8183526020830192505f815f5b84811015613a315781356139ee816134d2565b6001600160a01b0316865260208201356bffffffffffffffffffffffff8116808214613a18575f5ffd5b60208801525060409586019591909101906001016139db565b5093949350505050565b5f613a468283613989565b60a08552613a5860a0860182846139ce565b9150506020830135613a69816134d2565b6001600160a01b031660208501526040838101359085015263ffffffff613a9260608501613668565b16606085015263ffffffff613aa960808501613668565b1660808501528091505092915050565b60018060a01b0384168152826020820152606060408201525f613adf6060830184613a3b565b95945050505050565b8082018082111561114657611146613900565b602081525f6118c86020830184613a3b565b63ffffffff818116838216019081111561114657611146613900565b5f823560fe1983360301811261397f575f5ffd5b5f823560be1983360301811261397f575f5ffd5b5f5f8335601e19843603018112613b66575f5ffd5b830160208101925035905067ffffffffffffffff811115613b85575f5ffd5b8036038213156135cd575f5ffd5b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b5f613bc68283613989565b60c08552613bd860c0860182846139ce565b9150506020830135613be9816134d2565b6001600160a01b03166020850152613c046040840184613989565b858303604087015280835290915f91906020015b81831015613c53578335613c2b816134d2565b6001600160a01b03168152602084810135908201526040938401936001939093019201613c18565b613c5f60608701613668565b63ffffffff811660608901529350613c7960808701613668565b63ffffffff811660808901529350613c9460a0870187613b51565b9450925086810360a0880152613393818585613b93565b60018060a01b0384168152826020820152606060408201525f613adf6060830184613bbb565b828152604060208201525f6132a86040830184613bbb565b63ffffffff828116828216039081111561114657611146613900565b5f63ffffffff821680613d1a57613d1a613900565b5f190192915050565b5f60208284031215613d33575f5ffd5b5051919050565b5f60208284031215613d4a575f5ffd5b81516118c8816134d2565b5f5f8335601e19843603018112613d6a575f5ffd5b83018035915067ffffffffffffffff821115613d84575f5ffd5b6020019150600681901b36038213156135cd575f5ffd5b5f5f8335601e19843603018112613db0575f5ffd5b83018035915067ffffffffffffffff821115613dca575f5ffd5b6020019150600581901b36038213156135cd575f5ffd5b5f5f8335601e19843603018112613df6575f5ffd5b83018035915067ffffffffffffffff821115613e10575f5ffd5b6020019150368190038213156135cd575f5ffd5b634e487b7160e01b5f52601260045260245ffd5b5f63ffffffff831680613e4d57613e4d613e24565b8063ffffffff84160691505092915050565b5f82613e6d57613e6d613e24565b500490565b5f82518060208501845e5f920191825250919050565b5f82613e9657613e96613e24565b500690565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f8301168401019150509291505056fea264697066735822122001d8f1e9b16b9c1c91a405139ae06b32868e237bf6cef0ef8016876bbdb8292164736f6c634300081b0033", >>>>>>> eead7c9e (feat: better introspection for encumbered magnitude (#1038)) +======= + Bin: "0x6101c0604052348015610010575f5ffd5b506040516142d63803806142d683398101604081905261002f91610211565b858a8a8a88888888888f6001600160a01b038116610060576040516339b190bb60e11b815260040160405180910390fd5b6001600160a01b031660805261007685826102d3565b63ffffffff161561009a57604051630e06bd3160e01b815260040160405180910390fd5b6100a762015180866102d3565b63ffffffff16156100cb5760405163223c7b3960e11b815260040160405180910390fd5b6001600160a01b0397881660a05295871660c05293861660e05263ffffffff9283166101005290821661012052811661014052908116610160521661018052166101a052610117610126565b50505050505050505050610306565b5f54610100900460ff16156101915760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff908116146101e0575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b03811681146101f6575f5ffd5b50565b805163ffffffff8116811461020c575f5ffd5b919050565b5f5f5f5f5f5f5f5f5f5f6101408b8d03121561022b575f5ffd5b8a51610236816101e2565b60208c0151909a50610247816101e2565b60408c0151909950610258816101e2565b60608c0151909850610269816101e2565b60808c015190975061027a816101e2565b955061028860a08c016101f9565b945061029660c08c016101f9565b93506102a460e08c016101f9565b92506102b36101008c016101f9565b91506102c26101208c016101f9565b90509295989b9194979a5092959850565b5f63ffffffff8316806102f457634e487b7160e01b5f52601260045260245ffd5b8063ffffffff84160691505092915050565b60805160a05160c05160e05161010051610120516101405161016051610180516101a051613f066103d05f395f81816105a601526129ee01525f818161045a0152612f2f01525f81816103bc015261233201525f81816105080152612eed01525f818161080c0152612dfd01525f818161076001528181612e4d0152612e9b01525f81816108600152611a2601525f818161052f0152612fca01525f81816108d3015261199601525f81816106f201528181610b62015281816111750152611dcb0152613f065ff3fe608060405234801561000f575f5ffd5b506004361061037c575f3560e01c8063886f1195116101d4578063dcbb03b311610109578063f2fde38b116100a9578063fabc1cbc11610079578063fabc1cbc14610981578063fbf1e2c114610994578063fce36c7d146109a7578063ff9f6cce146109ba575f5ffd5b8063f2fde38b14610935578063f6efbb5914610948578063f8cd84481461095b578063f96abf2e1461096e575f5ffd5b8063e810ce21116100e4578063e810ce21146108bb578063ea4d3c9b146108ce578063ed71e6a2146108f5578063f22cef8514610922575f5ffd5b8063dcbb03b314610882578063de02e50314610895578063e063f81f146108a8575f5ffd5b8063a50a1d9c11610174578063bb7e451f1161014f578063bb7e451f146107e8578063bf21a8aa14610807578063c46db6061461082e578063ca8aa7c71461085b575f5ffd5b8063a50a1d9c14610795578063aebd8bae146107a8578063b3dbb0e0146107d5575f5ffd5b80639be3d4e4116101af5780639be3d4e4146107405780639cb9a5fa146107485780639d45c2811461075b578063a0169ddd14610782575f5ffd5b8063886f1195146106ed5780638da5cb5b146107145780639104c31914610725575f5ffd5b80634596021c116102b55780635c975abb11610255578063715018a611610225578063715018a6146106a05780637b8f8b05146106a8578063863cb9a9146106b0578063865c6953146106c3575f5ffd5b80635c975abb146106435780635e9d83481461064b57806363f6a7981461065e5780636d21117e14610673575f5ffd5b80634d18cc35116102905780634d18cc35146105ee57806358baaa3e14610605578063595c6a67146106185780635ac86ab714610620575f5ffd5b80634596021c1461058e5780634657e26a146105a15780634b943960146105c8575f5ffd5b80632b9f64a41161032057806339b70e38116102fb57806339b70e381461052a5780633a8c0786146105515780633ccc861d146105685780633efe1db61461057b575f5ffd5b80632b9f64a4146104b057806336af41fa146104f057806337838ed014610503575f5ffd5b80630eb383451161035b5780630eb3834514610440578063131433b414610455578063136439dd1461047c578063149bc8721461048f575f5ffd5b806218572c1461038057806304a0c502146103b75780630e9a53cf146103f3575b5f5ffd5b6103a261038e3660046134e6565b60d16020525f908152604090205460ff1681565b60405190151581526020015b60405180910390f35b6103de7f000000000000000000000000000000000000000000000000000000000000000081565b60405163ffffffff90911681526020016103ae565b6103fb6109cd565b6040516103ae91905f6080820190508251825263ffffffff602084015116602083015263ffffffff604084015116604083015260608301511515606083015292915050565b61045361044e36600461350e565b610acd565b005b6103de7f000000000000000000000000000000000000000000000000000000000000000081565b61045361048a366004613545565b610b4d565b6104a261049d366004613572565b610c22565b6040519081526020016103ae565b6104d86104be3660046134e6565b60cc6020525f90815260409020546001600160a01b031681565b6040516001600160a01b0390911681526020016103ae565b6104536104fe3660046135d4565b610c97565b6103de7f000000000000000000000000000000000000000000000000000000000000000081565b6104d87f000000000000000000000000000000000000000000000000000000000000000081565b60cb546103de90600160a01b900463ffffffff1681565b610453610576366004613624565b610e37565b61045361058936600461367b565b610e7c565b61045361059c3660046136a5565b611070565b6104d87f000000000000000000000000000000000000000000000000000000000000000081565b6105db6105d63660046134e6565b6110f1565b60405161ffff90911681526020016103ae565b60cb546103de90600160c01b900463ffffffff1681565b6104536106133660046136f8565b61114c565b610453611160565b6103a261062e366004613711565b606654600160ff9092169190911b9081161490565b6066546104a2565b6103a2610659366004613731565b61120f565b60cb546105db90600160e01b900461ffff1681565b6103a2610681366004613763565b60cf60209081525f928352604080842090915290825290205460ff1681565b61045361129a565b60ca546104a2565b6104536106be3660046134e6565b6112ab565b6104a26106d136600461378d565b60cd60209081525f928352604080842090915290825290205481565b6104d87f000000000000000000000000000000000000000000000000000000000000000081565b6033546001600160a01b03166104d8565b6104d873beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac081565b6103fb6112bc565b6104536107563660046137b9565b611358565b6103de7f000000000000000000000000000000000000000000000000000000000000000081565b6104536107903660046134e6565b611503565b6104536107a336600461381b565b61150e565b6103a26107b6366004613763565b60d260209081525f928352604080842090915290825290205460ff1681565b6104536107e3366004613834565b61151f565b6104a26107f63660046134e6565b60ce6020525f908152604090205481565b6103de7f000000000000000000000000000000000000000000000000000000000000000081565b6103a261083c366004613763565b60d060209081525f928352604080842090915290825290205460ff1681565b6104d87f000000000000000000000000000000000000000000000000000000000000000081565b61045361089036600461385e565b611668565b6103fb6108a3366004613545565b6117d3565b6105db6108b636600461378d565b611863565b6103de6108c9366004613545565b6118cf565b6104d87f000000000000000000000000000000000000000000000000000000000000000081565b6103a2610903366004613763565b60d360209081525f928352604080842090915290825290205460ff1681565b61045361093036600461378d565b611950565b6104536109433660046134e6565b611aba565b6104536109563660046138a2565b611b35565b6104a2610969366004613572565b611c6a565b61045361097c3660046136f8565b611c7a565b61045361098f366004613545565b611dc9565b60cb546104d8906001600160a01b031681565b6104536109b53660046135d4565b611edf565b6104536109c83660046135d4565b61202e565b604080516080810182525f80825260208201819052918101829052606081019190915260ca545b8015610aa5575f60ca610a08600184613914565b81548110610a1857610a18613927565b5f91825260209182902060408051608081018252600293909302909101805483526001015463ffffffff80821694840194909452600160201b810490931690820152600160401b90910460ff161580156060830181905291925090610a875750806040015163ffffffff164210155b15610a925792915050565b5080610a9d8161393b565b9150506109f4565b5050604080516080810182525f80825260208201819052918101829052606081019190915290565b610ad56121ad565b6001600160a01b0382165f81815260d1602052604080822054905160ff9091169284151592841515927f4de6293e668df1398422e1def12118052c1539a03cbfedc145895d48d7685f1c9190a4506001600160a01b03919091165f90815260d160205260409020805460ff1916911515919091179055565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa158015610baf573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610bd39190613950565b610bf057604051631d77d47760e21b815260040160405180910390fd5b6066548181168114610c155760405163c61dca5d60e01b815260040160405180910390fd5b610c1e82612207565b5050565b5f80610c3160208401846134e6565b8360200135604051602001610c7a9392919060f89390931b6001600160f81b031916835260609190911b6bffffffffffffffffffffffff19166001830152601582015260350190565b604051602081830303815290604052805190602001209050919050565b606654600190600290811603610cc05760405163840a48d560e01b815260040160405180910390fd5b335f90815260d1602052604090205460ff16610cef57604051635c427cd960e01b815260040160405180910390fd5b610cf7612244565b5f5b82811015610e275736848483818110610d1457610d14613927565b9050602002810190610d26919061396b565b335f81815260ce60209081526040808320549051949550939192610d509290918591879101613ab9565b604051602081830303815290604052805190602001209050610d718361229d565b335f90815260d0602090815260408083208484529091529020805460ff19166001908117909155610da3908390613ae8565b335f81815260ce602052604090819020929092559051829184917f51088b8c89628df3a8174002c2a034d0152fce6af8415d651b2a4734bf27048290610dea908890613afb565b60405180910390a4610e1c333060408601803590610e0b90602089016134e6565b6001600160a01b031692919061238d565b505050600101610cf9565b50610e326001609755565b505050565b606654600290600490811603610e605760405163840a48d560e01b815260040160405180910390fd5b610e68612244565b610e7283836123f8565b610e326001609755565b606654600390600890811603610ea55760405163840a48d560e01b815260040160405180910390fd5b60cb546001600160a01b03163314610ed057604051635c427cd960e01b815260040160405180910390fd5b60cb5463ffffffff600160c01b909104811690831611610f0357604051631ca7e50b60e21b815260040160405180910390fd5b428263ffffffff1610610f29576040516306957c9160e11b815260040160405180910390fd5b60ca5460cb545f90610f4890600160a01b900463ffffffff1642613b0d565b6040805160808101825287815263ffffffff87811660208084018281528684168587018181525f6060880181815260ca8054600181018255925297517f42d72674974f694b5f5159593243114d38a5c39c89d6b62fee061ff523240ee160029092029182015592517f42d72674974f694b5f5159593243114d38a5c39c89d6b62fee061ff523240ee290930180549151975193871667ffffffffffffffff1990921691909117600160201b978716979097029690961760ff60401b1916600160401b921515929092029190911790945560cb805463ffffffff60c01b1916600160c01b840217905593519283529394508892908616917fecd866c3c158fa00bf34d803d5f6023000b57080bcb48af004c2b4b46b3afd08910160405180910390a45050505050565b6066546002906004908116036110995760405163840a48d560e01b815260040160405180910390fd5b6110a1612244565b5f5b838110156110e0576110d88585838181106110c0576110c0613927565b90506020028101906110d29190613b29565b846123f8565b6001016110a3565b506110eb6001609755565b50505050565b6001600160a01b0381165f90815260d5602090815260408083208151606081018352905461ffff80821683526201000082041693820193909352600160201b90920463ffffffff169082015261114690612680565b92915050565b6111546121ad565b61115d816126f0565b50565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa1580156111c2573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111e69190613950565b61120357604051631d77d47760e21b815260040160405180910390fd5b61120d5f19612207565b565b5f6112928260ca61122360208301836136f8565b63ffffffff168154811061123957611239613927565b5f91825260209182902060408051608081018252600293909302909101805483526001015463ffffffff80821694840194909452600160201b810490931690820152600160401b90910460ff1615156060820152612761565b506001919050565b6112a26121ad565b61120d5f612904565b6112b36121ad565b61115d81612955565b604080516080810182525f80825260208201819052918101829052606081019190915260ca80546112ef90600190613914565b815481106112ff576112ff613927565b5f91825260209182902060408051608081018252600293909302909101805483526001015463ffffffff80821694840194909452600160201b810490931690820152600160401b90910460ff1615156060820152919050565b6066546005906020908116036113815760405163840a48d560e01b815260040160405180910390fd5b8361138b816129b0565b6113a85760405163932d94f760e01b815260040160405180910390fd5b6113b0612244565b5f5b838110156114f157368585838181106113cd576113cd613927565b90506020028101906113df9190613b3d565b6001600160a01b0388165f90815260ce6020908152604080832054905193945092611410918b918591879101613cab565b6040516020818303038152906040528051906020012090505f61143284612a5a565b6001600160a01b038b165f90815260d3602090815260408083208684529091529020805460ff19166001908117909155909150611470908490613ae8565b6001600160a01b038b165f81815260ce60205260409081902092909255905183919033907ffc8888bffd711da60bc5092b33f677d81896fe80ecc677b84cfab8184462b6e0906114c39088908a90613cd1565b60405180910390a46114e1333083610e0b6040890160208a016134e6565b5050600190920191506113b29050565b506114fc6001609755565b5050505050565b33610c1e8183612c40565b6115166121ad565b61115d81612ca3565b6066546007906080908116036115485760405163840a48d560e01b815260040160405180910390fd5b82611552816129b0565b61156f5760405163932d94f760e01b815260040160405180910390fd5b60cb545f9061158b90600160a01b900463ffffffff1642613b0d565b6001600160a01b0386165f90815260d5602090815260408083208151606081018352905461ffff80821683526201000082041693820193909352600160201b90920463ffffffff1690820152919250906115e490612680565b6001600160a01b0387165f90815260d560205260409020909150611609908684612d0e565b6040805163ffffffff8416815261ffff838116602083015287168183015290516001600160a01b0388169133917fd1e028bd664486a46ad26040e999cd2d22e1e9a094ee6afe19fcf64678f16f749181900360600190a3505050505050565b6066546006906040908116036116915760405163840a48d560e01b815260040160405180910390fd5b8361169b816129b0565b6116b85760405163932d94f760e01b815260040160405180910390fd5b60cb545f906116d490600160a01b900463ffffffff1642613b0d565b6001600160a01b038781165f90815260d460209081526040808320938a1683529281528282208351606081018552905461ffff80821683526201000082041692820192909252600160201b90910463ffffffff169281019290925291925061173b90612680565b6001600160a01b038089165f90815260d460209081526040808320938b1683529290522090915061176d908684612d0e565b6040805163ffffffff8416815261ffff838116602083015287168183015290516001600160a01b0388811692908a169133917f48e198b6ae357e529204ee53a8e514c470ff77d9cc8e4f7207f8b5d490ae6934919081900360600190a450505050505050565b604080516080810182525f80825260208201819052918101829052606081019190915260ca828154811061180957611809613927565b5f91825260209182902060408051608081018252600293909302909101805483526001015463ffffffff80821694840194909452600160201b810490931690820152600160401b90910460ff161515606082015292915050565b6001600160a01b038281165f90815260d46020908152604080832093851683529281528282208351606081018552905461ffff80821683526201000082041692820192909252600160201b90910463ffffffff1692810192909252906118c890612680565b9392505050565b60ca545f905b63ffffffff811615611936578260ca6118ef600184613ce9565b63ffffffff168154811061190557611905613927565b905f5260205f2090600202015f015403611924576118c8600182613ce9565b8061192e81613d05565b9150506118d5565b5060405163504570e360e01b815260040160405180910390fd5b8161195a816129b0565b6119775760405163932d94f760e01b815260040160405180910390fd5b6040516336b87bd760e11b81526001600160a01b0384811660048301527f00000000000000000000000000000000000000000000000000000000000000001690636d70f7ae90602401602060405180830381865afa1580156119db573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906119ff9190613950565b80611a93575060405163ba1a84e560e01b81526001600160a01b0384811660048301525f917f00000000000000000000000000000000000000000000000000000000000000009091169063ba1a84e590602401602060405180830381865afa158015611a6d573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a919190613d23565b115b611ab05760405163fb494ea160e01b815260040160405180910390fd5b610e328383612c40565b611ac26121ad565b6001600160a01b038116611b2c5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084015b60405180910390fd5b61115d81612904565b5f54610100900460ff1615808015611b5357505f54600160ff909116105b80611b6c5750303b158015611b6c57505f5460ff166001145b611bcf5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401611b23565b5f805460ff191660011790558015611bf0575f805461ff0019166101001790555b611bf985612207565b611c0286612904565b611c0b84612955565b611c14836126f0565b611c1d82612ca3565b8015611c62575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050505050565b5f6001610c3160208401846134e6565b606654600390600890811603611ca35760405163840a48d560e01b815260040160405180910390fd5b60cb546001600160a01b03163314611cce57604051635c427cd960e01b815260040160405180910390fd5b60ca5463ffffffff831610611cf6576040516394a8d38960e01b815260040160405180910390fd5b5f60ca8363ffffffff1681548110611d1057611d10613927565b905f5260205f20906002020190508060010160089054906101000a900460ff1615611d4e57604051631b14174b60e01b815260040160405180910390fd5b6001810154600160201b900463ffffffff164210611d7f57604051630c36f66560e21b815260040160405180910390fd5b60018101805460ff60401b1916600160401b17905560405163ffffffff8416907fd850e6e5dfa497b72661fa73df2923464eaed9dc2ff1d3cb82bccbfeabe5c41e905f90a2505050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611e25573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611e499190613d3a565b6001600160a01b0316336001600160a01b031614611e7a5760405163794821ff60e01b815260040160405180910390fd5b60665480198219811614611ea15760405163c61dca5d60e01b815260040160405180910390fd5b606682905560405182815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c9060200160405180910390a25050565b6066545f90600190811603611f075760405163840a48d560e01b815260040160405180910390fd5b611f0f612244565b5f5b82811015610e275736848483818110611f2c57611f2c613927565b9050602002810190611f3e919061396b565b335f81815260ce60209081526040808320549051949550939192611f689290918591879101613ab9565b604051602081830303815290604052805190602001209050611f898361229d565b335f90815260cf602090815260408083208484529091529020805460ff19166001908117909155611fbb908390613ae8565b335f81815260ce602052604090819020929092559051829184917f450a367a380c4e339e5ae7340c8464ef27af7781ad9945cfe8abd828f89e628190612002908890613afb565b60405180910390a4612023333060408601803590610e0b90602089016134e6565b505050600101611f11565b6066546004906010908116036120575760405163840a48d560e01b815260040160405180910390fd5b335f90815260d1602052604090205460ff1661208657604051635c427cd960e01b815260040160405180910390fd5b61208e612244565b5f5b82811015610e2757368484838181106120ab576120ab613927565b90506020028101906120bd919061396b565b335f81815260ce602090815260408083205490519495509391926120e79290918591879101613ab9565b6040516020818303038152906040528051906020012090506121088361229d565b335f90815260d2602090815260408083208484529091529020805460ff1916600190811790915561213a908390613ae8565b335f81815260ce602052604090819020929092559051829184917f5251b6fdefcb5d81144e735f69ea4c695fd43b0289ca53dc075033f5fc80068b90612181908890613afb565b60405180910390a46121a2333060408601803590610e0b90602089016134e6565b505050600101612090565b6033546001600160a01b0316331461120d5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401611b23565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a250565b6002609754036122965760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401611b23565b6002609755565b6122cf6122aa8280613d55565b6122ba60808501606086016136f8565b6122ca60a08601608087016136f8565b612ddd565b5f8160400135116122f3576040516310eb483f60e21b815260040160405180910390fd5b6f4b3b4ca85a86c47a098a223fffffffff816040013511156123285760405163070b5a6f60e21b815260040160405180910390fd5b61235863ffffffff7f00000000000000000000000000000000000000000000000000000000000000001642613ae8565b61236860808301606084016136f8565b63ffffffff16111561115d57604051637ee2b44360e01b815260040160405180910390fd5b6040516001600160a01b03808516602483015283166044820152606481018290526110eb9085906323b872dd60e01b906084015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b0319909316929092179091526130b5565b5f60ca61240860208501856136f8565b63ffffffff168154811061241e5761241e613927565b5f91825260209182902060408051608081018252600293909302909101805483526001015463ffffffff80821694840194909452600160201b810490931690820152600160401b90910460ff1615156060820152905061247e8382612761565b5f61248f60808501606086016134e6565b6001600160a01b038082165f90815260cc602052604090205491925016806124b45750805b336001600160a01b038216146124dd57604051635c427cd960e01b815260040160405180910390fd5b5f5b6124ec60a0870187613d9b565b9050811015611c62573661250360e0880188613d55565b8381811061251357612513613927565b6001600160a01b0387165f90815260cd602090815260408083209302949094019450929091508290612547908501856134e6565b6001600160a01b03166001600160a01b031681526020019081526020015f205490508082602001351161258d5760405163aa385e8160e01b815260040160405180910390fd5b5f61259c826020850135613914565b6001600160a01b0387165f90815260cd602090815260408220929350850180359291906125c990876134e6565b6001600160a01b031681526020808201929092526040015f209190915561260a90899083906125fa908701876134e6565b6001600160a01b03169190613188565b86516001600160a01b03808a1691878216918916907f9543dbd55580842586a951f0386e24d68a5df99ae29e3b216588b45fd684ce319061264e60208901896134e6565b604080519283526001600160a01b039091166020830152810186905260600160405180910390a45050506001016124df565b5f816040015163ffffffff165f14806126b25750815161ffff9081161480156126b25750816040015163ffffffff1642105b156126ca57505060cb54600160e01b900461ffff1690565b816040015163ffffffff164210156126e3578151611146565b506020015190565b919050565b60cb546040805163ffffffff600160a01b9093048316815291831660208301527faf557c6c02c208794817a705609cfa935f827312a1adfdd26494b6b95dd2b4b3910160405180910390a160cb805463ffffffff909216600160a01b0263ffffffff60a01b19909216919091179055565b80606001511561278457604051631b14174b60e01b815260040160405180910390fd5b806040015163ffffffff164210156127af57604051631437a2bb60e31b815260040160405180910390fd5b6127bc60c0830183613d9b565b90506127cb60a0840184613d9b565b9050146127eb576040516343714afd60e01b815260040160405180910390fd5b6127f860e0830183613d55565b905061280760c0840184613d9b565b905014612827576040516343714afd60e01b815260040160405180910390fd5b80516128539061283d60408501602086016136f8565b61284a6040860186613de1565b866060016131b8565b5f5b61286260a0840184613d9b565b9050811015610e32576128fc608084013561288060a0860186613d9b565b8481811061289057612890613927565b90506020020160208101906128a591906136f8565b6128b260c0870187613d9b565b858181106128c2576128c2613927565b90506020028101906128d49190613de1565b6128e160e0890189613d55565b878181106128f1576128f1613927565b90506040020161325c565b600101612855565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b60cb546040516001600160a01b038084169216907f237b82f438d75fc568ebab484b75b01d9287b9e98b490b7c23221623b6705dbb905f90a360cb80546001600160a01b0319166001600160a01b0392909216919091179055565b604051631beb2b9760e31b81526001600160a01b0382811660048301523360248301523060448301525f80356001600160e01b0319166064840152917f00000000000000000000000000000000000000000000000000000000000000009091169063df595cb8906084016020604051808303815f875af1158015612a36573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111469190613950565b5f612a88612a688380613d55565b612a7860808601606087016136f8565b6122ca60a08701608088016136f8565b5f612a966040840184613d55565b905011612ab65760405163796cc52560e01b815260040160405180910390fd5b42612ac760a08401608085016136f8565b612ad760808501606086016136f8565b612ae19190613b0d565b63ffffffff1610612b055760405163150358a160e21b815260040160405180910390fd5b5f80805b612b166040860186613d55565b9050811015612c075736612b2d6040870187613d55565b83818110612b3d57612b3d613927565b6040029190910191505f9050612b5660208301836134e6565b6001600160a01b031603612b7d57604051630863a45360e11b815260040160405180910390fd5b612b8a60208201826134e6565b6001600160a01b0316836001600160a01b031610612bbb576040516310fb47f160e31b815260040160405180910390fd5b5f816020013511612bdf576040516310eb483f60e21b815260040160405180910390fd5b612bec60208201826134e6565b9250612bfc602082013585613ae8565b935050600101612b09565b506f4b3b4ca85a86c47a098a223fffffffff821115612c395760405163070b5a6f60e21b815260040160405180910390fd5b5092915050565b6001600160a01b038083165f81815260cc602052604080822080548686166001600160a01b0319821681179092559151919094169392849290917fbab947934d42e0ad206f25c9cab18b5bb6ae144acfb00f40b4e3aa59590ca3129190a4505050565b60cb546040805161ffff600160e01b9093048316815291831660208301527fe6cd4edfdcc1f6d130ab35f73d72378f3a642944fb4ee5bd84b7807a81ea1c4e910160405180910390a160cb805461ffff909216600160e01b0261ffff60e01b19909216919091179055565b61271061ffff83161115612d355760405163891c63df60e01b815260040160405180910390fd5b8254600160201b900463ffffffff164211612d6357604051637b1e25c560e01b815260040160405180910390fd5b8254600160201b900463ffffffff165f03612d8a57825461ffff191661ffff178355612da1565b825462010000810461ffff1661ffff199091161783555b825463ffffffff909116600160201b0267ffffffff000000001961ffff90931662010000029290921667ffffffffffff00001990911617179055565b82612dfb5760405163796cc52560e01b815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000063ffffffff168163ffffffff161115612e4857604051630dd0b9f560e21b815260040160405180910390fd5b612e727f000000000000000000000000000000000000000000000000000000000000000082613e38565b63ffffffff1615612e965760405163ee66470560e01b815260040160405180910390fd5b612ec07f000000000000000000000000000000000000000000000000000000000000000083613e38565b63ffffffff1615612ee457604051633c1a94f160e21b815260040160405180910390fd5b8163ffffffff167f000000000000000000000000000000000000000000000000000000000000000063ffffffff1642612f1d9190613914565b11158015612f5757508163ffffffff167f000000000000000000000000000000000000000000000000000000000000000063ffffffff1611155b612f745760405163041aa75760e11b815260040160405180910390fd5b5f805b84811015611c62575f868683818110612f9257612f92613927565b612fa892602060409092020190810191506134e6565b60405163198f077960e21b81526001600160a01b0380831660048301529192507f00000000000000000000000000000000000000000000000000000000000000009091169063663c1de490602401602060405180830381865afa158015613011573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906130359190613950565b8061305c57506001600160a01b03811673beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac0145b61307957604051632efd965160e11b815260040160405180910390fd5b806001600160a01b0316836001600160a01b0316106130ab5760405163dfad9ca160e01b815260040160405180910390fd5b9150600101612f77565b5f613109826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b031661329a9092919063ffffffff16565b905080515f14806131295750808060200190518101906131299190613950565b610e325760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401611b23565b6040516001600160a01b038316602482015260448101829052610e3290849063a9059cbb60e01b906064016123c1565b6131c3602083613e5f565b6001901b8463ffffffff16106131eb5760405162c6c39d60e71b815260040160405180910390fd5b5f6131f582610c22565b905061323f84848080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152508a92508591505063ffffffff89166132b0565b611c62576040516369ca16c960e01b815260040160405180910390fd5b613267602083613e5f565b6001901b8463ffffffff16106132905760405163054ff4df60e51b815260040160405180910390fd5b5f6131f582611c6a565b60606132a884845f856132c7565b949350505050565b5f836132bd86858561339e565b1495945050505050565b6060824710156133285760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401611b23565b5f5f866001600160a01b031685876040516133439190613e72565b5f6040518083038185875af1925050503d805f811461337d576040519150601f19603f3d011682016040523d82523d5f602084013e613382565b606091505b509150915061339387838387613435565b979650505050505050565b5f602084516133ad9190613e88565b156133cb576040516313717da960e21b815260040160405180910390fd5b8260205b8551811161342c576133e2600285613e88565b5f0361340357815f528086015160205260405f20915060028404935061341a565b808601515f528160205260405f2091506002840493505b613425602082613ae8565b90506133cf565b50949350505050565b606083156134a35782515f0361349c576001600160a01b0385163b61349c5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401611b23565b50816132a8565b6132a883838151156134b85781518083602001fd5b8060405162461bcd60e51b8152600401611b239190613e9b565b6001600160a01b038116811461115d575f5ffd5b5f602082840312156134f6575f5ffd5b81356118c8816134d2565b801515811461115d575f5ffd5b5f5f6040838503121561351f575f5ffd5b823561352a816134d2565b9150602083013561353a81613501565b809150509250929050565b5f60208284031215613555575f5ffd5b5035919050565b5f6040828403121561356c575f5ffd5b50919050565b5f60408284031215613582575f5ffd5b6118c8838361355c565b5f5f83601f84011261359c575f5ffd5b50813567ffffffffffffffff8111156135b3575f5ffd5b6020830191508360208260051b85010111156135cd575f5ffd5b9250929050565b5f5f602083850312156135e5575f5ffd5b823567ffffffffffffffff8111156135fb575f5ffd5b6136078582860161358c565b90969095509350505050565b5f610100828403121561356c575f5ffd5b5f5f60408385031215613635575f5ffd5b823567ffffffffffffffff81111561364b575f5ffd5b61365785828601613613565b925050602083013561353a816134d2565b803563ffffffff811681146126eb575f5ffd5b5f5f6040838503121561368c575f5ffd5b8235915061369c60208401613668565b90509250929050565b5f5f5f604084860312156136b7575f5ffd5b833567ffffffffffffffff8111156136cd575f5ffd5b6136d98682870161358c565b90945092505060208401356136ed816134d2565b809150509250925092565b5f60208284031215613708575f5ffd5b6118c882613668565b5f60208284031215613721575f5ffd5b813560ff811681146118c8575f5ffd5b5f60208284031215613741575f5ffd5b813567ffffffffffffffff811115613757575f5ffd5b6132a884828501613613565b5f5f60408385031215613774575f5ffd5b823561377f816134d2565b946020939093013593505050565b5f5f6040838503121561379e575f5ffd5b82356137a9816134d2565b9150602083013561353a816134d2565b5f5f5f604084860312156137cb575f5ffd5b83356137d6816134d2565b9250602084013567ffffffffffffffff8111156137f1575f5ffd5b6137fd8682870161358c565b9497909650939450505050565b803561ffff811681146126eb575f5ffd5b5f6020828403121561382b575f5ffd5b6118c88261380a565b5f5f60408385031215613845575f5ffd5b8235613850816134d2565b915061369c6020840161380a565b5f5f5f60608486031215613870575f5ffd5b833561387b816134d2565b9250602084013561388b816134d2565b91506138996040850161380a565b90509250925092565b5f5f5f5f5f60a086880312156138b6575f5ffd5b85356138c1816134d2565b94506020860135935060408601356138d8816134d2565b92506138e660608701613668565b91506138f46080870161380a565b90509295509295909350565b634e487b7160e01b5f52601160045260245ffd5b8181038181111561114657611146613900565b634e487b7160e01b5f52603260045260245ffd5b5f8161394957613949613900565b505f190190565b5f60208284031215613960575f5ffd5b81516118c881613501565b5f8235609e1983360301811261397f575f5ffd5b9190910192915050565b5f5f8335601e1984360301811261399e575f5ffd5b830160208101925035905067ffffffffffffffff8111156139bd575f5ffd5b8060061b36038213156135cd575f5ffd5b8183526020830192505f815f5b84811015613a315781356139ee816134d2565b6001600160a01b0316865260208201356bffffffffffffffffffffffff8116808214613a18575f5ffd5b60208801525060409586019591909101906001016139db565b5093949350505050565b5f613a468283613989565b60a08552613a5860a0860182846139ce565b9150506020830135613a69816134d2565b6001600160a01b031660208501526040838101359085015263ffffffff613a9260608501613668565b16606085015263ffffffff613aa960808501613668565b1660808501528091505092915050565b60018060a01b0384168152826020820152606060408201525f613adf6060830184613a3b565b95945050505050565b8082018082111561114657611146613900565b602081525f6118c86020830184613a3b565b63ffffffff818116838216019081111561114657611146613900565b5f823560fe1983360301811261397f575f5ffd5b5f823560be1983360301811261397f575f5ffd5b5f5f8335601e19843603018112613b66575f5ffd5b830160208101925035905067ffffffffffffffff811115613b85575f5ffd5b8036038213156135cd575f5ffd5b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b5f613bc68283613989565b60c08552613bd860c0860182846139ce565b9150506020830135613be9816134d2565b6001600160a01b03166020850152613c046040840184613989565b858303604087015280835290915f91906020015b81831015613c53578335613c2b816134d2565b6001600160a01b03168152602084810135908201526040938401936001939093019201613c18565b613c5f60608701613668565b63ffffffff811660608901529350613c7960808701613668565b63ffffffff811660808901529350613c9460a0870187613b51565b9450925086810360a0880152613393818585613b93565b60018060a01b0384168152826020820152606060408201525f613adf6060830184613bbb565b828152604060208201525f6132a86040830184613bbb565b63ffffffff828116828216039081111561114657611146613900565b5f63ffffffff821680613d1a57613d1a613900565b5f190192915050565b5f60208284031215613d33575f5ffd5b5051919050565b5f60208284031215613d4a575f5ffd5b81516118c8816134d2565b5f5f8335601e19843603018112613d6a575f5ffd5b83018035915067ffffffffffffffff821115613d84575f5ffd5b6020019150600681901b36038213156135cd575f5ffd5b5f5f8335601e19843603018112613db0575f5ffd5b83018035915067ffffffffffffffff821115613dca575f5ffd5b6020019150600581901b36038213156135cd575f5ffd5b5f5f8335601e19843603018112613df6575f5ffd5b83018035915067ffffffffffffffff821115613e10575f5ffd5b6020019150368190038213156135cd575f5ffd5b634e487b7160e01b5f52601260045260245ffd5b5f63ffffffff831680613e4d57613e4d613e24565b8063ffffffff84160691505092915050565b5f82613e6d57613e6d613e24565b500490565b5f82518060208501845e5f920191825250919050565b5f82613e9657613e96613e24565b500690565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f8301168401019150509291505056fea26469706673582212201a6084d395aa3a0b3fc41fcd22c6d97318ba5baaa9af9b8f96ae50febc98644c64736f6c634300081b0033", +>>>>>>> bb1d64ea (chore: remove unused helper (#1039)) } // RewardsCoordinatorABI is the input ABI used to generate the binding from. diff --git a/pkg/bindings/SlashingLib/binding.go b/pkg/bindings/SlashingLib/binding.go index cb36ba7ebe..7d63923c31 100644 --- a/pkg/bindings/SlashingLib/binding.go +++ b/pkg/bindings/SlashingLib/binding.go @@ -32,7 +32,7 @@ var ( // SlashingLibMetaData contains all meta data concerning the SlashingLib contract. var SlashingLibMetaData = &bind.MetaData{ ABI: "[]", - Bin: "0x6055604b600b8282823980515f1a607314603f577f4e487b71000000000000000000000000000000000000000000000000000000005f525f60045260245ffd5b305f52607381538281f3fe730000000000000000000000000000000000000000301460806040525f5ffdfea264697066735822122064093fed1626f49b079e1ddcebe511e7d8efe0282a7ca54e974ae194a9db6e7864736f6c634300081b0033", + Bin: "0x60556032600b8282823980515f1a607314602657634e487b7160e01b5f525f60045260245ffd5b305f52607381538281f3fe730000000000000000000000000000000000000000301460806040525f5ffdfea264697066735822122079d8acd82faee8c5e28651bbc1515549e1c13cf6bb3869d1f31aa11a796fa9f664736f6c634300081b0033", } // SlashingLibABI is the input ABI used to generate the binding from. diff --git a/pkg/bindings/Snapshots/binding.go b/pkg/bindings/Snapshots/binding.go index 952be20bf6..2a6027eebf 100644 --- a/pkg/bindings/Snapshots/binding.go +++ b/pkg/bindings/Snapshots/binding.go @@ -32,7 +32,7 @@ var ( // SnapshotsMetaData contains all meta data concerning the Snapshots contract. var SnapshotsMetaData = &bind.MetaData{ ABI: "[{\"type\":\"error\",\"name\":\"InvalidSnapshotOrdering\",\"inputs\":[]}]", - Bin: "0x6055604b600b8282823980515f1a607314603f577f4e487b71000000000000000000000000000000000000000000000000000000005f525f60045260245ffd5b305f52607381538281f3fe730000000000000000000000000000000000000000301460806040525f5ffdfea264697066735822122003e3deed4d6531d9666fc99a9e2a3d00d10deeb84ff5755e24ea228a6b92d0c064736f6c634300081b0033", + Bin: "0x60556032600b8282823980515f1a607314602657634e487b7160e01b5f525f60045260245ffd5b305f52607381538281f3fe730000000000000000000000000000000000000000301460806040525f5ffdfea264697066735822122044bb5b18319bff57ed60efd0467beb2f05208fa5189c267bfd18f0a7f7417aa964736f6c634300081b0033", } // SnapshotsABI is the input ABI used to generate the binding from. diff --git a/pkg/bindings/StrategyBase/binding.go b/pkg/bindings/StrategyBase/binding.go index 13a19160fd..8d8ac72785 100644 --- a/pkg/bindings/StrategyBase/binding.go +++ b/pkg/bindings/StrategyBase/binding.go @@ -32,7 +32,7 @@ var ( // StrategyBaseMetaData contains all meta data concerning the StrategyBase contract. var StrategyBaseMetaData = &bind.MetaData{ ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"_strategyManager\",\"type\":\"address\",\"internalType\":\"contractIStrategyManager\"},{\"name\":\"_pauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"deposit\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"newShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"explanation\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"_underlyingToken\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"pauseAll\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[{\"name\":\"index\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pauserRegistry\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"shares\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"sharesToUnderlying\",\"inputs\":[{\"name\":\"amountShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"sharesToUnderlyingView\",\"inputs\":[{\"name\":\"amountShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"strategyManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategyManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"totalShares\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"underlyingToShares\",\"inputs\":[{\"name\":\"amountUnderlying\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"underlyingToSharesView\",\"inputs\":[{\"name\":\"amountUnderlying\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"underlyingToken\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"userUnderlying\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"userUnderlyingView\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"withdraw\",\"inputs\":[{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amountShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"ExchangeRateEmitted\",\"inputs\":[{\"name\":\"rate\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StrategyTokenSet\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIERC20\"},{\"name\":\"decimals\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"BalanceExceedsMaxTotalDeposits\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"CurrentlyPaused\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InputAddressZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidNewPausedStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"MaxPerDepositExceedsMax\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NewSharesZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyPauser\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyStrategyManager\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyUnderlyingToken\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyUnpauser\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"TotalSharesExceedsMax\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"WithdrawalAmountExceedsTotalDeposits\",\"inputs\":[]}]", - Bin: "0x60c060405234801561000f575f5ffd5b506040516113a63803806113a683398101604081905261002e9161014b565b806001600160a01b038116610056576040516339b190bb60e11b815260040160405180910390fd5b6001600160a01b03908116608052821660a052610071610078565b5050610183565b5f54610100900460ff16156100e35760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff90811614610132575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b0381168114610148575f5ffd5b50565b5f5f6040838503121561015c575f5ffd5b825161016781610134565b602084015190925061017881610134565b809150509250929050565b60805160a0516111d86101ce5f395f81816101750152818161040201528181610796015261083301525f818161022b0152818161030f01528181610543015261096101526111d85ff3fe608060405234801561000f575f5ffd5b5060043610610127575f3560e01c8063886f1195116100a9578063ce7c2ac21161006e578063ce7c2ac21461029b578063d9caed12146102ae578063e3dae51c146102c1578063f3e73875146102d4578063fabc1cbc146102e7575f5ffd5b8063886f1195146102265780638c8710191461024d5780638f6a624014610260578063ab5921e114610273578063c4d66de814610288575f5ffd5b8063553ca5f8116100ef578063553ca5f8146101c1578063595c6a67146101d45780635ac86ab7146101dc5780635c975abb1461020b5780637a8b263714610213575f5ffd5b8063136439dd1461012b5780632495a5991461014057806339b70e38146101705780633a98ef391461019757806347e7ef24146101ae575b5f5ffd5b61013e610139366004610f4d565b6102fa565b005b603254610153906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b6101537f000000000000000000000000000000000000000000000000000000000000000081565b6101a060335481565b604051908152602001610167565b6101a06101bc366004610f7b565b6103cf565b6101a06101cf366004610fa5565b61051b565b61013e61052e565b6101fb6101ea366004610fd5565b6001805460ff9092161b9081161490565b6040519015158152602001610167565b6001546101a0565b6101a0610221366004610f4d565b6105dd565b6101537f000000000000000000000000000000000000000000000000000000000000000081565b6101a061025b366004610f4d565b610626565b6101a061026e366004610fa5565b610630565b61027b61063d565b6040516101679190610ff0565b61013e610296366004610fa5565b61065d565b6101a06102a9366004610fa5565b61076f565b61013e6102bc366004611025565b610801565b6101a06102cf366004610f4d565b61091e565b6101a06102e2366004610f4d565b610955565b61013e6102f5366004610f4d565b61095f565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa15801561035c573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103809190611063565b61039d57604051631d77d47760e21b815260040160405180910390fd5b60015481811681146103c25760405163c61dca5d60e01b815260040160405180910390fd5b6103cb82610a75565b5050565b600180545f9182918116036103f75760405163840a48d560e01b815260040160405180910390fd5b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610440576040516348da714f60e01b815260040160405180910390fd5b61044a8484610ab2565b6033545f61045a6103e883611096565b90505f6103e8610468610ae0565b6104729190611096565b90505f61047f87836110a9565b90508061048c84896110bc565b61049691906110d3565b9550855f036104b857604051630c392ed360e11b815260040160405180910390fd5b6104c28685611096565b60338190556f4b3b4ca85a86c47a098a223fffffffff10156104f757604051632f14e8a360e11b815260040160405180910390fd5b610510826103e860335461050b9190611096565b610b4f565b505050505092915050565b5f6105286102218361076f565b92915050565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa158015610590573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105b49190611063565b6105d157604051631d77d47760e21b815260040160405180910390fd5b6105db5f19610a75565b565b5f5f6103e86033546105ef9190611096565b90505f6103e86105fd610ae0565b6106079190611096565b90508161061485836110bc565b61061e91906110d3565b949350505050565b5f6105288261091e565b5f6105286102e28361076f565b60606040518060800160405280604d8152602001611156604d9139905090565b5f54610100900460ff161580801561067b57505f54600160ff909116105b806106945750303b15801561069457505f5460ff166001145b6106fc5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b5f805460ff19166001179055801561071d575f805461ff0019166101001790555b61072682610b9b565b80156103cb575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498906020015b60405180910390a15050565b60405163fe243a1760e01b81526001600160a01b0382811660048301523060248301525f917f00000000000000000000000000000000000000000000000000000000000000009091169063fe243a1790604401602060405180830381865afa1580156107dd573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061052891906110f2565b600180546002908116036108285760405163840a48d560e01b815260040160405180910390fd5b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610871576040516348da714f60e01b815260040160405180910390fd5b61087c848484610ce6565b603354808311156108a057604051630b469df360e41b815260040160405180910390fd5b5f6108ad6103e883611096565b90505f6103e86108bb610ae0565b6108c59190611096565b90505f826108d387846110bc565b6108dd91906110d3565b90506108e986856110a9565b6033556109096108f982846110a9565b6103e860335461050b9190611096565b610914888883610d19565b5050505050505050565b5f5f6103e86033546109309190611096565b90505f6103e861093e610ae0565b6109489190611096565b90508061061483866110bc565b5f610528826105dd565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156109bb573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109df9190611109565b6001600160a01b0316336001600160a01b031614610a105760405163794821ff60e01b815260040160405180910390fd5b60015480198219811614610a375760405163c61dca5d60e01b815260040160405180910390fd5b600182905560405182815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c9060200160405180910390a25050565b600181905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a250565b6032546001600160a01b038381169116146103cb57604051630312abdd60e61b815260040160405180910390fd5b6032546040516370a0823160e01b81523060048201525f916001600160a01b0316906370a0823190602401602060405180830381865afa158015610b26573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b4a91906110f2565b905090565b7fd2494f3479e5da49d386657c292c610b5b01df313d07c62eb0cfa49924a31be881610b8384670de0b6b3a76400006110bc565b610b8d91906110d3565b604051908152602001610763565b5f54610100900460ff16610c055760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b60648201526084016106f3565b603280546001600160a01b0319166001600160a01b038316179055610c295f610a75565b7f1c540707b00eb5427b6b774fc799d756516a54aee108b64b327acc55af55750760325f9054906101000a90046001600160a01b0316826001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015610c9b573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610cbf9190611124565b604080516001600160a01b03909316835260ff90911660208301520160405180910390a150565b6032546001600160a01b03838116911614610d1457604051630312abdd60e61b815260040160405180910390fd5b505050565b604080516001600160a01b03858116602483015260448083018590528351808403909101815260649092018352602080830180516001600160e01b031663a9059cbb60e01b17905283518085019094528084527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c656490840152610d1492908516918691859185918591905f90610db19084908490610e30565b905080515f1480610dd1575080806020019051810190610dd19190611063565b610d145760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016106f3565b606061061e84845f85855f5f866001600160a01b03168587604051610e55919061113f565b5f6040518083038185875af1925050503d805f8114610e8f576040519150601f19603f3d011682016040523d82523d5f602084013e610e94565b606091505b5091509150610ea587838387610eb0565b979650505050505050565b60608315610f1e5782515f03610f17576001600160a01b0385163b610f175760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016106f3565b508161061e565b61061e8383815115610f335781518083602001fd5b8060405162461bcd60e51b81526004016106f39190610ff0565b5f60208284031215610f5d575f5ffd5b5035919050565b6001600160a01b0381168114610f78575f5ffd5b50565b5f5f60408385031215610f8c575f5ffd5b8235610f9781610f64565b946020939093013593505050565b5f60208284031215610fb5575f5ffd5b8135610fc081610f64565b9392505050565b60ff81168114610f78575f5ffd5b5f60208284031215610fe5575f5ffd5b8135610fc081610fc7565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b5f5f5f60608486031215611037575f5ffd5b833561104281610f64565b9250602084013561105281610f64565b929592945050506040919091013590565b5f60208284031215611073575f5ffd5b81518015158114610fc0575f5ffd5b634e487b7160e01b5f52601160045260245ffd5b8082018082111561052857610528611082565b8181038181111561052857610528611082565b808202811582820484141761052857610528611082565b5f826110ed57634e487b7160e01b5f52601260045260245ffd5b500490565b5f60208284031215611102575f5ffd5b5051919050565b5f60208284031215611119575f5ffd5b8151610fc081610f64565b5f60208284031215611134575f5ffd5b8151610fc081610fc7565b5f82518060208501845e5f92019182525091905056fe4261736520537472617465677920696d706c656d656e746174696f6e20746f20696e68657269742066726f6d20666f72206d6f726520636f6d706c657820696d706c656d656e746174696f6e73a2646970667358221220762d0f677dd782b36e4135d769a45b7786803d76c93d6252adb22a9f8dc2e5e464736f6c634300081b0033", + Bin: "0x60c060405234801561000f575f5ffd5b506040516113a63803806113a683398101604081905261002e9161014b565b806001600160a01b038116610056576040516339b190bb60e11b815260040160405180910390fd5b6001600160a01b03908116608052821660a052610071610078565b5050610183565b5f54610100900460ff16156100e35760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff90811614610132575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b0381168114610148575f5ffd5b50565b5f5f6040838503121561015c575f5ffd5b825161016781610134565b602084015190925061017881610134565b809150509250929050565b60805160a0516111d86101ce5f395f81816101750152818161040201528181610796015261083301525f818161022b0152818161030f01528181610543015261096101526111d85ff3fe608060405234801561000f575f5ffd5b5060043610610127575f3560e01c8063886f1195116100a9578063ce7c2ac21161006e578063ce7c2ac21461029b578063d9caed12146102ae578063e3dae51c146102c1578063f3e73875146102d4578063fabc1cbc146102e7575f5ffd5b8063886f1195146102265780638c8710191461024d5780638f6a624014610260578063ab5921e114610273578063c4d66de814610288575f5ffd5b8063553ca5f8116100ef578063553ca5f8146101c1578063595c6a67146101d45780635ac86ab7146101dc5780635c975abb1461020b5780637a8b263714610213575f5ffd5b8063136439dd1461012b5780632495a5991461014057806339b70e38146101705780633a98ef391461019757806347e7ef24146101ae575b5f5ffd5b61013e610139366004610f4d565b6102fa565b005b603254610153906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b6101537f000000000000000000000000000000000000000000000000000000000000000081565b6101a060335481565b604051908152602001610167565b6101a06101bc366004610f7b565b6103cf565b6101a06101cf366004610fa5565b61051b565b61013e61052e565b6101fb6101ea366004610fd5565b6001805460ff9092161b9081161490565b6040519015158152602001610167565b6001546101a0565b6101a0610221366004610f4d565b6105dd565b6101537f000000000000000000000000000000000000000000000000000000000000000081565b6101a061025b366004610f4d565b610626565b6101a061026e366004610fa5565b610630565b61027b61063d565b6040516101679190610ff0565b61013e610296366004610fa5565b61065d565b6101a06102a9366004610fa5565b61076f565b61013e6102bc366004611025565b610801565b6101a06102cf366004610f4d565b61091e565b6101a06102e2366004610f4d565b610955565b61013e6102f5366004610f4d565b61095f565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa15801561035c573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103809190611063565b61039d57604051631d77d47760e21b815260040160405180910390fd5b60015481811681146103c25760405163c61dca5d60e01b815260040160405180910390fd5b6103cb82610a75565b5050565b600180545f9182918116036103f75760405163840a48d560e01b815260040160405180910390fd5b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610440576040516348da714f60e01b815260040160405180910390fd5b61044a8484610ab2565b6033545f61045a6103e883611096565b90505f6103e8610468610ae0565b6104729190611096565b90505f61047f87836110a9565b90508061048c84896110bc565b61049691906110d3565b9550855f036104b857604051630c392ed360e11b815260040160405180910390fd5b6104c28685611096565b60338190556f4b3b4ca85a86c47a098a223fffffffff10156104f757604051632f14e8a360e11b815260040160405180910390fd5b610510826103e860335461050b9190611096565b610b4f565b505050505092915050565b5f6105286102218361076f565b92915050565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa158015610590573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105b49190611063565b6105d157604051631d77d47760e21b815260040160405180910390fd5b6105db5f19610a75565b565b5f5f6103e86033546105ef9190611096565b90505f6103e86105fd610ae0565b6106079190611096565b90508161061485836110bc565b61061e91906110d3565b949350505050565b5f6105288261091e565b5f6105286102e28361076f565b60606040518060800160405280604d8152602001611156604d9139905090565b5f54610100900460ff161580801561067b57505f54600160ff909116105b806106945750303b15801561069457505f5460ff166001145b6106fc5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b5f805460ff19166001179055801561071d575f805461ff0019166101001790555b61072682610b9b565b80156103cb575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498906020015b60405180910390a15050565b60405163fe243a1760e01b81526001600160a01b0382811660048301523060248301525f917f00000000000000000000000000000000000000000000000000000000000000009091169063fe243a1790604401602060405180830381865afa1580156107dd573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061052891906110f2565b600180546002908116036108285760405163840a48d560e01b815260040160405180910390fd5b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610871576040516348da714f60e01b815260040160405180910390fd5b61087c848484610ce6565b603354808311156108a057604051630b469df360e41b815260040160405180910390fd5b5f6108ad6103e883611096565b90505f6103e86108bb610ae0565b6108c59190611096565b90505f826108d387846110bc565b6108dd91906110d3565b90506108e986856110a9565b6033556109096108f982846110a9565b6103e860335461050b9190611096565b610914888883610d19565b5050505050505050565b5f5f6103e86033546109309190611096565b90505f6103e861093e610ae0565b6109489190611096565b90508061061483866110bc565b5f610528826105dd565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156109bb573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109df9190611109565b6001600160a01b0316336001600160a01b031614610a105760405163794821ff60e01b815260040160405180910390fd5b60015480198219811614610a375760405163c61dca5d60e01b815260040160405180910390fd5b600182905560405182815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c9060200160405180910390a25050565b600181905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a250565b6032546001600160a01b038381169116146103cb57604051630312abdd60e61b815260040160405180910390fd5b6032546040516370a0823160e01b81523060048201525f916001600160a01b0316906370a0823190602401602060405180830381865afa158015610b26573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b4a91906110f2565b905090565b7fd2494f3479e5da49d386657c292c610b5b01df313d07c62eb0cfa49924a31be881610b8384670de0b6b3a76400006110bc565b610b8d91906110d3565b604051908152602001610763565b5f54610100900460ff16610c055760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b60648201526084016106f3565b603280546001600160a01b0319166001600160a01b038316179055610c295f610a75565b7f1c540707b00eb5427b6b774fc799d756516a54aee108b64b327acc55af55750760325f9054906101000a90046001600160a01b0316826001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015610c9b573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610cbf9190611124565b604080516001600160a01b03909316835260ff90911660208301520160405180910390a150565b6032546001600160a01b03838116911614610d1457604051630312abdd60e61b815260040160405180910390fd5b505050565b604080516001600160a01b03858116602483015260448083018590528351808403909101815260649092018352602080830180516001600160e01b031663a9059cbb60e01b17905283518085019094528084527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c656490840152610d1492908516918691859185918591905f90610db19084908490610e30565b905080515f1480610dd1575080806020019051810190610dd19190611063565b610d145760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016106f3565b606061061e84845f85855f5f866001600160a01b03168587604051610e55919061113f565b5f6040518083038185875af1925050503d805f8114610e8f576040519150601f19603f3d011682016040523d82523d5f602084013e610e94565b606091505b5091509150610ea587838387610eb0565b979650505050505050565b60608315610f1e5782515f03610f17576001600160a01b0385163b610f175760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016106f3565b508161061e565b61061e8383815115610f335781518083602001fd5b8060405162461bcd60e51b81526004016106f39190610ff0565b5f60208284031215610f5d575f5ffd5b5035919050565b6001600160a01b0381168114610f78575f5ffd5b50565b5f5f60408385031215610f8c575f5ffd5b8235610f9781610f64565b946020939093013593505050565b5f60208284031215610fb5575f5ffd5b8135610fc081610f64565b9392505050565b60ff81168114610f78575f5ffd5b5f60208284031215610fe5575f5ffd5b8135610fc081610fc7565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b5f5f5f60608486031215611037575f5ffd5b833561104281610f64565b9250602084013561105281610f64565b929592945050506040919091013590565b5f60208284031215611073575f5ffd5b81518015158114610fc0575f5ffd5b634e487b7160e01b5f52601160045260245ffd5b8082018082111561052857610528611082565b8181038181111561052857610528611082565b808202811582820484141761052857610528611082565b5f826110ed57634e487b7160e01b5f52601260045260245ffd5b500490565b5f60208284031215611102575f5ffd5b5051919050565b5f60208284031215611119575f5ffd5b8151610fc081610f64565b5f60208284031215611134575f5ffd5b8151610fc081610fc7565b5f82518060208501845e5f92019182525091905056fe4261736520537472617465677920696d706c656d656e746174696f6e20746f20696e68657269742066726f6d20666f72206d6f726520636f6d706c657820696d706c656d656e746174696f6e73a2646970667358221220f4652e29b9389ddb9bb3e165cbbc4a59be04a6b7c106abd876f5689aa6ae036464736f6c634300081b0033", } // 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 942501ba40..fe3d17f8e5 100644 --- a/pkg/bindings/StrategyBaseTVLLimits/binding.go +++ b/pkg/bindings/StrategyBaseTVLLimits/binding.go @@ -32,7 +32,7 @@ var ( // StrategyBaseTVLLimitsMetaData contains all meta data concerning the StrategyBaseTVLLimits contract. var StrategyBaseTVLLimitsMetaData = &bind.MetaData{ ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"_strategyManager\",\"type\":\"address\",\"internalType\":\"contractIStrategyManager\"},{\"name\":\"_pauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"deposit\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"newShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"explanation\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"getTVLLimits\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"_maxPerDeposit\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_maxTotalDeposits\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_underlyingToken\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"_underlyingToken\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"maxPerDeposit\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"maxTotalDeposits\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"pauseAll\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[{\"name\":\"index\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pauserRegistry\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"setTVLLimits\",\"inputs\":[{\"name\":\"newMaxPerDeposit\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"newMaxTotalDeposits\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"shares\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"sharesToUnderlying\",\"inputs\":[{\"name\":\"amountShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"sharesToUnderlyingView\",\"inputs\":[{\"name\":\"amountShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"strategyManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategyManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"totalShares\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"underlyingToShares\",\"inputs\":[{\"name\":\"amountUnderlying\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"underlyingToSharesView\",\"inputs\":[{\"name\":\"amountUnderlying\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"underlyingToken\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"userUnderlying\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"userUnderlyingView\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"withdraw\",\"inputs\":[{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amountShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"ExchangeRateEmitted\",\"inputs\":[{\"name\":\"rate\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"MaxPerDepositUpdated\",\"inputs\":[{\"name\":\"previousValue\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"newValue\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"MaxTotalDepositsUpdated\",\"inputs\":[{\"name\":\"previousValue\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"newValue\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StrategyTokenSet\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIERC20\"},{\"name\":\"decimals\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"BalanceExceedsMaxTotalDeposits\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"CurrentlyPaused\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InputAddressZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidNewPausedStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"MaxPerDepositExceedsMax\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NewSharesZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyPauser\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyStrategyManager\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyUnderlyingToken\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyUnpauser\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"TotalSharesExceedsMax\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"WithdrawalAmountExceedsTotalDeposits\",\"inputs\":[]}]", - Bin: "0x60c060405234801561000f575f5ffd5b5060405161173e38038061173e83398101604081905261002e9161014f565b8181806001600160a01b038116610058576040516339b190bb60e11b815260040160405180910390fd5b6001600160a01b03908116608052821660a05261007361007c565b50505050610187565b5f54610100900460ff16156100e75760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff90811614610136575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b038116811461014c575f5ffd5b50565b5f5f60408385031215610160575f5ffd5b825161016b81610138565b602084015190925061017c81610138565b809150509250929050565b60805160a0516115656101d95f395f81816101ce01528181610556015281816109790152610a1601525f81816102960152818161039501528181610467015281816106970152610b4401526115655ff3fe608060405234801561000f575f5ffd5b506004361061016d575f3560e01c80637a8b2637116100d9578063c4d66de811610093578063df6fadc11161006e578063df6fadc11461033f578063e3dae51c1461035a578063f3e738751461036d578063fabc1cbc14610380575f5ffd5b8063c4d66de814610306578063ce7c2ac214610319578063d9caed121461032c575f5ffd5b80637a8b26371461027e578063886f1195146102915780638c871019146102b85780638f6a6240146102cb578063a6ab36f2146102de578063ab5921e1146102f1575f5ffd5b806347e7ef241161012a57806347e7ef2414610210578063553ca5f814610223578063595c6a67146102365780635ac86ab71461023e5780635c975abb1461026d57806361b01b5d14610275575f5ffd5b806311c70c9d14610171578063136439dd146101865780632495a5991461019957806339b70e38146101c95780633a98ef39146101f057806343fe08b014610207575b5f5ffd5b61018461017f366004611236565b610393565b005b610184610194366004611256565b610452565b6032546101ac906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b6101ac7f000000000000000000000000000000000000000000000000000000000000000081565b6101f960335481565b6040519081526020016101c0565b6101f960645481565b6101f961021e366004611284565b610523565b6101f96102313660046112ae565b61066f565b610184610682565b61025d61024c3660046112de565b6001805460ff9092161b9081161490565b60405190151581526020016101c0565b6001546101f9565b6101f960655481565b6101f961028c366004611256565b610731565b6101ac7f000000000000000000000000000000000000000000000000000000000000000081565b6101f96102c6366004611256565b61077a565b6101f96102d93660046112ae565b610784565b6101846102ec3660046112f9565b610791565b6102f961086c565b6040516101c0919061132f565b6101846103143660046112ae565b61088c565b6101f96103273660046112ae565b610952565b61018461033a366004611364565b6109e4565b606454606554604080519283526020830191909152016101c0565b6101f9610368366004611256565b610b01565b6101f961037b366004611256565b610b38565b61018461038e366004611256565b610b42565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156103ef573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061041391906113a2565b6001600160a01b0316336001600160a01b0316146104445760405163794821ff60e01b815260040160405180910390fd5b61044e8282610c58565b5050565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa1580156104b4573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104d891906113bd565b6104f557604051631d77d47760e21b815260040160405180910390fd5b600154818116811461051a5760405163c61dca5d60e01b815260040160405180910390fd5b61044e82610cfc565b600180545f91829181160361054b5760405163840a48d560e01b815260040160405180910390fd5b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610594576040516348da714f60e01b815260040160405180910390fd5b61059e8484610d39565b6033545f6105ae6103e8836113f0565b90505f6103e86105bc610d90565b6105c691906113f0565b90505f6105d38783611403565b9050806105e08489611416565b6105ea919061142d565b9550855f0361060c57604051630c392ed360e11b815260040160405180910390fd5b61061686856113f0565b60338190556f4b3b4ca85a86c47a098a223fffffffff101561064b57604051632f14e8a360e11b815260040160405180910390fd5b610664826103e860335461065f91906113f0565b610dff565b505050505092915050565b5f61067c61028c83610952565b92915050565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa1580156106e4573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061070891906113bd565b61072557604051631d77d47760e21b815260040160405180910390fd5b61072f5f19610cfc565b565b5f5f6103e860335461074391906113f0565b90505f6103e8610751610d90565b61075b91906113f0565b9050816107688583611416565b610772919061142d565b949350505050565b5f61067c82610b01565b5f61067c61037b83610952565b5f54610100900460ff16158080156107af57505f54600160ff909116105b806107c85750303b1580156107c857505f5460ff166001145b6107ed5760405162461bcd60e51b81526004016107e49061144c565b60405180910390fd5b5f805460ff19166001179055801561080e575f805461ff0019166101001790555b6108188484610c58565b61082182610e4b565b8015610866575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b60606040518060800160405280604d81526020016114e3604d9139905090565b5f54610100900460ff16158080156108aa57505f54600160ff909116105b806108c35750303b1580156108c357505f5460ff166001145b6108df5760405162461bcd60e51b81526004016107e49061144c565b5f805460ff191660011790558015610900575f805461ff0019166101001790555b61090982610e4b565b801561044e575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498906020015b60405180910390a15050565b60405163fe243a1760e01b81526001600160a01b0382811660048301523060248301525f917f00000000000000000000000000000000000000000000000000000000000000009091169063fe243a1790604401602060405180830381865afa1580156109c0573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061067c919061149a565b60018054600290811603610a0b5760405163840a48d560e01b815260040160405180910390fd5b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610a54576040516348da714f60e01b815260040160405180910390fd5b610a5f848484610f96565b60335480831115610a8357604051630b469df360e41b815260040160405180910390fd5b5f610a906103e8836113f0565b90505f6103e8610a9e610d90565b610aa891906113f0565b90505f82610ab68784611416565b610ac0919061142d565b9050610acc8685611403565b603355610aec610adc8284611403565b6103e860335461065f91906113f0565b610af7888883610fc9565b5050505050505050565b5f5f6103e8603354610b1391906113f0565b90505f6103e8610b21610d90565b610b2b91906113f0565b9050806107688386611416565b5f61067c82610731565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b9e573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610bc291906113a2565b6001600160a01b0316336001600160a01b031614610bf35760405163794821ff60e01b815260040160405180910390fd5b60015480198219811614610c1a5760405163c61dca5d60e01b815260040160405180910390fd5b600182905560405182815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c9060200160405180910390a25050565b60645460408051918252602082018490527ff97ed4e083acac67830025ecbc756d8fe847cdbdca4cee3fe1e128e98b54ecb5910160405180910390a160655460408051918252602082018390527f6ab181e0440bfbf4bacdf2e99674735ce6638005490688c5f994f5399353e452910160405180910390a180821115610cf15760405163052b07b760e21b815260040160405180910390fd5b606491909155606555565b600181905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a250565b606454811115610d5c5760405163052b07b760e21b815260040160405180910390fd5b606554610d67610d90565b1115610d865760405163d86bae6760e01b815260040160405180910390fd5b61044e8282610fdd565b6032546040516370a0823160e01b81523060048201525f916001600160a01b0316906370a0823190602401602060405180830381865afa158015610dd6573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610dfa919061149a565b905090565b7fd2494f3479e5da49d386657c292c610b5b01df313d07c62eb0cfa49924a31be881610e3384670de0b6b3a7640000611416565b610e3d919061142d565b604051908152602001610946565b5f54610100900460ff16610eb55760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b60648201526084016107e4565b603280546001600160a01b0319166001600160a01b038316179055610ed95f610cfc565b7f1c540707b00eb5427b6b774fc799d756516a54aee108b64b327acc55af55750760325f9054906101000a90046001600160a01b0316826001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f4b573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f6f91906114b1565b604080516001600160a01b03909316835260ff90911660208301520160405180910390a150565b6032546001600160a01b03838116911614610fc457604051630312abdd60e61b815260040160405180910390fd5b505050565b610fc46001600160a01b038316848361100b565b6032546001600160a01b0383811691161461044e57604051630312abdd60e61b815260040160405180910390fd5b604080516001600160a01b03848116602483015260448083018590528351808403909101815260649092018352602080830180516001600160e01b031663a9059cbb60e01b17905283518085019094528084527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c656490840152610fc4928692915f9161109a918516908490611119565b905080515f14806110ba5750808060200190518101906110ba91906113bd565b610fc45760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016107e4565b606061077284845f85855f5f866001600160a01b0316858760405161113e91906114cc565b5f6040518083038185875af1925050503d805f8114611178576040519150601f19603f3d011682016040523d82523d5f602084013e61117d565b606091505b509150915061118e87838387611199565b979650505050505050565b606083156112075782515f03611200576001600160a01b0385163b6112005760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016107e4565b5081610772565b610772838381511561121c5781518083602001fd5b8060405162461bcd60e51b81526004016107e4919061132f565b5f5f60408385031215611247575f5ffd5b50508035926020909101359150565b5f60208284031215611266575f5ffd5b5035919050565b6001600160a01b0381168114611281575f5ffd5b50565b5f5f60408385031215611295575f5ffd5b82356112a08161126d565b946020939093013593505050565b5f602082840312156112be575f5ffd5b81356112c98161126d565b9392505050565b60ff81168114611281575f5ffd5b5f602082840312156112ee575f5ffd5b81356112c9816112d0565b5f5f5f6060848603121561130b575f5ffd5b833592506020840135915060408401356113248161126d565b809150509250925092565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b5f5f5f60608486031215611376575f5ffd5b83356113818161126d565b925060208401356113918161126d565b929592945050506040919091013590565b5f602082840312156113b2575f5ffd5b81516112c98161126d565b5f602082840312156113cd575f5ffd5b815180151581146112c9575f5ffd5b634e487b7160e01b5f52601160045260245ffd5b8082018082111561067c5761067c6113dc565b8181038181111561067c5761067c6113dc565b808202811582820484141761067c5761067c6113dc565b5f8261144757634e487b7160e01b5f52601260045260245ffd5b500490565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b5f602082840312156114aa575f5ffd5b5051919050565b5f602082840312156114c1575f5ffd5b81516112c9816112d0565b5f82518060208501845e5f92019182525091905056fe4261736520537472617465677920696d706c656d656e746174696f6e20746f20696e68657269742066726f6d20666f72206d6f726520636f6d706c657820696d706c656d656e746174696f6e73a26469706673582212200c57a2a22085f981ee53bbcecc92ca02ec3a9be5fb5882eddf73ca423a0ab36764736f6c634300081b0033", + Bin: "0x60c060405234801561000f575f5ffd5b5060405161173e38038061173e83398101604081905261002e9161014f565b8181806001600160a01b038116610058576040516339b190bb60e11b815260040160405180910390fd5b6001600160a01b03908116608052821660a05261007361007c565b50505050610187565b5f54610100900460ff16156100e75760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff90811614610136575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b038116811461014c575f5ffd5b50565b5f5f60408385031215610160575f5ffd5b825161016b81610138565b602084015190925061017c81610138565b809150509250929050565b60805160a0516115656101d95f395f81816101ce01528181610556015281816109790152610a1601525f81816102960152818161039501528181610467015281816106970152610b4401526115655ff3fe608060405234801561000f575f5ffd5b506004361061016d575f3560e01c80637a8b2637116100d9578063c4d66de811610093578063df6fadc11161006e578063df6fadc11461033f578063e3dae51c1461035a578063f3e738751461036d578063fabc1cbc14610380575f5ffd5b8063c4d66de814610306578063ce7c2ac214610319578063d9caed121461032c575f5ffd5b80637a8b26371461027e578063886f1195146102915780638c871019146102b85780638f6a6240146102cb578063a6ab36f2146102de578063ab5921e1146102f1575f5ffd5b806347e7ef241161012a57806347e7ef2414610210578063553ca5f814610223578063595c6a67146102365780635ac86ab71461023e5780635c975abb1461026d57806361b01b5d14610275575f5ffd5b806311c70c9d14610171578063136439dd146101865780632495a5991461019957806339b70e38146101c95780633a98ef39146101f057806343fe08b014610207575b5f5ffd5b61018461017f366004611236565b610393565b005b610184610194366004611256565b610452565b6032546101ac906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b6101ac7f000000000000000000000000000000000000000000000000000000000000000081565b6101f960335481565b6040519081526020016101c0565b6101f960645481565b6101f961021e366004611284565b610523565b6101f96102313660046112ae565b61066f565b610184610682565b61025d61024c3660046112de565b6001805460ff9092161b9081161490565b60405190151581526020016101c0565b6001546101f9565b6101f960655481565b6101f961028c366004611256565b610731565b6101ac7f000000000000000000000000000000000000000000000000000000000000000081565b6101f96102c6366004611256565b61077a565b6101f96102d93660046112ae565b610784565b6101846102ec3660046112f9565b610791565b6102f961086c565b6040516101c0919061132f565b6101846103143660046112ae565b61088c565b6101f96103273660046112ae565b610952565b61018461033a366004611364565b6109e4565b606454606554604080519283526020830191909152016101c0565b6101f9610368366004611256565b610b01565b6101f961037b366004611256565b610b38565b61018461038e366004611256565b610b42565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156103ef573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061041391906113a2565b6001600160a01b0316336001600160a01b0316146104445760405163794821ff60e01b815260040160405180910390fd5b61044e8282610c58565b5050565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa1580156104b4573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104d891906113bd565b6104f557604051631d77d47760e21b815260040160405180910390fd5b600154818116811461051a5760405163c61dca5d60e01b815260040160405180910390fd5b61044e82610cfc565b600180545f91829181160361054b5760405163840a48d560e01b815260040160405180910390fd5b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610594576040516348da714f60e01b815260040160405180910390fd5b61059e8484610d39565b6033545f6105ae6103e8836113f0565b90505f6103e86105bc610d90565b6105c691906113f0565b90505f6105d38783611403565b9050806105e08489611416565b6105ea919061142d565b9550855f0361060c57604051630c392ed360e11b815260040160405180910390fd5b61061686856113f0565b60338190556f4b3b4ca85a86c47a098a223fffffffff101561064b57604051632f14e8a360e11b815260040160405180910390fd5b610664826103e860335461065f91906113f0565b610dff565b505050505092915050565b5f61067c61028c83610952565b92915050565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa1580156106e4573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061070891906113bd565b61072557604051631d77d47760e21b815260040160405180910390fd5b61072f5f19610cfc565b565b5f5f6103e860335461074391906113f0565b90505f6103e8610751610d90565b61075b91906113f0565b9050816107688583611416565b610772919061142d565b949350505050565b5f61067c82610b01565b5f61067c61037b83610952565b5f54610100900460ff16158080156107af57505f54600160ff909116105b806107c85750303b1580156107c857505f5460ff166001145b6107ed5760405162461bcd60e51b81526004016107e49061144c565b60405180910390fd5b5f805460ff19166001179055801561080e575f805461ff0019166101001790555b6108188484610c58565b61082182610e4b565b8015610866575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b60606040518060800160405280604d81526020016114e3604d9139905090565b5f54610100900460ff16158080156108aa57505f54600160ff909116105b806108c35750303b1580156108c357505f5460ff166001145b6108df5760405162461bcd60e51b81526004016107e49061144c565b5f805460ff191660011790558015610900575f805461ff0019166101001790555b61090982610e4b565b801561044e575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498906020015b60405180910390a15050565b60405163fe243a1760e01b81526001600160a01b0382811660048301523060248301525f917f00000000000000000000000000000000000000000000000000000000000000009091169063fe243a1790604401602060405180830381865afa1580156109c0573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061067c919061149a565b60018054600290811603610a0b5760405163840a48d560e01b815260040160405180910390fd5b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610a54576040516348da714f60e01b815260040160405180910390fd5b610a5f848484610f96565b60335480831115610a8357604051630b469df360e41b815260040160405180910390fd5b5f610a906103e8836113f0565b90505f6103e8610a9e610d90565b610aa891906113f0565b90505f82610ab68784611416565b610ac0919061142d565b9050610acc8685611403565b603355610aec610adc8284611403565b6103e860335461065f91906113f0565b610af7888883610fc9565b5050505050505050565b5f5f6103e8603354610b1391906113f0565b90505f6103e8610b21610d90565b610b2b91906113f0565b9050806107688386611416565b5f61067c82610731565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b9e573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610bc291906113a2565b6001600160a01b0316336001600160a01b031614610bf35760405163794821ff60e01b815260040160405180910390fd5b60015480198219811614610c1a5760405163c61dca5d60e01b815260040160405180910390fd5b600182905560405182815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c9060200160405180910390a25050565b60645460408051918252602082018490527ff97ed4e083acac67830025ecbc756d8fe847cdbdca4cee3fe1e128e98b54ecb5910160405180910390a160655460408051918252602082018390527f6ab181e0440bfbf4bacdf2e99674735ce6638005490688c5f994f5399353e452910160405180910390a180821115610cf15760405163052b07b760e21b815260040160405180910390fd5b606491909155606555565b600181905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a250565b606454811115610d5c5760405163052b07b760e21b815260040160405180910390fd5b606554610d67610d90565b1115610d865760405163d86bae6760e01b815260040160405180910390fd5b61044e8282610fdd565b6032546040516370a0823160e01b81523060048201525f916001600160a01b0316906370a0823190602401602060405180830381865afa158015610dd6573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610dfa919061149a565b905090565b7fd2494f3479e5da49d386657c292c610b5b01df313d07c62eb0cfa49924a31be881610e3384670de0b6b3a7640000611416565b610e3d919061142d565b604051908152602001610946565b5f54610100900460ff16610eb55760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b60648201526084016107e4565b603280546001600160a01b0319166001600160a01b038316179055610ed95f610cfc565b7f1c540707b00eb5427b6b774fc799d756516a54aee108b64b327acc55af55750760325f9054906101000a90046001600160a01b0316826001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f4b573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f6f91906114b1565b604080516001600160a01b03909316835260ff90911660208301520160405180910390a150565b6032546001600160a01b03838116911614610fc457604051630312abdd60e61b815260040160405180910390fd5b505050565b610fc46001600160a01b038316848361100b565b6032546001600160a01b0383811691161461044e57604051630312abdd60e61b815260040160405180910390fd5b604080516001600160a01b03848116602483015260448083018590528351808403909101815260649092018352602080830180516001600160e01b031663a9059cbb60e01b17905283518085019094528084527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c656490840152610fc4928692915f9161109a918516908490611119565b905080515f14806110ba5750808060200190518101906110ba91906113bd565b610fc45760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016107e4565b606061077284845f85855f5f866001600160a01b0316858760405161113e91906114cc565b5f6040518083038185875af1925050503d805f8114611178576040519150601f19603f3d011682016040523d82523d5f602084013e61117d565b606091505b509150915061118e87838387611199565b979650505050505050565b606083156112075782515f03611200576001600160a01b0385163b6112005760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016107e4565b5081610772565b610772838381511561121c5781518083602001fd5b8060405162461bcd60e51b81526004016107e4919061132f565b5f5f60408385031215611247575f5ffd5b50508035926020909101359150565b5f60208284031215611266575f5ffd5b5035919050565b6001600160a01b0381168114611281575f5ffd5b50565b5f5f60408385031215611295575f5ffd5b82356112a08161126d565b946020939093013593505050565b5f602082840312156112be575f5ffd5b81356112c98161126d565b9392505050565b60ff81168114611281575f5ffd5b5f602082840312156112ee575f5ffd5b81356112c9816112d0565b5f5f5f6060848603121561130b575f5ffd5b833592506020840135915060408401356113248161126d565b809150509250925092565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b5f5f5f60608486031215611376575f5ffd5b83356113818161126d565b925060208401356113918161126d565b929592945050506040919091013590565b5f602082840312156113b2575f5ffd5b81516112c98161126d565b5f602082840312156113cd575f5ffd5b815180151581146112c9575f5ffd5b634e487b7160e01b5f52601160045260245ffd5b8082018082111561067c5761067c6113dc565b8181038181111561067c5761067c6113dc565b808202811582820484141761067c5761067c6113dc565b5f8261144757634e487b7160e01b5f52601260045260245ffd5b500490565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b5f602082840312156114aa575f5ffd5b5051919050565b5f602082840312156114c1575f5ffd5b81516112c9816112d0565b5f82518060208501845e5f92019182525091905056fe4261736520537472617465677920696d706c656d656e746174696f6e20746f20696e68657269742066726f6d20666f72206d6f726520636f6d706c657820696d706c656d656e746174696f6e73a2646970667358221220e2d513e8e2d876b87d44574cd019e13e2cf2b613c6bc5ef7fe5d42e8fe87ac5464736f6c634300081b0033", } // 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 20ba8a6086..75f6021477 100644 --- a/pkg/bindings/StrategyFactory/binding.go +++ b/pkg/bindings/StrategyFactory/binding.go @@ -32,7 +32,7 @@ var ( // StrategyFactoryMetaData contains all meta data concerning the StrategyFactory contract. var StrategyFactoryMetaData = &bind.MetaData{ ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"_strategyManager\",\"type\":\"address\",\"internalType\":\"contractIStrategyManager\"},{\"name\":\"_pauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"blacklistTokens\",\"inputs\":[{\"name\":\"tokens\",\"type\":\"address[]\",\"internalType\":\"contractIERC20[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"deployNewStrategy\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"outputs\":[{\"name\":\"newStrategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"deployedStrategies\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"_initialOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_initialPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_strategyBeacon\",\"type\":\"address\",\"internalType\":\"contractIBeacon\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"isBlacklisted\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"pauseAll\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[{\"name\":\"index\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pauserRegistry\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"removeStrategiesFromWhitelist\",\"inputs\":[{\"name\":\"strategiesToRemoveFromWhitelist\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"strategyBeacon\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIBeacon\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"strategyManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategyManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"whitelistStrategies\",\"inputs\":[{\"name\":\"strategiesToWhitelist\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StrategyBeaconModified\",\"inputs\":[{\"name\":\"previousBeacon\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIBeacon\"},{\"name\":\"newBeacon\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIBeacon\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StrategySetForToken\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIERC20\"},{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TokenBlacklisted\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIERC20\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"AlreadyBlacklisted\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"BlacklistedToken\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"CurrentlyPaused\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InputAddressZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidNewPausedStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyPauser\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyUnpauser\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StrategyAlreadyExists\",\"inputs\":[]}]", - Bin: "0x60c060405234801561000f575f5ffd5b5060405161195e38038061195e83398101604081905261002e9161014e565b806001600160a01b038116610056576040516339b190bb60e11b815260040160405180910390fd5b6001600160a01b03908116608052821660a052610071610078565b5050610186565b603354610100900460ff16156100e45760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60335460ff90811614610135576033805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b038116811461014b575f5ffd5b50565b5f5f6040838503121561015f575f5ffd5b825161016a81610137565b602084015190925061017b81610137565b809150509250929050565b60805160a0516117866101d85f395f8181610142015281816105d501528181610869015281816109060152610c4701525f8181610215015281816102f0015281816106530152610b1401526117865ff3fe608060405234801561000f575f5ffd5b5060043610610111575f3560e01c8063886f11951161009e578063f0062d9a1161006e578063f0062d9a1461026e578063f2fde38b14610280578063fabc1cbc14610293578063fe38b32d146102a6578063fe575a87146102b9575f5ffd5b8063886f1195146102105780638da5cb5b14610237578063b768ebc914610248578063c350a1b51461025b575f5ffd5b8063595c6a67116100e4578063595c6a67146101a95780635ac86ab7146101b15780635c975abb146101e45780636b9b6229146101f5578063715018a614610208575f5ffd5b8063136439dd1461011557806323103c411461012a57806339b70e381461013d578063581dfd6514610181575b5f5ffd5b610128610123366004610e44565b6102db565b005b610128610138366004610ea3565b6103b0565b6101647f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020015b60405180910390f35b61016461018f366004610ef6565b60016020525f90815260409020546001600160a01b031681565b61012861063e565b6101d46101bf366004610f18565b609954600160ff9092169190911b9081161490565b6040519015158152602001610178565b609954604051908152602001610178565b610164610203366004610ef6565b6106ed565b6101286108d6565b6101647f000000000000000000000000000000000000000000000000000000000000000081565b6066546001600160a01b0316610164565b610128610256366004610ea3565b6108e7565b610128610269366004610f38565b61096e565b5f54610164906001600160a01b031681565b61012861028e366004610ef6565b610a99565b6101286102a1366004610e44565b610b12565b6101286102b4366004610ea3565b610c28565b6101d46102c7366004610ef6565b60026020525f908152604090205460ff1681565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa15801561033d573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103619190610f77565b61037e57604051631d77d47760e21b815260040160405180910390fd5b60995481811681146103a35760405163c61dca5d60e01b815260040160405180910390fd5b6103ac82610c7e565b5050565b6103b8610cbb565b5f8167ffffffffffffffff8111156103d2576103d2610f96565b6040519080825280602002602001820160405280156103fb578160200160208202803683370190505b5090505f805b838110156105b45760025f86868481811061041e5761041e610faa565b90506020020160208101906104339190610ef6565b6001600160a01b0316815260208101919091526040015f205460ff161561046d5760405163f53de75f60e01b815260040160405180910390fd5b600160025f87878581811061048457610484610faa565b90506020020160208101906104999190610ef6565b6001600160a01b0316815260208101919091526040015f20805460ff19169115159190911790557f75519c51f39873ec0e27dd3bbc09549e4865a113f505393fb9eab5898f6418b38585838181106104f3576104f3610faa565b90506020020160208101906105089190610ef6565b6040516001600160a01b03909116815260200160405180910390a15f60015f87878581811061053957610539610faa565b905060200201602081019061054e9190610ef6565b6001600160a01b03908116825260208201929092526040015f205416905080156105ab578084848151811061058557610585610faa565b6001600160a01b0390921660209283029190910190910152826105a781610fbe565b9350505b50600101610401565b508082528015610638576040516316bb16b760e31b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063b5d8b5b89061060a908590600401610fe2565b5f604051808303815f87803b158015610621575f5ffd5b505af1158015610633573d5f5f3e3d5ffd5b505050505b50505050565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa1580156106a0573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106c49190610f77565b6106e157604051631d77d47760e21b815260040160405180910390fd5b6106eb5f19610c7e565b565b6099545f9081906001908116036107175760405163840a48d560e01b815260040160405180910390fd5b6001600160a01b0383165f9081526002602052604090205460ff16156107505760405163091867bd60e11b815260040160405180910390fd5b6001600160a01b038381165f9081526001602052604090205416156107885760405163c45546f760e01b815260040160405180910390fd5b5f8054604080516001600160a01b0387811660248084019190915283518084039091018152604490920183526020820180516001600160e01b031663189acdbd60e31b17905291519190921691906107df90610e37565b6107ea92919061102d565b604051809103905ff080158015610803573d5f5f3e3d5ffd5b5090506108108482610d15565b6040805160018082528183019092525f916020808301908036833701905050905081815f8151811061084457610844610faa565b6001600160a01b039283166020918202929092010152604051632ef047f960e11b81527f000000000000000000000000000000000000000000000000000000000000000090911690635de08ff2906108a0908490600401610fe2565b5f604051808303815f87803b1580156108b7575f5ffd5b505af11580156108c9573d5f5f3e3d5ffd5b5093979650505050505050565b6108de610cbb565b6106eb5f610d7f565b6108ef610cbb565b604051632ef047f960e11b81526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690635de08ff29061093d9085908590600401611071565b5f604051808303815f87803b158015610954575f5ffd5b505af1158015610966573d5f5f3e3d5ffd5b505050505050565b603354610100900460ff161580801561098e5750603354600160ff909116105b806109a85750303b1580156109a8575060335460ff166001145b610a105760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b6033805460ff191660011790558015610a33576033805461ff0019166101001790555b610a3c84610d7f565b610a4583610c7e565b610a4e82610dd0565b8015610638576033805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a150505050565b610aa1610cbb565b6001600160a01b038116610b065760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610a07565b610b0f81610d7f565b50565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b6e573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b9291906110bd565b6001600160a01b0316336001600160a01b031614610bc35760405163794821ff60e01b815260040160405180910390fd5b60995480198219811614610bea5760405163c61dca5d60e01b815260040160405180910390fd5b609982905560405182815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c9060200160405180910390a25050565b610c30610cbb565b6040516316bb16b760e31b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063b5d8b5b89061093d9085908590600401611071565b609981905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a250565b6066546001600160a01b031633146106eb5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a07565b6001600160a01b038281165f8181526001602090815260409182902080546001600160a01b031916948616948517905581519283528201929092527f6852a55230ef089d785bce7ffbf757985de34026df90a87d7b4a6e56f95d251f910160405180910390a15050565b606680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b5f54604080516001600160a01b03928316815291831660208301527fe21755962a7d7e100b59b9c3e4d4b54085b146313719955efb6a7a25c5c7feee910160405180910390a15f80546001600160a01b0319166001600160a01b0392909216919091179055565b610678806110d983390190565b5f60208284031215610e54575f5ffd5b5035919050565b5f5f83601f840112610e6b575f5ffd5b50813567ffffffffffffffff811115610e82575f5ffd5b6020830191508360208260051b8501011115610e9c575f5ffd5b9250929050565b5f5f60208385031215610eb4575f5ffd5b823567ffffffffffffffff811115610eca575f5ffd5b610ed685828601610e5b565b90969095509350505050565b6001600160a01b0381168114610b0f575f5ffd5b5f60208284031215610f06575f5ffd5b8135610f1181610ee2565b9392505050565b5f60208284031215610f28575f5ffd5b813560ff81168114610f11575f5ffd5b5f5f5f60608486031215610f4a575f5ffd5b8335610f5581610ee2565b9250602084013591506040840135610f6c81610ee2565b809150509250925092565b5f60208284031215610f87575f5ffd5b81518015158114610f11575f5ffd5b634e487b7160e01b5f52604160045260245ffd5b634e487b7160e01b5f52603260045260245ffd5b5f60018201610fdb57634e487b7160e01b5f52601160045260245ffd5b5060010190565b602080825282518282018190525f918401906040840190835b818110156110225783516001600160a01b0316835260209384019390920191600101610ffb565b509095945050505050565b60018060a01b0383168152604060208201525f82518060408401528060208501606085015e5f606082850101526060601f19601f8301168401019150509392505050565b602080825281018290525f8360408301825b858110156110b357823561109681610ee2565b6001600160a01b0316825260209283019290910190600101611083565b5095945050505050565b5f602082840312156110cd575f5ffd5b8151610f1181610ee256fe6080604052604051610678380380610678833981016040819052610022916103ed565b61002d82825f610034565b5050610513565b61003d836100f1565b6040516001600160a01b038416907f1cf3b03a6cf19fa2baba4df148e9dcabedea7f8a5c07840e207e5c089be95d3e905f90a25f8251118061007c5750805b156100ec576100ea836001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156100c0573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906100e491906104af565b83610273565b505b505050565b6001600160a01b0381163b61015b5760405162461bcd60e51b815260206004820152602560248201527f455243313936373a206e657720626561636f6e206973206e6f74206120636f6e6044820152641d1c9858dd60da1b60648201526084015b60405180910390fd5b6101cd816001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561019a573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906101be91906104af565b6001600160a01b03163b151590565b6102325760405162461bcd60e51b815260206004820152603060248201527f455243313936373a20626561636f6e20696d706c656d656e746174696f6e206960448201526f1cc81b9bdd08184818dbdb9d1c9858dd60821b6064820152608401610152565b7fa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d5080546001600160a01b0319166001600160a01b0392909216919091179055565b606061029883836040518060600160405280602781526020016106516027913961029f565b9392505050565b60605f5f856001600160a01b0316856040516102bb91906104c8565b5f60405180830381855af49150503d805f81146102f3576040519150601f19603f3d011682016040523d82523d5f602084013e6102f8565b606091505b50909250905061030a86838387610314565b9695505050505050565b606083156103825782515f0361037b576001600160a01b0385163b61037b5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610152565b508161038c565b61038c8383610394565b949350505050565b8151156103a45781518083602001fd5b8060405162461bcd60e51b815260040161015291906104de565b80516001600160a01b03811681146103d4575f5ffd5b919050565b634e487b7160e01b5f52604160045260245ffd5b5f5f604083850312156103fe575f5ffd5b610407836103be565b60208401519092506001600160401b03811115610422575f5ffd5b8301601f81018513610432575f5ffd5b80516001600160401b0381111561044b5761044b6103d9565b604051601f8201601f19908116603f011681016001600160401b0381118282101715610479576104796103d9565b604052818152828201602001871015610490575f5ffd5b8160208401602083015e5f602083830101528093505050509250929050565b5f602082840312156104bf575f5ffd5b610298826103be565b5f82518060208501845e5f920191825250919050565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b610131806105205f395ff3fe608060405236601057600e6013565b005b600e5b601f601b6021565b60b3565b565b5f60527fa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50546001600160a01b031690565b6001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015608c573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019060ae919060d0565b905090565b365f5f375f5f365f845af43d5f5f3e80801560cc573d5ff35b3d5ffd5b5f6020828403121560df575f5ffd5b81516001600160a01b038116811460f4575f5ffd5b939250505056fea2646970667358221220f37d2ffd80ec7d14cc9a0f17394e9d97446c1f630de382043b1ed4ccacf6a7d464736f6c634300081b0033416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220635a3ef1d0e9ee7ff1dc580d781a4dfc61462301a90e38109e3a496baf9773e764736f6c634300081b0033", + Bin: "0x60c060405234801561000f575f5ffd5b5060405161195e38038061195e83398101604081905261002e9161014e565b806001600160a01b038116610056576040516339b190bb60e11b815260040160405180910390fd5b6001600160a01b03908116608052821660a052610071610078565b5050610186565b603354610100900460ff16156100e45760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60335460ff90811614610135576033805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b038116811461014b575f5ffd5b50565b5f5f6040838503121561015f575f5ffd5b825161016a81610137565b602084015190925061017b81610137565b809150509250929050565b60805160a0516117866101d85f395f8181610142015281816105d501528181610869015281816109060152610c4701525f8181610215015281816102f0015281816106530152610b1401526117865ff3fe608060405234801561000f575f5ffd5b5060043610610111575f3560e01c8063886f11951161009e578063f0062d9a1161006e578063f0062d9a1461026e578063f2fde38b14610280578063fabc1cbc14610293578063fe38b32d146102a6578063fe575a87146102b9575f5ffd5b8063886f1195146102105780638da5cb5b14610237578063b768ebc914610248578063c350a1b51461025b575f5ffd5b8063595c6a67116100e4578063595c6a67146101a95780635ac86ab7146101b15780635c975abb146101e45780636b9b6229146101f5578063715018a614610208575f5ffd5b8063136439dd1461011557806323103c411461012a57806339b70e381461013d578063581dfd6514610181575b5f5ffd5b610128610123366004610e44565b6102db565b005b610128610138366004610ea3565b6103b0565b6101647f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020015b60405180910390f35b61016461018f366004610ef6565b60016020525f90815260409020546001600160a01b031681565b61012861063e565b6101d46101bf366004610f18565b609954600160ff9092169190911b9081161490565b6040519015158152602001610178565b609954604051908152602001610178565b610164610203366004610ef6565b6106ed565b6101286108d6565b6101647f000000000000000000000000000000000000000000000000000000000000000081565b6066546001600160a01b0316610164565b610128610256366004610ea3565b6108e7565b610128610269366004610f38565b61096e565b5f54610164906001600160a01b031681565b61012861028e366004610ef6565b610a99565b6101286102a1366004610e44565b610b12565b6101286102b4366004610ea3565b610c28565b6101d46102c7366004610ef6565b60026020525f908152604090205460ff1681565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa15801561033d573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103619190610f77565b61037e57604051631d77d47760e21b815260040160405180910390fd5b60995481811681146103a35760405163c61dca5d60e01b815260040160405180910390fd5b6103ac82610c7e565b5050565b6103b8610cbb565b5f8167ffffffffffffffff8111156103d2576103d2610f96565b6040519080825280602002602001820160405280156103fb578160200160208202803683370190505b5090505f805b838110156105b45760025f86868481811061041e5761041e610faa565b90506020020160208101906104339190610ef6565b6001600160a01b0316815260208101919091526040015f205460ff161561046d5760405163f53de75f60e01b815260040160405180910390fd5b600160025f87878581811061048457610484610faa565b90506020020160208101906104999190610ef6565b6001600160a01b0316815260208101919091526040015f20805460ff19169115159190911790557f75519c51f39873ec0e27dd3bbc09549e4865a113f505393fb9eab5898f6418b38585838181106104f3576104f3610faa565b90506020020160208101906105089190610ef6565b6040516001600160a01b03909116815260200160405180910390a15f60015f87878581811061053957610539610faa565b905060200201602081019061054e9190610ef6565b6001600160a01b03908116825260208201929092526040015f205416905080156105ab578084848151811061058557610585610faa565b6001600160a01b0390921660209283029190910190910152826105a781610fbe565b9350505b50600101610401565b508082528015610638576040516316bb16b760e31b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063b5d8b5b89061060a908590600401610fe2565b5f604051808303815f87803b158015610621575f5ffd5b505af1158015610633573d5f5f3e3d5ffd5b505050505b50505050565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa1580156106a0573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106c49190610f77565b6106e157604051631d77d47760e21b815260040160405180910390fd5b6106eb5f19610c7e565b565b6099545f9081906001908116036107175760405163840a48d560e01b815260040160405180910390fd5b6001600160a01b0383165f9081526002602052604090205460ff16156107505760405163091867bd60e11b815260040160405180910390fd5b6001600160a01b038381165f9081526001602052604090205416156107885760405163c45546f760e01b815260040160405180910390fd5b5f8054604080516001600160a01b0387811660248084019190915283518084039091018152604490920183526020820180516001600160e01b031663189acdbd60e31b17905291519190921691906107df90610e37565b6107ea92919061102d565b604051809103905ff080158015610803573d5f5f3e3d5ffd5b5090506108108482610d15565b6040805160018082528183019092525f916020808301908036833701905050905081815f8151811061084457610844610faa565b6001600160a01b039283166020918202929092010152604051632ef047f960e11b81527f000000000000000000000000000000000000000000000000000000000000000090911690635de08ff2906108a0908490600401610fe2565b5f604051808303815f87803b1580156108b7575f5ffd5b505af11580156108c9573d5f5f3e3d5ffd5b5093979650505050505050565b6108de610cbb565b6106eb5f610d7f565b6108ef610cbb565b604051632ef047f960e11b81526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690635de08ff29061093d9085908590600401611071565b5f604051808303815f87803b158015610954575f5ffd5b505af1158015610966573d5f5f3e3d5ffd5b505050505050565b603354610100900460ff161580801561098e5750603354600160ff909116105b806109a85750303b1580156109a8575060335460ff166001145b610a105760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b6033805460ff191660011790558015610a33576033805461ff0019166101001790555b610a3c84610d7f565b610a4583610c7e565b610a4e82610dd0565b8015610638576033805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a150505050565b610aa1610cbb565b6001600160a01b038116610b065760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610a07565b610b0f81610d7f565b50565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b6e573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b9291906110bd565b6001600160a01b0316336001600160a01b031614610bc35760405163794821ff60e01b815260040160405180910390fd5b60995480198219811614610bea5760405163c61dca5d60e01b815260040160405180910390fd5b609982905560405182815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c9060200160405180910390a25050565b610c30610cbb565b6040516316bb16b760e31b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063b5d8b5b89061093d9085908590600401611071565b609981905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a250565b6066546001600160a01b031633146106eb5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a07565b6001600160a01b038281165f8181526001602090815260409182902080546001600160a01b031916948616948517905581519283528201929092527f6852a55230ef089d785bce7ffbf757985de34026df90a87d7b4a6e56f95d251f910160405180910390a15050565b606680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b5f54604080516001600160a01b03928316815291831660208301527fe21755962a7d7e100b59b9c3e4d4b54085b146313719955efb6a7a25c5c7feee910160405180910390a15f80546001600160a01b0319166001600160a01b0392909216919091179055565b610678806110d983390190565b5f60208284031215610e54575f5ffd5b5035919050565b5f5f83601f840112610e6b575f5ffd5b50813567ffffffffffffffff811115610e82575f5ffd5b6020830191508360208260051b8501011115610e9c575f5ffd5b9250929050565b5f5f60208385031215610eb4575f5ffd5b823567ffffffffffffffff811115610eca575f5ffd5b610ed685828601610e5b565b90969095509350505050565b6001600160a01b0381168114610b0f575f5ffd5b5f60208284031215610f06575f5ffd5b8135610f1181610ee2565b9392505050565b5f60208284031215610f28575f5ffd5b813560ff81168114610f11575f5ffd5b5f5f5f60608486031215610f4a575f5ffd5b8335610f5581610ee2565b9250602084013591506040840135610f6c81610ee2565b809150509250925092565b5f60208284031215610f87575f5ffd5b81518015158114610f11575f5ffd5b634e487b7160e01b5f52604160045260245ffd5b634e487b7160e01b5f52603260045260245ffd5b5f60018201610fdb57634e487b7160e01b5f52601160045260245ffd5b5060010190565b602080825282518282018190525f918401906040840190835b818110156110225783516001600160a01b0316835260209384019390920191600101610ffb565b509095945050505050565b60018060a01b0383168152604060208201525f82518060408401528060208501606085015e5f606082850101526060601f19601f8301168401019150509392505050565b602080825281018290525f8360408301825b858110156110b357823561109681610ee2565b6001600160a01b0316825260209283019290910190600101611083565b5095945050505050565b5f602082840312156110cd575f5ffd5b8151610f1181610ee256fe6080604052604051610678380380610678833981016040819052610022916103ed565b61002d82825f610034565b5050610513565b61003d836100f1565b6040516001600160a01b038416907f1cf3b03a6cf19fa2baba4df148e9dcabedea7f8a5c07840e207e5c089be95d3e905f90a25f8251118061007c5750805b156100ec576100ea836001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156100c0573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906100e491906104af565b83610273565b505b505050565b6001600160a01b0381163b61015b5760405162461bcd60e51b815260206004820152602560248201527f455243313936373a206e657720626561636f6e206973206e6f74206120636f6e6044820152641d1c9858dd60da1b60648201526084015b60405180910390fd5b6101cd816001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561019a573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906101be91906104af565b6001600160a01b03163b151590565b6102325760405162461bcd60e51b815260206004820152603060248201527f455243313936373a20626561636f6e20696d706c656d656e746174696f6e206960448201526f1cc81b9bdd08184818dbdb9d1c9858dd60821b6064820152608401610152565b7fa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d5080546001600160a01b0319166001600160a01b0392909216919091179055565b606061029883836040518060600160405280602781526020016106516027913961029f565b9392505050565b60605f5f856001600160a01b0316856040516102bb91906104c8565b5f60405180830381855af49150503d805f81146102f3576040519150601f19603f3d011682016040523d82523d5f602084013e6102f8565b606091505b50909250905061030a86838387610314565b9695505050505050565b606083156103825782515f0361037b576001600160a01b0385163b61037b5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610152565b508161038c565b61038c8383610394565b949350505050565b8151156103a45781518083602001fd5b8060405162461bcd60e51b815260040161015291906104de565b80516001600160a01b03811681146103d4575f5ffd5b919050565b634e487b7160e01b5f52604160045260245ffd5b5f5f604083850312156103fe575f5ffd5b610407836103be565b60208401519092506001600160401b03811115610422575f5ffd5b8301601f81018513610432575f5ffd5b80516001600160401b0381111561044b5761044b6103d9565b604051601f8201601f19908116603f011681016001600160401b0381118282101715610479576104796103d9565b604052818152828201602001871015610490575f5ffd5b8160208401602083015e5f602083830101528093505050509250929050565b5f602082840312156104bf575f5ffd5b610298826103be565b5f82518060208501845e5f920191825250919050565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b610131806105205f395ff3fe608060405236601057600e6013565b005b600e5b601f601b6021565b60b3565b565b5f60527fa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50546001600160a01b031690565b6001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015608c573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019060ae919060d0565b905090565b365f5f375f5f365f845af43d5f5f3e80801560cc573d5ff35b3d5ffd5b5f6020828403121560df575f5ffd5b81516001600160a01b038116811460f4575f5ffd5b939250505056fea26469706673582212205e179e1700322d816f025eafa6283d01eb81392a9f5f438a46fb77683652459464736f6c634300081b0033416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220cd490f4fa8073ef9bbfecf650844d2934535ae132846c3b66b893f9373ce1aa364736f6c634300081b0033", } // StrategyFactoryABI 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 829f49d70b..2347b25f61 100644 --- a/pkg/bindings/StrategyManager/binding.go +++ b/pkg/bindings/StrategyManager/binding.go @@ -32,7 +32,7 @@ var ( // StrategyManagerMetaData contains all meta data concerning the StrategyManager contract. var StrategyManagerMetaData = &bind.MetaData{ ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"_delegation\",\"type\":\"address\",\"internalType\":\"contractIDelegationManager\"},{\"name\":\"_pauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"DEFAULT_BURN_ADDRESS\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"DEPOSIT_TYPEHASH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"addShares\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"shares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"addStrategiesToDepositWhitelist\",\"inputs\":[{\"name\":\"strategiesToWhitelist\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"burnShares\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"burnableShares\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"calculateStrategyDepositDigestHash\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"nonce\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"delegation\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIDelegationManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"depositIntoStrategy\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"depositShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"depositIntoStrategyWithSignature\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"depositShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"domainSeparator\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getDeposits\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getStakerStrategyList\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"increaseBurnableShares\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"addedSharesToBurn\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"initialOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"initialStrategyWhitelister\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"initialPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"nonces\",\"inputs\":[{\"name\":\"signer\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"nonce\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"pauseAll\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[{\"name\":\"index\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pauserRegistry\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"removeDepositShares\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"depositSharesToRemove\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"removeStrategiesFromDepositWhitelist\",\"inputs\":[{\"name\":\"strategiesToRemoveFromWhitelist\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setStrategyWhitelister\",\"inputs\":[{\"name\":\"newStrategyWhitelister\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"stakerDepositShares\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"shares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"stakerStrategyList\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"strategies\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"stakerStrategyListLength\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"strategyIsWhitelistedForDeposit\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"whitelisted\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"strategyWhitelister\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"withdrawSharesAsTokens\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"shares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"BurnableSharesDecreased\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"shares\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BurnableSharesIncreased\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"shares\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Deposit\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"shares\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StrategyAddedToDepositWhitelist\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StrategyRemovedFromDepositWhitelist\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StrategyWhitelisterChanged\",\"inputs\":[{\"name\":\"previousAddress\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"newAddress\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"CurrentlyPaused\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InputAddressZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidNewPausedStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidSignature\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"MaxStrategiesExceeded\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyDelegationManager\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyPauser\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyStrategyWhitelister\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyUnpauser\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SharesAmountTooHigh\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SharesAmountZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SignatureExpired\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StakerAddressZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StrategyNotFound\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StrategyNotWhitelisted\",\"inputs\":[]}]", - Bin: "0x610100604052348015610010575f5ffd5b5060405161285338038061285383398101604081905261002f916101ed565b81816001600160a01b038116610058576040516339b190bb60e11b815260040160405180910390fd5b6001600160a01b039081166080521660a0524660c052610108604080518082018252600a81526922b4b3b2b72630bcb2b960b11b60209182015281517f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a866818301527f71b625cfad44bac63b13dba07f2e1d6084ee04b6f8752101ece6126d584ee6ea81840152466060820152306080808301919091528351808303909101815260a0909101909252815191012090565b60e05261011361011a565b5050610225565b5f54610100900460ff16156101855760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff908116146101d4575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b03811681146101ea575f5ffd5b50565b5f5f604083850312156101fe575f5ffd5b8251610209816101d6565b602084015190925061021a816101d6565b809150509250929050565b60805160a05160c05160e0516125c36102905f395f6112ce01525f61120e01525f81816104c501528181610762015281816109e001528181610c3f0152818161109301526116b101525f818161039a0152818161057101528181610a4a01526112f201526125c35ff3fe608060405234801561000f575f5ffd5b50600436106101fd575f3560e01c80638b8aac3c11610114578063de44acb6116100a9578063f2fde38b11610079578063f2fde38b146104fa578063f3b4a0001461050d578063f698da2514610517578063fabc1cbc1461051f578063fe243a1714610532575f5ffd5b8063de44acb61461048d578063debe1eab146104ad578063df5cf723146104c0578063e7a050aa146104e7575f5ffd5b80639ac01d61116100e45780639ac01d6114610441578063b5d8b5b814610454578063c665670214610467578063cbc2bd621461047a575f5ffd5b80638b8aac3c146103d45780638da5cb5b146103fc57806394f649dd1461040d578063967fc0d21461042e575f5ffd5b8063595c6a6711610195578063663c1de411610165578063663c1de414610339578063715018a61461035b578063724af423146103635780637ecebe0014610376578063886f119514610395575f5ffd5b8063595c6a67146102e35780635ac86ab7146102eb5780635c975abb1461031e5780635de08ff214610326575f5ffd5b806332e89ace116101d057806332e89ace1461026e57806348825e94146102815780634b6d5d6e146102a857806350ff7225146102bb575f5ffd5b8063136439dd146102015780631794bb3c146102165780631b3cbdc1146102295780632eae418c1461025b575b5f5ffd5b61021461020f36600461204d565b61055c565b005b610214610224366004612078565b610631565b6102486102373660046120b6565b60d46020525f908152604090205481565b6040519081526020015b60405180910390f35b6102146102693660046120d1565b610757565b61024861027c366004612133565b610803565b6102487f4337f82d142e41f2a8c10547cd8c859bddb92262a61058e77842e24d9dea922481565b6102146102b63660046120b6565b6108a7565b6102ce6102c9366004612078565b6109d3565b60408051928352602083019190915201610252565b610214610a35565b61030e6102f936600461222e565b609854600160ff9092169190911b9081161490565b6040519015158152602001610252565b609854610248565b61021461033436600461224e565b610ae4565b61030e6103473660046120b6565b60d16020525f908152604090205460ff1681565b610214610c23565b610214610371366004612078565b610c34565b6102486103843660046120b6565b60ca6020525f908152604090205481565b6103bc7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610252565b6102486103e23660046120b6565b6001600160a01b03165f90815260ce602052604090205490565b6033546001600160a01b03166103bc565b61042061041b3660046120b6565b610c88565b604051610252929190612302565b60cb546103bc906001600160a01b031681565b61024861044f36600461235a565b610e00565b61021461046236600461224e565b610e91565b6102146104753660046120b6565b610fd0565b6103bc6104883660046123bb565b610fe1565b6104a061049b3660046120b6565b611015565b60405161025291906123e5565b6102146104bb3660046123bb565b611088565b6103bc7f000000000000000000000000000000000000000000000000000000000000000081565b6102486104f5366004612078565b611143565b6102146105083660046120b6565b611195565b6103bc620e16e481565b61024861120b565b61021461052d36600461204d565b6112f0565b6102486105403660046123f7565b60cd60209081525f928352604080842090915290825290205481565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa1580156105be573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105e2919061242e565b6105ff57604051631d77d47760e21b815260040160405180910390fd5b60985481811681146106245760405163c61dca5d60e01b815260040160405180910390fd5b61062d82611406565b5050565b5f54610100900460ff161580801561064f57505f54600160ff909116105b806106685750303b15801561066857505f5460ff166001145b6106d05760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b5f805460ff1916600117905580156106f1575f805461ff0019166101001790555b6106fa82611406565b61070384611443565b61070c83611494565b8015610751575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146107a05760405163f739589b60e01b815260040160405180910390fd5b604051636ce5768960e11b81526001600160a01b0384169063d9caed12906107d09087908690869060040161244d565b5f604051808303815f87803b1580156107e7575f5ffd5b505af11580156107f9573d5f5f3e3d5ffd5b5050505050505050565b6098545f90819060019081160361082d5760405163840a48d560e01b815260040160405180910390fd5b6108356114fd565b6001600160a01b0385165f90815260ca60205260409020546108668661085f818c8c8c878c610e00565b8688611556565b6001600160a01b0386165f90815260ca6020526040902060018201905561088f868a8a8a6115a8565b92505061089c6001606555565b509695505050505050565b6108af6114fd565b6001600160a01b0381165f81815260d4602090815260408083208054939055805193845290830182905290917fd9d082c3ec4f3a3ffa55c324939a06407f5fbcb87d5e0ce3b9508c92c84ed839910160405180910390a1816001600160a01b031663d9caed12620e16e4846001600160a01b0316632495a5996040518163ffffffff1660e01b8152600401602060405180830381865afa158015610955573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109799190612471565b846040518463ffffffff1660e01b81526004016109989392919061244d565b5f604051808303815f87803b1580156109af575f5ffd5b505af11580156109c1573d5f5f3e3d5ffd5b50505050506109d06001606555565b50565b5f80336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610a1e5760405163f739589b60e01b815260040160405180910390fd5b610a29858585611715565b91509150935093915050565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa158015610a97573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610abb919061242e565b610ad857604051631d77d47760e21b815260040160405180910390fd5b610ae25f19611406565b565b60cb546001600160a01b03163314610b0f576040516320ba3ff960e21b815260040160405180910390fd5b805f5b818110156107515760d15f858584818110610b2f57610b2f61248c565b9050602002016020810190610b4491906120b6565b6001600160a01b0316815260208101919091526040015f205460ff16610c1b57600160d15f868685818110610b7b57610b7b61248c565b9050602002016020810190610b9091906120b6565b6001600160a01b0316815260208101919091526040015f20805460ff19169115159190911790557f0c35b17d91c96eb2751cd456e1252f42a386e524ef9ff26ecc9950859fdc04fe848483818110610bea57610bea61248c565b9050602002016020810190610bff91906120b6565b6040516001600160a01b03909116815260200160405180910390a15b600101610b12565b610c2b61187d565b610ae25f611443565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610c7d5760405163f739589b60e01b815260040160405180910390fd5b6107518383836118d7565b6001600160a01b0381165f90815260ce60205260408120546060918291908167ffffffffffffffff811115610cbf57610cbf61211f565b604051908082528060200260200182016040528015610ce8578160200160208202803683370190505b5090505f5b82811015610d76576001600160a01b0386165f90815260cd6020908152604080832060ce9092528220805491929184908110610d2b57610d2b61248c565b5f9182526020808320909101546001600160a01b031683528201929092526040019020548251839083908110610d6357610d6361248c565b6020908102919091010152600101610ced565b5060ce5f866001600160a01b03166001600160a01b031681526020019081526020015f208181805480602002602001604051908101604052809291908181526020018280548015610dee57602002820191905f5260205f20905b81546001600160a01b03168152600190910190602001808311610dd0575b50505050509150935093505050915091565b604080517f4337f82d142e41f2a8c10547cd8c859bddb92262a61058e77842e24d9dea922460208201526001600160a01b03808916928201929092528187166060820152908516608082015260a0810184905260c0810183905260e081018290525f90610e8690610100016040516020818303038152906040528051906020012061199b565b979650505050505050565b60cb546001600160a01b03163314610ebc576040516320ba3ff960e21b815260040160405180910390fd5b805f5b818110156107515760d15f858584818110610edc57610edc61248c565b9050602002016020810190610ef191906120b6565b6001600160a01b0316815260208101919091526040015f205460ff1615610fc8575f60d15f868685818110610f2857610f2861248c565b9050602002016020810190610f3d91906120b6565b6001600160a01b0316815260208101919091526040015f20805460ff19169115159190911790557f4074413b4b443e4e58019f2855a8765113358c7c72e39509c6af45fc0f5ba030848483818110610f9757610f9761248c565b9050602002016020810190610fac91906120b6565b6040516001600160a01b03909116815260200160405180910390a15b600101610ebf565b610fd861187d565b6109d081611494565b60ce602052815f5260405f208181548110610ffa575f80fd5b5f918252602090912001546001600160a01b03169150829050565b6001600160a01b0381165f90815260ce602090815260409182902080548351818402810184019094528084526060939283018282801561107c57602002820191905f5260205f20905b81546001600160a01b0316815260019091019060200180831161105e575b50505050509050919050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146110d15760405163f739589b60e01b815260040160405180910390fd5b6001600160a01b0382165f90815260d46020526040812080548392906110f89084906124b4565b9091555050604080516001600160a01b0384168152602081018390527fca3e02a4ab7ad3c47a8e36e5a624c30170791726ab720f1babfef21046d953ff910160405180910390a15050565b6098545f90819060019081160361116d5760405163840a48d560e01b815260040160405180910390fd5b6111756114fd565b611181338686866115a8565b915061118d6001606555565b509392505050565b61119d61187d565b6001600160a01b0381166112025760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016106c7565b6109d081611443565b5f7f000000000000000000000000000000000000000000000000000000000000000046146112cb5750604080518082018252600a81526922b4b3b2b72630bcb2b960b11b60209182015281517f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a866818301527f71b625cfad44bac63b13dba07f2e1d6084ee04b6f8752101ece6126d584ee6ea81840152466060820152306080808301919091528351808303909101815260a0909101909252815191012090565b507f000000000000000000000000000000000000000000000000000000000000000090565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561134c573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113709190612471565b6001600160a01b0316336001600160a01b0316146113a15760405163794821ff60e01b815260040160405180910390fd5b609854801982198116146113c85760405163c61dca5d60e01b815260040160405180910390fd5b609882905560405182815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c9060200160405180910390a25050565b609881905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a250565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b60cb54604080516001600160a01b03928316815291831660208301527f4264275e593955ff9d6146a51a4525f6ddace2e81db9391abcc9d1ca48047d29910160405180910390a160cb80546001600160a01b0319166001600160a01b0392909216919091179055565b60026065540361154f5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016106c7565b6002606555565b4281101561157757604051630819bdcd60e01b815260040160405180910390fd5b61158b6001600160a01b03851684846119e1565b61075157604051638baa579f60e01b815260040160405180910390fd5b6001600160a01b0383165f90815260d16020526040812054849060ff166115e257604051632efd965160e11b815260040160405180910390fd5b6115f76001600160a01b038516338786611a3f565b6040516311f9fbc960e21b81526001600160a01b038581166004830152602482018590528616906347e7ef24906044016020604051808303815f875af1158015611643573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061166791906124cd565b91505f5f611676888886611715565b604051631e328e7960e11b81526001600160a01b038b811660048301528a8116602483015260448201849052606482018390529294509092507f000000000000000000000000000000000000000000000000000000000000000090911690633c651cf2906084015f604051808303815f87803b1580156116f4575f5ffd5b505af1158015611706573d5f5f3e3d5ffd5b50505050505050949350505050565b5f806001600160a01b03851661173e576040516316f2ccc960e01b815260040160405180910390fd5b825f0361175e576040516342061b2560e11b815260040160405180910390fd5b6001600160a01b038086165f90815260cd6020908152604080832093881683529290529081205490819003611804576001600160a01b0386165f90815260ce6020908152604090912054106117c6576040516301a1443960e31b815260040160405180910390fd5b6001600160a01b038681165f90815260ce602090815260408220805460018101825590835291200180546001600160a01b0319169187169190911790555b61180e84826124b4565b6001600160a01b038088165f90815260cd60209081526040808320938a16835292905281902091909155517f5548c837ab068cf56a2c2479df0882a4922fd203edb7517321831d95078c5f629061186a9088908890889061244d565b60405180910390a1959294509192505050565b6033546001600160a01b03163314610ae25760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016106c7565b5f815f036118f8576040516342061b2560e11b815260040160405180910390fd5b6001600160a01b038085165f90815260cd60209081526040808320938716835292905220548083111561193e57604051634b18b19360e01b815260040160405180910390fd5b61194883826124e4565b6001600160a01b038087165f90815260cd60209081526040808320938916835292905290812082905590915081900361198f576119858585611a97565b6001915050611994565b5f9150505b9392505050565b5f6119a461120b565b60405161190160f01b6020820152602281019190915260428101839052606201604051602081830303815290604052805190602001209050919050565b5f5f5f6119ee8585611c15565b90925090505f816004811115611a0657611a066124f7565b148015611a245750856001600160a01b0316826001600160a01b0316145b80611a355750611a35868686611c57565b9695505050505050565b610751846323b872dd60e01b858585604051602401611a609392919061244d565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152611d3e565b6001600160a01b0382165f90815260ce6020526040812054905b81811015611ba9576001600160a01b038481165f90815260ce6020526040902080549185169183908110611ae757611ae761248c565b5f918252602090912001546001600160a01b031603611ba1576001600160a01b0384165f90815260ce602052604090208054611b25906001906124e4565b81548110611b3557611b3561248c565b5f9182526020808320909101546001600160a01b03878116845260ce9092526040909220805491909216919083908110611b7157611b7161248c565b905f5260205f20015f6101000a8154816001600160a01b0302191690836001600160a01b03160217905550611ba9565b600101611ab1565b818103611bc957604051632df15a4160e11b815260040160405180910390fd5b6001600160a01b0384165f90815260ce60205260409020805480611bef57611bef61250b565b5f8281526020902081015f1990810180546001600160a01b031916905501905550505050565b5f5f8251604103611c49576020830151604084015160608501515f1a611c3d87828585611e16565b94509450505050611c50565b505f905060025b9250929050565b5f5f5f856001600160a01b0316631626ba7e60e01b8686604051602401611c7f92919061254d565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b0319909416939093179092529051611cbd9190612565565b5f60405180830381855afa9150503d805f8114611cf5576040519150601f19603f3d011682016040523d82523d5f602084013e611cfa565b606091505b5091509150818015611d0e57506020815110155b8015611a3557508051630b135d3f60e11b90611d3390830160209081019084016124cd565b149695505050505050565b5f611d92826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316611ed39092919063ffffffff16565b905080515f1480611db2575080806020019051810190611db2919061242e565b611e115760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016106c7565b505050565b5f807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0831115611e4b57505f90506003611eca565b604080515f8082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015611e9c573d5f5f3e3d5ffd5b5050604051601f1901519150506001600160a01b038116611ec4575f60019250925050611eca565b91505f90505b94509492505050565b6060611ee184845f85611ee9565b949350505050565b606082471015611f4a5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b60648201526084016106c7565b5f5f866001600160a01b03168587604051611f659190612565565b5f6040518083038185875af1925050503d805f8114611f9f576040519150601f19603f3d011682016040523d82523d5f602084013e611fa4565b606091505b5091509150610e86878383876060831561201e5782515f03612017576001600160a01b0385163b6120175760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016106c7565b5081611ee1565b611ee183838151156120335781518083602001fd5b8060405162461bcd60e51b81526004016106c7919061257b565b5f6020828403121561205d575f5ffd5b5035919050565b6001600160a01b03811681146109d0575f5ffd5b5f5f5f6060848603121561208a575f5ffd5b833561209581612064565b925060208401356120a581612064565b929592945050506040919091013590565b5f602082840312156120c6575f5ffd5b813561199481612064565b5f5f5f5f608085870312156120e4575f5ffd5b84356120ef81612064565b935060208501356120ff81612064565b9250604085013561210f81612064565b9396929550929360600135925050565b634e487b7160e01b5f52604160045260245ffd5b5f5f5f5f5f5f60c08789031215612148575f5ffd5b863561215381612064565b9550602087013561216381612064565b945060408701359350606087013561217a81612064565b92506080870135915060a087013567ffffffffffffffff81111561219c575f5ffd5b8701601f810189136121ac575f5ffd5b803567ffffffffffffffff8111156121c6576121c661211f565b604051601f8201601f19908116603f0116810167ffffffffffffffff811182821017156121f5576121f561211f565b6040528181528282016020018b101561220c575f5ffd5b816020840160208301375f602083830101528093505050509295509295509295565b5f6020828403121561223e575f5ffd5b813560ff81168114611994575f5ffd5b5f5f6020838503121561225f575f5ffd5b823567ffffffffffffffff811115612275575f5ffd5b8301601f81018513612285575f5ffd5b803567ffffffffffffffff81111561229b575f5ffd5b8560208260051b84010111156122af575f5ffd5b6020919091019590945092505050565b5f8151808452602084019350602083015f5b828110156122f85781516001600160a01b03168652602095860195909101906001016122d1565b5093949350505050565b604081525f61231460408301856122bf565b82810360208401528084518083526020830191506020860192505f5b8181101561234e578351835260209384019390920191600101612330565b50909695505050505050565b5f5f5f5f5f5f60c0878903121561236f575f5ffd5b863561237a81612064565b9550602087013561238a81612064565b9450604087013561239a81612064565b959894975094956060810135955060808101359460a0909101359350915050565b5f5f604083850312156123cc575f5ffd5b82356123d781612064565b946020939093013593505050565b602081525f61199460208301846122bf565b5f5f60408385031215612408575f5ffd5b823561241381612064565b9150602083013561242381612064565b809150509250929050565b5f6020828403121561243e575f5ffd5b81518015158114611994575f5ffd5b6001600160a01b039384168152919092166020820152604081019190915260600190565b5f60208284031215612481575f5ffd5b815161199481612064565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b808201808211156124c7576124c76124a0565b92915050565b5f602082840312156124dd575f5ffd5b5051919050565b818103818111156124c7576124c76124a0565b634e487b7160e01b5f52602160045260245ffd5b634e487b7160e01b5f52603160045260245ffd5b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b828152604060208201525f611ee1604083018461251f565b5f82518060208501845e5f920191825250919050565b602081525f611994602083018461251f56fea264697066735822122058c045c09833dc14476601e94e0351d0aa865f5a0b5783203f1cfa5fa48c7a6564736f6c634300081b0033", + Bin: "0x610100604052348015610010575f5ffd5b5060405161285338038061285383398101604081905261002f916101ed565b81816001600160a01b038116610058576040516339b190bb60e11b815260040160405180910390fd5b6001600160a01b039081166080521660a0524660c052610108604080518082018252600a81526922b4b3b2b72630bcb2b960b11b60209182015281517f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a866818301527f71b625cfad44bac63b13dba07f2e1d6084ee04b6f8752101ece6126d584ee6ea81840152466060820152306080808301919091528351808303909101815260a0909101909252815191012090565b60e05261011361011a565b5050610225565b5f54610100900460ff16156101855760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff908116146101d4575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b03811681146101ea575f5ffd5b50565b5f5f604083850312156101fe575f5ffd5b8251610209816101d6565b602084015190925061021a816101d6565b809150509250929050565b60805160a05160c05160e0516125c36102905f395f6112ce01525f61120e01525f81816104c501528181610762015281816109e001528181610c3f0152818161109301526116b101525f818161039a0152818161057101528181610a4a01526112f201526125c35ff3fe608060405234801561000f575f5ffd5b50600436106101fd575f3560e01c80638b8aac3c11610114578063de44acb6116100a9578063f2fde38b11610079578063f2fde38b146104fa578063f3b4a0001461050d578063f698da2514610517578063fabc1cbc1461051f578063fe243a1714610532575f5ffd5b8063de44acb61461048d578063debe1eab146104ad578063df5cf723146104c0578063e7a050aa146104e7575f5ffd5b80639ac01d61116100e45780639ac01d6114610441578063b5d8b5b814610454578063c665670214610467578063cbc2bd621461047a575f5ffd5b80638b8aac3c146103d45780638da5cb5b146103fc57806394f649dd1461040d578063967fc0d21461042e575f5ffd5b8063595c6a6711610195578063663c1de411610165578063663c1de414610339578063715018a61461035b578063724af423146103635780637ecebe0014610376578063886f119514610395575f5ffd5b8063595c6a67146102e35780635ac86ab7146102eb5780635c975abb1461031e5780635de08ff214610326575f5ffd5b806332e89ace116101d057806332e89ace1461026e57806348825e94146102815780634b6d5d6e146102a857806350ff7225146102bb575f5ffd5b8063136439dd146102015780631794bb3c146102165780631b3cbdc1146102295780632eae418c1461025b575b5f5ffd5b61021461020f36600461204d565b61055c565b005b610214610224366004612078565b610631565b6102486102373660046120b6565b60d46020525f908152604090205481565b6040519081526020015b60405180910390f35b6102146102693660046120d1565b610757565b61024861027c366004612133565b610803565b6102487f4337f82d142e41f2a8c10547cd8c859bddb92262a61058e77842e24d9dea922481565b6102146102b63660046120b6565b6108a7565b6102ce6102c9366004612078565b6109d3565b60408051928352602083019190915201610252565b610214610a35565b61030e6102f936600461222e565b609854600160ff9092169190911b9081161490565b6040519015158152602001610252565b609854610248565b61021461033436600461224e565b610ae4565b61030e6103473660046120b6565b60d16020525f908152604090205460ff1681565b610214610c23565b610214610371366004612078565b610c34565b6102486103843660046120b6565b60ca6020525f908152604090205481565b6103bc7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610252565b6102486103e23660046120b6565b6001600160a01b03165f90815260ce602052604090205490565b6033546001600160a01b03166103bc565b61042061041b3660046120b6565b610c88565b604051610252929190612302565b60cb546103bc906001600160a01b031681565b61024861044f36600461235a565b610e00565b61021461046236600461224e565b610e91565b6102146104753660046120b6565b610fd0565b6103bc6104883660046123bb565b610fe1565b6104a061049b3660046120b6565b611015565b60405161025291906123e5565b6102146104bb3660046123bb565b611088565b6103bc7f000000000000000000000000000000000000000000000000000000000000000081565b6102486104f5366004612078565b611143565b6102146105083660046120b6565b611195565b6103bc620e16e481565b61024861120b565b61021461052d36600461204d565b6112f0565b6102486105403660046123f7565b60cd60209081525f928352604080842090915290825290205481565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa1580156105be573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105e2919061242e565b6105ff57604051631d77d47760e21b815260040160405180910390fd5b60985481811681146106245760405163c61dca5d60e01b815260040160405180910390fd5b61062d82611406565b5050565b5f54610100900460ff161580801561064f57505f54600160ff909116105b806106685750303b15801561066857505f5460ff166001145b6106d05760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b5f805460ff1916600117905580156106f1575f805461ff0019166101001790555b6106fa82611406565b61070384611443565b61070c83611494565b8015610751575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146107a05760405163f739589b60e01b815260040160405180910390fd5b604051636ce5768960e11b81526001600160a01b0384169063d9caed12906107d09087908690869060040161244d565b5f604051808303815f87803b1580156107e7575f5ffd5b505af11580156107f9573d5f5f3e3d5ffd5b5050505050505050565b6098545f90819060019081160361082d5760405163840a48d560e01b815260040160405180910390fd5b6108356114fd565b6001600160a01b0385165f90815260ca60205260409020546108668661085f818c8c8c878c610e00565b8688611556565b6001600160a01b0386165f90815260ca6020526040902060018201905561088f868a8a8a6115a8565b92505061089c6001606555565b509695505050505050565b6108af6114fd565b6001600160a01b0381165f81815260d4602090815260408083208054939055805193845290830182905290917fd9d082c3ec4f3a3ffa55c324939a06407f5fbcb87d5e0ce3b9508c92c84ed839910160405180910390a1816001600160a01b031663d9caed12620e16e4846001600160a01b0316632495a5996040518163ffffffff1660e01b8152600401602060405180830381865afa158015610955573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109799190612471565b846040518463ffffffff1660e01b81526004016109989392919061244d565b5f604051808303815f87803b1580156109af575f5ffd5b505af11580156109c1573d5f5f3e3d5ffd5b50505050506109d06001606555565b50565b5f80336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610a1e5760405163f739589b60e01b815260040160405180910390fd5b610a29858585611715565b91509150935093915050565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa158015610a97573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610abb919061242e565b610ad857604051631d77d47760e21b815260040160405180910390fd5b610ae25f19611406565b565b60cb546001600160a01b03163314610b0f576040516320ba3ff960e21b815260040160405180910390fd5b805f5b818110156107515760d15f858584818110610b2f57610b2f61248c565b9050602002016020810190610b4491906120b6565b6001600160a01b0316815260208101919091526040015f205460ff16610c1b57600160d15f868685818110610b7b57610b7b61248c565b9050602002016020810190610b9091906120b6565b6001600160a01b0316815260208101919091526040015f20805460ff19169115159190911790557f0c35b17d91c96eb2751cd456e1252f42a386e524ef9ff26ecc9950859fdc04fe848483818110610bea57610bea61248c565b9050602002016020810190610bff91906120b6565b6040516001600160a01b03909116815260200160405180910390a15b600101610b12565b610c2b61187d565b610ae25f611443565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610c7d5760405163f739589b60e01b815260040160405180910390fd5b6107518383836118d7565b6001600160a01b0381165f90815260ce60205260408120546060918291908167ffffffffffffffff811115610cbf57610cbf61211f565b604051908082528060200260200182016040528015610ce8578160200160208202803683370190505b5090505f5b82811015610d76576001600160a01b0386165f90815260cd6020908152604080832060ce9092528220805491929184908110610d2b57610d2b61248c565b5f9182526020808320909101546001600160a01b031683528201929092526040019020548251839083908110610d6357610d6361248c565b6020908102919091010152600101610ced565b5060ce5f866001600160a01b03166001600160a01b031681526020019081526020015f208181805480602002602001604051908101604052809291908181526020018280548015610dee57602002820191905f5260205f20905b81546001600160a01b03168152600190910190602001808311610dd0575b50505050509150935093505050915091565b604080517f4337f82d142e41f2a8c10547cd8c859bddb92262a61058e77842e24d9dea922460208201526001600160a01b03808916928201929092528187166060820152908516608082015260a0810184905260c0810183905260e081018290525f90610e8690610100016040516020818303038152906040528051906020012061199b565b979650505050505050565b60cb546001600160a01b03163314610ebc576040516320ba3ff960e21b815260040160405180910390fd5b805f5b818110156107515760d15f858584818110610edc57610edc61248c565b9050602002016020810190610ef191906120b6565b6001600160a01b0316815260208101919091526040015f205460ff1615610fc8575f60d15f868685818110610f2857610f2861248c565b9050602002016020810190610f3d91906120b6565b6001600160a01b0316815260208101919091526040015f20805460ff19169115159190911790557f4074413b4b443e4e58019f2855a8765113358c7c72e39509c6af45fc0f5ba030848483818110610f9757610f9761248c565b9050602002016020810190610fac91906120b6565b6040516001600160a01b03909116815260200160405180910390a15b600101610ebf565b610fd861187d565b6109d081611494565b60ce602052815f5260405f208181548110610ffa575f80fd5b5f918252602090912001546001600160a01b03169150829050565b6001600160a01b0381165f90815260ce602090815260409182902080548351818402810184019094528084526060939283018282801561107c57602002820191905f5260205f20905b81546001600160a01b0316815260019091019060200180831161105e575b50505050509050919050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146110d15760405163f739589b60e01b815260040160405180910390fd5b6001600160a01b0382165f90815260d46020526040812080548392906110f89084906124b4565b9091555050604080516001600160a01b0384168152602081018390527fca3e02a4ab7ad3c47a8e36e5a624c30170791726ab720f1babfef21046d953ff910160405180910390a15050565b6098545f90819060019081160361116d5760405163840a48d560e01b815260040160405180910390fd5b6111756114fd565b611181338686866115a8565b915061118d6001606555565b509392505050565b61119d61187d565b6001600160a01b0381166112025760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016106c7565b6109d081611443565b5f7f000000000000000000000000000000000000000000000000000000000000000046146112cb5750604080518082018252600a81526922b4b3b2b72630bcb2b960b11b60209182015281517f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a866818301527f71b625cfad44bac63b13dba07f2e1d6084ee04b6f8752101ece6126d584ee6ea81840152466060820152306080808301919091528351808303909101815260a0909101909252815191012090565b507f000000000000000000000000000000000000000000000000000000000000000090565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561134c573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113709190612471565b6001600160a01b0316336001600160a01b0316146113a15760405163794821ff60e01b815260040160405180910390fd5b609854801982198116146113c85760405163c61dca5d60e01b815260040160405180910390fd5b609882905560405182815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c9060200160405180910390a25050565b609881905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a250565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b60cb54604080516001600160a01b03928316815291831660208301527f4264275e593955ff9d6146a51a4525f6ddace2e81db9391abcc9d1ca48047d29910160405180910390a160cb80546001600160a01b0319166001600160a01b0392909216919091179055565b60026065540361154f5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016106c7565b6002606555565b4281101561157757604051630819bdcd60e01b815260040160405180910390fd5b61158b6001600160a01b03851684846119e1565b61075157604051638baa579f60e01b815260040160405180910390fd5b6001600160a01b0383165f90815260d16020526040812054849060ff166115e257604051632efd965160e11b815260040160405180910390fd5b6115f76001600160a01b038516338786611a3f565b6040516311f9fbc960e21b81526001600160a01b038581166004830152602482018590528616906347e7ef24906044016020604051808303815f875af1158015611643573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061166791906124cd565b91505f5f611676888886611715565b604051631e328e7960e11b81526001600160a01b038b811660048301528a8116602483015260448201849052606482018390529294509092507f000000000000000000000000000000000000000000000000000000000000000090911690633c651cf2906084015f604051808303815f87803b1580156116f4575f5ffd5b505af1158015611706573d5f5f3e3d5ffd5b50505050505050949350505050565b5f806001600160a01b03851661173e576040516316f2ccc960e01b815260040160405180910390fd5b825f0361175e576040516342061b2560e11b815260040160405180910390fd5b6001600160a01b038086165f90815260cd6020908152604080832093881683529290529081205490819003611804576001600160a01b0386165f90815260ce6020908152604090912054106117c6576040516301a1443960e31b815260040160405180910390fd5b6001600160a01b038681165f90815260ce602090815260408220805460018101825590835291200180546001600160a01b0319169187169190911790555b61180e84826124b4565b6001600160a01b038088165f90815260cd60209081526040808320938a16835292905281902091909155517f5548c837ab068cf56a2c2479df0882a4922fd203edb7517321831d95078c5f629061186a9088908890889061244d565b60405180910390a1959294509192505050565b6033546001600160a01b03163314610ae25760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016106c7565b5f815f036118f8576040516342061b2560e11b815260040160405180910390fd5b6001600160a01b038085165f90815260cd60209081526040808320938716835292905220548083111561193e57604051634b18b19360e01b815260040160405180910390fd5b61194883826124e4565b6001600160a01b038087165f90815260cd60209081526040808320938916835292905290812082905590915081900361198f576119858585611a97565b6001915050611994565b5f9150505b9392505050565b5f6119a461120b565b60405161190160f01b6020820152602281019190915260428101839052606201604051602081830303815290604052805190602001209050919050565b5f5f5f6119ee8585611c15565b90925090505f816004811115611a0657611a066124f7565b148015611a245750856001600160a01b0316826001600160a01b0316145b80611a355750611a35868686611c57565b9695505050505050565b610751846323b872dd60e01b858585604051602401611a609392919061244d565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152611d3e565b6001600160a01b0382165f90815260ce6020526040812054905b81811015611ba9576001600160a01b038481165f90815260ce6020526040902080549185169183908110611ae757611ae761248c565b5f918252602090912001546001600160a01b031603611ba1576001600160a01b0384165f90815260ce602052604090208054611b25906001906124e4565b81548110611b3557611b3561248c565b5f9182526020808320909101546001600160a01b03878116845260ce9092526040909220805491909216919083908110611b7157611b7161248c565b905f5260205f20015f6101000a8154816001600160a01b0302191690836001600160a01b03160217905550611ba9565b600101611ab1565b818103611bc957604051632df15a4160e11b815260040160405180910390fd5b6001600160a01b0384165f90815260ce60205260409020805480611bef57611bef61250b565b5f8281526020902081015f1990810180546001600160a01b031916905501905550505050565b5f5f8251604103611c49576020830151604084015160608501515f1a611c3d87828585611e16565b94509450505050611c50565b505f905060025b9250929050565b5f5f5f856001600160a01b0316631626ba7e60e01b8686604051602401611c7f92919061254d565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b0319909416939093179092529051611cbd9190612565565b5f60405180830381855afa9150503d805f8114611cf5576040519150601f19603f3d011682016040523d82523d5f602084013e611cfa565b606091505b5091509150818015611d0e57506020815110155b8015611a3557508051630b135d3f60e11b90611d3390830160209081019084016124cd565b149695505050505050565b5f611d92826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316611ed39092919063ffffffff16565b905080515f1480611db2575080806020019051810190611db2919061242e565b611e115760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016106c7565b505050565b5f807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0831115611e4b57505f90506003611eca565b604080515f8082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015611e9c573d5f5f3e3d5ffd5b5050604051601f1901519150506001600160a01b038116611ec4575f60019250925050611eca565b91505f90505b94509492505050565b6060611ee184845f85611ee9565b949350505050565b606082471015611f4a5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b60648201526084016106c7565b5f5f866001600160a01b03168587604051611f659190612565565b5f6040518083038185875af1925050503d805f8114611f9f576040519150601f19603f3d011682016040523d82523d5f602084013e611fa4565b606091505b5091509150610e86878383876060831561201e5782515f03612017576001600160a01b0385163b6120175760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016106c7565b5081611ee1565b611ee183838151156120335781518083602001fd5b8060405162461bcd60e51b81526004016106c7919061257b565b5f6020828403121561205d575f5ffd5b5035919050565b6001600160a01b03811681146109d0575f5ffd5b5f5f5f6060848603121561208a575f5ffd5b833561209581612064565b925060208401356120a581612064565b929592945050506040919091013590565b5f602082840312156120c6575f5ffd5b813561199481612064565b5f5f5f5f608085870312156120e4575f5ffd5b84356120ef81612064565b935060208501356120ff81612064565b9250604085013561210f81612064565b9396929550929360600135925050565b634e487b7160e01b5f52604160045260245ffd5b5f5f5f5f5f5f60c08789031215612148575f5ffd5b863561215381612064565b9550602087013561216381612064565b945060408701359350606087013561217a81612064565b92506080870135915060a087013567ffffffffffffffff81111561219c575f5ffd5b8701601f810189136121ac575f5ffd5b803567ffffffffffffffff8111156121c6576121c661211f565b604051601f8201601f19908116603f0116810167ffffffffffffffff811182821017156121f5576121f561211f565b6040528181528282016020018b101561220c575f5ffd5b816020840160208301375f602083830101528093505050509295509295509295565b5f6020828403121561223e575f5ffd5b813560ff81168114611994575f5ffd5b5f5f6020838503121561225f575f5ffd5b823567ffffffffffffffff811115612275575f5ffd5b8301601f81018513612285575f5ffd5b803567ffffffffffffffff81111561229b575f5ffd5b8560208260051b84010111156122af575f5ffd5b6020919091019590945092505050565b5f8151808452602084019350602083015f5b828110156122f85781516001600160a01b03168652602095860195909101906001016122d1565b5093949350505050565b604081525f61231460408301856122bf565b82810360208401528084518083526020830191506020860192505f5b8181101561234e578351835260209384019390920191600101612330565b50909695505050505050565b5f5f5f5f5f5f60c0878903121561236f575f5ffd5b863561237a81612064565b9550602087013561238a81612064565b9450604087013561239a81612064565b959894975094956060810135955060808101359460a0909101359350915050565b5f5f604083850312156123cc575f5ffd5b82356123d781612064565b946020939093013593505050565b602081525f61199460208301846122bf565b5f5f60408385031215612408575f5ffd5b823561241381612064565b9150602083013561242381612064565b809150509250929050565b5f6020828403121561243e575f5ffd5b81518015158114611994575f5ffd5b6001600160a01b039384168152919092166020820152604081019190915260600190565b5f60208284031215612481575f5ffd5b815161199481612064565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b808201808211156124c7576124c76124a0565b92915050565b5f602082840312156124dd575f5ffd5b5051919050565b818103818111156124c7576124c76124a0565b634e487b7160e01b5f52602160045260245ffd5b634e487b7160e01b5f52603160045260245ffd5b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b828152604060208201525f611ee1604083018461251f565b5f82518060208501845e5f920191825250919050565b602081525f611994602083018461251f56fea26469706673582212204d8dc99318e4c22525994dff986dab3f95823a44c04e5ce2b2f7fd1c8dc4c47a64736f6c634300081b0033", } // StrategyManagerABI is the input ABI used to generate the binding from. diff --git a/src/contracts/libraries/SlashingLib.sol b/src/contracts/libraries/SlashingLib.sol index b6ce24151c..7063a6d3e5 100644 --- a/src/contracts/libraries/SlashingLib.sol +++ b/src/contracts/libraries/SlashingLib.sol @@ -55,13 +55,6 @@ library SlashingLib { return x.mulDiv(y, WAD, Math.Rounding.Up); } - /** - * @notice Used as part of calculating wadSlashed in the EPM to ensure that we don't overslash - */ - function divWadRoundUp(uint256 x, uint256 y) internal pure returns (uint256) { - return x.mulDiv(WAD, y, Math.Rounding.Up); - } - // GETTERS function scalingFactor( From ca571793700897e8e48262d13f2e880443e00acc Mon Sep 17 00:00:00 2001 From: eigenmikem Date: Tue, 21 Jan 2025 15:49:09 -0500 Subject: [PATCH 11/35] feat: changing burnableShares to EnumerableMap (#1028) * feat: changing burnableShares to EnumerableMap * style: linter * docs: storage docs * style: natspec and import * style: lint * feat: adding view function for cronjob and moving functions * fix: updating storage gap * docs: storage slots comment * feat: new bindings * docs: updating StrategyManager doc * docs: bindings --------- Co-authored-by: Michael --- docs/core/StrategyManager.md | 3 +- pkg/bindings/AVSDirectory/binding.go | 2 +- pkg/bindings/AllocationManager/binding.go | 2 +- pkg/bindings/BackingEigen/binding.go | 2 +- pkg/bindings/BeaconChainProofs/binding.go | 2 +- pkg/bindings/BytesLib/binding.go | 2 +- pkg/bindings/DelegationManager/binding.go | 2 +- pkg/bindings/Eigen/binding.go | 2 +- pkg/bindings/EigenPod/binding.go | 2 +- pkg/bindings/EigenPodManager/binding.go | 2 +- pkg/bindings/EigenStrategy/binding.go | 2 +- pkg/bindings/Endian/binding.go | 2 +- pkg/bindings/IStrategyManager/binding.go | 65 +++++++++++- pkg/bindings/Merkle/binding.go | 2 +- pkg/bindings/OperatorSetLib/binding.go | 2 +- pkg/bindings/PauserRegistry/binding.go | 2 +- pkg/bindings/PermissionController/binding.go | 2 +- pkg/bindings/RewardsCoordinator/binding.go | 4 + pkg/bindings/SlashingLib/binding.go | 2 +- pkg/bindings/Snapshots/binding.go | 2 +- pkg/bindings/StrategyBase/binding.go | 2 +- pkg/bindings/StrategyBaseTVLLimits/binding.go | 2 +- pkg/bindings/StrategyFactory/binding.go | 2 +- pkg/bindings/StrategyManager/binding.go | 98 ++++++++++++------- .../StrategyManagerStorage/binding.go | 96 ++++++++++++------ src/contracts/core/StrategyManager.sol | 31 +++++- src/contracts/core/StrategyManagerStorage.sol | 8 +- src/contracts/interfaces/IStrategyManager.sol | 15 +++ src/test/unit/StrategyManagerUnit.t.sol | 87 +++++++++++++++- 29 files changed, 349 insertions(+), 98 deletions(-) diff --git a/docs/core/StrategyManager.md b/docs/core/StrategyManager.md index 5e10461e3a..ddb817dbd5 100644 --- a/docs/core/StrategyManager.md +++ b/docs/core/StrategyManager.md @@ -250,7 +250,7 @@ This method directs the `strategy` to convert the input deposit shares to tokens ## Burning Slashed Shares -The following methods handle burning of slashed shares: +Slashed shares are marked as burnable, and anyone can call `burnShares` to transfer them to the default burn address. Burnable shares are stored in `burnableShares`, an [EnumerableMap](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.9.0/contracts/utils/structs/EnumerableMap.sol) with strategy contract addresses as keys and associated view functions. The following methods handle burning of slashed shares: * [`StrategyManager.increaseBurnableShares`](#increaseburnableshares) * [`StrategyManager.burnShares`](#burnshares) @@ -294,7 +294,6 @@ function burnShares( IStrategy strategy ) external - onlyDelegationManager ``` Anyone can call this method to burn slashed shares previously added by the `DelegationManager` via `increaseBurnableShares`. This method resets the strategy's burnable shares to 0, and directs the corresponding `strategy` to convert the shares to tokens and transfer them to `DEFAULT_BURN_ADDRESS`, rendering them unrecoverable. diff --git a/pkg/bindings/AVSDirectory/binding.go b/pkg/bindings/AVSDirectory/binding.go index a37af907a5..3b4a092575 100644 --- a/pkg/bindings/AVSDirectory/binding.go +++ b/pkg/bindings/AVSDirectory/binding.go @@ -39,7 +39,7 @@ type ISignatureUtilsSignatureWithSaltAndExpiry struct { // AVSDirectoryMetaData contains all meta data concerning the AVSDirectory contract. var AVSDirectoryMetaData = &bind.MetaData{ ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"_delegation\",\"type\":\"address\",\"internalType\":\"contractIDelegationManager\"},{\"name\":\"_pauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"OPERATOR_AVS_REGISTRATION_TYPEHASH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"OPERATOR_SET_FORCE_DEREGISTRATION_TYPEHASH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"OPERATOR_SET_REGISTRATION_TYPEHASH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"avsOperatorStatus\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"enumIAVSDirectoryTypes.OperatorAVSRegistrationStatus\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"calculateOperatorAVSRegistrationDigestHash\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"cancelSalt\",\"inputs\":[{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"delegation\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIDelegationManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"deregisterOperatorFromAVS\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"domainSeparator\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"initialOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"initialPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"operatorSaltIsSpent\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"isSpent\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"pauseAll\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[{\"name\":\"index\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pauserRegistry\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"registerOperatorToAVS\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSignature\",\"type\":\"tuple\",\"internalType\":\"structISignatureUtils.SignatureWithSaltAndExpiry\",\"components\":[{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"updateAVSMetadataURI\",\"inputs\":[{\"name\":\"metadataURI\",\"type\":\"string\",\"internalType\":\"string\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"AVSMetadataURIUpdated\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"metadataURI\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorAVSRegistrationStatusUpdated\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"avs\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"status\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"enumIAVSDirectoryTypes.OperatorAVSRegistrationStatus\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"CurrentlyPaused\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InputAddressZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidNewPausedStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidSignature\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyPauser\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyUnpauser\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OperatorAlreadyRegisteredToAVS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OperatorNotRegisteredToAVS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OperatorNotRegisteredToEigenLayer\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SaltSpent\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SignatureExpired\",\"inputs\":[]}]", - Bin: "0x610100604052348015610010575f5ffd5b5060405161170438038061170483398101604081905261002f916101ed565b81816001600160a01b038116610058576040516339b190bb60e11b815260040160405180910390fd5b6001600160a01b039081166080521660a0524660c052610108604080518082018252600a81526922b4b3b2b72630bcb2b960b11b60209182015281517f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a866818301527f71b625cfad44bac63b13dba07f2e1d6084ee04b6f8752101ece6126d584ee6ea81840152466060820152306080808301919091528351808303909101815260a0909101909252815191012090565b60e05261011361011a565b5050610225565b5f54610100900460ff16156101855760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff908116146101d4575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b03811681146101ea575f5ffd5b50565b5f5f604083850312156101fe575f5ffd5b8251610209816101d6565b602084015190925061021a816101d6565b809150509250929050565b60805160a05160c05160e0516114906102745f395f610b7a01525f610aba01525f8181610340015261063d01525f818161021c015281816103d8015281816104ad0152610b9e01526114905ff3fe608060405234801561000f575f5ffd5b506004361061013d575f3560e01c8063a364f4da116100b4578063dce974b911610079578063dce974b914610314578063df5cf7231461033b578063ec76f44214610362578063f2fde38b14610395578063f698da25146103a8578063fabc1cbc146103b0575f5ffd5b8063a364f4da1461028d578063a98fb355146102a0578063c825fe68146102b3578063cd6dc687146102da578063d79aceab146102ed575f5ffd5b80635c975abb116101055780635c975abb146101fd578063715018a61461020f578063886f1195146102175780638da5cb5b146102565780639926ee7d14610267578063a1060c881461027a575f5ffd5b8063136439dd14610141578063374823b51461015657806349075da314610198578063595c6a67146101d25780635ac86ab7146101da575b5f5ffd5b61015461014f366004611075565b6103c3565b005b6101836101643660046110a0565b609960209081525f928352604080842090915290825290205460ff1681565b60405190151581526020015b60405180910390f35b6101c56101a63660046110ca565b609860209081525f928352604080842090915290825290205460ff1681565b60405161018f9190611115565b610154610498565b6101836101e836600461113b565b606654600160ff9092169190911b9081161490565b6066545b60405190815260200161018f565b610154610547565b61023e7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200161018f565b6033546001600160a01b031661023e565b6101546102753660046111d0565b610558565b6102016102883660046112bd565b610777565b61015461029b366004611300565b6107f6565b6101546102ae36600461131b565b6108db565b6102017f809c5ac049c45b7a7f050a20f00c16cf63797efbf8b1eb8d749fdfa39ff8f92981565b6101546102e83660046110a0565b610922565b6102017fda2c89bafdd34776a2b8bb9c83c82f419e20cc8c67207f70edd58249b92661bd81565b6102017f4ee65f64218c67b68da66fd0db16560040a6b973290b9e71912d661ee53fe49581565b61023e7f000000000000000000000000000000000000000000000000000000000000000081565b610154610370366004611075565b335f90815260996020908152604080832093835292905220805460ff19166001179055565b6101546103a3366004611300565b610a3e565b610201610ab7565b6101546103be366004611075565b610b9c565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa158015610425573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104499190611389565b61046657604051631d77d47760e21b815260040160405180910390fd5b606654818116811461048b5760405163c61dca5d60e01b815260040160405180910390fd5b61049482610cab565b5050565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa1580156104fa573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061051e9190611389565b61053b57604051631d77d47760e21b815260040160405180910390fd5b6105455f19610cab565b565b61054f610ce8565b6105455f610d42565b6066545f906001908116036105805760405163840a48d560e01b815260040160405180910390fd5b6001335f9081526098602090815260408083206001600160a01b038816845290915290205460ff1660018111156105b9576105b9611101565b036105d757604051631aa528bb60e11b815260040160405180910390fd5b6001600160a01b0383165f90815260996020908152604080832085830151845290915290205460ff161561061e57604051630d4c4c9160e21b815260040160405180910390fd5b6040516336b87bd760e11b81526001600160a01b0384811660048301527f00000000000000000000000000000000000000000000000000000000000000001690636d70f7ae90602401602060405180830381865afa158015610682573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106a69190611389565b6106c357604051639f88c8af60e01b815260040160405180910390fd5b6106e7836106db853386602001518760400151610777565b84516040860151610d93565b6001600160a01b0383165f81815260996020908152604080832086830151845282528083208054600160ff19918216811790925533808652609885528386208787529094529382902080549094168117909355519092917ff0952b1c65271d819d39983d2abb044b9cace59bcc4d4dd389f586ebdcb15b419161076a9190611115565b60405180910390a3505050565b604080517fda2c89bafdd34776a2b8bb9c83c82f419e20cc8c67207f70edd58249b92661bd60208201526001600160a01b038087169282019290925290841660608201526080810183905260a081018290525f906107ed9060c00160405160208183030381529060405280519060200120610deb565b95945050505050565b6066545f9060019081160361081e5760405163840a48d560e01b815260040160405180910390fd5b6001335f9081526098602090815260408083206001600160a01b038716845290915290205460ff16600181111561085757610857611101565b14610875576040516352df45c960e01b815260040160405180910390fd5b335f8181526098602090815260408083206001600160a01b0387168085529252808320805460ff191690555190917ff0952b1c65271d819d39983d2abb044b9cace59bcc4d4dd389f586ebdcb15b41916108cf9190611115565b60405180910390a35050565b336001600160a01b03167fa89c1dc243d8908a96dd84944bcc97d6bc6ac00dd78e20621576be6a3c94371383836040516109169291906113a8565b60405180910390a25050565b5f54610100900460ff161580801561094057505f54600160ff909116105b806109595750303b15801561095957505f5460ff166001145b6109c15760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b5f805460ff1916600117905580156109e2575f805461ff0019166101001790555b6109eb82610cab565b6109f483610d42565b8015610a39575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050565b610a46610ce8565b6001600160a01b038116610aab5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016109b8565b610ab481610d42565b50565b5f7f00000000000000000000000000000000000000000000000000000000000000004614610b775750604080518082018252600a81526922b4b3b2b72630bcb2b960b11b60209182015281517f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a866818301527f71b625cfad44bac63b13dba07f2e1d6084ee04b6f8752101ece6126d584ee6ea81840152466060820152306080808301919091528351808303909101815260a0909101909252815191012090565b507f000000000000000000000000000000000000000000000000000000000000000090565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610bf8573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c1c91906113d6565b6001600160a01b0316336001600160a01b031614610c4d5760405163794821ff60e01b815260040160405180910390fd5b60665480198219811614610c745760405163c61dca5d60e01b815260040160405180910390fd5b606682905560405182815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c90602001610916565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a250565b6033546001600160a01b031633146105455760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016109b8565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b42811015610db457604051630819bdcd60e01b815260040160405180910390fd5b610dc86001600160a01b0385168484610e31565b610de557604051638baa579f60e01b815260040160405180910390fd5b50505050565b5f610df4610ab7565b60405161190160f01b6020820152602281019190915260428101839052606201604051602081830303815290604052805190602001209050919050565b5f5f5f610e3e8585610e8f565b90925090505f816004811115610e5657610e56611101565b148015610e745750856001600160a01b0316826001600160a01b0316145b80610e855750610e85868686610ed1565b9695505050505050565b5f5f8251604103610ec3576020830151604084015160608501515f1a610eb787828585610fb8565b94509450505050610eca565b505f905060025b9250929050565b5f5f5f856001600160a01b0316631626ba7e60e01b8686604051602401610ef99291906113f1565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b0319909416939093179092529051610f37919061142d565b5f60405180830381855afa9150503d805f8114610f6f576040519150601f19603f3d011682016040523d82523d5f602084013e610f74565b606091505b5091509150818015610f8857506020815110155b8015610e8557508051630b135d3f60e11b90610fad9083016020908101908401611443565b149695505050505050565b5f807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0831115610fed57505f9050600361106c565b604080515f8082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa15801561103e573d5f5f3e3d5ffd5b5050604051601f1901519150506001600160a01b038116611066575f6001925092505061106c565b91505f90505b94509492505050565b5f60208284031215611085575f5ffd5b5035919050565b6001600160a01b0381168114610ab4575f5ffd5b5f5f604083850312156110b1575f5ffd5b82356110bc8161108c565b946020939093013593505050565b5f5f604083850312156110db575f5ffd5b82356110e68161108c565b915060208301356110f68161108c565b809150509250929050565b634e487b7160e01b5f52602160045260245ffd5b602081016002831061113557634e487b7160e01b5f52602160045260245ffd5b91905290565b5f6020828403121561114b575f5ffd5b813560ff8116811461115b575f5ffd5b9392505050565b634e487b7160e01b5f52604160045260245ffd5b6040516060810167ffffffffffffffff8111828210171561119957611199611162565b60405290565b604051601f8201601f1916810167ffffffffffffffff811182821017156111c8576111c8611162565b604052919050565b5f5f604083850312156111e1575f5ffd5b82356111ec8161108c565b9150602083013567ffffffffffffffff811115611207575f5ffd5b830160608186031215611218575f5ffd5b611220611176565b813567ffffffffffffffff811115611236575f5ffd5b8201601f81018713611246575f5ffd5b803567ffffffffffffffff81111561126057611260611162565b611273601f8201601f191660200161119f565b818152886020838501011115611287575f5ffd5b816020840160208301375f6020928201830152835283810135908301525060409182013591810191909152919491935090915050565b5f5f5f5f608085870312156112d0575f5ffd5b84356112db8161108c565b935060208501356112eb8161108c565b93969395505050506040820135916060013590565b5f60208284031215611310575f5ffd5b813561115b8161108c565b5f5f6020838503121561132c575f5ffd5b823567ffffffffffffffff811115611342575f5ffd5b8301601f81018513611352575f5ffd5b803567ffffffffffffffff811115611368575f5ffd5b856020828401011115611379575f5ffd5b6020919091019590945092505050565b5f60208284031215611399575f5ffd5b8151801515811461115b575f5ffd5b60208152816020820152818360408301375f818301604090810191909152601f909201601f19160101919050565b5f602082840312156113e6575f5ffd5b815161115b8161108c565b828152604060208201525f82518060408401528060208501606085015e5f606082850101526060601f19601f8301168401019150509392505050565b5f82518060208501845e5f920191825250919050565b5f60208284031215611453575f5ffd5b505191905056fea2646970667358221220dac23420e90e0bd5ba6e8cdf6633661ff54956fb8326b8a2b164dca48bbf756964736f6c634300081b0033", + Bin: "0x610100604052348015610010575f5ffd5b5060405161170438038061170483398101604081905261002f916101ed565b81816001600160a01b038116610058576040516339b190bb60e11b815260040160405180910390fd5b6001600160a01b039081166080521660a0524660c052610108604080518082018252600a81526922b4b3b2b72630bcb2b960b11b60209182015281517f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a866818301527f71b625cfad44bac63b13dba07f2e1d6084ee04b6f8752101ece6126d584ee6ea81840152466060820152306080808301919091528351808303909101815260a0909101909252815191012090565b60e05261011361011a565b5050610225565b5f54610100900460ff16156101855760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff908116146101d4575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b03811681146101ea575f5ffd5b50565b5f5f604083850312156101fe575f5ffd5b8251610209816101d6565b602084015190925061021a816101d6565b809150509250929050565b60805160a05160c05160e0516114906102745f395f610b7a01525f610aba01525f8181610340015261063d01525f818161021c015281816103d8015281816104ad0152610b9e01526114905ff3fe608060405234801561000f575f5ffd5b506004361061013d575f3560e01c8063a364f4da116100b4578063dce974b911610079578063dce974b914610314578063df5cf7231461033b578063ec76f44214610362578063f2fde38b14610395578063f698da25146103a8578063fabc1cbc146103b0575f5ffd5b8063a364f4da1461028d578063a98fb355146102a0578063c825fe68146102b3578063cd6dc687146102da578063d79aceab146102ed575f5ffd5b80635c975abb116101055780635c975abb146101fd578063715018a61461020f578063886f1195146102175780638da5cb5b146102565780639926ee7d14610267578063a1060c881461027a575f5ffd5b8063136439dd14610141578063374823b51461015657806349075da314610198578063595c6a67146101d25780635ac86ab7146101da575b5f5ffd5b61015461014f366004611075565b6103c3565b005b6101836101643660046110a0565b609960209081525f928352604080842090915290825290205460ff1681565b60405190151581526020015b60405180910390f35b6101c56101a63660046110ca565b609860209081525f928352604080842090915290825290205460ff1681565b60405161018f9190611115565b610154610498565b6101836101e836600461113b565b606654600160ff9092169190911b9081161490565b6066545b60405190815260200161018f565b610154610547565b61023e7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200161018f565b6033546001600160a01b031661023e565b6101546102753660046111d0565b610558565b6102016102883660046112bd565b610777565b61015461029b366004611300565b6107f6565b6101546102ae36600461131b565b6108db565b6102017f809c5ac049c45b7a7f050a20f00c16cf63797efbf8b1eb8d749fdfa39ff8f92981565b6101546102e83660046110a0565b610922565b6102017fda2c89bafdd34776a2b8bb9c83c82f419e20cc8c67207f70edd58249b92661bd81565b6102017f4ee65f64218c67b68da66fd0db16560040a6b973290b9e71912d661ee53fe49581565b61023e7f000000000000000000000000000000000000000000000000000000000000000081565b610154610370366004611075565b335f90815260996020908152604080832093835292905220805460ff19166001179055565b6101546103a3366004611300565b610a3e565b610201610ab7565b6101546103be366004611075565b610b9c565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa158015610425573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104499190611389565b61046657604051631d77d47760e21b815260040160405180910390fd5b606654818116811461048b5760405163c61dca5d60e01b815260040160405180910390fd5b61049482610cab565b5050565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa1580156104fa573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061051e9190611389565b61053b57604051631d77d47760e21b815260040160405180910390fd5b6105455f19610cab565b565b61054f610ce8565b6105455f610d42565b6066545f906001908116036105805760405163840a48d560e01b815260040160405180910390fd5b6001335f9081526098602090815260408083206001600160a01b038816845290915290205460ff1660018111156105b9576105b9611101565b036105d757604051631aa528bb60e11b815260040160405180910390fd5b6001600160a01b0383165f90815260996020908152604080832085830151845290915290205460ff161561061e57604051630d4c4c9160e21b815260040160405180910390fd5b6040516336b87bd760e11b81526001600160a01b0384811660048301527f00000000000000000000000000000000000000000000000000000000000000001690636d70f7ae90602401602060405180830381865afa158015610682573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106a69190611389565b6106c357604051639f88c8af60e01b815260040160405180910390fd5b6106e7836106db853386602001518760400151610777565b84516040860151610d93565b6001600160a01b0383165f81815260996020908152604080832086830151845282528083208054600160ff19918216811790925533808652609885528386208787529094529382902080549094168117909355519092917ff0952b1c65271d819d39983d2abb044b9cace59bcc4d4dd389f586ebdcb15b419161076a9190611115565b60405180910390a3505050565b604080517fda2c89bafdd34776a2b8bb9c83c82f419e20cc8c67207f70edd58249b92661bd60208201526001600160a01b038087169282019290925290841660608201526080810183905260a081018290525f906107ed9060c00160405160208183030381529060405280519060200120610deb565b95945050505050565b6066545f9060019081160361081e5760405163840a48d560e01b815260040160405180910390fd5b6001335f9081526098602090815260408083206001600160a01b038716845290915290205460ff16600181111561085757610857611101565b14610875576040516352df45c960e01b815260040160405180910390fd5b335f8181526098602090815260408083206001600160a01b0387168085529252808320805460ff191690555190917ff0952b1c65271d819d39983d2abb044b9cace59bcc4d4dd389f586ebdcb15b41916108cf9190611115565b60405180910390a35050565b336001600160a01b03167fa89c1dc243d8908a96dd84944bcc97d6bc6ac00dd78e20621576be6a3c94371383836040516109169291906113a8565b60405180910390a25050565b5f54610100900460ff161580801561094057505f54600160ff909116105b806109595750303b15801561095957505f5460ff166001145b6109c15760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b5f805460ff1916600117905580156109e2575f805461ff0019166101001790555b6109eb82610cab565b6109f483610d42565b8015610a39575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050565b610a46610ce8565b6001600160a01b038116610aab5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016109b8565b610ab481610d42565b50565b5f7f00000000000000000000000000000000000000000000000000000000000000004614610b775750604080518082018252600a81526922b4b3b2b72630bcb2b960b11b60209182015281517f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a866818301527f71b625cfad44bac63b13dba07f2e1d6084ee04b6f8752101ece6126d584ee6ea81840152466060820152306080808301919091528351808303909101815260a0909101909252815191012090565b507f000000000000000000000000000000000000000000000000000000000000000090565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610bf8573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c1c91906113d6565b6001600160a01b0316336001600160a01b031614610c4d5760405163794821ff60e01b815260040160405180910390fd5b60665480198219811614610c745760405163c61dca5d60e01b815260040160405180910390fd5b606682905560405182815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c90602001610916565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a250565b6033546001600160a01b031633146105455760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016109b8565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b42811015610db457604051630819bdcd60e01b815260040160405180910390fd5b610dc86001600160a01b0385168484610e31565b610de557604051638baa579f60e01b815260040160405180910390fd5b50505050565b5f610df4610ab7565b60405161190160f01b6020820152602281019190915260428101839052606201604051602081830303815290604052805190602001209050919050565b5f5f5f610e3e8585610e8f565b90925090505f816004811115610e5657610e56611101565b148015610e745750856001600160a01b0316826001600160a01b0316145b80610e855750610e85868686610ed1565b9695505050505050565b5f5f8251604103610ec3576020830151604084015160608501515f1a610eb787828585610fb8565b94509450505050610eca565b505f905060025b9250929050565b5f5f5f856001600160a01b0316631626ba7e60e01b8686604051602401610ef99291906113f1565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b0319909416939093179092529051610f37919061142d565b5f60405180830381855afa9150503d805f8114610f6f576040519150601f19603f3d011682016040523d82523d5f602084013e610f74565b606091505b5091509150818015610f8857506020815110155b8015610e8557508051630b135d3f60e11b90610fad9083016020908101908401611443565b149695505050505050565b5f807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0831115610fed57505f9050600361106c565b604080515f8082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa15801561103e573d5f5f3e3d5ffd5b5050604051601f1901519150506001600160a01b038116611066575f6001925092505061106c565b91505f90505b94509492505050565b5f60208284031215611085575f5ffd5b5035919050565b6001600160a01b0381168114610ab4575f5ffd5b5f5f604083850312156110b1575f5ffd5b82356110bc8161108c565b946020939093013593505050565b5f5f604083850312156110db575f5ffd5b82356110e68161108c565b915060208301356110f68161108c565b809150509250929050565b634e487b7160e01b5f52602160045260245ffd5b602081016002831061113557634e487b7160e01b5f52602160045260245ffd5b91905290565b5f6020828403121561114b575f5ffd5b813560ff8116811461115b575f5ffd5b9392505050565b634e487b7160e01b5f52604160045260245ffd5b6040516060810167ffffffffffffffff8111828210171561119957611199611162565b60405290565b604051601f8201601f1916810167ffffffffffffffff811182821017156111c8576111c8611162565b604052919050565b5f5f604083850312156111e1575f5ffd5b82356111ec8161108c565b9150602083013567ffffffffffffffff811115611207575f5ffd5b830160608186031215611218575f5ffd5b611220611176565b813567ffffffffffffffff811115611236575f5ffd5b8201601f81018713611246575f5ffd5b803567ffffffffffffffff81111561126057611260611162565b611273601f8201601f191660200161119f565b818152886020838501011115611287575f5ffd5b816020840160208301375f6020928201830152835283810135908301525060409182013591810191909152919491935090915050565b5f5f5f5f608085870312156112d0575f5ffd5b84356112db8161108c565b935060208501356112eb8161108c565b93969395505050506040820135916060013590565b5f60208284031215611310575f5ffd5b813561115b8161108c565b5f5f6020838503121561132c575f5ffd5b823567ffffffffffffffff811115611342575f5ffd5b8301601f81018513611352575f5ffd5b803567ffffffffffffffff811115611368575f5ffd5b856020828401011115611379575f5ffd5b6020919091019590945092505050565b5f60208284031215611399575f5ffd5b8151801515811461115b575f5ffd5b60208152816020820152818360408301375f818301604090810191909152601f909201601f19160101919050565b5f602082840312156113e6575f5ffd5b815161115b8161108c565b828152604060208201525f82518060408401528060208501606085015e5f606082850101526060601f19601f8301168401019150509392505050565b5f82518060208501845e5f920191825250919050565b5f60208284031215611453575f5ffd5b505191905056fea264697066735822122055ff6492ef37c637eaf96a50c054a670c0eca33335f619eeb12ddfa4d6b8325b64736f6c634300081b0033", } // AVSDirectoryABI is the input ABI used to generate the binding from. diff --git a/pkg/bindings/AllocationManager/binding.go b/pkg/bindings/AllocationManager/binding.go index 8146779a82..f186448155 100644 --- a/pkg/bindings/AllocationManager/binding.go +++ b/pkg/bindings/AllocationManager/binding.go @@ -81,7 +81,7 @@ type OperatorSet struct { // AllocationManagerMetaData contains all meta data concerning the AllocationManager contract. var AllocationManagerMetaData = &bind.MetaData{ ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"_delegation\",\"type\":\"address\",\"internalType\":\"contractIDelegationManager\"},{\"name\":\"_pauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"},{\"name\":\"_permissionController\",\"type\":\"address\",\"internalType\":\"contractIPermissionController\"},{\"name\":\"_DEALLOCATION_DELAY\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"_ALLOCATION_CONFIGURATION_DELAY\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"ALLOCATION_CONFIGURATION_DELAY\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"DEALLOCATION_DELAY\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"addStrategiesToOperatorSet\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetId\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"clearDeallocationQueue\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"numToClear\",\"type\":\"uint16[]\",\"internalType\":\"uint16[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"createOperatorSets\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"params\",\"type\":\"tuple[]\",\"internalType\":\"structIAllocationManagerTypes.CreateSetParams[]\",\"components\":[{\"name\":\"operatorSetId\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"delegation\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIDelegationManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"deregisterFromOperatorSets\",\"inputs\":[{\"name\":\"params\",\"type\":\"tuple\",\"internalType\":\"structIAllocationManagerTypes.DeregisterParams\",\"components\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetIds\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"getAVSRegistrar\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIAVSRegistrar\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAllocatableMagnitude\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAllocatedSets\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple[]\",\"internalType\":\"structOperatorSet[]\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAllocatedStrategies\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAllocation\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIAllocationManagerTypes.Allocation\",\"components\":[{\"name\":\"currentMagnitude\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"pendingDiff\",\"type\":\"int128\",\"internalType\":\"int128\"},{\"name\":\"effectBlock\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAllocationDelay\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAllocations\",\"inputs\":[{\"name\":\"operators\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple[]\",\"internalType\":\"structIAllocationManagerTypes.Allocation[]\",\"components\":[{\"name\":\"currentMagnitude\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"pendingDiff\",\"type\":\"int128\",\"internalType\":\"int128\"},{\"name\":\"effectBlock\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getEncumberedMagnitude\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getMaxMagnitude\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getMaxMagnitudes\",\"inputs\":[{\"name\":\"operators\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64[]\",\"internalType\":\"uint64[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getMaxMagnitudes\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64[]\",\"internalType\":\"uint64[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getMaxMagnitudesAtBlock\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"blockNumber\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64[]\",\"internalType\":\"uint64[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getMemberCount\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getMembers\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getMinimumSlashableStake\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"operators\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"futureBlock\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[{\"name\":\"slashableStake\",\"type\":\"uint256[][]\",\"internalType\":\"uint256[][]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getOperatorSetCount\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getRegisteredSets\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple[]\",\"internalType\":\"structOperatorSet[]\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getStrategiesInOperatorSet\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getStrategyAllocations\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple[]\",\"internalType\":\"structOperatorSet[]\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"\",\"type\":\"tuple[]\",\"internalType\":\"structIAllocationManagerTypes.Allocation[]\",\"components\":[{\"name\":\"currentMagnitude\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"pendingDiff\",\"type\":\"int128\",\"internalType\":\"int128\"},{\"name\":\"effectBlock\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"initialOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"initialPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"isMemberOfOperatorSet\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isOperatorSet\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"modifyAllocations\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"params\",\"type\":\"tuple[]\",\"internalType\":\"structIAllocationManagerTypes.AllocateParams[]\",\"components\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"newMagnitudes\",\"type\":\"uint64[]\",\"internalType\":\"uint64[]\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"pauseAll\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[{\"name\":\"index\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pauserRegistry\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"permissionController\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIPermissionController\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"registerForOperatorSets\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"params\",\"type\":\"tuple\",\"internalType\":\"structIAllocationManagerTypes.RegisterParams\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetIds\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"removeStrategiesFromOperatorSet\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetId\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setAVSRegistrar\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"registrar\",\"type\":\"address\",\"internalType\":\"contractIAVSRegistrar\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setAllocationDelay\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"delay\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"slashOperator\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"params\",\"type\":\"tuple\",\"internalType\":\"structIAllocationManagerTypes.SlashingParams\",\"components\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetId\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"wadsToSlash\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"},{\"name\":\"description\",\"type\":\"string\",\"internalType\":\"string\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"updateAVSMetadataURI\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"metadataURI\",\"type\":\"string\",\"internalType\":\"string\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"AVSMetadataURIUpdated\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"metadataURI\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"AVSRegistrarSet\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"registrar\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIAVSRegistrar\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"AllocationDelaySet\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"delay\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"},{\"name\":\"effectBlock\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"AllocationUpdated\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"magnitude\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"effectBlock\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"EncumberedMagnitudeUpdated\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"encumberedMagnitude\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"MaxMagnitudeUpdated\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"maxMagnitude\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorAddedToOperatorSet\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorRemovedFromOperatorSet\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorSetCreated\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorSlashed\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"strategies\",\"type\":\"address[]\",\"indexed\":false,\"internalType\":\"contractIStrategy[]\"},{\"name\":\"wadSlashed\",\"type\":\"uint256[]\",\"indexed\":false,\"internalType\":\"uint256[]\"},{\"name\":\"description\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StrategyAddedToOperatorSet\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StrategyRemovedFromOperatorSet\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"AlreadyMemberOfSet\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"CurrentlyPaused\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"Empty\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InputAddressZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InputArrayLengthMismatch\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InsufficientMagnitude\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidCaller\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidNewPausedStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidOperator\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidOperatorSet\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidPermissions\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidSnapshotOrdering\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidWadToSlash\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ModificationAlreadyPending\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotMemberOfSet\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyPauser\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyUnpauser\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OperatorNotSlashable\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OutOfBounds\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SameMagnitude\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StrategiesMustBeInAscendingOrder\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StrategyAlreadyInOperatorSet\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StrategyNotInOperatorSet\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"UninitializedAllocationDelay\",\"inputs\":[]}]", - Bin: "0x610120604052348015610010575f5ffd5b50604051615a79380380615a7983398101604081905261002f91610180565b82858383876001600160a01b03811661005b576040516339b190bb60e11b815260040160405180910390fd5b6001600160a01b0390811660805292831660a05263ffffffff91821660c0521660e052166101005261008b610095565b50505050506101e9565b5f54610100900460ff16156101005760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff9081161461014f575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b0381168114610165575f5ffd5b50565b805163ffffffff8116811461017b575f5ffd5b919050565b5f5f5f5f5f60a08688031215610194575f5ffd5b855161019f81610151565b60208701519095506101b081610151565b60408701519094506101c181610151565b92506101cf60608701610168565b91506101dd60808701610168565b90509295509295909350565b60805160a05160c05160e051610100516157ff61027a5f395f81816103f9015261359701525f81816105480152613b9701525f818161031e015281816120c601526127bd01525f81816106c701528181610c77015281816115fc01528181611c6301528181611ccd0152612a8401525f818161056f0152818161077201528181611d72015261320e01526157ff5ff3fe608060405234801561000f575f5ffd5b5060043610610281575f3560e01c80636e875dba11610156578063adc2e3d9116100ca578063cd6dc68711610084578063cd6dc6871461069c578063d3d96ff4146106af578063df5cf723146106c2578063f2fde38b146106e9578063f605ce08146106fc578063fabc1cbc1461070f575f5ffd5b8063adc2e3d91461060e578063b2447af714610621578063b66bd98914610634578063b9fbaed114610647578063ba1a84e514610676578063c221d8ae14610689575f5ffd5b80638ce648541161011b5780638ce64854146105915780638da5cb5b146105b157806394d7d00c146105c2578063952899ee146105d5578063a9333ec8146105e8578063a9821821146105fb575f5ffd5b80636e875dba14610515578063715018a61461052857806379ae50cd146105305780637bc1ef6114610543578063886f11951461056a575f5ffd5b80634657e26a116101f8578063595c6a67116101b2578063595c6a67146104875780635ac86ab71461048f5780635c975abb146104b2578063670d3ba2146104c45780636cfb4481146104d75780636e3492b514610502575f5ffd5b80634657e26a146103f45780634a10ffe51461041b5780634b5046ef1461043b57806350feea201461044e578063547afb871461046157806356c483e614610474575f5ffd5b80632981eb77116102495780632981eb77146103195780632bab2c4a14610355578063304c10cd1461037557806336352057146103a057806340120dab146103b35780634177a87c146103d4575f5ffd5b806310e1b9b814610285578063136439dd146102ae57806315fe5028146102c3578063260dc758146102e3578063261f84e014610306575b5f5ffd5b610298610293366004614736565b610722565b6040516102a5919061477d565b60405180910390f35b6102c16102bc3660046147b0565b61075d565b005b6102d66102d13660046147c7565b610832565b6040516102a59190614845565b6102f66102f1366004614857565b610949565b60405190151581526020016102a5565b6102c16103143660046148b1565b610980565b6103407f000000000000000000000000000000000000000000000000000000000000000081565b60405163ffffffff90911681526020016102a5565b610368610363366004614996565b610c23565b6040516102a59190614a4a565b6103886103833660046147c7565b610f10565b6040516001600160a01b0390911681526020016102a5565b6102c16103ae366004614aad565b610f3f565b6103c66103c1366004614aff565b611751565b6040516102a5929190614b8c565b6103e76103e2366004614857565b6118cc565b6040516102a59190614be9565b6103887f000000000000000000000000000000000000000000000000000000000000000081565b61042e610429366004614bfb565b6118f0565b6040516102a59190614c3e565b6102c1610449366004614c89565b611998565b6102c161045c366004614d09565b611a52565b61042e61046f366004614d67565b611bb0565b6102c1610482366004614da9565b611c58565b6102c1611d5d565b6102f661049d366004614ddc565b606654600160ff9092169190911b9081161490565b6066545b6040519081526020016102a5565b6102f66104d2366004614dfc565b611e0c565b6104ea6104e5366004614aff565b611e1d565b6040516001600160401b0390911681526020016102a5565b6102c1610510366004614e3d565b611e32565b6103e7610523366004614857565b612202565b6102c1612213565b6102d661053e3660046147c7565b612224565b6103407f000000000000000000000000000000000000000000000000000000000000000081565b6103887f000000000000000000000000000000000000000000000000000000000000000081565b6105a461059f366004614e6e565b6122fe565b6040516102a59190614eb1565b6033546001600160a01b0316610388565b61042e6105d0366004614ec3565b6123c3565b6102c16105e3366004614f1e565b6124af565b6104ea6105f6366004614aff565b612976565b6102c16106093660046150c7565b6129a5565b6102c161061c366004615145565b612a15565b6104b661062f366004614857565b612d64565b6102c1610642366004614d09565b612d86565b61065a6106553660046147c7565b612ee0565b60408051921515835263ffffffff9091166020830152016102a5565b6104b66106843660046147c7565b612f7a565b6103e7610697366004614dfc565b612f9a565b6102c16106aa366004615187565b612fcb565b6102c16106bd366004614aff565b6130e8565b6103887f000000000000000000000000000000000000000000000000000000000000000081565b6102c16106f73660046147c7565b613187565b6104ea61070a366004614aff565b613200565b6102c161071d3660046147b0565b61320c565b604080516060810182525f80825260208201819052918101829052906107518561074b86613322565b85613385565b925050505b9392505050565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa1580156107bf573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107e391906151b1565b61080057604051631d77d47760e21b815260040160405180910390fd5b60665481811681146108255760405163c61dca5d60e01b815260040160405180910390fd5b61082e826134f1565b5050565b6001600160a01b0381165f908152609d60205260408120606091906108569061352e565b90505f816001600160401b038111156108715761087161465a565b6040519080825280602002602001820160405280156108b557816020015b604080518082019091525f808252602082015281526020019060019003908161088f5790505b5090505f5b82811015610941576001600160a01b0385165f908152609d6020526040902061091c906108e79083613537565b604080518082019091525f80825260208201525060408051808201909152606082901c815263ffffffff909116602082015290565b82828151811061092e5761092e6151d0565b60209081029190910101526001016108ba565b509392505050565b60208082015182516001600160a01b03165f90815260989092526040822061097a9163ffffffff9081169061354216565b92915050565b8261098a81613559565b6109a75760405163932d94f760e01b815260040160405180910390fd5b5f5b82811015610c1c575f6040518060400160405280876001600160a01b031681526020018686858181106109de576109de6151d0565b90506020028101906109f091906151e4565b6109fe906020810190615202565b63ffffffff168152509050610a48816020015163ffffffff1660985f896001600160a01b03166001600160a01b031681526020019081526020015f2061360390919063ffffffff16565b610a6557604051631fb1705560e21b815260040160405180910390fd5b7f31629285ead2335ae0933f86ed2ae63321f7af77b4e6eaabc42c057880977e6c6040518060400160405280886001600160a01b03168152602001836020015163ffffffff16815250604051610abb919061521b565b60405180910390a15f610acd82613322565b90505f5b868685818110610ae357610ae36151d0565b9050602002810190610af591906151e4565b610b03906020810190615229565b9050811015610c1157610b79878786818110610b2157610b216151d0565b9050602002810190610b3391906151e4565b610b41906020810190615229565b83818110610b5157610b516151d0565b9050602002016020810190610b6691906147c7565b5f8481526099602052604090209061360e565b507f7ab260fe0af193db5f4986770d831bda4ea46099dc817e8b6716dcae8af8e88b83888887818110610bae57610bae6151d0565b9050602002810190610bc091906151e4565b610bce906020810190615229565b84818110610bde57610bde6151d0565b9050602002016020810190610bf391906147c7565b604051610c0192919061526e565b60405180910390a1600101610ad1565b5050506001016109a9565b5050505050565b606083516001600160401b03811115610c3e57610c3e61465a565b604051908082528060200260200182016040528015610c7157816020015b6060815260200190600190039081610c5c5790505b5090505f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663f0e0e67686866040518363ffffffff1660e01b8152600401610cc3929190615294565b5f60405180830381865afa158015610cdd573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610d0491908101906152b8565b90505f5b8551811015610f06575f868281518110610d2457610d246151d0565b6020026020010151905085516001600160401b03811115610d4757610d4761465a565b604051908082528060200260200182016040528015610d70578160200160208202803683370190505b50848381518110610d8357610d836151d0565b60209081029190910101525f5b8651811015610efc575f878281518110610dac57610dac6151d0565b6020908102919091018101516001600160a01b038086165f90815260a1845260408082209284168252919093528220909250610de790613622565b9050806001600160401b03165f03610e00575050610ef4565b5f610e0c858d85610722565b90508863ffffffff16816040015163ffffffff1611158015610e3457505f8160200151600f0b125b15610e5657610e4a815f01518260200151613635565b6001600160401b031681525b80515f90610e71906001600160401b03908116908516613649565b9050610eb881898981518110610e8957610e896151d0565b60200260200101518781518110610ea257610ea26151d0565b602002602001015161365d90919063ffffffff16565b898881518110610eca57610eca6151d0565b60200260200101518681518110610ee357610ee36151d0565b602002602001018181525050505050505b600101610d90565b5050600101610d08565b5050949350505050565b6001600160a01b038082165f908152609760205260408120549091168015610f385780610756565b5090919050565b606654600190600290811603610f685760405163840a48d560e01b815260040160405180910390fd5b82610f7281613559565b610f8f5760405163932d94f760e01b815260040160405180910390fd5b5f6040518060400160405280866001600160a01b03168152602001856020016020810190610fbd9190615202565b63ffffffff16905290505f610fde610fd860208701876147c7565b83613671565b9050610fed6060860186615229565b9050610ffc6040870187615229565b90501461101c576040516343714afd60e01b815260040160405180910390fd5b60208083015183516001600160a01b03165f9081526098909252604090912061104e9163ffffffff9081169061354216565b61106b57604051631fb1705560e21b815260040160405180910390fd5b806110895760405163ebbff49760e01b815260040160405180910390fd5b5f6110976040870187615229565b90506001600160401b038111156110b0576110b061465a565b6040519080825280602002602001820160405280156110d9578160200160208202803683370190505b5090505f5b6110eb6040880188615229565b90508110156116e25780158061117e57506111096040880188615229565b6111146001846153d8565b818110611123576111236151d0565b905060200201602081019061113891906147c7565b6001600160a01b031661114e6040890189615229565b8381811061115e5761115e6151d0565b905060200201602081019061117391906147c7565b6001600160a01b0316115b61119b57604051639f1c805360e01b815260040160405180910390fd5b6111a86060880188615229565b828181106111b8576111b86151d0565b905060200201355f1080156111f85750670de0b6b3a76400006111de6060890189615229565b838181106111ee576111ee6151d0565b9050602002013511155b61121557604051631353603160e01b815260040160405180910390fd5b6112716112256040890189615229565b83818110611235576112356151d0565b905060200201602081019061124a91906147c7565b60995f61125688613322565b81526020019081526020015f206136e790919063ffffffff16565b61128e576040516331bc342760e11b815260040160405180910390fd5b5f806112e06112a060208b018b6147c7565b6112a988613322565b6112b660408d018d615229565b878181106112c6576112c66151d0565b90506020020160208101906112db91906147c7565b613385565b805191935091506001600160401b03165f036112fd5750506116da565b5f61133861130e60608c018c615229565b8681811061131e5761131e6151d0565b85516001600160401b031692602090910201359050613708565b83519091506113536001600160401b03808416908316613649565b868681518110611365576113656151d0565b60200260200101818152505081835f0181815161138291906153eb565b6001600160401b031690525083518290859061139f9083906153eb565b6001600160401b03169052506020840180518391906113bf9083906153eb565b6001600160401b031690525060208301515f600f9190910b12156114da575f6114226113ee60608e018e615229565b888181106113fe576113fe6151d0565b9050602002013585602001516114139061540a565b6001600160801b031690613708565b9050806001600160401b03168460200181815161143f919061542e565b600f0b9052507f1487af5418c47ee5ea45ef4a93398668120890774a9e13487e61e9dc3baf76dd61147360208e018e6147c7565b8a8e80604001906114849190615229565b8a818110611494576114946151d0565b90506020020160208101906114a991906147c7565b6114ba885f01518960200151613635565b88604001516040516114d095949392919061545b565b60405180910390a1505b61152c6114ea60208d018d6147c7565b6114f38a613322565b61150060408f018f615229565b89818110611510576115106151d0565b905060200201602081019061152591906147c7565b878761371e565b7f1487af5418c47ee5ea45ef4a93398668120890774a9e13487e61e9dc3baf76dd61155a60208d018d6147c7565b8961156860408f018f615229565b89818110611578576115786151d0565b905060200201602081019061158d91906147c7565b86516040516115a19493929190439061545b565b60405180910390a16115f26115b960208d018d6147c7565b6115c660408e018e615229565b888181106115d6576115d66151d0565b90506020020160208101906115eb91906147c7565b865161395e565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001663601bb36f61162e60208e018e6147c7565b61163b60408f018f615229565b8981811061164b5761164b6151d0565b905060200201602081019061166091906147c7565b875160405160e085901b6001600160e01b03191681526001600160a01b0393841660048201529290911660248301526001600160401b0380861660448401521660648201526084015f604051808303815f87803b1580156116bf575f5ffd5b505af11580156116d1573d5f5f3e3d5ffd5b50505050505050505b6001016110de565b507f80969ad29428d6797ee7aad084f9e4a42a82fc506dcd2ca3b6fb431f85ccebe561171160208801886147c7565b8461171f60408a018a615229565b8561172d60808d018d6154ac565b6040516117409796959493929190615516565b60405180910390a150505050505050565b6001600160a01b0382165f908152609d6020526040812060609182916117769061352e565b90505f816001600160401b038111156117915761179161465a565b6040519080825280602002602001820160405280156117d557816020015b604080518082019091525f80825260208201528152602001906001900390816117af5790505b5090505f826001600160401b038111156117f1576117f161465a565b60405190808252806020026020018201604052801561183a57816020015b604080516060810182525f80825260208083018290529282015282525f1990920191018161180f5790505b5090505f5b838110156118bd576001600160a01b0388165f908152609d6020526040812061186c906108e79084613537565b905080848381518110611881576118816151d0565b602002602001018190525061189789828a610722565b8383815181106118a9576118a96151d0565b60209081029190910101525060010161183f565b509093509150505b9250929050565b60605f61075660995f6118de86613322565b81526020019081526020015f206139e0565b60605f83516001600160401b0381111561190c5761190c61465a565b604051908082528060200260200182016040528015611935578160200160208202803683370190505b5090505f5b845181101561094157611966858281518110611958576119586151d0565b602002602001015185612976565b828281518110611978576119786151d0565b6001600160401b039092166020928302919091019091015260010161193a565b6066545f906001908116036119c05760405163840a48d560e01b815260040160405180910390fd5b8382146119e0576040516343714afd60e01b815260040160405180910390fd5b5f5b84811015611a4957611a4187878784818110611a0057611a006151d0565b9050602002016020810190611a1591906147c7565b868685818110611a2757611a276151d0565b9050602002016020810190611a3c91906155ac565b6139ec565b6001016119e2565b50505050505050565b83611a5c81613559565b611a795760405163932d94f760e01b815260040160405180910390fd5b604080518082019091526001600160a01b038616815263ffffffff851660208201525f611aa582613322565b9050611ae6826020015163ffffffff1660985f8a6001600160a01b03166001600160a01b031681526020019081526020015f2061354290919063ffffffff16565b611b0357604051631fb1705560e21b815260040160405180910390fd5b5f5b84811015611ba657611b22868683818110610b5157610b516151d0565b611b3f5760405163585cfb2f60e01b815260040160405180910390fd5b7f7ab260fe0af193db5f4986770d831bda4ea46099dc817e8b6716dcae8af8e88b83878784818110611b7357611b736151d0565b9050602002016020810190611b8891906147c7565b604051611b9692919061526e565b60405180910390a1600101611b05565b5050505050505050565b60605f82516001600160401b03811115611bcc57611bcc61465a565b604051908082528060200260200182016040528015611bf5578160200160208202803683370190505b5090505f5b835181101561094157611c2685858381518110611c1957611c196151d0565b6020026020010151612976565b828281518110611c3857611c386151d0565b6001600160401b0390921660209283029190910190910152600101611bfa565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614611d5357611c9182613559565b611cae576040516348f5c3ed60e01b815260040160405180910390fd5b6040516336b87bd760e11b81526001600160a01b0383811660048301527f00000000000000000000000000000000000000000000000000000000000000001690636d70f7ae90602401602060405180830381865afa158015611d12573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611d3691906151b1565b611d535760405163ccea9e6f60e01b815260040160405180910390fd5b61082e8282613af0565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa158015611dbf573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611de391906151b1565b611e0057604051631d77d47760e21b815260040160405180910390fd5b611e0a5f196134f1565b565b5f61075683609a5f61125686613322565b5f5f611e298484613c9c565b95945050505050565b606654600290600490811603611e5b5760405163840a48d560e01b815260040160405180910390fd5b611e70611e6b60208401846147c7565b613559565b80611e895750611e89611e6b60408401602085016147c7565b611ea6576040516348f5c3ed60e01b815260040160405180910390fd5b5f5b611eb56040840184615229565b9050811015612177575f6040518060400160405280856020016020810190611edd91906147c7565b6001600160a01b03168152602001611ef86040870187615229565b85818110611f0857611f086151d0565b9050602002016020810190611f1d9190615202565b63ffffffff168152509050611f6a816020015163ffffffff1660985f876020016020810190611f4c91906147c7565b6001600160a01b0316815260208101919091526040015f2090613542565b611f8757604051631fb1705560e21b815260040160405180910390fd5b609e5f611f9760208701876147c7565b6001600160a01b03166001600160a01b031681526020019081526020015f205f611fc083613322565b815260208101919091526040015f205460ff16611ff0576040516325131d4f60e01b815260040160405180910390fd5b61202a611ffc82613322565b609c5f61200c60208901896147c7565b6001600160a01b0316815260208101919091526040015f2090613e0b565b5061206261203b60208601866147c7565b609a5f61204785613322565b81526020019081526020015f20613e1690919063ffffffff16565b5061207060208501856147c7565b6001600160a01b03167fad34c3070be1dffbcaa499d000ba2b8d9848aefcac3059df245dd95c4ece14fe826040516120a8919061521b565b60405180910390a2604080518082019091525f8152602081016120eb7f0000000000000000000000000000000000000000000000000000000000000000436155cd565b63ffffffff169052609e5f61210360208801886147c7565b6001600160a01b03166001600160a01b031681526020019081526020015f205f61212c84613322565b81526020808201929092526040015f2082518154939092015163ffffffff166101000264ffffffff00199215159290921664ffffffffff199093169290921717905550600101611ea8565b5061218b61038360408401602085016147c7565b6001600160a01b0316639d8e0c236121a660208501856147c7565b6121b36040860186615229565b6040518463ffffffff1660e01b81526004016121d193929190615622565b5f604051808303815f87803b1580156121e8575f5ffd5b505af19250505080156121f9575060015b1561082e575050565b606061097a609a5f6118de85613322565b61221b613e2a565b611e0a5f613e84565b6001600160a01b0381165f908152609c60205260408120606091906122489061352e565b90505f816001600160401b038111156122635761226361465a565b6040519080825280602002602001820160405280156122a757816020015b604080518082019091525f80825260208201528152602001906001900390816122815790505b5090505f5b82811015610941576001600160a01b0385165f908152609c602052604090206122d9906108e79083613537565b8282815181106122eb576122eb6151d0565b60209081029190910101526001016122ac565b60605f84516001600160401b0381111561231a5761231a61465a565b60405190808252806020026020018201604052801561236357816020015b604080516060810182525f80825260208083018290529282015282525f199092019101816123385790505b5090505f5b85518110156123ba57612395868281518110612386576123866151d0565b60200260200101518686610722565b8282815181106123a7576123a76151d0565b6020908102919091010152600101612368565b50949350505050565b60605f83516001600160401b038111156123df576123df61465a565b604051908082528060200260200182016040528015612408578160200160208202803683370190505b5090505f5b84518110156123ba576001600160a01b0386165f90815260a160205260408120865161247d92879291899086908110612448576124486151d0565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020015f20613ed590919063ffffffff16565b82828151811061248f5761248f6151d0565b6001600160401b039092166020928302919091019091015260010161240d565b6066545f906001908116036124d75760405163840a48d560e01b815260040160405180910390fd5b6124e083613559565b6124fd576040516348f5c3ed60e01b815260040160405180910390fd5b5f5f5f61250986612ee0565b915091508161252b5760405163fa55fc8160e01b815260040160405180910390fd5b91505f90505b8351811015610c1c5783818151811061254c5761254c6151d0565b6020026020010151604001515184828151811061256b5761256b6151d0565b6020026020010151602001515114612596576040516343714afd60e01b815260040160405180910390fd5b5f8482815181106125a9576125a96151d0565b602090810291909101810151518082015181516001600160a01b03165f908152609890935260409092209092506125e99163ffffffff9081169061354216565b61260657604051631fb1705560e21b815260040160405180910390fd5b5f6126118783613671565b90505f5b868481518110612627576126276151d0565b6020026020010151602001515181101561296b575f87858151811061264e5761264e6151d0565b602002602001015160200151828151811061266b5761266b6151d0565b60200260200101519050612682898261ffff6139ec565b5f5f6126918b61074b88613322565b915091508060200151600f0b5f146126bc57604051630d8fcbe360e41b815260040160405180910390fd5b5f6126c987858489613ee9565b905061270e825f01518c8a815181106126e4576126e46151d0565b6020026020010151604001518781518110612701576127016151d0565b6020026020010151613f1f565b600f0b602083018190525f0361273757604051634606179360e11b815260040160405180910390fd5b5f8260200151600f0b121561287b5780156127fd576127b861275888613322565b6001600160a01b03808f165f90815260a360209081526040808320938a16835292905220908154600160801b90819004600f0b5f818152600180860160205260409091209390935583546001600160801b03908116939091011602179055565b6127e27f0000000000000000000000000000000000000000000000000000000000000000436155cd565b6127ed9060016155cd565b63ffffffff1660408301526128e8565b61280f83602001518360200151613635565b6001600160401b031660208401528a518b9089908110612831576128316151d0565b602002602001015160400151858151811061284e5761284e6151d0565b6020908102919091018101516001600160401b031683525f9083015263ffffffff431660408301526128e8565b5f8260200151600f0b13156128e85761289c83602001518360200151613635565b6001600160401b0390811660208501819052845190911610156128d257604051636c9be0bf60e01b815260040160405180910390fd5b6128dc89436155cd565b63ffffffff1660408301525b6128fd8c6128f589613322565b86868661371e565b7f1487af5418c47ee5ea45ef4a93398668120890774a9e13487e61e9dc3baf76dd8c61292b6108e78a613322565b8661293d865f01518760200151613635565b866040015160405161295395949392919061545b565b60405180910390a15050600190920191506126159050565b505050600101612531565b6001600160a01b038083165f90815260a160209081526040808320938516835292905290812061075690613622565b826129af81613559565b6129cc5760405163932d94f760e01b815260040160405180910390fd5b836001600160a01b03167fa89c1dc243d8908a96dd84944bcc97d6bc6ac00dd78e20621576be6a3c9437138484604051612a07929190615646565b60405180910390a250505050565b606654600290600490811603612a3e5760405163840a48d560e01b815260040160405180910390fd5b82612a4881613559565b612a655760405163932d94f760e01b815260040160405180910390fd5b6040516336b87bd760e11b81526001600160a01b0385811660048301527f00000000000000000000000000000000000000000000000000000000000000001690636d70f7ae90602401602060405180830381865afa158015612ac9573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612aed91906151b1565b612b0a5760405163ccea9e6f60e01b815260040160405180910390fd5b5f5b612b196020850185615229565b9050811015612ce157604080518082019091525f9080612b3c60208801886147c7565b6001600160a01b03168152602001868060200190612b5a9190615229565b85818110612b6a57612b6a6151d0565b9050602002016020810190612b7f9190615202565b63ffffffff90811690915260208083015183516001600160a01b03165f90815260989092526040909120929350612bbb92919081169061354216565b612bd857604051631fb1705560e21b815260040160405180910390fd5b612be28682613671565b15612c0057604051636c6c6e2760e11b815260040160405180910390fd5b612c29612c0c82613322565b6001600160a01b0388165f908152609c6020526040902090613603565b50612c5586609a5f612c3a85613322565b81526020019081526020015f2061360e90919063ffffffff16565b50856001600160a01b03167f43232edf9071753d2321e5fa7e018363ee248e5f2142e6c08edd3265bfb4895e82604051612c8f919061521b565b60405180910390a26001600160a01b0386165f908152609e60205260408120600191612cba84613322565b815260208101919091526040015f20805460ff191691151591909117905550600101612b0c565b50612cf261038360208501856147c7565b6001600160a01b031663adcf73f785612d0e6020870187615229565b612d1b60408901896154ac565b6040518663ffffffff1660e01b8152600401612d3b959493929190615659565b5f604051808303815f87803b158015612d52575f5ffd5b505af1158015611ba6573d5f5f3e3d5ffd5b5f61097a609a5f612d7485613322565b81526020019081526020015f2061352e565b83612d9081613559565b612dad5760405163932d94f760e01b815260040160405180910390fd5b6040805180820182526001600160a01b03871680825263ffffffff80881660208085018290525f93845260989052939091209192612dec929161354216565b612e0957604051631fb1705560e21b815260040160405180910390fd5b5f612e1382613322565b90505f5b84811015611ba657612e5c868683818110612e3457612e346151d0565b9050602002016020810190612e4991906147c7565b5f84815260996020526040902090613e16565b612e79576040516331bc342760e11b815260040160405180910390fd5b7f7b4b073d80dcac55a11177d8459ad9f664ceeb91f71f27167bb14f8152a7eeee83878784818110612ead57612ead6151d0565b9050602002016020810190612ec291906147c7565b604051612ed092919061526e565b60405180910390a1600101612e17565b6001600160a01b0381165f908152609b602090815260408083208151608081018352905463ffffffff80821680845260ff600160201b8404161515958401869052650100000000008304821694840194909452600160481b909104166060820181905284939192919015801590612f615750826060015163ffffffff164310155b15612f70575050604081015160015b9590945092505050565b6001600160a01b0381165f90815260986020526040812061097a9061352e565b6001600160a01b0382165f908152609f6020526040812060609190612fc390826118de86613322565b949350505050565b5f54610100900460ff1615808015612fe957505f54600160ff909116105b806130025750303b15801561300257505f5460ff166001145b61306a5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b5f805460ff19166001179055801561308b575f805461ff0019166101001790555b613094826134f1565b61309d83613e84565b80156130e3575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498906020015b60405180910390a15b505050565b816130f281613559565b61310f5760405163932d94f760e01b815260040160405180910390fd5b6001600160a01b038381165f90815260976020526040902080546001600160a01b0319169184169190911790557f2ae945c40c44dc0ec263f95609c3fdc6952e0aefa22d6374e44f2c997acedf858361316781610f10565b604080516001600160a01b039384168152929091166020830152016130da565b61318f613e2a565b6001600160a01b0381166131f45760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401613061565b6131fd81613e84565b50565b5f5f6123ba8484613c9c565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015613268573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061328c919061569c565b6001600160a01b0316336001600160a01b0316146132bd5760405163794821ff60e01b815260040160405180910390fd5b606654801982198116146132e45760405163c61dca5d60e01b815260040160405180910390fd5b606682905560405182815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c9060200160405180910390a25050565b5f815f0151826020015163ffffffff1660405160200161336d92919060609290921b6bffffffffffffffffffffffff1916825260a01b6001600160a01b031916601482015260200190565b60405160208183030381529060405261097a906156b7565b6040805180820182525f80825260208083018290528351606081018552828152808201839052808501839052845180860186526001600160a01b03898116855260a18452868520908816855290925293822092939281906133e590613622565b6001600160401b0390811682526001600160a01b038981165f81815260a260209081526040808320948c168084529482528083205486169682019690965291815260a082528481208b8252825284812092815291815290839020835160608101855290549283168152600160401b8304600f0b91810191909152600160c01b90910463ffffffff169181018290529192504310156134875790925090506134e9565b613498815f01518260200151613635565b6001600160401b0316815260208101515f600f9190910b12156134d6576134c782602001518260200151613635565b6001600160401b031660208301525b5f60408201819052602082015290925090505b935093915050565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a250565b5f61097a825490565b5f6107568383613f36565b5f8181526001830160205260408120541515610756565b604051631beb2b9760e31b81526001600160a01b0382811660048301523360248301523060448301525f80356001600160e01b0319166064840152917f00000000000000000000000000000000000000000000000000000000000000009091169063df595cb8906084016020604051808303815f875af11580156135df573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061097a91906151b1565b5f6107568383613f5c565b5f610756836001600160a01b038416613f5c565b5f61097a82670de0b6b3a7640000613fa8565b5f610756826001600160401b03851661542e565b5f61075683670de0b6b3a764000084613fec565b5f6107568383670de0b6b3a7640000613fec565b6001600160a01b0382165f908152609e6020526040812081908161369485613322565b815260208082019290925260409081015f2081518083019092525460ff8116151580835261010090910463ffffffff1692820192909252915080612fc357506020015163ffffffff164311159392505050565b6001600160a01b0381165f9081526001830160205260408120541515610756565b5f6107568383670de0b6b3a764000060016140d1565b6020808301516001600160a01b038088165f90815260a284526040808220928816825291909352909120546001600160401b039081169116146137e457602082810180516001600160a01b038881165f81815260a286526040808220938a1680835293875290819020805467ffffffffffffffff19166001600160401b0395861617905593518451918252948101919091529216908201527facf9095feb3a370c9cf692421c69ef320d4db5c66e6a7d29c7694eb02364fc559060600160405180910390a15b6001600160a01b038086165f90815260a060209081526040808320888452825280832093871683529281529082902083518154928501519385015163ffffffff16600160c01b0263ffffffff60c01b196001600160801b038616600160401b026001600160c01b03199095166001600160401b03909316929092179390931716919091179055600f0b156138c6576001600160a01b0385165f908152609f60209081526040808320878452909152902061389e908461360e565b506001600160a01b0385165f908152609d602052604090206138c09085613603565b50610c1c565b80516001600160401b03165f03610c1c576001600160a01b0385165f908152609f6020908152604080832087845290915290206139039084613e16565b506001600160a01b0385165f908152609f60209081526040808320878452909152902061392f9061352e565b5f03610c1c576001600160a01b0385165f908152609d602052604090206139569085613e0b565b505050505050565b6001600160a01b038084165f90815260a16020908152604080832093861683529290522061398d90438361412a565b604080516001600160a01b038086168252841660208201526001600160401b038316918101919091527f1c6458079a41077d003c11faf9bf097e693bd67979e4e6500bac7b29db779b5c906060016130da565b60605f6107568361413e565b6001600160a01b038381165f90815260a360209081526040808320938616835292905290812054600f81810b600160801b909204900b035b5f81118015613a3657508261ffff1682105b15610c1c576001600160a01b038086165f90815260a3602090815260408083209388168352929052908120613a6a90614197565b90505f5f613a79888489613385565b91509150806040015163ffffffff16431015613a9757505050610c1c565b613aa4888489858561371e565b6001600160a01b038089165f90815260a360209081526040808320938b16835292905220613ad1906141e9565b50613adb856156da565b9450613ae6846156f2565b9350505050613a24565b6001600160a01b0382165f908152609b60209081526040918290208251608081018452905463ffffffff808216835260ff600160201b830416151593830193909352650100000000008104831693820193909352600160481b909204166060820181905215801590613b6c5750806060015163ffffffff164310155b15613b8657604081015163ffffffff168152600160208201525b63ffffffff82166040820152613bbc7f0000000000000000000000000000000000000000000000000000000000000000436155cd565b613bc79060016155cd565b63ffffffff90811660608381019182526001600160a01b0386165f818152609b602090815260409182902087518154838a0151858b01519851928a1664ffffffffff1990921691909117600160201b91151591909102176cffffffffffffffff0000000000191665010000000000978916979097026cffffffff000000000000000000191696909617600160481b968816968702179055815192835294871694820194909452928301919091527f4e85751d6331506c6c62335f207eb31f12a61e570f34f5c17640308785c6d4db91016130da565b6001600160a01b038281165f81815260a2602090815260408083209486168084529482528083205493835260a38252808320948352939052918220546001600160401b039091169190600f81810b600160801b909204900b03815b81811015613dc7576001600160a01b038087165f90815260a3602090815260408083209389168352929052908120613d2f9083614266565b6001600160a01b038881165f90815260a0602090815260408083208584528252808320938b16835292815290829020825160608101845290546001600160401b0381168252600160401b8104600f0b92820192909252600160c01b90910463ffffffff16918101829052919250431015613daa575050613dc7565b613db8868260200151613635565b95505050806001019050613cf7565b506001600160a01b038086165f90815260a1602090815260408083209388168352929052208390613df790613622565b613e0191906153eb565b9150509250929050565b5f61075683836142d5565b5f610756836001600160a01b0384166142d5565b6033546001600160a01b03163314611e0a5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401613061565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b5f6107568383670de0b6b3a76400006143b8565b5f613efa8460995f61125689613322565b8015613f035750815b8015611e2957505090516001600160401b031615159392505050565b5f6107566001600160401b03808516908416615707565b5f825f018281548110613f4b57613f4b6151d0565b905f5260205f200154905092915050565b5f818152600183016020526040812054613fa157508154600181810184555f84815260208082209093018490558454848252828601909352604090209190915561097a565b505f61097a565b81545f908015613fe457613fce84613fc16001846153d8565b5f91825260209091200190565b54600160201b90046001600160e01b0316612fc3565b509092915050565b5f80805f19858709858702925082811083820303915050805f036140235783828161401957614019615734565b0492505050610756565b80841161406a5760405162461bcd60e51b81526020600482015260156024820152744d6174683a206d756c446976206f766572666c6f7760581b6044820152606401613061565b5f8486880960026001871981018816978890046003810283188082028403028082028403028082028403028082028403028082028403029081029092039091025f889003889004909101858311909403939093029303949094049190911702949350505050565b5f5f6140de868686613fec565b905060018360028111156140f4576140f4615748565b14801561411057505f848061410b5761410b615734565b868809115b15611e295761412060018261575c565b9695505050505050565b6130e383836001600160401b038416614400565b6060815f0180548060200260200160405190810160405280929190818152602001828054801561418b57602002820191905f5260205f20905b815481526020019060010190808311614177575b50505050509050919050565b5f6141b18254600f81810b600160801b909204900b131590565b156141cf57604051631ed9509560e11b815260040160405180910390fd5b508054600f0b5f9081526001909101602052604090205490565b5f6142038254600f81810b600160801b909204900b131590565b1561422157604051631ed9509560e11b815260040160405180910390fd5b508054600f0b5f818152600180840160205260408220805492905583546fffffffffffffffffffffffffffffffff191692016001600160801b03169190911790915590565b5f5f61428861427484614503565b85546142839190600f0b61576f565b614570565b8454909150600160801b9004600f90810b9082900b126142bb57604051632d0483c560e21b815260040160405180910390fd5b600f0b5f9081526001939093016020525050604090205490565b5f81815260018301602052604081205480156143af575f6142f76001836153d8565b85549091505f9061430a906001906153d8565b9050818114614369575f865f018281548110614328576143286151d0565b905f5260205f200154905080875f018481548110614348576143486151d0565b5f918252602080832090910192909255918252600188019052604090208390555b855486908061437a5761437a615796565b600190038181905f5260205f20015f90559055856001015f8681526020019081526020015f205f90556001935050505061097a565b5f91505061097a565b82545f90816143c9868683856145d9565b905080156143f6576143e086613fc16001846153d8565b54600160201b90046001600160e01b0316610751565b5091949350505050565b825480156144b6575f61441885613fc16001856153d8565b60408051808201909152905463ffffffff808216808452600160201b9092046001600160e01b03166020840152919250908516101561446a5760405163151b8e3f60e11b815260040160405180910390fd5b805163ffffffff8086169116036144b4578261448b86613fc16001866153d8565b80546001600160e01b0392909216600160201b0263ffffffff9092169190911790555050505050565b505b506040805180820190915263ffffffff92831681526001600160e01b03918216602080830191825285546001810187555f968752952091519051909216600160201b029190921617910155565b5f6001600160ff1b0382111561456c5760405162461bcd60e51b815260206004820152602860248201527f53616665436173743a2076616c756520646f65736e27742066697420696e2061604482015267371034b73a191a9b60c11b6064820152608401613061565b5090565b80600f81900b81146145d45760405162461bcd60e51b815260206004820152602760248201527f53616665436173743a2076616c756520646f65736e27742066697420696e20316044820152663238206269747360c81b6064820152608401613061565b919050565b5f5b81831015610941575f6145ee848461462c565b5f8781526020902090915063ffffffff86169082015463ffffffff16111561461857809250614626565b61462381600161575c565b93505b506145db565b5f61463a60028484186157aa565b6107569084841661575c565b6001600160a01b03811681146131fd575f5ffd5b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b03811182821017156146905761469061465a565b60405290565b604051601f8201601f191681016001600160401b03811182821017156146be576146be61465a565b604052919050565b803563ffffffff811681146145d4575f5ffd5b5f604082840312156146e9575f5ffd5b604080519081016001600160401b038111828210171561470b5761470b61465a565b604052905080823561471c81614646565b815261472a602084016146c6565b60208201525092915050565b5f5f5f60808486031215614748575f5ffd5b833561475381614646565b925061476285602086016146d9565b9150606084013561477281614646565b809150509250925092565b81516001600160401b03168152602080830151600f0b9082015260408083015163ffffffff16908201526060810161097a565b5f602082840312156147c0575f5ffd5b5035919050565b5f602082840312156147d7575f5ffd5b813561075681614646565b80516001600160a01b0316825260209081015163ffffffff16910152565b5f8151808452602084019350602083015f5b8281101561483b576148258683516147e2565b6040959095019460209190910190600101614812565b5093949350505050565b602081525f6107566020830184614800565b5f60408284031215614867575f5ffd5b61075683836146d9565b5f5f83601f840112614881575f5ffd5b5081356001600160401b03811115614897575f5ffd5b6020830191508360208260051b85010111156118c5575f5ffd5b5f5f5f604084860312156148c3575f5ffd5b83356148ce81614646565b925060208401356001600160401b038111156148e8575f5ffd5b6148f486828701614871565b9497909650939450505050565b5f6001600160401b038211156149195761491961465a565b5060051b60200190565b5f82601f830112614932575f5ffd5b813561494561494082614901565b614696565b8082825260208201915060208360051b860101925085831115614966575f5ffd5b602085015b8381101561498c57803561497e81614646565b83526020928301920161496b565b5095945050505050565b5f5f5f5f60a085870312156149a9575f5ffd5b6149b386866146d9565b935060408501356001600160401b038111156149cd575f5ffd5b6149d987828801614923565b93505060608501356001600160401b038111156149f4575f5ffd5b614a0087828801614923565b925050614a0f608086016146c6565b905092959194509250565b5f8151808452602084019350602083015f5b8281101561483b578151865260209586019590910190600101614a2c565b5f602082016020835280845180835260408501915060408160051b8601019250602086015f5b82811015614aa157603f19878603018452614a8c858351614a1a565b94506020938401939190910190600101614a70565b50929695505050505050565b5f5f60408385031215614abe575f5ffd5b8235614ac981614646565b915060208301356001600160401b03811115614ae3575f5ffd5b830160a08186031215614af4575f5ffd5b809150509250929050565b5f5f60408385031215614b10575f5ffd5b8235614b1b81614646565b91506020830135614af481614646565b5f8151808452602084019350602083015f5b8281101561483b57614b7686835180516001600160401b03168252602080820151600f0b9083015260409081015163ffffffff16910152565b6060959095019460209190910190600101614b3d565b604081525f614b9e6040830185614800565b8281036020840152611e298185614b2b565b5f8151808452602084019350602083015f5b8281101561483b5781516001600160a01b0316865260209586019590910190600101614bc2565b602081525f6107566020830184614bb0565b5f5f60408385031215614c0c575f5ffd5b82356001600160401b03811115614c21575f5ffd5b614c2d85828601614923565b9250506020830135614af481614646565b602080825282518282018190525f918401906040840190835b81811015614c7e5783516001600160401b0316835260209384019390920191600101614c57565b509095945050505050565b5f5f5f5f5f60608688031215614c9d575f5ffd5b8535614ca881614646565b945060208601356001600160401b03811115614cc2575f5ffd5b614cce88828901614871565b90955093505060408601356001600160401b03811115614cec575f5ffd5b614cf888828901614871565b969995985093965092949392505050565b5f5f5f5f60608587031215614d1c575f5ffd5b8435614d2781614646565b9350614d35602086016146c6565b925060408501356001600160401b03811115614d4f575f5ffd5b614d5b87828801614871565b95989497509550505050565b5f5f60408385031215614d78575f5ffd5b8235614d8381614646565b915060208301356001600160401b03811115614d9d575f5ffd5b613e0185828601614923565b5f5f60408385031215614dba575f5ffd5b8235614dc581614646565b9150614dd3602084016146c6565b90509250929050565b5f60208284031215614dec575f5ffd5b813560ff81168114610756575f5ffd5b5f5f60608385031215614e0d575f5ffd5b8235614e1881614646565b9150614dd384602085016146d9565b5f60608284031215614e37575f5ffd5b50919050565b5f60208284031215614e4d575f5ffd5b81356001600160401b03811115614e62575f5ffd5b612fc384828501614e27565b5f5f5f60808486031215614e80575f5ffd5b83356001600160401b03811115614e95575f5ffd5b614ea186828701614923565b93505061476285602086016146d9565b602081525f6107566020830184614b2b565b5f5f5f60608486031215614ed5575f5ffd5b8335614ee081614646565b925060208401356001600160401b03811115614efa575f5ffd5b614f0686828701614923565b925050614f15604085016146c6565b90509250925092565b5f5f60408385031215614f2f575f5ffd5b8235614f3a81614646565b915060208301356001600160401b03811115614f54575f5ffd5b8301601f81018513614f64575f5ffd5b8035614f7261494082614901565b8082825260208201915060208360051b850101925087831115614f93575f5ffd5b602084015b838110156150b85780356001600160401b03811115614fb5575f5ffd5b85016080818b03601f19011215614fca575f5ffd5b614fd261466e565b614fdf8b602084016146d9565b815260608201356001600160401b03811115614ff9575f5ffd5b6150088c602083860101614923565b60208301525060808201356001600160401b03811115615026575f5ffd5b6020818401019250508a601f83011261503d575f5ffd5b813561504b61494082614901565b8082825260208201915060208360051b86010192508d83111561506c575f5ffd5b6020850194505b828510156150a25784356001600160401b0381168114615091575f5ffd5b825260209485019490910190615073565b6040840152505084525060209283019201614f98565b50809450505050509250929050565b5f5f5f604084860312156150d9575f5ffd5b83356150e481614646565b925060208401356001600160401b038111156150fe575f5ffd5b8401601f8101861361510e575f5ffd5b80356001600160401b03811115615123575f5ffd5b866020828401011115615134575f5ffd5b939660209190910195509293505050565b5f5f60408385031215615156575f5ffd5b823561516181614646565b915060208301356001600160401b0381111561517b575f5ffd5b613e0185828601614e27565b5f5f60408385031215615198575f5ffd5b82356151a381614646565b946020939093013593505050565b5f602082840312156151c1575f5ffd5b81518015158114610756575f5ffd5b634e487b7160e01b5f52603260045260245ffd5b5f8235603e198336030181126151f8575f5ffd5b9190910192915050565b5f60208284031215615212575f5ffd5b610756826146c6565b6040810161097a82846147e2565b5f5f8335601e1984360301811261523e575f5ffd5b8301803591506001600160401b03821115615257575f5ffd5b6020019150600581901b36038213156118c5575f5ffd5b6060810161527c82856147e2565b6001600160a01b039290921660409190910152919050565b604081525f6152a66040830185614bb0565b8281036020840152611e298185614bb0565b5f602082840312156152c8575f5ffd5b81516001600160401b038111156152dd575f5ffd5b8201601f810184136152ed575f5ffd5b80516152fb61494082614901565b8082825260208201915060208360051b85010192508683111561531c575f5ffd5b602084015b838110156153b95780516001600160401b0381111561533e575f5ffd5b8501603f8101891361534e575f5ffd5b602081015161535f61494082614901565b808282526020820191506020808460051b8601010192508b831115615382575f5ffd5b6040840193505b828410156153a4578351825260209384019390910190615389565b86525050602093840193919091019050615321565b509695505050505050565b634e487b7160e01b5f52601160045260245ffd5b8181038181111561097a5761097a6153c4565b6001600160401b03828116828216039081111561097a5761097a6153c4565b5f81600f0b60016001607f1b03198103615426576154266153c4565b5f0392915050565b600f81810b9083900b0160016001607f1b03811360016001607f1b03198212171561097a5761097a6153c4565b6001600160a01b038616815260c0810161547860208301876147e2565b6001600160a01b039490941660608201526001600160401b0392909216608083015263ffffffff1660a09091015292915050565b5f5f8335601e198436030181126154c1575f5ffd5b8301803591506001600160401b038211156154da575f5ffd5b6020019150368190038213156118c5575f5ffd5b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b6001600160a01b03881681525f60c08201615534602084018a6147e2565b60c060608401528690528660e083015f5b8881101561557557823561555881614646565b6001600160a01b0316825260209283019290910190600101615545565b5083810360808501526155888188614a1a565b91505082810360a084015261559e8185876154ee565b9a9950505050505050505050565b5f602082840312156155bc575f5ffd5b813561ffff81168114610756575f5ffd5b63ffffffff818116838216019081111561097a5761097a6153c4565b8183526020830192505f815f5b8481101561483b5763ffffffff61560c836146c6565b16865260209586019591909101906001016155f6565b6001600160a01b03841681526040602082018190525f90611e2990830184866155e9565b602081525f612fc36020830184866154ee565b6001600160a01b03861681526060602082018190525f9061567d90830186886155e9565b82810360408401526156908185876154ee565b98975050505050505050565b5f602082840312156156ac575f5ffd5b815161075681614646565b80516020808301519190811015614e37575f1960209190910360031b1b16919050565b5f600182016156eb576156eb6153c4565b5060010190565b5f81615700576157006153c4565b505f190190565b600f82810b9082900b0360016001607f1b0319811260016001607f1b038213171561097a5761097a6153c4565b634e487b7160e01b5f52601260045260245ffd5b634e487b7160e01b5f52602160045260245ffd5b8082018082111561097a5761097a6153c4565b8082018281125f83128015821682158216171561578e5761578e6153c4565b505092915050565b634e487b7160e01b5f52603160045260245ffd5b5f826157c457634e487b7160e01b5f52601260045260245ffd5b50049056fea2646970667358221220b6448b6e0c870da2f921bd7c4483b01f34691ed74ee37710fc519e5a80ab26a164736f6c634300081b0033", + Bin: "0x610120604052348015610010575f5ffd5b50604051615a79380380615a7983398101604081905261002f91610180565b82858383876001600160a01b03811661005b576040516339b190bb60e11b815260040160405180910390fd5b6001600160a01b0390811660805292831660a05263ffffffff91821660c0521660e052166101005261008b610095565b50505050506101e9565b5f54610100900460ff16156101005760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff9081161461014f575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b0381168114610165575f5ffd5b50565b805163ffffffff8116811461017b575f5ffd5b919050565b5f5f5f5f5f60a08688031215610194575f5ffd5b855161019f81610151565b60208701519095506101b081610151565b60408701519094506101c181610151565b92506101cf60608701610168565b91506101dd60808701610168565b90509295509295909350565b60805160a05160c05160e051610100516157ff61027a5f395f81816103f9015261359701525f81816105480152613b9701525f818161031e015281816120c601526127bd01525f81816106c701528181610c77015281816115fc01528181611c6301528181611ccd0152612a8401525f818161056f0152818161077201528181611d72015261320e01526157ff5ff3fe608060405234801561000f575f5ffd5b5060043610610281575f3560e01c80636e875dba11610156578063adc2e3d9116100ca578063cd6dc68711610084578063cd6dc6871461069c578063d3d96ff4146106af578063df5cf723146106c2578063f2fde38b146106e9578063f605ce08146106fc578063fabc1cbc1461070f575f5ffd5b8063adc2e3d91461060e578063b2447af714610621578063b66bd98914610634578063b9fbaed114610647578063ba1a84e514610676578063c221d8ae14610689575f5ffd5b80638ce648541161011b5780638ce64854146105915780638da5cb5b146105b157806394d7d00c146105c2578063952899ee146105d5578063a9333ec8146105e8578063a9821821146105fb575f5ffd5b80636e875dba14610515578063715018a61461052857806379ae50cd146105305780637bc1ef6114610543578063886f11951461056a575f5ffd5b80634657e26a116101f8578063595c6a67116101b2578063595c6a67146104875780635ac86ab71461048f5780635c975abb146104b2578063670d3ba2146104c45780636cfb4481146104d75780636e3492b514610502575f5ffd5b80634657e26a146103f45780634a10ffe51461041b5780634b5046ef1461043b57806350feea201461044e578063547afb871461046157806356c483e614610474575f5ffd5b80632981eb77116102495780632981eb77146103195780632bab2c4a14610355578063304c10cd1461037557806336352057146103a057806340120dab146103b35780634177a87c146103d4575f5ffd5b806310e1b9b814610285578063136439dd146102ae57806315fe5028146102c3578063260dc758146102e3578063261f84e014610306575b5f5ffd5b610298610293366004614736565b610722565b6040516102a5919061477d565b60405180910390f35b6102c16102bc3660046147b0565b61075d565b005b6102d66102d13660046147c7565b610832565b6040516102a59190614845565b6102f66102f1366004614857565b610949565b60405190151581526020016102a5565b6102c16103143660046148b1565b610980565b6103407f000000000000000000000000000000000000000000000000000000000000000081565b60405163ffffffff90911681526020016102a5565b610368610363366004614996565b610c23565b6040516102a59190614a4a565b6103886103833660046147c7565b610f10565b6040516001600160a01b0390911681526020016102a5565b6102c16103ae366004614aad565b610f3f565b6103c66103c1366004614aff565b611751565b6040516102a5929190614b8c565b6103e76103e2366004614857565b6118cc565b6040516102a59190614be9565b6103887f000000000000000000000000000000000000000000000000000000000000000081565b61042e610429366004614bfb565b6118f0565b6040516102a59190614c3e565b6102c1610449366004614c89565b611998565b6102c161045c366004614d09565b611a52565b61042e61046f366004614d67565b611bb0565b6102c1610482366004614da9565b611c58565b6102c1611d5d565b6102f661049d366004614ddc565b606654600160ff9092169190911b9081161490565b6066545b6040519081526020016102a5565b6102f66104d2366004614dfc565b611e0c565b6104ea6104e5366004614aff565b611e1d565b6040516001600160401b0390911681526020016102a5565b6102c1610510366004614e3d565b611e32565b6103e7610523366004614857565b612202565b6102c1612213565b6102d661053e3660046147c7565b612224565b6103407f000000000000000000000000000000000000000000000000000000000000000081565b6103887f000000000000000000000000000000000000000000000000000000000000000081565b6105a461059f366004614e6e565b6122fe565b6040516102a59190614eb1565b6033546001600160a01b0316610388565b61042e6105d0366004614ec3565b6123c3565b6102c16105e3366004614f1e565b6124af565b6104ea6105f6366004614aff565b612976565b6102c16106093660046150c7565b6129a5565b6102c161061c366004615145565b612a15565b6104b661062f366004614857565b612d64565b6102c1610642366004614d09565b612d86565b61065a6106553660046147c7565b612ee0565b60408051921515835263ffffffff9091166020830152016102a5565b6104b66106843660046147c7565b612f7a565b6103e7610697366004614dfc565b612f9a565b6102c16106aa366004615187565b612fcb565b6102c16106bd366004614aff565b6130e8565b6103887f000000000000000000000000000000000000000000000000000000000000000081565b6102c16106f73660046147c7565b613187565b6104ea61070a366004614aff565b613200565b6102c161071d3660046147b0565b61320c565b604080516060810182525f80825260208201819052918101829052906107518561074b86613322565b85613385565b925050505b9392505050565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa1580156107bf573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107e391906151b1565b61080057604051631d77d47760e21b815260040160405180910390fd5b60665481811681146108255760405163c61dca5d60e01b815260040160405180910390fd5b61082e826134f1565b5050565b6001600160a01b0381165f908152609d60205260408120606091906108569061352e565b90505f816001600160401b038111156108715761087161465a565b6040519080825280602002602001820160405280156108b557816020015b604080518082019091525f808252602082015281526020019060019003908161088f5790505b5090505f5b82811015610941576001600160a01b0385165f908152609d6020526040902061091c906108e79083613537565b604080518082019091525f80825260208201525060408051808201909152606082901c815263ffffffff909116602082015290565b82828151811061092e5761092e6151d0565b60209081029190910101526001016108ba565b509392505050565b60208082015182516001600160a01b03165f90815260989092526040822061097a9163ffffffff9081169061354216565b92915050565b8261098a81613559565b6109a75760405163932d94f760e01b815260040160405180910390fd5b5f5b82811015610c1c575f6040518060400160405280876001600160a01b031681526020018686858181106109de576109de6151d0565b90506020028101906109f091906151e4565b6109fe906020810190615202565b63ffffffff168152509050610a48816020015163ffffffff1660985f896001600160a01b03166001600160a01b031681526020019081526020015f2061360390919063ffffffff16565b610a6557604051631fb1705560e21b815260040160405180910390fd5b7f31629285ead2335ae0933f86ed2ae63321f7af77b4e6eaabc42c057880977e6c6040518060400160405280886001600160a01b03168152602001836020015163ffffffff16815250604051610abb919061521b565b60405180910390a15f610acd82613322565b90505f5b868685818110610ae357610ae36151d0565b9050602002810190610af591906151e4565b610b03906020810190615229565b9050811015610c1157610b79878786818110610b2157610b216151d0565b9050602002810190610b3391906151e4565b610b41906020810190615229565b83818110610b5157610b516151d0565b9050602002016020810190610b6691906147c7565b5f8481526099602052604090209061360e565b507f7ab260fe0af193db5f4986770d831bda4ea46099dc817e8b6716dcae8af8e88b83888887818110610bae57610bae6151d0565b9050602002810190610bc091906151e4565b610bce906020810190615229565b84818110610bde57610bde6151d0565b9050602002016020810190610bf391906147c7565b604051610c0192919061526e565b60405180910390a1600101610ad1565b5050506001016109a9565b5050505050565b606083516001600160401b03811115610c3e57610c3e61465a565b604051908082528060200260200182016040528015610c7157816020015b6060815260200190600190039081610c5c5790505b5090505f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663f0e0e67686866040518363ffffffff1660e01b8152600401610cc3929190615294565b5f60405180830381865afa158015610cdd573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610d0491908101906152b8565b90505f5b8551811015610f06575f868281518110610d2457610d246151d0565b6020026020010151905085516001600160401b03811115610d4757610d4761465a565b604051908082528060200260200182016040528015610d70578160200160208202803683370190505b50848381518110610d8357610d836151d0565b60209081029190910101525f5b8651811015610efc575f878281518110610dac57610dac6151d0565b6020908102919091018101516001600160a01b038086165f90815260a1845260408082209284168252919093528220909250610de790613622565b9050806001600160401b03165f03610e00575050610ef4565b5f610e0c858d85610722565b90508863ffffffff16816040015163ffffffff1611158015610e3457505f8160200151600f0b125b15610e5657610e4a815f01518260200151613635565b6001600160401b031681525b80515f90610e71906001600160401b03908116908516613649565b9050610eb881898981518110610e8957610e896151d0565b60200260200101518781518110610ea257610ea26151d0565b602002602001015161365d90919063ffffffff16565b898881518110610eca57610eca6151d0565b60200260200101518681518110610ee357610ee36151d0565b602002602001018181525050505050505b600101610d90565b5050600101610d08565b5050949350505050565b6001600160a01b038082165f908152609760205260408120549091168015610f385780610756565b5090919050565b606654600190600290811603610f685760405163840a48d560e01b815260040160405180910390fd5b82610f7281613559565b610f8f5760405163932d94f760e01b815260040160405180910390fd5b5f6040518060400160405280866001600160a01b03168152602001856020016020810190610fbd9190615202565b63ffffffff16905290505f610fde610fd860208701876147c7565b83613671565b9050610fed6060860186615229565b9050610ffc6040870187615229565b90501461101c576040516343714afd60e01b815260040160405180910390fd5b60208083015183516001600160a01b03165f9081526098909252604090912061104e9163ffffffff9081169061354216565b61106b57604051631fb1705560e21b815260040160405180910390fd5b806110895760405163ebbff49760e01b815260040160405180910390fd5b5f6110976040870187615229565b90506001600160401b038111156110b0576110b061465a565b6040519080825280602002602001820160405280156110d9578160200160208202803683370190505b5090505f5b6110eb6040880188615229565b90508110156116e25780158061117e57506111096040880188615229565b6111146001846153d8565b818110611123576111236151d0565b905060200201602081019061113891906147c7565b6001600160a01b031661114e6040890189615229565b8381811061115e5761115e6151d0565b905060200201602081019061117391906147c7565b6001600160a01b0316115b61119b57604051639f1c805360e01b815260040160405180910390fd5b6111a86060880188615229565b828181106111b8576111b86151d0565b905060200201355f1080156111f85750670de0b6b3a76400006111de6060890189615229565b838181106111ee576111ee6151d0565b9050602002013511155b61121557604051631353603160e01b815260040160405180910390fd5b6112716112256040890189615229565b83818110611235576112356151d0565b905060200201602081019061124a91906147c7565b60995f61125688613322565b81526020019081526020015f206136e790919063ffffffff16565b61128e576040516331bc342760e11b815260040160405180910390fd5b5f806112e06112a060208b018b6147c7565b6112a988613322565b6112b660408d018d615229565b878181106112c6576112c66151d0565b90506020020160208101906112db91906147c7565b613385565b805191935091506001600160401b03165f036112fd5750506116da565b5f61133861130e60608c018c615229565b8681811061131e5761131e6151d0565b85516001600160401b031692602090910201359050613708565b83519091506113536001600160401b03808416908316613649565b868681518110611365576113656151d0565b60200260200101818152505081835f0181815161138291906153eb565b6001600160401b031690525083518290859061139f9083906153eb565b6001600160401b03169052506020840180518391906113bf9083906153eb565b6001600160401b031690525060208301515f600f9190910b12156114da575f6114226113ee60608e018e615229565b888181106113fe576113fe6151d0565b9050602002013585602001516114139061540a565b6001600160801b031690613708565b9050806001600160401b03168460200181815161143f919061542e565b600f0b9052507f1487af5418c47ee5ea45ef4a93398668120890774a9e13487e61e9dc3baf76dd61147360208e018e6147c7565b8a8e80604001906114849190615229565b8a818110611494576114946151d0565b90506020020160208101906114a991906147c7565b6114ba885f01518960200151613635565b88604001516040516114d095949392919061545b565b60405180910390a1505b61152c6114ea60208d018d6147c7565b6114f38a613322565b61150060408f018f615229565b89818110611510576115106151d0565b905060200201602081019061152591906147c7565b878761371e565b7f1487af5418c47ee5ea45ef4a93398668120890774a9e13487e61e9dc3baf76dd61155a60208d018d6147c7565b8961156860408f018f615229565b89818110611578576115786151d0565b905060200201602081019061158d91906147c7565b86516040516115a19493929190439061545b565b60405180910390a16115f26115b960208d018d6147c7565b6115c660408e018e615229565b888181106115d6576115d66151d0565b90506020020160208101906115eb91906147c7565b865161395e565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001663601bb36f61162e60208e018e6147c7565b61163b60408f018f615229565b8981811061164b5761164b6151d0565b905060200201602081019061166091906147c7565b875160405160e085901b6001600160e01b03191681526001600160a01b0393841660048201529290911660248301526001600160401b0380861660448401521660648201526084015f604051808303815f87803b1580156116bf575f5ffd5b505af11580156116d1573d5f5f3e3d5ffd5b50505050505050505b6001016110de565b507f80969ad29428d6797ee7aad084f9e4a42a82fc506dcd2ca3b6fb431f85ccebe561171160208801886147c7565b8461171f60408a018a615229565b8561172d60808d018d6154ac565b6040516117409796959493929190615516565b60405180910390a150505050505050565b6001600160a01b0382165f908152609d6020526040812060609182916117769061352e565b90505f816001600160401b038111156117915761179161465a565b6040519080825280602002602001820160405280156117d557816020015b604080518082019091525f80825260208201528152602001906001900390816117af5790505b5090505f826001600160401b038111156117f1576117f161465a565b60405190808252806020026020018201604052801561183a57816020015b604080516060810182525f80825260208083018290529282015282525f1990920191018161180f5790505b5090505f5b838110156118bd576001600160a01b0388165f908152609d6020526040812061186c906108e79084613537565b905080848381518110611881576118816151d0565b602002602001018190525061189789828a610722565b8383815181106118a9576118a96151d0565b60209081029190910101525060010161183f565b509093509150505b9250929050565b60605f61075660995f6118de86613322565b81526020019081526020015f206139e0565b60605f83516001600160401b0381111561190c5761190c61465a565b604051908082528060200260200182016040528015611935578160200160208202803683370190505b5090505f5b845181101561094157611966858281518110611958576119586151d0565b602002602001015185612976565b828281518110611978576119786151d0565b6001600160401b039092166020928302919091019091015260010161193a565b6066545f906001908116036119c05760405163840a48d560e01b815260040160405180910390fd5b8382146119e0576040516343714afd60e01b815260040160405180910390fd5b5f5b84811015611a4957611a4187878784818110611a0057611a006151d0565b9050602002016020810190611a1591906147c7565b868685818110611a2757611a276151d0565b9050602002016020810190611a3c91906155ac565b6139ec565b6001016119e2565b50505050505050565b83611a5c81613559565b611a795760405163932d94f760e01b815260040160405180910390fd5b604080518082019091526001600160a01b038616815263ffffffff851660208201525f611aa582613322565b9050611ae6826020015163ffffffff1660985f8a6001600160a01b03166001600160a01b031681526020019081526020015f2061354290919063ffffffff16565b611b0357604051631fb1705560e21b815260040160405180910390fd5b5f5b84811015611ba657611b22868683818110610b5157610b516151d0565b611b3f5760405163585cfb2f60e01b815260040160405180910390fd5b7f7ab260fe0af193db5f4986770d831bda4ea46099dc817e8b6716dcae8af8e88b83878784818110611b7357611b736151d0565b9050602002016020810190611b8891906147c7565b604051611b9692919061526e565b60405180910390a1600101611b05565b5050505050505050565b60605f82516001600160401b03811115611bcc57611bcc61465a565b604051908082528060200260200182016040528015611bf5578160200160208202803683370190505b5090505f5b835181101561094157611c2685858381518110611c1957611c196151d0565b6020026020010151612976565b828281518110611c3857611c386151d0565b6001600160401b0390921660209283029190910190910152600101611bfa565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614611d5357611c9182613559565b611cae576040516348f5c3ed60e01b815260040160405180910390fd5b6040516336b87bd760e11b81526001600160a01b0383811660048301527f00000000000000000000000000000000000000000000000000000000000000001690636d70f7ae90602401602060405180830381865afa158015611d12573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611d3691906151b1565b611d535760405163ccea9e6f60e01b815260040160405180910390fd5b61082e8282613af0565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa158015611dbf573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611de391906151b1565b611e0057604051631d77d47760e21b815260040160405180910390fd5b611e0a5f196134f1565b565b5f61075683609a5f61125686613322565b5f5f611e298484613c9c565b95945050505050565b606654600290600490811603611e5b5760405163840a48d560e01b815260040160405180910390fd5b611e70611e6b60208401846147c7565b613559565b80611e895750611e89611e6b60408401602085016147c7565b611ea6576040516348f5c3ed60e01b815260040160405180910390fd5b5f5b611eb56040840184615229565b9050811015612177575f6040518060400160405280856020016020810190611edd91906147c7565b6001600160a01b03168152602001611ef86040870187615229565b85818110611f0857611f086151d0565b9050602002016020810190611f1d9190615202565b63ffffffff168152509050611f6a816020015163ffffffff1660985f876020016020810190611f4c91906147c7565b6001600160a01b0316815260208101919091526040015f2090613542565b611f8757604051631fb1705560e21b815260040160405180910390fd5b609e5f611f9760208701876147c7565b6001600160a01b03166001600160a01b031681526020019081526020015f205f611fc083613322565b815260208101919091526040015f205460ff16611ff0576040516325131d4f60e01b815260040160405180910390fd5b61202a611ffc82613322565b609c5f61200c60208901896147c7565b6001600160a01b0316815260208101919091526040015f2090613e0b565b5061206261203b60208601866147c7565b609a5f61204785613322565b81526020019081526020015f20613e1690919063ffffffff16565b5061207060208501856147c7565b6001600160a01b03167fad34c3070be1dffbcaa499d000ba2b8d9848aefcac3059df245dd95c4ece14fe826040516120a8919061521b565b60405180910390a2604080518082019091525f8152602081016120eb7f0000000000000000000000000000000000000000000000000000000000000000436155cd565b63ffffffff169052609e5f61210360208801886147c7565b6001600160a01b03166001600160a01b031681526020019081526020015f205f61212c84613322565b81526020808201929092526040015f2082518154939092015163ffffffff166101000264ffffffff00199215159290921664ffffffffff199093169290921717905550600101611ea8565b5061218b61038360408401602085016147c7565b6001600160a01b0316639d8e0c236121a660208501856147c7565b6121b36040860186615229565b6040518463ffffffff1660e01b81526004016121d193929190615622565b5f604051808303815f87803b1580156121e8575f5ffd5b505af19250505080156121f9575060015b1561082e575050565b606061097a609a5f6118de85613322565b61221b613e2a565b611e0a5f613e84565b6001600160a01b0381165f908152609c60205260408120606091906122489061352e565b90505f816001600160401b038111156122635761226361465a565b6040519080825280602002602001820160405280156122a757816020015b604080518082019091525f80825260208201528152602001906001900390816122815790505b5090505f5b82811015610941576001600160a01b0385165f908152609c602052604090206122d9906108e79083613537565b8282815181106122eb576122eb6151d0565b60209081029190910101526001016122ac565b60605f84516001600160401b0381111561231a5761231a61465a565b60405190808252806020026020018201604052801561236357816020015b604080516060810182525f80825260208083018290529282015282525f199092019101816123385790505b5090505f5b85518110156123ba57612395868281518110612386576123866151d0565b60200260200101518686610722565b8282815181106123a7576123a76151d0565b6020908102919091010152600101612368565b50949350505050565b60605f83516001600160401b038111156123df576123df61465a565b604051908082528060200260200182016040528015612408578160200160208202803683370190505b5090505f5b84518110156123ba576001600160a01b0386165f90815260a160205260408120865161247d92879291899086908110612448576124486151d0565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020015f20613ed590919063ffffffff16565b82828151811061248f5761248f6151d0565b6001600160401b039092166020928302919091019091015260010161240d565b6066545f906001908116036124d75760405163840a48d560e01b815260040160405180910390fd5b6124e083613559565b6124fd576040516348f5c3ed60e01b815260040160405180910390fd5b5f5f5f61250986612ee0565b915091508161252b5760405163fa55fc8160e01b815260040160405180910390fd5b91505f90505b8351811015610c1c5783818151811061254c5761254c6151d0565b6020026020010151604001515184828151811061256b5761256b6151d0565b6020026020010151602001515114612596576040516343714afd60e01b815260040160405180910390fd5b5f8482815181106125a9576125a96151d0565b602090810291909101810151518082015181516001600160a01b03165f908152609890935260409092209092506125e99163ffffffff9081169061354216565b61260657604051631fb1705560e21b815260040160405180910390fd5b5f6126118783613671565b90505f5b868481518110612627576126276151d0565b6020026020010151602001515181101561296b575f87858151811061264e5761264e6151d0565b602002602001015160200151828151811061266b5761266b6151d0565b60200260200101519050612682898261ffff6139ec565b5f5f6126918b61074b88613322565b915091508060200151600f0b5f146126bc57604051630d8fcbe360e41b815260040160405180910390fd5b5f6126c987858489613ee9565b905061270e825f01518c8a815181106126e4576126e46151d0565b6020026020010151604001518781518110612701576127016151d0565b6020026020010151613f1f565b600f0b602083018190525f0361273757604051634606179360e11b815260040160405180910390fd5b5f8260200151600f0b121561287b5780156127fd576127b861275888613322565b6001600160a01b03808f165f90815260a360209081526040808320938a16835292905220908154600160801b90819004600f0b5f818152600180860160205260409091209390935583546001600160801b03908116939091011602179055565b6127e27f0000000000000000000000000000000000000000000000000000000000000000436155cd565b6127ed9060016155cd565b63ffffffff1660408301526128e8565b61280f83602001518360200151613635565b6001600160401b031660208401528a518b9089908110612831576128316151d0565b602002602001015160400151858151811061284e5761284e6151d0565b6020908102919091018101516001600160401b031683525f9083015263ffffffff431660408301526128e8565b5f8260200151600f0b13156128e85761289c83602001518360200151613635565b6001600160401b0390811660208501819052845190911610156128d257604051636c9be0bf60e01b815260040160405180910390fd5b6128dc89436155cd565b63ffffffff1660408301525b6128fd8c6128f589613322565b86868661371e565b7f1487af5418c47ee5ea45ef4a93398668120890774a9e13487e61e9dc3baf76dd8c61292b6108e78a613322565b8661293d865f01518760200151613635565b866040015160405161295395949392919061545b565b60405180910390a15050600190920191506126159050565b505050600101612531565b6001600160a01b038083165f90815260a160209081526040808320938516835292905290812061075690613622565b826129af81613559565b6129cc5760405163932d94f760e01b815260040160405180910390fd5b836001600160a01b03167fa89c1dc243d8908a96dd84944bcc97d6bc6ac00dd78e20621576be6a3c9437138484604051612a07929190615646565b60405180910390a250505050565b606654600290600490811603612a3e5760405163840a48d560e01b815260040160405180910390fd5b82612a4881613559565b612a655760405163932d94f760e01b815260040160405180910390fd5b6040516336b87bd760e11b81526001600160a01b0385811660048301527f00000000000000000000000000000000000000000000000000000000000000001690636d70f7ae90602401602060405180830381865afa158015612ac9573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612aed91906151b1565b612b0a5760405163ccea9e6f60e01b815260040160405180910390fd5b5f5b612b196020850185615229565b9050811015612ce157604080518082019091525f9080612b3c60208801886147c7565b6001600160a01b03168152602001868060200190612b5a9190615229565b85818110612b6a57612b6a6151d0565b9050602002016020810190612b7f9190615202565b63ffffffff90811690915260208083015183516001600160a01b03165f90815260989092526040909120929350612bbb92919081169061354216565b612bd857604051631fb1705560e21b815260040160405180910390fd5b612be28682613671565b15612c0057604051636c6c6e2760e11b815260040160405180910390fd5b612c29612c0c82613322565b6001600160a01b0388165f908152609c6020526040902090613603565b50612c5586609a5f612c3a85613322565b81526020019081526020015f2061360e90919063ffffffff16565b50856001600160a01b03167f43232edf9071753d2321e5fa7e018363ee248e5f2142e6c08edd3265bfb4895e82604051612c8f919061521b565b60405180910390a26001600160a01b0386165f908152609e60205260408120600191612cba84613322565b815260208101919091526040015f20805460ff191691151591909117905550600101612b0c565b50612cf261038360208501856147c7565b6001600160a01b031663adcf73f785612d0e6020870187615229565b612d1b60408901896154ac565b6040518663ffffffff1660e01b8152600401612d3b959493929190615659565b5f604051808303815f87803b158015612d52575f5ffd5b505af1158015611ba6573d5f5f3e3d5ffd5b5f61097a609a5f612d7485613322565b81526020019081526020015f2061352e565b83612d9081613559565b612dad5760405163932d94f760e01b815260040160405180910390fd5b6040805180820182526001600160a01b03871680825263ffffffff80881660208085018290525f93845260989052939091209192612dec929161354216565b612e0957604051631fb1705560e21b815260040160405180910390fd5b5f612e1382613322565b90505f5b84811015611ba657612e5c868683818110612e3457612e346151d0565b9050602002016020810190612e4991906147c7565b5f84815260996020526040902090613e16565b612e79576040516331bc342760e11b815260040160405180910390fd5b7f7b4b073d80dcac55a11177d8459ad9f664ceeb91f71f27167bb14f8152a7eeee83878784818110612ead57612ead6151d0565b9050602002016020810190612ec291906147c7565b604051612ed092919061526e565b60405180910390a1600101612e17565b6001600160a01b0381165f908152609b602090815260408083208151608081018352905463ffffffff80821680845260ff600160201b8404161515958401869052650100000000008304821694840194909452600160481b909104166060820181905284939192919015801590612f615750826060015163ffffffff164310155b15612f70575050604081015160015b9590945092505050565b6001600160a01b0381165f90815260986020526040812061097a9061352e565b6001600160a01b0382165f908152609f6020526040812060609190612fc390826118de86613322565b949350505050565b5f54610100900460ff1615808015612fe957505f54600160ff909116105b806130025750303b15801561300257505f5460ff166001145b61306a5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b5f805460ff19166001179055801561308b575f805461ff0019166101001790555b613094826134f1565b61309d83613e84565b80156130e3575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498906020015b60405180910390a15b505050565b816130f281613559565b61310f5760405163932d94f760e01b815260040160405180910390fd5b6001600160a01b038381165f90815260976020526040902080546001600160a01b0319169184169190911790557f2ae945c40c44dc0ec263f95609c3fdc6952e0aefa22d6374e44f2c997acedf858361316781610f10565b604080516001600160a01b039384168152929091166020830152016130da565b61318f613e2a565b6001600160a01b0381166131f45760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401613061565b6131fd81613e84565b50565b5f5f6123ba8484613c9c565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015613268573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061328c919061569c565b6001600160a01b0316336001600160a01b0316146132bd5760405163794821ff60e01b815260040160405180910390fd5b606654801982198116146132e45760405163c61dca5d60e01b815260040160405180910390fd5b606682905560405182815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c9060200160405180910390a25050565b5f815f0151826020015163ffffffff1660405160200161336d92919060609290921b6bffffffffffffffffffffffff1916825260a01b6001600160a01b031916601482015260200190565b60405160208183030381529060405261097a906156b7565b6040805180820182525f80825260208083018290528351606081018552828152808201839052808501839052845180860186526001600160a01b03898116855260a18452868520908816855290925293822092939281906133e590613622565b6001600160401b0390811682526001600160a01b038981165f81815260a260209081526040808320948c168084529482528083205486169682019690965291815260a082528481208b8252825284812092815291815290839020835160608101855290549283168152600160401b8304600f0b91810191909152600160c01b90910463ffffffff169181018290529192504310156134875790925090506134e9565b613498815f01518260200151613635565b6001600160401b0316815260208101515f600f9190910b12156134d6576134c782602001518260200151613635565b6001600160401b031660208301525b5f60408201819052602082015290925090505b935093915050565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a250565b5f61097a825490565b5f6107568383613f36565b5f8181526001830160205260408120541515610756565b604051631beb2b9760e31b81526001600160a01b0382811660048301523360248301523060448301525f80356001600160e01b0319166064840152917f00000000000000000000000000000000000000000000000000000000000000009091169063df595cb8906084016020604051808303815f875af11580156135df573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061097a91906151b1565b5f6107568383613f5c565b5f610756836001600160a01b038416613f5c565b5f61097a82670de0b6b3a7640000613fa8565b5f610756826001600160401b03851661542e565b5f61075683670de0b6b3a764000084613fec565b5f6107568383670de0b6b3a7640000613fec565b6001600160a01b0382165f908152609e6020526040812081908161369485613322565b815260208082019290925260409081015f2081518083019092525460ff8116151580835261010090910463ffffffff1692820192909252915080612fc357506020015163ffffffff164311159392505050565b6001600160a01b0381165f9081526001830160205260408120541515610756565b5f6107568383670de0b6b3a764000060016140d1565b6020808301516001600160a01b038088165f90815260a284526040808220928816825291909352909120546001600160401b039081169116146137e457602082810180516001600160a01b038881165f81815260a286526040808220938a1680835293875290819020805467ffffffffffffffff19166001600160401b0395861617905593518451918252948101919091529216908201527facf9095feb3a370c9cf692421c69ef320d4db5c66e6a7d29c7694eb02364fc559060600160405180910390a15b6001600160a01b038086165f90815260a060209081526040808320888452825280832093871683529281529082902083518154928501519385015163ffffffff16600160c01b0263ffffffff60c01b196001600160801b038616600160401b026001600160c01b03199095166001600160401b03909316929092179390931716919091179055600f0b156138c6576001600160a01b0385165f908152609f60209081526040808320878452909152902061389e908461360e565b506001600160a01b0385165f908152609d602052604090206138c09085613603565b50610c1c565b80516001600160401b03165f03610c1c576001600160a01b0385165f908152609f6020908152604080832087845290915290206139039084613e16565b506001600160a01b0385165f908152609f60209081526040808320878452909152902061392f9061352e565b5f03610c1c576001600160a01b0385165f908152609d602052604090206139569085613e0b565b505050505050565b6001600160a01b038084165f90815260a16020908152604080832093861683529290522061398d90438361412a565b604080516001600160a01b038086168252841660208201526001600160401b038316918101919091527f1c6458079a41077d003c11faf9bf097e693bd67979e4e6500bac7b29db779b5c906060016130da565b60605f6107568361413e565b6001600160a01b038381165f90815260a360209081526040808320938616835292905290812054600f81810b600160801b909204900b035b5f81118015613a3657508261ffff1682105b15610c1c576001600160a01b038086165f90815260a3602090815260408083209388168352929052908120613a6a90614197565b90505f5f613a79888489613385565b91509150806040015163ffffffff16431015613a9757505050610c1c565b613aa4888489858561371e565b6001600160a01b038089165f90815260a360209081526040808320938b16835292905220613ad1906141e9565b50613adb856156da565b9450613ae6846156f2565b9350505050613a24565b6001600160a01b0382165f908152609b60209081526040918290208251608081018452905463ffffffff808216835260ff600160201b830416151593830193909352650100000000008104831693820193909352600160481b909204166060820181905215801590613b6c5750806060015163ffffffff164310155b15613b8657604081015163ffffffff168152600160208201525b63ffffffff82166040820152613bbc7f0000000000000000000000000000000000000000000000000000000000000000436155cd565b613bc79060016155cd565b63ffffffff90811660608381019182526001600160a01b0386165f818152609b602090815260409182902087518154838a0151858b01519851928a1664ffffffffff1990921691909117600160201b91151591909102176cffffffffffffffff0000000000191665010000000000978916979097026cffffffff000000000000000000191696909617600160481b968816968702179055815192835294871694820194909452928301919091527f4e85751d6331506c6c62335f207eb31f12a61e570f34f5c17640308785c6d4db91016130da565b6001600160a01b038281165f81815260a2602090815260408083209486168084529482528083205493835260a38252808320948352939052918220546001600160401b039091169190600f81810b600160801b909204900b03815b81811015613dc7576001600160a01b038087165f90815260a3602090815260408083209389168352929052908120613d2f9083614266565b6001600160a01b038881165f90815260a0602090815260408083208584528252808320938b16835292815290829020825160608101845290546001600160401b0381168252600160401b8104600f0b92820192909252600160c01b90910463ffffffff16918101829052919250431015613daa575050613dc7565b613db8868260200151613635565b95505050806001019050613cf7565b506001600160a01b038086165f90815260a1602090815260408083209388168352929052208390613df790613622565b613e0191906153eb565b9150509250929050565b5f61075683836142d5565b5f610756836001600160a01b0384166142d5565b6033546001600160a01b03163314611e0a5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401613061565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b5f6107568383670de0b6b3a76400006143b8565b5f613efa8460995f61125689613322565b8015613f035750815b8015611e2957505090516001600160401b031615159392505050565b5f6107566001600160401b03808516908416615707565b5f825f018281548110613f4b57613f4b6151d0565b905f5260205f200154905092915050565b5f818152600183016020526040812054613fa157508154600181810184555f84815260208082209093018490558454848252828601909352604090209190915561097a565b505f61097a565b81545f908015613fe457613fce84613fc16001846153d8565b5f91825260209091200190565b54600160201b90046001600160e01b0316612fc3565b509092915050565b5f80805f19858709858702925082811083820303915050805f036140235783828161401957614019615734565b0492505050610756565b80841161406a5760405162461bcd60e51b81526020600482015260156024820152744d6174683a206d756c446976206f766572666c6f7760581b6044820152606401613061565b5f8486880960026001871981018816978890046003810283188082028403028082028403028082028403028082028403028082028403029081029092039091025f889003889004909101858311909403939093029303949094049190911702949350505050565b5f5f6140de868686613fec565b905060018360028111156140f4576140f4615748565b14801561411057505f848061410b5761410b615734565b868809115b15611e295761412060018261575c565b9695505050505050565b6130e383836001600160401b038416614400565b6060815f0180548060200260200160405190810160405280929190818152602001828054801561418b57602002820191905f5260205f20905b815481526020019060010190808311614177575b50505050509050919050565b5f6141b18254600f81810b600160801b909204900b131590565b156141cf57604051631ed9509560e11b815260040160405180910390fd5b508054600f0b5f9081526001909101602052604090205490565b5f6142038254600f81810b600160801b909204900b131590565b1561422157604051631ed9509560e11b815260040160405180910390fd5b508054600f0b5f818152600180840160205260408220805492905583546fffffffffffffffffffffffffffffffff191692016001600160801b03169190911790915590565b5f5f61428861427484614503565b85546142839190600f0b61576f565b614570565b8454909150600160801b9004600f90810b9082900b126142bb57604051632d0483c560e21b815260040160405180910390fd5b600f0b5f9081526001939093016020525050604090205490565b5f81815260018301602052604081205480156143af575f6142f76001836153d8565b85549091505f9061430a906001906153d8565b9050818114614369575f865f018281548110614328576143286151d0565b905f5260205f200154905080875f018481548110614348576143486151d0565b5f918252602080832090910192909255918252600188019052604090208390555b855486908061437a5761437a615796565b600190038181905f5260205f20015f90559055856001015f8681526020019081526020015f205f90556001935050505061097a565b5f91505061097a565b82545f90816143c9868683856145d9565b905080156143f6576143e086613fc16001846153d8565b54600160201b90046001600160e01b0316610751565b5091949350505050565b825480156144b6575f61441885613fc16001856153d8565b60408051808201909152905463ffffffff808216808452600160201b9092046001600160e01b03166020840152919250908516101561446a5760405163151b8e3f60e11b815260040160405180910390fd5b805163ffffffff8086169116036144b4578261448b86613fc16001866153d8565b80546001600160e01b0392909216600160201b0263ffffffff9092169190911790555050505050565b505b506040805180820190915263ffffffff92831681526001600160e01b03918216602080830191825285546001810187555f968752952091519051909216600160201b029190921617910155565b5f6001600160ff1b0382111561456c5760405162461bcd60e51b815260206004820152602860248201527f53616665436173743a2076616c756520646f65736e27742066697420696e2061604482015267371034b73a191a9b60c11b6064820152608401613061565b5090565b80600f81900b81146145d45760405162461bcd60e51b815260206004820152602760248201527f53616665436173743a2076616c756520646f65736e27742066697420696e20316044820152663238206269747360c81b6064820152608401613061565b919050565b5f5b81831015610941575f6145ee848461462c565b5f8781526020902090915063ffffffff86169082015463ffffffff16111561461857809250614626565b61462381600161575c565b93505b506145db565b5f61463a60028484186157aa565b6107569084841661575c565b6001600160a01b03811681146131fd575f5ffd5b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b03811182821017156146905761469061465a565b60405290565b604051601f8201601f191681016001600160401b03811182821017156146be576146be61465a565b604052919050565b803563ffffffff811681146145d4575f5ffd5b5f604082840312156146e9575f5ffd5b604080519081016001600160401b038111828210171561470b5761470b61465a565b604052905080823561471c81614646565b815261472a602084016146c6565b60208201525092915050565b5f5f5f60808486031215614748575f5ffd5b833561475381614646565b925061476285602086016146d9565b9150606084013561477281614646565b809150509250925092565b81516001600160401b03168152602080830151600f0b9082015260408083015163ffffffff16908201526060810161097a565b5f602082840312156147c0575f5ffd5b5035919050565b5f602082840312156147d7575f5ffd5b813561075681614646565b80516001600160a01b0316825260209081015163ffffffff16910152565b5f8151808452602084019350602083015f5b8281101561483b576148258683516147e2565b6040959095019460209190910190600101614812565b5093949350505050565b602081525f6107566020830184614800565b5f60408284031215614867575f5ffd5b61075683836146d9565b5f5f83601f840112614881575f5ffd5b5081356001600160401b03811115614897575f5ffd5b6020830191508360208260051b85010111156118c5575f5ffd5b5f5f5f604084860312156148c3575f5ffd5b83356148ce81614646565b925060208401356001600160401b038111156148e8575f5ffd5b6148f486828701614871565b9497909650939450505050565b5f6001600160401b038211156149195761491961465a565b5060051b60200190565b5f82601f830112614932575f5ffd5b813561494561494082614901565b614696565b8082825260208201915060208360051b860101925085831115614966575f5ffd5b602085015b8381101561498c57803561497e81614646565b83526020928301920161496b565b5095945050505050565b5f5f5f5f60a085870312156149a9575f5ffd5b6149b386866146d9565b935060408501356001600160401b038111156149cd575f5ffd5b6149d987828801614923565b93505060608501356001600160401b038111156149f4575f5ffd5b614a0087828801614923565b925050614a0f608086016146c6565b905092959194509250565b5f8151808452602084019350602083015f5b8281101561483b578151865260209586019590910190600101614a2c565b5f602082016020835280845180835260408501915060408160051b8601019250602086015f5b82811015614aa157603f19878603018452614a8c858351614a1a565b94506020938401939190910190600101614a70565b50929695505050505050565b5f5f60408385031215614abe575f5ffd5b8235614ac981614646565b915060208301356001600160401b03811115614ae3575f5ffd5b830160a08186031215614af4575f5ffd5b809150509250929050565b5f5f60408385031215614b10575f5ffd5b8235614b1b81614646565b91506020830135614af481614646565b5f8151808452602084019350602083015f5b8281101561483b57614b7686835180516001600160401b03168252602080820151600f0b9083015260409081015163ffffffff16910152565b6060959095019460209190910190600101614b3d565b604081525f614b9e6040830185614800565b8281036020840152611e298185614b2b565b5f8151808452602084019350602083015f5b8281101561483b5781516001600160a01b0316865260209586019590910190600101614bc2565b602081525f6107566020830184614bb0565b5f5f60408385031215614c0c575f5ffd5b82356001600160401b03811115614c21575f5ffd5b614c2d85828601614923565b9250506020830135614af481614646565b602080825282518282018190525f918401906040840190835b81811015614c7e5783516001600160401b0316835260209384019390920191600101614c57565b509095945050505050565b5f5f5f5f5f60608688031215614c9d575f5ffd5b8535614ca881614646565b945060208601356001600160401b03811115614cc2575f5ffd5b614cce88828901614871565b90955093505060408601356001600160401b03811115614cec575f5ffd5b614cf888828901614871565b969995985093965092949392505050565b5f5f5f5f60608587031215614d1c575f5ffd5b8435614d2781614646565b9350614d35602086016146c6565b925060408501356001600160401b03811115614d4f575f5ffd5b614d5b87828801614871565b95989497509550505050565b5f5f60408385031215614d78575f5ffd5b8235614d8381614646565b915060208301356001600160401b03811115614d9d575f5ffd5b613e0185828601614923565b5f5f60408385031215614dba575f5ffd5b8235614dc581614646565b9150614dd3602084016146c6565b90509250929050565b5f60208284031215614dec575f5ffd5b813560ff81168114610756575f5ffd5b5f5f60608385031215614e0d575f5ffd5b8235614e1881614646565b9150614dd384602085016146d9565b5f60608284031215614e37575f5ffd5b50919050565b5f60208284031215614e4d575f5ffd5b81356001600160401b03811115614e62575f5ffd5b612fc384828501614e27565b5f5f5f60808486031215614e80575f5ffd5b83356001600160401b03811115614e95575f5ffd5b614ea186828701614923565b93505061476285602086016146d9565b602081525f6107566020830184614b2b565b5f5f5f60608486031215614ed5575f5ffd5b8335614ee081614646565b925060208401356001600160401b03811115614efa575f5ffd5b614f0686828701614923565b925050614f15604085016146c6565b90509250925092565b5f5f60408385031215614f2f575f5ffd5b8235614f3a81614646565b915060208301356001600160401b03811115614f54575f5ffd5b8301601f81018513614f64575f5ffd5b8035614f7261494082614901565b8082825260208201915060208360051b850101925087831115614f93575f5ffd5b602084015b838110156150b85780356001600160401b03811115614fb5575f5ffd5b85016080818b03601f19011215614fca575f5ffd5b614fd261466e565b614fdf8b602084016146d9565b815260608201356001600160401b03811115614ff9575f5ffd5b6150088c602083860101614923565b60208301525060808201356001600160401b03811115615026575f5ffd5b6020818401019250508a601f83011261503d575f5ffd5b813561504b61494082614901565b8082825260208201915060208360051b86010192508d83111561506c575f5ffd5b6020850194505b828510156150a25784356001600160401b0381168114615091575f5ffd5b825260209485019490910190615073565b6040840152505084525060209283019201614f98565b50809450505050509250929050565b5f5f5f604084860312156150d9575f5ffd5b83356150e481614646565b925060208401356001600160401b038111156150fe575f5ffd5b8401601f8101861361510e575f5ffd5b80356001600160401b03811115615123575f5ffd5b866020828401011115615134575f5ffd5b939660209190910195509293505050565b5f5f60408385031215615156575f5ffd5b823561516181614646565b915060208301356001600160401b0381111561517b575f5ffd5b613e0185828601614e27565b5f5f60408385031215615198575f5ffd5b82356151a381614646565b946020939093013593505050565b5f602082840312156151c1575f5ffd5b81518015158114610756575f5ffd5b634e487b7160e01b5f52603260045260245ffd5b5f8235603e198336030181126151f8575f5ffd5b9190910192915050565b5f60208284031215615212575f5ffd5b610756826146c6565b6040810161097a82846147e2565b5f5f8335601e1984360301811261523e575f5ffd5b8301803591506001600160401b03821115615257575f5ffd5b6020019150600581901b36038213156118c5575f5ffd5b6060810161527c82856147e2565b6001600160a01b039290921660409190910152919050565b604081525f6152a66040830185614bb0565b8281036020840152611e298185614bb0565b5f602082840312156152c8575f5ffd5b81516001600160401b038111156152dd575f5ffd5b8201601f810184136152ed575f5ffd5b80516152fb61494082614901565b8082825260208201915060208360051b85010192508683111561531c575f5ffd5b602084015b838110156153b95780516001600160401b0381111561533e575f5ffd5b8501603f8101891361534e575f5ffd5b602081015161535f61494082614901565b808282526020820191506020808460051b8601010192508b831115615382575f5ffd5b6040840193505b828410156153a4578351825260209384019390910190615389565b86525050602093840193919091019050615321565b509695505050505050565b634e487b7160e01b5f52601160045260245ffd5b8181038181111561097a5761097a6153c4565b6001600160401b03828116828216039081111561097a5761097a6153c4565b5f81600f0b60016001607f1b03198103615426576154266153c4565b5f0392915050565b600f81810b9083900b0160016001607f1b03811360016001607f1b03198212171561097a5761097a6153c4565b6001600160a01b038616815260c0810161547860208301876147e2565b6001600160a01b039490941660608201526001600160401b0392909216608083015263ffffffff1660a09091015292915050565b5f5f8335601e198436030181126154c1575f5ffd5b8301803591506001600160401b038211156154da575f5ffd5b6020019150368190038213156118c5575f5ffd5b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b6001600160a01b03881681525f60c08201615534602084018a6147e2565b60c060608401528690528660e083015f5b8881101561557557823561555881614646565b6001600160a01b0316825260209283019290910190600101615545565b5083810360808501526155888188614a1a565b91505082810360a084015261559e8185876154ee565b9a9950505050505050505050565b5f602082840312156155bc575f5ffd5b813561ffff81168114610756575f5ffd5b63ffffffff818116838216019081111561097a5761097a6153c4565b8183526020830192505f815f5b8481101561483b5763ffffffff61560c836146c6565b16865260209586019591909101906001016155f6565b6001600160a01b03841681526040602082018190525f90611e2990830184866155e9565b602081525f612fc36020830184866154ee565b6001600160a01b03861681526060602082018190525f9061567d90830186886155e9565b82810360408401526156908185876154ee565b98975050505050505050565b5f602082840312156156ac575f5ffd5b815161075681614646565b80516020808301519190811015614e37575f1960209190910360031b1b16919050565b5f600182016156eb576156eb6153c4565b5060010190565b5f81615700576157006153c4565b505f190190565b600f82810b9082900b0360016001607f1b0319811260016001607f1b038213171561097a5761097a6153c4565b634e487b7160e01b5f52601260045260245ffd5b634e487b7160e01b5f52602160045260245ffd5b8082018082111561097a5761097a6153c4565b8082018281125f83128015821682158216171561578e5761578e6153c4565b505092915050565b634e487b7160e01b5f52603160045260245ffd5b5f826157c457634e487b7160e01b5f52601260045260245ffd5b50049056fea2646970667358221220bf2c2a135f852605c736e114c992eb283845849273282d707e128f09f189664c64736f6c634300081b0033", } // AllocationManagerABI 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 5367ed4b91..773e13f221 100644 --- a/pkg/bindings/BackingEigen/binding.go +++ b/pkg/bindings/BackingEigen/binding.go @@ -38,7 +38,7 @@ type ERC20VotesUpgradeableCheckpoint struct { // BackingEigenMetaData contains all meta data concerning the BackingEigen contract. var BackingEigenMetaData = &bind.MetaData{ ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"_EIGEN\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"CLOCK_MODE\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"DOMAIN_SEPARATOR\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"EIGEN\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"allowance\",\"inputs\":[{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"spender\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"allowedFrom\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"allowedTo\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"approve\",\"inputs\":[{\"name\":\"spender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"balanceOf\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"burn\",\"inputs\":[{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"checkpoints\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"pos\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structERC20VotesUpgradeable.Checkpoint\",\"components\":[{\"name\":\"fromBlock\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"votes\",\"type\":\"uint224\",\"internalType\":\"uint224\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"clock\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint48\",\"internalType\":\"uint48\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"decimals\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"decreaseAllowance\",\"inputs\":[{\"name\":\"spender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"subtractedValue\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"delegate\",\"inputs\":[{\"name\":\"delegatee\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"delegateBySig\",\"inputs\":[{\"name\":\"delegatee\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"nonce\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"v\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"r\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"s\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"delegates\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"disableTransferRestrictions\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"eip712Domain\",\"inputs\":[],\"outputs\":[{\"name\":\"fields\",\"type\":\"bytes1\",\"internalType\":\"bytes1\"},{\"name\":\"name\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"version\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"chainId\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"verifyingContract\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"extensions\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getPastTotalSupply\",\"inputs\":[{\"name\":\"timepoint\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getPastVotes\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"timepoint\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getVotes\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"increaseAllowance\",\"inputs\":[{\"name\":\"spender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"addedValue\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"initialOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"isMinter\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"mint\",\"inputs\":[{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"name\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"nonces\",\"inputs\":[{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"numCheckpoints\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"permit\",\"inputs\":[{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"spender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"deadline\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"v\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"r\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"s\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setAllowedFrom\",\"inputs\":[{\"name\":\"from\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"isAllowedFrom\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setAllowedTo\",\"inputs\":[{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"isAllowedTo\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setIsMinter\",\"inputs\":[{\"name\":\"minterAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"newStatus\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"symbol\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"totalSupply\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"transfer\",\"inputs\":[{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"transferFrom\",\"inputs\":[{\"name\":\"from\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"transferRestrictionsDisabledAfter\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"event\",\"name\":\"Approval\",\"inputs\":[{\"name\":\"owner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"spender\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Backed\",\"inputs\":[],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegateChanged\",\"inputs\":[{\"name\":\"delegator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"fromDelegate\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"toDelegate\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegateVotesChanged\",\"inputs\":[{\"name\":\"delegate\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"previousBalance\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"newBalance\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"EIP712DomainChanged\",\"inputs\":[],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"IsMinterModified\",\"inputs\":[{\"name\":\"minterAddress\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newStatus\",\"type\":\"bool\",\"indexed\":false,\"internalType\":\"bool\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"SetAllowedFrom\",\"inputs\":[{\"name\":\"from\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"isAllowedFrom\",\"type\":\"bool\",\"indexed\":false,\"internalType\":\"bool\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"SetAllowedTo\",\"inputs\":[{\"name\":\"to\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"isAllowedTo\",\"type\":\"bool\",\"indexed\":false,\"internalType\":\"bool\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Transfer\",\"inputs\":[{\"name\":\"from\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TransferRestrictionsDisabled\",\"inputs\":[],\"anonymous\":false}]", - Bin: "0x60a060405234801561000f575f5ffd5b50604051612d11380380612d1183398101604081905261002e91610105565b6001600160a01b038116608052610043610049565b50610132565b5f54610100900460ff16156100b45760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff90811614610103575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b5f60208284031215610115575f5ffd5b81516001600160a01b038116811461012b575f5ffd5b9392505050565b608051612bb261015f5f395f81816105e901528181610dae01528181610dd90152610e040152612bb25ff3fe608060405234801561000f575f5ffd5b506004361061023f575f3560e01c80637ecebe0011610135578063aa271e1a116100b4578063dd62ed3e11610079578063dd62ed3e14610579578063eb415f451461058c578063f1127ed814610594578063f2fde38b146105d1578063fdc371ce146105e4575f5ffd5b8063aa271e1a1461050a578063b8c255941461052d578063c3cda52014610540578063c4d66de814610553578063d505accf14610566575f5ffd5b806395d89b41116100fa57806395d89b41146104bf5780639ab24eb0146104c75780639aec4bae146104da578063a457c2d7146104e4578063a9059cbb146104f7575f5ffd5b80637ecebe001461044e57806384b0196e146104615780638da5cb5b1461047c5780638e539e8c1461048d57806391ddadf4146104a0575f5ffd5b806340c10f19116101c157806366eb399f1161018657806366eb399f146103c05780636fcfff45146103d357806370a08231146103fb578063715018a61461042357806378aa33ba1461042b575f5ffd5b806340c10f191461031a57806342966c681461032d5780634bf5d7e914610340578063587cde1e1461036a5780635c19a95c146103ad575f5ffd5b806323b872dd1161020757806323b872dd146102ca578063313ce567146102dd5780633644e515146102ec57806339509351146102f45780633a46b1a814610307575f5ffd5b80630455e6941461024357806306fdde031461027b578063095ea7b31461029057806318160ddd146102a35780631ffacdef146102b5575b5f5ffd5b610266610251366004612682565b6101316020525f908152604090205460ff1681565b60405190151581526020015b60405180910390f35b61028361060b565b60405161027291906126c9565b61026661029e3660046126db565b61069b565b6067545b604051908152602001610272565b6102c86102c3366004612703565b6106b4565b005b6102666102d836600461273c565b6106ca565b60405160128152602001610272565b6102a76106ed565b6102666103023660046126db565b6106fb565b6102a76103153660046126db565b61071c565b6102c86103283660046126db565b6107a4565b6102c861033b366004612776565b61081f565b60408051808201909152600e81526d06d6f64653d74696d657374616d760941b6020820152610283565b610395610378366004612682565b6001600160a01b039081165f90815260fe60205260409020541690565b6040516001600160a01b039091168152602001610272565b6102c86103bb366004612682565b61082c565b6102c86103ce366004612703565b610836565b6103e66103e1366004612682565b6108ae565b60405163ffffffff9091168152602001610272565b6102a7610409366004612682565b6001600160a01b03165f9081526065602052604090205490565b6102c86108cf565b610266610439366004612682565b6101326020525f908152604090205460ff1681565b6102a761045c366004612682565b6108e2565b6104696108ff565b604051610272979695949392919061278d565b6033546001600160a01b0316610395565b6102a761049b366004612776565b610998565b6104a86109ff565b60405165ffffffffffff9091168152602001610272565b610283610a09565b6102a76104d5366004612682565b610a18565b6102a76101305481565b6102666104f23660046126db565b610a95565b6102666105053660046126db565b610b0f565b610266610518366004612682565b6101336020525f908152604090205460ff1681565b6102c861053b366004612703565b610b1c565b6102c861054e366004612833565b610b2e565b6102c8610561366004612682565b610c63565b6102c8610574366004612887565b610ea5565b6102a76105873660046128ed565b611006565b6102c8611030565b6105a76105a236600461291e565b6110fe565b60408051825163ffffffff1681526020928301516001600160e01b03169281019290925201610272565b6102c86105df366004612682565b61117f565b6103957f000000000000000000000000000000000000000000000000000000000000000081565b60606068805461061a90612950565b80601f016020809104026020016040519081016040528092919081815260200182805461064690612950565b80156106915780601f1061066857610100808354040283529160200191610691565b820191905f5260205f20905b81548152906001019060200180831161067457829003601f168201915b5050505050905090565b5f336106a88185856111f5565b60019150505b92915050565b6106bc611318565b6106c68282611372565b5050565b5f336106d78582856113d2565b6106e285858561144a565b506001949350505050565b5f6106f6611604565b905090565b5f336106a881858561070d8383611006565b6107179190612996565b6111f5565b5f6107256109ff565b65ffffffffffff16821061077c5760405162461bcd60e51b815260206004820152601960248201527804552433230566f7465733a20667574757265206c6f6f6b757603c1b60448201526064015b60405180910390fd5b6001600160a01b0383165f90815260ff6020526040902061079d908361160d565b9392505050565b335f908152610133602052604090205460ff166108155760405162461bcd60e51b815260206004820152602960248201527f4261636b696e67456967656e2e6d696e743a2063616c6c6572206973206e6f7460448201526810309036b4b73a32b960b91b6064820152608401610773565b6106c682826116ee565b6108293382611779565b50565b6108293382611792565b61083e611318565b816001600160a01b03167f0124b12503bddc2616c0f3f54fd23ed283f5ef0c1483a75409e42612176b8bde8260405161087b911515815260200190565b60405180910390a26001600160a01b03919091165f90815261013360205260409020805460ff1916911515919091179055565b6001600160a01b0381165f90815260ff60205260408120546106ae9061180b565b6108d7611318565b6108e05f611873565b565b6001600160a01b0381165f90815260cb60205260408120546106ae565b5f6060805f5f5f60606097545f5f1b14801561091b5750609854155b61095f5760405162461bcd60e51b81526020600482015260156024820152741152540dcc4c8e88155b9a5b9a5d1a585b1a5e9959605a1b6044820152606401610773565b6109676118c4565b61096f6118d3565b604080515f80825260208201909252600f60f81b9b939a50919850469750309650945092509050565b5f6109a16109ff565b65ffffffffffff1682106109f35760405162461bcd60e51b815260206004820152601960248201527804552433230566f7465733a20667574757265206c6f6f6b757603c1b6044820152606401610773565b6106ae6101008361160d565b5f6106f6426118e2565b60606069805461061a90612950565b6001600160a01b0381165f90815260ff60205260408120548015610a83576001600160a01b0383165f90815260ff6020526040902080545f198301908110610a6257610a626129bd565b5f9182526020909120015464010000000090046001600160e01b0316610a85565b5f5b6001600160e01b03169392505050565b5f3381610aa28286611006565b905083811015610b025760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610773565b6106e282868684036111f5565b5f336106a881858561144a565b610b24611318565b6106c68282611948565b83421115610b7e5760405162461bcd60e51b815260206004820152601d60248201527f4552433230566f7465733a207369676e617475726520657870697265640000006044820152606401610773565b604080517fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf60208201526001600160a01b0388169181019190915260608101869052608081018590525f90610bf790610bef9060a001604051602081830303815290604052805190602001206119a0565b8585856119cc565b9050610c02816119f2565b8614610c505760405162461bcd60e51b815260206004820152601960248201527f4552433230566f7465733a20696e76616c6964206e6f6e6365000000000000006044820152606401610773565b610c5a8188611792565b50505050505050565b5f54610100900460ff1615808015610c8157505f54600160ff909116105b80610c9a5750303b158015610c9a57505f5460ff166001145b610cfd5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610773565b5f805460ff191660011790558015610d1e575f805461ff0019166101001790555b610d26611a19565b610d736040518060400160405280600d81526020016c2130b1b5b4b7339022b4b3b2b760991b815250604051806040016040528060068152602001653122a4a3a2a760d11b815250611a47565b610d7c82611873565b610da3604051806040016040528060068152602001653122a4a3a2a760d11b815250611a77565b5f1961013055610dd47f00000000000000000000000000000000000000000000000000000000000000006001611372565b610dff7f00000000000000000000000000000000000000000000000000000000000000006001611948565b610e357f00000000000000000000000000000000000000000000000000000000000000006b05686877afb5cbccbf7340006116ee565b6040517fb7c23c1e2e36f298e9879a88ecfcd07e28fbb439bcfa9c78ca1363ca14370d26905f90a180156106c6575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15050565b83421115610ef55760405162461bcd60e51b815260206004820152601d60248201527f45524332305065726d69743a206578706972656420646561646c696e650000006044820152606401610773565b5f7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9888888610f238c6119f2565b6040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090505f610f7d826119a0565b90505f610f8c828787876119cc565b9050896001600160a01b0316816001600160a01b031614610fef5760405162461bcd60e51b815260206004820152601e60248201527f45524332305065726d69743a20696e76616c6964207369676e617475726500006044820152606401610773565b610ffa8a8a8a6111f5565b50505050505050505050565b6001600160a01b039182165f90815260666020908152604080832093909416825291909152205490565b611038611318565b5f1961013054146110ce5760405162461bcd60e51b815260206004820152605460248201527f4261636b696e67456967656e2e64697361626c655472616e736665725265737460448201527f72696374696f6e733a207472616e73666572207265737472696374696f6e7320606482015273185c9948185b1c9958591e48191a5cd8589b195960621b608482015260a401610773565b5f6101308190556040517f2b18986d3ba809db2f13a5d7bf17f60d357b37d9cbb55dd71cbbac8dc4060f649190a1565b604080518082019091525f80825260208201526001600160a01b0383165f90815260ff60205260409020805463ffffffff8416908110611140576111406129bd565b5f9182526020918290206040805180820190915291015463ffffffff8116825264010000000090046001600160e01b0316918101919091529392505050565b611187611318565b6001600160a01b0381166111ec5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610773565b61082981611873565b6001600160a01b0383166112575760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610773565b6001600160a01b0382166112b85760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610773565b6001600160a01b038381165f8181526066602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6033546001600160a01b031633146108e05760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610773565b6001600160a01b0382165f8181526101316020908152604091829020805460ff191685151590811790915591519182527fcf20b1ecb604b0e8888d579c64e8a3b10e590d45c1c2dddb393bed284362227191015b60405180910390a25050565b5f6113dd8484611006565b90505f19811461144457818110156114375760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610773565b61144484848484036111f5565b50505050565b6001600160a01b0383166114ae5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610773565b6001600160a01b0382166115105760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610773565b61151b838383611ac0565b6001600160a01b0383165f90815260656020526040902054818110156115925760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610773565b6001600160a01b038085165f8181526065602052604080822086860390559286168082529083902080548601905591517fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906115f19086815260200190565b60405180910390a3611444848484611b9c565b5f6106f6611bcd565b81545f9081816005811115611664575f61162684611c40565b61163090856129d1565b5f88815260209020909150869082015463ffffffff16111561165457809150611662565b61165f816001612996565b92505b505b808210156116af575f6116778383611d24565b5f88815260209020909150869082015463ffffffff16111561169b578091506116a9565b6116a6816001612996565b92505b50611664565b80156116d9575f8681526020902081015f19015464010000000090046001600160e01b03166116db565b5f5b6001600160e01b03169695505050505050565b6116f88282611d3e565b6067546001600160e01b03101561176a5760405162461bcd60e51b815260206004820152603060248201527f4552433230566f7465733a20746f74616c20737570706c79207269736b73206f60448201526f766572666c6f77696e6720766f74657360801b6064820152608401610773565b611444610100611e0f83611e1a565b6117838282611f86565b6114446101006120c983611e1a565b6001600160a01b038281165f81815260fe6020818152604080842080546065845282862054949093528787166001600160a01b03198416811790915590519190951694919391928592917f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f9190a46114448284836120d4565b5f63ffffffff82111561186f5760405162461bcd60e51b815260206004820152602660248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203360448201526532206269747360d01b6064820152608401610773565b5090565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b60606099805461061a90612950565b6060609a805461061a90612950565b5f65ffffffffffff82111561186f5760405162461bcd60e51b815260206004820152602660248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203460448201526538206269747360d01b6064820152608401610773565b6001600160a01b0382165f8181526101326020908152604091829020805460ff191685151590811790915591519182527f72a561d1af7409467dae4f1e9fc52590a9335a1dda17727e2b6aa8c4db35109b91016113c6565b5f6106ae6119ac611604565b8360405161190160f01b8152600281019290925260228201526042902090565b5f5f5f6119db8787878761220e565b915091506119e8816122cb565b5095945050505050565b6001600160a01b0381165f90815260cb602052604090208054600181018255905b50919050565b5f54610100900460ff16611a3f5760405162461bcd60e51b8152600401610773906129e4565b6108e0612414565b5f54610100900460ff16611a6d5760405162461bcd60e51b8152600401610773906129e4565b6106c68282612443565b5f54610100900460ff16611a9d5760405162461bcd60e51b8152600401610773906129e4565b61082981604051806040016040528060018152602001603160f81b815250612482565b610130544211611b97576001600160a01b0383165f908152610131602052604090205460ff1680611b0957506001600160a01b0382165f908152610132602052604090205460ff165b80611b1b57506001600160a01b038316155b611b975760405162461bcd60e51b815260206004820152604160248201527f4261636b696e67456967656e2e5f6265666f7265546f6b656e5472616e73666560448201527f723a2066726f6d206f7220746f206d7573742062652077686974656c697374656064820152601960fa1b608482015260a401610773565b505050565b6001600160a01b038381165f90815260fe6020526040808220548584168352912054611b97929182169116836120d4565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f611bf76124cf565b611bff612527565b60408051602081019490945283019190915260608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b5f815f03611c4f57505f919050565b5f6001611c5b84612557565b901c6001901b90506001818481611c7457611c74612a2f565b048201901c90506001818481611c8c57611c8c612a2f565b048201901c90506001818481611ca457611ca4612a2f565b048201901c90506001818481611cbc57611cbc612a2f565b048201901c90506001818481611cd457611cd4612a2f565b048201901c90506001818481611cec57611cec612a2f565b048201901c90506001818481611d0457611d04612a2f565b048201901c905061079d81828581611d1e57611d1e612a2f565b046125ea565b5f611d326002848418612a43565b61079d90848416612996565b6001600160a01b038216611d945760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610773565b611d9f5f8383611ac0565b8060675f828254611db09190612996565b90915550506001600160a01b0382165f818152606560209081526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a36106c65f8383611b9c565b5f61079d8284612996565b82545f908190818115611e64575f8781526020902082015f190160408051808201909152905463ffffffff8116825264010000000090046001600160e01b03166020820152611e78565b604080518082019091525f80825260208201525b905080602001516001600160e01b03169350611e9884868863ffffffff16565b92505f82118015611ec05750611eac6109ff565b65ffffffffffff16815f015163ffffffff16145b15611f0357611ece836125ff565b5f8881526020902083015f190180546001600160e01b03929092166401000000000263ffffffff909216919091179055611f7c565b866040518060400160405280611f27611f1a6109ff565b65ffffffffffff1661180b565b63ffffffff168152602001611f3b866125ff565b6001600160e01b0390811690915282546001810184555f938452602093849020835194909301519091166401000000000263ffffffff909316929092179101555b5050935093915050565b6001600160a01b038216611fe65760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401610773565b611ff1825f83611ac0565b6001600160a01b0382165f90815260656020526040902054818110156120645760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b6064820152608401610773565b6001600160a01b0383165f8181526065602090815260408083208686039055606780548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3611b97835f84611b9c565b5f61079d82846129d1565b816001600160a01b0316836001600160a01b0316141580156120f557505f81115b15611b97576001600160a01b03831615612182576001600160a01b0383165f90815260ff60205260408120819061212f906120c985611e1a565b91509150846001600160a01b03167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a7248383604051612177929190918252602082015260400190565b60405180910390a250505b6001600160a01b03821615611b97576001600160a01b0382165f90815260ff6020526040812081906121b790611e0f85611e1a565b91509150836001600160a01b03167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a72483836040516121ff929190918252602082015260400190565b60405180910390a25050505050565b5f807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a083111561224357505f905060036122c2565b604080515f8082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015612294573d5f5f3e3d5ffd5b5050604051601f1901519150506001600160a01b0381166122bc575f600192509250506122c2565b91505f90505b94509492505050565b5f8160048111156122de576122de612a62565b036122e65750565b60018160048111156122fa576122fa612a62565b036123475760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610773565b600281600481111561235b5761235b612a62565b036123a85760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610773565b60038160048111156123bc576123bc612a62565b036108295760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401610773565b5f54610100900460ff1661243a5760405162461bcd60e51b8152600401610773906129e4565b6108e033611873565b5f54610100900460ff166124695760405162461bcd60e51b8152600401610773906129e4565b60686124758382612ac1565b506069611b978282612ac1565b5f54610100900460ff166124a85760405162461bcd60e51b8152600401610773906129e4565b60996124b48382612ac1565b50609a6124c18282612ac1565b50505f609781905560985550565b5f5f6124d96118c4565b8051909150156124f0578051602090910120919050565b60975480156124ff5792915050565b7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4709250505090565b5f5f6125316118d3565b805190915015612548578051602090910120919050565b60985480156124ff5792915050565b5f80608083901c1561256b57608092831c92015b604083901c1561257d57604092831c92015b602083901c1561258f57602092831c92015b601083901c156125a157601092831c92015b600883901c156125b357600892831c92015b600483901c156125c557600492831c92015b600283901c156125d757600292831c92015b600183901c156106ae5760010192915050565b5f8183106125f8578161079d565b5090919050565b5f6001600160e01b0382111561186f5760405162461bcd60e51b815260206004820152602760248201527f53616665436173743a2076616c756520646f65736e27742066697420696e20326044820152663234206269747360c81b6064820152608401610773565b80356001600160a01b038116811461267d575f5ffd5b919050565b5f60208284031215612692575f5ffd5b61079d82612667565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f61079d602083018461269b565b5f5f604083850312156126ec575f5ffd5b6126f583612667565b946020939093013593505050565b5f5f60408385031215612714575f5ffd5b61271d83612667565b915060208301358015158114612731575f5ffd5b809150509250929050565b5f5f5f6060848603121561274e575f5ffd5b61275784612667565b925061276560208501612667565b929592945050506040919091013590565b5f60208284031215612786575f5ffd5b5035919050565b60ff60f81b8816815260e060208201525f6127ab60e083018961269b565b82810360408401526127bd818961269b565b606084018890526001600160a01b038716608085015260a0840186905283810360c0850152845180825260208087019350909101905f5b818110156128125783518352602093840193909201916001016127f4565b50909b9a5050505050505050505050565b803560ff8116811461267d575f5ffd5b5f5f5f5f5f5f60c08789031215612848575f5ffd5b61285187612667565b9550602087013594506040870135935061286d60608801612823565b9598949750929560808101359460a0909101359350915050565b5f5f5f5f5f5f5f60e0888a03121561289d575f5ffd5b6128a688612667565b96506128b460208901612667565b955060408801359450606088013593506128d060808901612823565b9699959850939692959460a0840135945060c09093013592915050565b5f5f604083850312156128fe575f5ffd5b61290783612667565b915061291560208401612667565b90509250929050565b5f5f6040838503121561292f575f5ffd5b61293883612667565b9150602083013563ffffffff81168114612731575f5ffd5b600181811c9082168061296457607f821691505b602082108103611a1357634e487b7160e01b5f52602260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b808201808211156106ae576106ae612982565b634e487b7160e01b5f52604160045260245ffd5b634e487b7160e01b5f52603260045260245ffd5b818103818111156106ae576106ae612982565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b634e487b7160e01b5f52601260045260245ffd5b5f82612a5d57634e487b7160e01b5f52601260045260245ffd5b500490565b634e487b7160e01b5f52602160045260245ffd5b601f821115611b9757805f5260205f20601f840160051c81016020851015612a9b5750805b601f840160051c820191505b81811015612aba575f8155600101612aa7565b5050505050565b815167ffffffffffffffff811115612adb57612adb6129a9565b612aef81612ae98454612950565b84612a76565b6020601f821160018114612b21575f8315612b0a5750848201515b5f19600385901b1c1916600184901b178455612aba565b5f84815260208120601f198516915b82811015612b505787850151825560209485019460019092019101612b30565b5084821015612b6d57868401515f19600387901b60f8161c191681555b50505050600190811b0190555056fea2646970667358221220bc65aa22c82ea1986fef941c8ffca5d6f9991e3fb75b2eefff53e26501e45f9064736f6c634300081b0033", + Bin: "0x60a060405234801561000f575f5ffd5b50604051612d11380380612d1183398101604081905261002e91610105565b6001600160a01b038116608052610043610049565b50610132565b5f54610100900460ff16156100b45760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff90811614610103575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b5f60208284031215610115575f5ffd5b81516001600160a01b038116811461012b575f5ffd5b9392505050565b608051612bb261015f5f395f81816105e901528181610dae01528181610dd90152610e040152612bb25ff3fe608060405234801561000f575f5ffd5b506004361061023f575f3560e01c80637ecebe0011610135578063aa271e1a116100b4578063dd62ed3e11610079578063dd62ed3e14610579578063eb415f451461058c578063f1127ed814610594578063f2fde38b146105d1578063fdc371ce146105e4575f5ffd5b8063aa271e1a1461050a578063b8c255941461052d578063c3cda52014610540578063c4d66de814610553578063d505accf14610566575f5ffd5b806395d89b41116100fa57806395d89b41146104bf5780639ab24eb0146104c75780639aec4bae146104da578063a457c2d7146104e4578063a9059cbb146104f7575f5ffd5b80637ecebe001461044e57806384b0196e146104615780638da5cb5b1461047c5780638e539e8c1461048d57806391ddadf4146104a0575f5ffd5b806340c10f19116101c157806366eb399f1161018657806366eb399f146103c05780636fcfff45146103d357806370a08231146103fb578063715018a61461042357806378aa33ba1461042b575f5ffd5b806340c10f191461031a57806342966c681461032d5780634bf5d7e914610340578063587cde1e1461036a5780635c19a95c146103ad575f5ffd5b806323b872dd1161020757806323b872dd146102ca578063313ce567146102dd5780633644e515146102ec57806339509351146102f45780633a46b1a814610307575f5ffd5b80630455e6941461024357806306fdde031461027b578063095ea7b31461029057806318160ddd146102a35780631ffacdef146102b5575b5f5ffd5b610266610251366004612682565b6101316020525f908152604090205460ff1681565b60405190151581526020015b60405180910390f35b61028361060b565b60405161027291906126c9565b61026661029e3660046126db565b61069b565b6067545b604051908152602001610272565b6102c86102c3366004612703565b6106b4565b005b6102666102d836600461273c565b6106ca565b60405160128152602001610272565b6102a76106ed565b6102666103023660046126db565b6106fb565b6102a76103153660046126db565b61071c565b6102c86103283660046126db565b6107a4565b6102c861033b366004612776565b61081f565b60408051808201909152600e81526d06d6f64653d74696d657374616d760941b6020820152610283565b610395610378366004612682565b6001600160a01b039081165f90815260fe60205260409020541690565b6040516001600160a01b039091168152602001610272565b6102c86103bb366004612682565b61082c565b6102c86103ce366004612703565b610836565b6103e66103e1366004612682565b6108ae565b60405163ffffffff9091168152602001610272565b6102a7610409366004612682565b6001600160a01b03165f9081526065602052604090205490565b6102c86108cf565b610266610439366004612682565b6101326020525f908152604090205460ff1681565b6102a761045c366004612682565b6108e2565b6104696108ff565b604051610272979695949392919061278d565b6033546001600160a01b0316610395565b6102a761049b366004612776565b610998565b6104a86109ff565b60405165ffffffffffff9091168152602001610272565b610283610a09565b6102a76104d5366004612682565b610a18565b6102a76101305481565b6102666104f23660046126db565b610a95565b6102666105053660046126db565b610b0f565b610266610518366004612682565b6101336020525f908152604090205460ff1681565b6102c861053b366004612703565b610b1c565b6102c861054e366004612833565b610b2e565b6102c8610561366004612682565b610c63565b6102c8610574366004612887565b610ea5565b6102a76105873660046128ed565b611006565b6102c8611030565b6105a76105a236600461291e565b6110fe565b60408051825163ffffffff1681526020928301516001600160e01b03169281019290925201610272565b6102c86105df366004612682565b61117f565b6103957f000000000000000000000000000000000000000000000000000000000000000081565b60606068805461061a90612950565b80601f016020809104026020016040519081016040528092919081815260200182805461064690612950565b80156106915780601f1061066857610100808354040283529160200191610691565b820191905f5260205f20905b81548152906001019060200180831161067457829003601f168201915b5050505050905090565b5f336106a88185856111f5565b60019150505b92915050565b6106bc611318565b6106c68282611372565b5050565b5f336106d78582856113d2565b6106e285858561144a565b506001949350505050565b5f6106f6611604565b905090565b5f336106a881858561070d8383611006565b6107179190612996565b6111f5565b5f6107256109ff565b65ffffffffffff16821061077c5760405162461bcd60e51b815260206004820152601960248201527804552433230566f7465733a20667574757265206c6f6f6b757603c1b60448201526064015b60405180910390fd5b6001600160a01b0383165f90815260ff6020526040902061079d908361160d565b9392505050565b335f908152610133602052604090205460ff166108155760405162461bcd60e51b815260206004820152602960248201527f4261636b696e67456967656e2e6d696e743a2063616c6c6572206973206e6f7460448201526810309036b4b73a32b960b91b6064820152608401610773565b6106c682826116ee565b6108293382611779565b50565b6108293382611792565b61083e611318565b816001600160a01b03167f0124b12503bddc2616c0f3f54fd23ed283f5ef0c1483a75409e42612176b8bde8260405161087b911515815260200190565b60405180910390a26001600160a01b03919091165f90815261013360205260409020805460ff1916911515919091179055565b6001600160a01b0381165f90815260ff60205260408120546106ae9061180b565b6108d7611318565b6108e05f611873565b565b6001600160a01b0381165f90815260cb60205260408120546106ae565b5f6060805f5f5f60606097545f5f1b14801561091b5750609854155b61095f5760405162461bcd60e51b81526020600482015260156024820152741152540dcc4c8e88155b9a5b9a5d1a585b1a5e9959605a1b6044820152606401610773565b6109676118c4565b61096f6118d3565b604080515f80825260208201909252600f60f81b9b939a50919850469750309650945092509050565b5f6109a16109ff565b65ffffffffffff1682106109f35760405162461bcd60e51b815260206004820152601960248201527804552433230566f7465733a20667574757265206c6f6f6b757603c1b6044820152606401610773565b6106ae6101008361160d565b5f6106f6426118e2565b60606069805461061a90612950565b6001600160a01b0381165f90815260ff60205260408120548015610a83576001600160a01b0383165f90815260ff6020526040902080545f198301908110610a6257610a626129bd565b5f9182526020909120015464010000000090046001600160e01b0316610a85565b5f5b6001600160e01b03169392505050565b5f3381610aa28286611006565b905083811015610b025760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610773565b6106e282868684036111f5565b5f336106a881858561144a565b610b24611318565b6106c68282611948565b83421115610b7e5760405162461bcd60e51b815260206004820152601d60248201527f4552433230566f7465733a207369676e617475726520657870697265640000006044820152606401610773565b604080517fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf60208201526001600160a01b0388169181019190915260608101869052608081018590525f90610bf790610bef9060a001604051602081830303815290604052805190602001206119a0565b8585856119cc565b9050610c02816119f2565b8614610c505760405162461bcd60e51b815260206004820152601960248201527f4552433230566f7465733a20696e76616c6964206e6f6e6365000000000000006044820152606401610773565b610c5a8188611792565b50505050505050565b5f54610100900460ff1615808015610c8157505f54600160ff909116105b80610c9a5750303b158015610c9a57505f5460ff166001145b610cfd5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610773565b5f805460ff191660011790558015610d1e575f805461ff0019166101001790555b610d26611a19565b610d736040518060400160405280600d81526020016c2130b1b5b4b7339022b4b3b2b760991b815250604051806040016040528060068152602001653122a4a3a2a760d11b815250611a47565b610d7c82611873565b610da3604051806040016040528060068152602001653122a4a3a2a760d11b815250611a77565b5f1961013055610dd47f00000000000000000000000000000000000000000000000000000000000000006001611372565b610dff7f00000000000000000000000000000000000000000000000000000000000000006001611948565b610e357f00000000000000000000000000000000000000000000000000000000000000006b05686877afb5cbccbf7340006116ee565b6040517fb7c23c1e2e36f298e9879a88ecfcd07e28fbb439bcfa9c78ca1363ca14370d26905f90a180156106c6575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15050565b83421115610ef55760405162461bcd60e51b815260206004820152601d60248201527f45524332305065726d69743a206578706972656420646561646c696e650000006044820152606401610773565b5f7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9888888610f238c6119f2565b6040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090505f610f7d826119a0565b90505f610f8c828787876119cc565b9050896001600160a01b0316816001600160a01b031614610fef5760405162461bcd60e51b815260206004820152601e60248201527f45524332305065726d69743a20696e76616c6964207369676e617475726500006044820152606401610773565b610ffa8a8a8a6111f5565b50505050505050505050565b6001600160a01b039182165f90815260666020908152604080832093909416825291909152205490565b611038611318565b5f1961013054146110ce5760405162461bcd60e51b815260206004820152605460248201527f4261636b696e67456967656e2e64697361626c655472616e736665725265737460448201527f72696374696f6e733a207472616e73666572207265737472696374696f6e7320606482015273185c9948185b1c9958591e48191a5cd8589b195960621b608482015260a401610773565b5f6101308190556040517f2b18986d3ba809db2f13a5d7bf17f60d357b37d9cbb55dd71cbbac8dc4060f649190a1565b604080518082019091525f80825260208201526001600160a01b0383165f90815260ff60205260409020805463ffffffff8416908110611140576111406129bd565b5f9182526020918290206040805180820190915291015463ffffffff8116825264010000000090046001600160e01b0316918101919091529392505050565b611187611318565b6001600160a01b0381166111ec5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610773565b61082981611873565b6001600160a01b0383166112575760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610773565b6001600160a01b0382166112b85760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610773565b6001600160a01b038381165f8181526066602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6033546001600160a01b031633146108e05760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610773565b6001600160a01b0382165f8181526101316020908152604091829020805460ff191685151590811790915591519182527fcf20b1ecb604b0e8888d579c64e8a3b10e590d45c1c2dddb393bed284362227191015b60405180910390a25050565b5f6113dd8484611006565b90505f19811461144457818110156114375760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610773565b61144484848484036111f5565b50505050565b6001600160a01b0383166114ae5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610773565b6001600160a01b0382166115105760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610773565b61151b838383611ac0565b6001600160a01b0383165f90815260656020526040902054818110156115925760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610773565b6001600160a01b038085165f8181526065602052604080822086860390559286168082529083902080548601905591517fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906115f19086815260200190565b60405180910390a3611444848484611b9c565b5f6106f6611bcd565b81545f9081816005811115611664575f61162684611c40565b61163090856129d1565b5f88815260209020909150869082015463ffffffff16111561165457809150611662565b61165f816001612996565b92505b505b808210156116af575f6116778383611d24565b5f88815260209020909150869082015463ffffffff16111561169b578091506116a9565b6116a6816001612996565b92505b50611664565b80156116d9575f8681526020902081015f19015464010000000090046001600160e01b03166116db565b5f5b6001600160e01b03169695505050505050565b6116f88282611d3e565b6067546001600160e01b03101561176a5760405162461bcd60e51b815260206004820152603060248201527f4552433230566f7465733a20746f74616c20737570706c79207269736b73206f60448201526f766572666c6f77696e6720766f74657360801b6064820152608401610773565b611444610100611e0f83611e1a565b6117838282611f86565b6114446101006120c983611e1a565b6001600160a01b038281165f81815260fe6020818152604080842080546065845282862054949093528787166001600160a01b03198416811790915590519190951694919391928592917f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f9190a46114448284836120d4565b5f63ffffffff82111561186f5760405162461bcd60e51b815260206004820152602660248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203360448201526532206269747360d01b6064820152608401610773565b5090565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b60606099805461061a90612950565b6060609a805461061a90612950565b5f65ffffffffffff82111561186f5760405162461bcd60e51b815260206004820152602660248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203460448201526538206269747360d01b6064820152608401610773565b6001600160a01b0382165f8181526101326020908152604091829020805460ff191685151590811790915591519182527f72a561d1af7409467dae4f1e9fc52590a9335a1dda17727e2b6aa8c4db35109b91016113c6565b5f6106ae6119ac611604565b8360405161190160f01b8152600281019290925260228201526042902090565b5f5f5f6119db8787878761220e565b915091506119e8816122cb565b5095945050505050565b6001600160a01b0381165f90815260cb602052604090208054600181018255905b50919050565b5f54610100900460ff16611a3f5760405162461bcd60e51b8152600401610773906129e4565b6108e0612414565b5f54610100900460ff16611a6d5760405162461bcd60e51b8152600401610773906129e4565b6106c68282612443565b5f54610100900460ff16611a9d5760405162461bcd60e51b8152600401610773906129e4565b61082981604051806040016040528060018152602001603160f81b815250612482565b610130544211611b97576001600160a01b0383165f908152610131602052604090205460ff1680611b0957506001600160a01b0382165f908152610132602052604090205460ff165b80611b1b57506001600160a01b038316155b611b975760405162461bcd60e51b815260206004820152604160248201527f4261636b696e67456967656e2e5f6265666f7265546f6b656e5472616e73666560448201527f723a2066726f6d206f7220746f206d7573742062652077686974656c697374656064820152601960fa1b608482015260a401610773565b505050565b6001600160a01b038381165f90815260fe6020526040808220548584168352912054611b97929182169116836120d4565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f611bf76124cf565b611bff612527565b60408051602081019490945283019190915260608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b5f815f03611c4f57505f919050565b5f6001611c5b84612557565b901c6001901b90506001818481611c7457611c74612a2f565b048201901c90506001818481611c8c57611c8c612a2f565b048201901c90506001818481611ca457611ca4612a2f565b048201901c90506001818481611cbc57611cbc612a2f565b048201901c90506001818481611cd457611cd4612a2f565b048201901c90506001818481611cec57611cec612a2f565b048201901c90506001818481611d0457611d04612a2f565b048201901c905061079d81828581611d1e57611d1e612a2f565b046125ea565b5f611d326002848418612a43565b61079d90848416612996565b6001600160a01b038216611d945760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610773565b611d9f5f8383611ac0565b8060675f828254611db09190612996565b90915550506001600160a01b0382165f818152606560209081526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a36106c65f8383611b9c565b5f61079d8284612996565b82545f908190818115611e64575f8781526020902082015f190160408051808201909152905463ffffffff8116825264010000000090046001600160e01b03166020820152611e78565b604080518082019091525f80825260208201525b905080602001516001600160e01b03169350611e9884868863ffffffff16565b92505f82118015611ec05750611eac6109ff565b65ffffffffffff16815f015163ffffffff16145b15611f0357611ece836125ff565b5f8881526020902083015f190180546001600160e01b03929092166401000000000263ffffffff909216919091179055611f7c565b866040518060400160405280611f27611f1a6109ff565b65ffffffffffff1661180b565b63ffffffff168152602001611f3b866125ff565b6001600160e01b0390811690915282546001810184555f938452602093849020835194909301519091166401000000000263ffffffff909316929092179101555b5050935093915050565b6001600160a01b038216611fe65760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401610773565b611ff1825f83611ac0565b6001600160a01b0382165f90815260656020526040902054818110156120645760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b6064820152608401610773565b6001600160a01b0383165f8181526065602090815260408083208686039055606780548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3611b97835f84611b9c565b5f61079d82846129d1565b816001600160a01b0316836001600160a01b0316141580156120f557505f81115b15611b97576001600160a01b03831615612182576001600160a01b0383165f90815260ff60205260408120819061212f906120c985611e1a565b91509150846001600160a01b03167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a7248383604051612177929190918252602082015260400190565b60405180910390a250505b6001600160a01b03821615611b97576001600160a01b0382165f90815260ff6020526040812081906121b790611e0f85611e1a565b91509150836001600160a01b03167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a72483836040516121ff929190918252602082015260400190565b60405180910390a25050505050565b5f807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a083111561224357505f905060036122c2565b604080515f8082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015612294573d5f5f3e3d5ffd5b5050604051601f1901519150506001600160a01b0381166122bc575f600192509250506122c2565b91505f90505b94509492505050565b5f8160048111156122de576122de612a62565b036122e65750565b60018160048111156122fa576122fa612a62565b036123475760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610773565b600281600481111561235b5761235b612a62565b036123a85760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610773565b60038160048111156123bc576123bc612a62565b036108295760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401610773565b5f54610100900460ff1661243a5760405162461bcd60e51b8152600401610773906129e4565b6108e033611873565b5f54610100900460ff166124695760405162461bcd60e51b8152600401610773906129e4565b60686124758382612ac1565b506069611b978282612ac1565b5f54610100900460ff166124a85760405162461bcd60e51b8152600401610773906129e4565b60996124b48382612ac1565b50609a6124c18282612ac1565b50505f609781905560985550565b5f5f6124d96118c4565b8051909150156124f0578051602090910120919050565b60975480156124ff5792915050565b7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4709250505090565b5f5f6125316118d3565b805190915015612548578051602090910120919050565b60985480156124ff5792915050565b5f80608083901c1561256b57608092831c92015b604083901c1561257d57604092831c92015b602083901c1561258f57602092831c92015b601083901c156125a157601092831c92015b600883901c156125b357600892831c92015b600483901c156125c557600492831c92015b600283901c156125d757600292831c92015b600183901c156106ae5760010192915050565b5f8183106125f8578161079d565b5090919050565b5f6001600160e01b0382111561186f5760405162461bcd60e51b815260206004820152602760248201527f53616665436173743a2076616c756520646f65736e27742066697420696e20326044820152663234206269747360c81b6064820152608401610773565b80356001600160a01b038116811461267d575f5ffd5b919050565b5f60208284031215612692575f5ffd5b61079d82612667565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f61079d602083018461269b565b5f5f604083850312156126ec575f5ffd5b6126f583612667565b946020939093013593505050565b5f5f60408385031215612714575f5ffd5b61271d83612667565b915060208301358015158114612731575f5ffd5b809150509250929050565b5f5f5f6060848603121561274e575f5ffd5b61275784612667565b925061276560208501612667565b929592945050506040919091013590565b5f60208284031215612786575f5ffd5b5035919050565b60ff60f81b8816815260e060208201525f6127ab60e083018961269b565b82810360408401526127bd818961269b565b606084018890526001600160a01b038716608085015260a0840186905283810360c0850152845180825260208087019350909101905f5b818110156128125783518352602093840193909201916001016127f4565b50909b9a5050505050505050505050565b803560ff8116811461267d575f5ffd5b5f5f5f5f5f5f60c08789031215612848575f5ffd5b61285187612667565b9550602087013594506040870135935061286d60608801612823565b9598949750929560808101359460a0909101359350915050565b5f5f5f5f5f5f5f60e0888a03121561289d575f5ffd5b6128a688612667565b96506128b460208901612667565b955060408801359450606088013593506128d060808901612823565b9699959850939692959460a0840135945060c09093013592915050565b5f5f604083850312156128fe575f5ffd5b61290783612667565b915061291560208401612667565b90509250929050565b5f5f6040838503121561292f575f5ffd5b61293883612667565b9150602083013563ffffffff81168114612731575f5ffd5b600181811c9082168061296457607f821691505b602082108103611a1357634e487b7160e01b5f52602260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b808201808211156106ae576106ae612982565b634e487b7160e01b5f52604160045260245ffd5b634e487b7160e01b5f52603260045260245ffd5b818103818111156106ae576106ae612982565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b634e487b7160e01b5f52601260045260245ffd5b5f82612a5d57634e487b7160e01b5f52601260045260245ffd5b500490565b634e487b7160e01b5f52602160045260245ffd5b601f821115611b9757805f5260205f20601f840160051c81016020851015612a9b5750805b601f840160051c820191505b81811015612aba575f8155600101612aa7565b5050505050565b815167ffffffffffffffff811115612adb57612adb6129a9565b612aef81612ae98454612950565b84612a76565b6020601f821160018114612b21575f8315612b0a5750848201515b5f19600385901b1c1916600184901b178455612aba565b5f84815260208120601f198516915b82811015612b505787850151825560209485019460019092019101612b30565b5084821015612b6d57868401515f19600387901b60f8161c191681555b50505050600190811b0190555056fea2646970667358221220e867b134dc261d7025b320d04b24d156f209a884537e24f3f733872669a3444264736f6c634300081b0033", } // 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 3e48868c16..bca107b999 100644 --- a/pkg/bindings/BeaconChainProofs/binding.go +++ b/pkg/bindings/BeaconChainProofs/binding.go @@ -32,7 +32,7 @@ var ( // BeaconChainProofsMetaData contains all meta data concerning the BeaconChainProofs contract. var BeaconChainProofsMetaData = &bind.MetaData{ ABI: "[{\"type\":\"error\",\"name\":\"InvalidProof\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidProofLength\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidValidatorFieldsLength\",\"inputs\":[]}]", - Bin: "0x60556032600b8282823980515f1a607314602657634e487b7160e01b5f525f60045260245ffd5b305f52607381538281f3fe730000000000000000000000000000000000000000301460806040525f5ffdfea2646970667358221220b786d81c68c50488570935b357a548005dc46a3e40dcde8c9c3cfe80240891a564736f6c634300081b0033", + Bin: "0x60556032600b8282823980515f1a607314602657634e487b7160e01b5f525f60045260245ffd5b305f52607381538281f3fe730000000000000000000000000000000000000000301460806040525f5ffdfea264697066735822122008cce030eef89bfa5bdc495fd3132a80b290f7c5211b5ff5314d2604022ce60764736f6c634300081b0033", } // 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 80d08fb9da..23d7c38887 100644 --- a/pkg/bindings/BytesLib/binding.go +++ b/pkg/bindings/BytesLib/binding.go @@ -32,7 +32,7 @@ var ( // BytesLibMetaData contains all meta data concerning the BytesLib contract. var BytesLibMetaData = &bind.MetaData{ ABI: "[{\"type\":\"error\",\"name\":\"OutOfBounds\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"Overflow\",\"inputs\":[]}]", - Bin: "0x60556032600b8282823980515f1a607314602657634e487b7160e01b5f525f60045260245ffd5b305f52607381538281f3fe730000000000000000000000000000000000000000301460806040525f5ffdfea2646970667358221220517c792f82001a69d55f8c03043251e3baff982c0b3c945ebf5259c111341b5664736f6c634300081b0033", + Bin: "0x60556032600b8282823980515f1a607314602657634e487b7160e01b5f525f60045260245ffd5b305f52607381538281f3fe730000000000000000000000000000000000000000301460806040525f5ffdfea26469706673582212201c49718c32c7b9955558fe081b9edb8db636f523f0b3ec1bfeea2696a9f7424464736f6c634300081b0033", } // BytesLibABI is the input ABI used to generate the binding from. diff --git a/pkg/bindings/DelegationManager/binding.go b/pkg/bindings/DelegationManager/binding.go index 356ef3cecb..a8f2a6e2da 100644 --- a/pkg/bindings/DelegationManager/binding.go +++ b/pkg/bindings/DelegationManager/binding.go @@ -56,7 +56,7 @@ 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\":\"_eigenPodManager\",\"type\":\"address\",\"internalType\":\"contractIEigenPodManager\"},{\"name\":\"_allocationManager\",\"type\":\"address\",\"internalType\":\"contractIAllocationManager\"},{\"name\":\"_pauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"},{\"name\":\"_permissionController\",\"type\":\"address\",\"internalType\":\"contractIPermissionController\"},{\"name\":\"_MIN_WITHDRAWAL_DELAY\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"DELEGATION_APPROVAL_TYPEHASH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"allocationManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIAllocationManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"beaconChainETHStrategy\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"calculateDelegationApprovalDigestHash\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"approver\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"approverSalt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"calculateWithdrawalRoot\",\"inputs\":[{\"name\":\"withdrawal\",\"type\":\"tuple\",\"internalType\":\"structIDelegationManagerTypes.Withdrawal\",\"components\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"delegatedTo\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"withdrawer\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"nonce\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startBlock\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"scaledShares\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"completeQueuedWithdrawal\",\"inputs\":[{\"name\":\"withdrawal\",\"type\":\"tuple\",\"internalType\":\"structIDelegationManagerTypes.Withdrawal\",\"components\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"delegatedTo\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"withdrawer\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"nonce\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startBlock\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"scaledShares\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}]},{\"name\":\"tokens\",\"type\":\"address[]\",\"internalType\":\"contractIERC20[]\"},{\"name\":\"receiveAsTokens\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeQueuedWithdrawals\",\"inputs\":[{\"name\":\"withdrawals\",\"type\":\"tuple[]\",\"internalType\":\"structIDelegationManagerTypes.Withdrawal[]\",\"components\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"delegatedTo\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"withdrawer\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"nonce\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startBlock\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"scaledShares\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}]},{\"name\":\"tokens\",\"type\":\"address[][]\",\"internalType\":\"contractIERC20[][]\"},{\"name\":\"receiveAsTokens\",\"type\":\"bool[]\",\"internalType\":\"bool[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"convertToDepositShares\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"withdrawableShares\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"cumulativeWithdrawalsQueued\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"totalQueued\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"decreaseDelegatedShares\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"curDepositShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"beaconChainSlashingFactorDecrease\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"delegateTo\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"approverSignatureAndExpiry\",\"type\":\"tuple\",\"internalType\":\"structISignatureUtils.SignatureWithExpiry\",\"components\":[{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"approverSalt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"delegatedTo\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"delegationApprover\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"delegationApproverSaltIsSpent\",\"inputs\":[{\"name\":\"delegationApprover\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"spent\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"depositScalingFactor\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"domainSeparator\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"eigenPodManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIEigenPodManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getDepositedShares\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getOperatorShares\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getOperatorsShares\",\"inputs\":[{\"name\":\"operators\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256[][]\",\"internalType\":\"uint256[][]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getQueuedWithdrawal\",\"inputs\":[{\"name\":\"withdrawalRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIDelegationManagerTypes.Withdrawal\",\"components\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"delegatedTo\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"withdrawer\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"nonce\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startBlock\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"scaledShares\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getQueuedWithdrawalRoots\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32[]\",\"internalType\":\"bytes32[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getQueuedWithdrawals\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"withdrawals\",\"type\":\"tuple[]\",\"internalType\":\"structIDelegationManagerTypes.Withdrawal[]\",\"components\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"delegatedTo\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"withdrawer\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"nonce\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startBlock\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"scaledShares\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}]},{\"name\":\"shares\",\"type\":\"uint256[][]\",\"internalType\":\"uint256[][]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getSlashableSharesInQueue\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getWithdrawableShares\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"outputs\":[{\"name\":\"withdrawableShares\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"},{\"name\":\"depositShares\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"increaseDelegatedShares\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"prevDepositShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"addedShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"initialOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"initialPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"isDelegated\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isOperator\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"minWithdrawalDelayBlocks\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"modifyOperatorDetails\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"newDelegationApprover\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"operatorShares\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"shares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"pauseAll\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[{\"name\":\"index\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pauserRegistry\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pendingWithdrawals\",\"inputs\":[{\"name\":\"withdrawalRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"pending\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"permissionController\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIPermissionController\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"queueWithdrawals\",\"inputs\":[{\"name\":\"params\",\"type\":\"tuple[]\",\"internalType\":\"structIDelegationManagerTypes.QueuedWithdrawalParams[]\",\"components\":[{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"depositShares\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"},{\"name\":\"__deprecated_withdrawer\",\"type\":\"address\",\"internalType\":\"address\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32[]\",\"internalType\":\"bytes32[]\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"redelegate\",\"inputs\":[{\"name\":\"newOperator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"newOperatorApproverSig\",\"type\":\"tuple\",\"internalType\":\"structISignatureUtils.SignatureWithExpiry\",\"components\":[{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"approverSalt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"withdrawalRoots\",\"type\":\"bytes32[]\",\"internalType\":\"bytes32[]\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"registerAsOperator\",\"inputs\":[{\"name\":\"initDelegationApprover\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"allocationDelay\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"metadataURI\",\"type\":\"string\",\"internalType\":\"string\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"slashOperatorShares\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"prevMaxMagnitude\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"newMaxMagnitude\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"strategyManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategyManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"undelegate\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"withdrawalRoots\",\"type\":\"bytes32[]\",\"internalType\":\"bytes32[]\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"updateOperatorMetadataURI\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"metadataURI\",\"type\":\"string\",\"internalType\":\"string\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"DelegationApproverUpdated\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newDelegationApprover\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DepositScalingFactorUpdated\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"newDepositScalingFactor\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorMetadataURIUpdated\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"metadataURI\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorRegistered\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"delegationApprover\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorSharesDecreased\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"staker\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"shares\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorSharesIncreased\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"staker\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"shares\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"SlashingWithdrawalCompleted\",\"inputs\":[{\"name\":\"withdrawalRoot\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"SlashingWithdrawalQueued\",\"inputs\":[{\"name\":\"withdrawalRoot\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"},{\"name\":\"withdrawal\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIDelegationManagerTypes.Withdrawal\",\"components\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"delegatedTo\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"withdrawer\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"nonce\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startBlock\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"scaledShares\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}]},{\"name\":\"sharesToWithdraw\",\"type\":\"uint256[]\",\"indexed\":false,\"internalType\":\"uint256[]\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StakerDelegated\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StakerForceUndelegated\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StakerUndelegated\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"ActivelyDelegated\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"CallerCannotUndelegate\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"CurrentlyPaused\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"FullySlashed\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InputAddressZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InputArrayLengthMismatch\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InputArrayLengthZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidNewPausedStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidPermissions\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidSignature\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidSnapshotOrdering\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotActivelyDelegated\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyAllocationManager\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyEigenPodManager\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyPauser\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyStrategyManagerOrEigenPodManager\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyUnpauser\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OperatorNotRegistered\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OperatorsCannotUndelegate\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SaltSpent\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SignatureExpired\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"WithdrawalDelayNotElapsed\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"WithdrawalNotQueued\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"WithdrawerNotCaller\",\"inputs\":[]}]", - Bin: "0x610180604052348015610010575f5ffd5b50604051615dd6380380615dd683398101604081905261002f9161021c565b8186868684876001600160a01b03811661005c576040516339b190bb60e11b815260040160405180910390fd5b6001600160a01b0390811660805293841660a05291831660c05290911660e05263ffffffff16610100524661012052610125604080518082018252600a81526922b4b3b2b72630bcb2b960b11b60209182015281517f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a866818301527f71b625cfad44bac63b13dba07f2e1d6084ee04b6f8752101ece6126d584ee6ea81840152466060820152306080808301919091528351808303909101815260a0909101909252815191012090565b610140526001600160a01b03166101605261013e610149565b5050505050506102a7565b5f54610100900460ff16156101b45760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff90811614610203575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b0381168114610219575f5ffd5b50565b5f5f5f5f5f5f60c08789031215610231575f5ffd5b865161023c81610205565b602088015190965061024d81610205565b604088015190955061025e81610205565b606088015190945061026f81610205565b608088015190935061028081610205565b60a088015190925063ffffffff81168114610299575f5ffd5b809150509295509295509295565b60805160a05160c05160e05161010051610120516101405161016051615a3a61039c5f395f818161042c01526132fa01525f61271601525f61265601525f818161070001528181611504015281816134f5015261383101525f818161075001528181610da901528181610f5a0152818161169f0152818161185e01528181611cb2015281816128eb01526133b101525f818161045301528181610ee0015281816117c501528181611a23015281816130e3015261363b01525f818161038901528181610eae01528181611977015261361501525f81816105ee01528181610b410152818161107a015261273a0152615a3a5ff3fe608060405234801561000f575f5ffd5b50600436106102cb575f3560e01c8063715018a61161017b578063bfae3fd2116100e4578063e4cc3f901161009e578063f2fde38b11610079578063f2fde38b146107de578063f698da25146107f1578063fabc1cbc146107f9578063fd8aa88d1461080c575f5ffd5b8063e4cc3f9014610798578063eea9064b146107ab578063f0e0e676146107be575f5ffd5b8063bfae3fd2146106e3578063c448feb8146106f6578063c978f7ac1461072a578063ca8aa7c71461074b578063cd6dc68714610772578063da8be86414610785575f5ffd5b80639104c319116101355780639104c319146106345780639435bb431461064f578063a178848414610662578063a33a343314610681578063b7f06ebe14610694578063bb45fef2146106b6575f5ffd5b8063715018a6146105a4578063778e55f3146105ac57806378296ec5146105d6578063886f1195146105e95780638da5cb5b146106105780639004134714610621575f5ffd5b806354b7c96c116102375780635dd68579116101f157806365da1264116101cc57806365da12641461053557806366d5ba931461055d5780636d70f7ae1461057e5780636e17444814610591575f5ffd5b80635dd68579146104ee578063601bb36f1461050f57806360a0d1ce14610522575f5ffd5b806354b7c96c14610475578063595c6a6714610488578063597b36da146104905780635ac86ab7146104a35780635c975abb146104c65780635d975e88146104ce575f5ffd5b806339b70e381161028857806339b70e38146103845780633c651cf2146103c35780633cdeb5e0146103d65780633e28391d146104045780634657e26a146104275780634665bcda1461044e575f5ffd5b806304a4f979146102cf5780630b9f487a146103095780630dd8dd021461031c578063136439dd1461033c57806325df922e146103515780632aa6d88814610371575b5f5ffd5b6102f67f14bde674c9f64b2ad00eaaee4a8bed1fabef35c7507e3c5b9cfc9436909a2dad81565b6040519081526020015b60405180910390f35b6102f6610317366004614957565b61081f565b61032f61032a3660046149ee565b6108a7565b6040516103009190614a2c565b61034f61034a366004614a63565b610b2c565b005b61036461035f366004614bf8565b610c01565b6040516103009190614ca6565b61034f61037f366004614d08565b610d61565b6103ab7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610300565b61034f6103d1366004614d66565b610ea3565b6103ab6103e4366004614da9565b6001600160a01b039081165f908152609960205260409020600101541690565b610417610412366004614da9565b610fea565b6040519015158152602001610300565b6103ab7f000000000000000000000000000000000000000000000000000000000000000081565b6103ab7f000000000000000000000000000000000000000000000000000000000000000081565b61034f610483366004614dc4565b611009565b61034f611065565b6102f661049e366004614eb7565b611114565b6104176104b1366004614ee8565b606654600160ff9092169190911b9081161490565b6066546102f6565b6104e16104dc366004614a63565b611143565b6040516103009190614fbf565b6105016104fc366004614da9565b61125f565b60405161030092919061501f565b61034f61051d3660046150a0565b611694565b61034f6105303660046150f9565b6117ba565b6103ab610543366004614da9565b609a6020525f90815260409020546001600160a01b031681565b61057061056b366004614da9565b61194f565b604051610300929190615138565b61041761058c366004614da9565b611c4f565b6102f661059f366004614dc4565b611c87565b61034f611d31565b6102f66105ba366004614dc4565b609860209081525f928352604080842090915290825290205481565b61034f6105e436600461515c565b611d42565b6103ab7f000000000000000000000000000000000000000000000000000000000000000081565b6033546001600160a01b03166103ab565b61036461062f3660046151ac565b611dca565b6103ab73beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac081565b61034f61065d3660046151f8565b611ea0565b6102f6610670366004614da9565b609f6020525f908152604090205481565b61032f61068f366004615294565b611f70565b6104176106a2366004614a63565b609e6020525f908152604090205460ff1681565b6104176106c436600461537b565b609c60209081525f928352604080842090915290825290205460ff1681565b6102f66106f1366004614dc4565b611f88565b60405163ffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152602001610300565b61073d6107383660046151ac565b611fc4565b6040516103009291906153a5565b6103ab7f000000000000000000000000000000000000000000000000000000000000000081565b61034f61078036600461537b565b612251565b61032f610793366004614da9565b61236c565b61034f6107a63660046153c4565b61247c565b61034f6107b9366004615294565b6124d2565b6107d16107cc366004615437565b612535565b60405161030091906154e4565b61034f6107ec366004614da9565b6125da565b6102f6612653565b61034f610807366004614a63565b612738565b61032f61081a366004614da9565b61284f565b604080517f14bde674c9f64b2ad00eaaee4a8bed1fabef35c7507e3c5b9cfc9436909a2dad60208201526001600160a01b03808616928201929092528187166060820152908516608082015260a0810183905260c081018290525f9061089d9060e00160405160208183030381529060405280519060200120612872565b9695505050505050565b6066546060906001906002908116036108d35760405163840a48d560e01b815260040160405180910390fd5b5f836001600160401b038111156108ec576108ec614a7a565b604051908082528060200260200182016040528015610915578160200160208202803683370190505b50335f908152609a60205260408120549192506001600160a01b03909116905b85811015610b215786868281811061094f5761094f6154f6565b9050602002810190610961919061550a565b61096f906020810190615528565b9050878783818110610983576109836154f6565b9050602002810190610995919061550a565b61099f9080615528565b9050146109bf576040516343714afd60e01b815260040160405180910390fd5b5f610a2933848a8a868181106109d7576109d76154f6565b90506020028101906109e9919061550a565b6109f39080615528565b808060200260200160405190810160405280939291908181526020018383602002808284375f920191909152506128a092505050565b9050610afb33848a8a86818110610a4257610a426154f6565b9050602002810190610a54919061550a565b610a5e9080615528565b808060200260200160405190810160405280939291908181526020018383602002808284375f920191909152508e92508d9150889050818110610aa357610aa36154f6565b9050602002810190610ab5919061550a565b610ac3906020810190615528565b808060200260200160405190810160405280939291908181526020018383602002808284375f920191909152508892506129e7915050565b848381518110610b0d57610b0d6154f6565b602090810291909101015250600101610935565b509095945050505050565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa158015610b8e573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610bb2919061556d565b610bcf57604051631d77d47760e21b815260040160405180910390fd5b6066548181168114610bf45760405163c61dca5d60e01b815260040160405180910390fd5b610bfd82612edc565b5050565b6001600160a01b038084165f908152609a60205260408120546060921690610c2a8683876128a0565b90505f85516001600160401b03811115610c4657610c46614a7a565b604051908082528060200260200182016040528015610c6f578160200160208202803683370190505b5090505f5b8651811015610d54576001600160a01b0388165f90815260a260205260408120885182908a9085908110610caa57610caa6154f6565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020015f206040518060200160405290815f820154815250509050610d2e878381518110610cfc57610cfc6154f6565b6020026020010151858481518110610d1657610d166154f6565b602002602001015183612f199092919063ffffffff16565b838381518110610d4057610d406154f6565b602090810291909101015250600101610c74565b50925050505b9392505050565b610d6a33610fea565b15610d8857604051633bf2b50360e11b815260040160405180910390fd5b604051632b6241f360e11b815233600482015263ffffffff841660248201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906356c483e6906044015f604051808303815f87803b158015610df2575f5ffd5b505af1158015610e04573d5f5f3e3d5ffd5b50505050610e123385612f37565b610e1c3333612f99565b6040516001600160a01b038516815233907fa453db612af59e5521d6ab9284dc3e2d06af286eb1b1b7b771fce4716c19f2c19060200160405180910390a2336001600160a01b03167f02a919ed0e2acad1dd90f17ef2fa4ae5462ee1339170034a8531cca4b67080908383604051610e95929190615588565b60405180910390a250505050565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161480610f025750336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016145b610f1f5760405163045206a560e21b815260040160405180910390fd5b6001600160a01b038481165f908152609a602052604080822054905163152667d960e31b8152908316600482018190528684166024830152927f0000000000000000000000000000000000000000000000000000000000000000169063a9333ec890604401602060405180830381865afa158015610f9f573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610fc391906155b6565b90505f610fd187878461309c565b9050610fe183888888888661317e565b50505050505050565b6001600160a01b039081165f908152609a602052604090205416151590565b81611013816132bc565b6110305760405163932d94f760e01b815260040160405180910390fd5b61103983611c4f565b611056576040516325ec6c1f60e01b815260040160405180910390fd5b6110608383612f37565b505050565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa1580156110c7573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110eb919061556d565b61110857604051631d77d47760e21b815260040160405180910390fd5b6111125f19612edc565b565b5f816040516020016111269190614fbf565b604051602081830303815290604052805190602001209050919050565b61114b614813565b5f82815260a46020908152604091829020825160e08101845281546001600160a01b03908116825260018301548116828501526002830154168185015260038201546060820152600482015463ffffffff1660808201526005820180548551818602810186019096528086529194929360a086019392908301828280156111f957602002820191905f5260205f20905b81546001600160a01b031681526001909101906020018083116111db575b505050505081526020016006820180548060200260200160405190810160405280929190818152602001828054801561124f57602002820191905f5260205f20905b81548152602001906001019080831161123b575b5050505050815250509050919050565b6060805f61126c8461284f565b8051909150806001600160401b0381111561128957611289614a7a565b6040519080825280602002602001820160405280156112c257816020015b6112af614813565b8152602001906001900390816112a75790505b509350806001600160401b038111156112dd576112dd614a7a565b60405190808252806020026020018201604052801561131057816020015b60608152602001906001900390816112fb5790505b506001600160a01b038087165f908152609a60205260408120549295509116905b8281101561168b5760a45f85838151811061134e5761134e6154f6565b60209081029190910181015182528181019290925260409081015f20815160e08101835281546001600160a01b03908116825260018301548116828601526002830154168184015260038201546060820152600482015463ffffffff1660808201526005820180548451818702810187019095528085529194929360a086019390929083018282801561140857602002820191905f5260205f20905b81546001600160a01b031681526001909101906020018083116113ea575b505050505081526020016006820180548060200260200160405190810160405280929190818152602001828054801561145e57602002820191905f5260205f20905b81548152602001906001019080831161144a575b505050505081525050868281518110611479576114796154f6565b6020026020010181905250858181518110611496576114966154f6565b602002602001015160a00151516001600160401b038111156114ba576114ba614a7a565b6040519080825280602002602001820160405280156114e3578160200160208202803683370190505b508582815181106114f6576114f66154f6565b60200260200101819052505f7f0000000000000000000000000000000000000000000000000000000000000000878381518110611535576115356154f6565b60200260200101516080015161154b91906155e5565b905060604363ffffffff168263ffffffff1610156115935761158c89858a868151811061157a5761157a6154f6565b602002602001015160a0015185613366565b90506115be565b6115bb89858a86815181106115aa576115aa6154f6565b602002602001015160a001516128a0565b90505b5f5b8884815181106115d2576115d26154f6565b602002602001015160a001515181101561167d5761163f8985815181106115fb576115fb6154f6565b602002602001015160c001518281518110611618576116186154f6565b6020026020010151838381518110611632576116326154f6565b6020026020010151613494565b888581518110611651576116516154f6565b6020026020010151828151811061166a5761166a6154f6565b60209081029190910101526001016115c0565b505050806001019050611331565b50505050915091565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146116dd576040516323d871a560e01b815260040160405180910390fd5b6001600160a01b038085165f90815260986020908152604080832093871683529290529081205461171b906001600160401b0380861690851661349f565b90505f61172a868686866134b7565b90505f6117378284615601565b9050611745875f8886613574565b5f61174f876135ee565b60405163debe1eab60e01b81526001600160a01b038981166004830152602482018590529192509082169063debe1eab906044015f604051808303815f87803b15801561179a575f5ffd5b505af11580156117ac573d5f5f3e3d5ffd5b505050505050505050505050565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461180357604051633213a66160e21b815260040160405180910390fd5b61180c83610fea565b15611060576001600160a01b038381165f908152609a602052604080822054905163152667d960e31b81529083166004820181905273beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac06024830152927f0000000000000000000000000000000000000000000000000000000000000000169063a9333ec890604401602060405180830381865afa1580156118a3573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906118c791906155b6565b6001600160a01b0386165f90815260a26020908152604080832073beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac084528252808320815192830190915254815291925061192d866119256001600160401b03808716908916613660565b849190613674565b9050610fe1848873beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac084613574565b6040516394f649dd60e01b81526001600160a01b03828116600483015260609182915f9182917f000000000000000000000000000000000000000000000000000000000000000016906394f649dd906024015f60405180830381865afa1580156119bb573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526119e2919081019061566f565b60405163fe243a1760e01b81526001600160a01b03888116600483015273beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac060248301529294509092505f917f0000000000000000000000000000000000000000000000000000000000000000169063fe243a1790604401602060405180830381865afa158015611a68573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a8c919061572a565b9050805f03611aa057509094909350915050565b5f83516001611aaf9190615601565b6001600160401b03811115611ac657611ac6614a7a565b604051908082528060200260200182016040528015611aef578160200160208202803683370190505b5090505f84516001611b019190615601565b6001600160401b03811115611b1857611b18614a7a565b604051908082528060200260200182016040528015611b41578160200160208202803683370190505b50905073beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac082865181518110611b6c57611b6c6154f6565b60200260200101906001600160a01b031690816001600160a01b0316815250508281865181518110611ba057611ba06154f6565b60209081029190910101525f5b8551811015611c4157858181518110611bc857611bc86154f6565b6020026020010151838281518110611be257611be26154f6565b60200260200101906001600160a01b031690816001600160a01b031681525050848181518110611c1457611c146154f6565b6020026020010151828281518110611c2e57611c2e6154f6565b6020908102919091010152600101611bad565b509097909650945050505050565b5f6001600160a01b03821615801590611c8157506001600160a01b038083165f818152609a6020526040902054909116145b92915050565b60405163152667d960e31b81526001600160a01b03838116600483015282811660248301525f9182917f0000000000000000000000000000000000000000000000000000000000000000169063a9333ec890604401602060405180830381865afa158015611cf7573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611d1b91906155b6565b9050611d298484835f6134b7565b949350505050565b611d39613692565b6111125f6136ec565b82611d4c816132bc565b611d695760405163932d94f760e01b815260040160405180910390fd5b611d7284611c4f565b611d8f576040516325ec6c1f60e01b815260040160405180910390fd5b836001600160a01b03167f02a919ed0e2acad1dd90f17ef2fa4ae5462ee1339170034a8531cca4b67080908484604051610e95929190615588565b60605f82516001600160401b03811115611de657611de6614a7a565b604051908082528060200260200182016040528015611e0f578160200160208202803683370190505b5090505f5b8351811015611e98576001600160a01b0385165f9081526098602052604081208551909190869084908110611e4b57611e4b6154f6565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020015f2054828281518110611e8557611e856154f6565b6020908102919091010152600101611e14565b509392505050565b606654600290600490811603611ec95760405163840a48d560e01b815260040160405180910390fd5b611ed161373d565b855f5b81811015611f6457611f5c898983818110611ef157611ef16154f6565b9050602002810190611f039190615741565b611f0c90615755565b888884818110611f1e57611f1e6154f6565b9050602002810190611f309190615528565b888886818110611f4257611f426154f6565b9050602002016020810190611f579190615760565b613796565b600101611ed4565b5050610fe1600160c955565b6060611f7b3361236c565b9050610d5a8484846124d2565b6001600160a01b038083165f90815260a260209081526040808320938516835292815282822083519182019093529154825290610d5a90613bd8565b60608082516001600160401b03811115611fe057611fe0614a7a565b604051908082528060200260200182016040528015612009578160200160208202803683370190505b50915082516001600160401b0381111561202557612025614a7a565b60405190808252806020026020018201604052801561204e578160200160208202803683370190505b506001600160a01b038086165f908152609a60205260408120549293509116906120798683876128a0565b90505f5b8551811015612246575f6120a987838151811061209c5761209c6154f6565b60200260200101516135ee565b9050806001600160a01b031663fe243a17898985815181106120cd576120cd6154f6565b60200260200101516040518363ffffffff1660e01b81526004016121079291906001600160a01b0392831681529116602082015260400190565b602060405180830381865afa158015612122573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612146919061572a565b858381518110612158576121586154f6565b6020026020010181815250505f60a25f8a6001600160a01b03166001600160a01b031681526020019081526020015f205f89858151811061219b5761219b6154f6565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020015f206040518060200160405290815f82015481525050905061221f8684815181106121ed576121ed6154f6565b6020026020010151858581518110612207576122076154f6565b6020026020010151836136749092919063ffffffff16565b878481518110612231576122316154f6565b6020908102919091010152505060010161207d565b5050505b9250929050565b5f54610100900460ff161580801561226f57505f54600160ff909116105b806122885750303b15801561228857505f5460ff166001145b6122f05760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b5f805460ff191660011790558015612311575f805461ff0019166101001790555b61231a82612edc565b612323836136ec565b8015611060575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a1505050565b606061237782610fea565b6123945760405163a5c7c44560e01b815260040160405180910390fd5b61239d82611c4f565b156123bb576040516311ca333560e31b815260040160405180910390fd5b336001600160a01b03831614612473576001600160a01b038083165f908152609a6020526040902054166123ee816132bc565b8061241457506001600160a01b038181165f908152609960205260409020600101541633145b61243157604051631e499a2360e11b815260040160405180910390fd5b806001600160a01b0316836001600160a01b03167ff0eddf07e6ea14f388b47e1e94a0f464ecbd9eed4171130e0fc0e99fb4030a8a60405160405180910390a3505b611c8182613bf7565b6066546002906004908116036124a55760405163840a48d560e01b815260040160405180910390fd5b6124ad61373d565b6124c16124b986615755565b858585613796565b6124cb600160c955565b5050505050565b6124db33610fea565b156124f957604051633bf2b50360e11b815260040160405180910390fd5b61250283611c4f565b61251f576040516325ec6c1f60e01b815260040160405180910390fd5b61252b33848484613e56565b6110603384612f99565b60605f83516001600160401b0381111561255157612551614a7a565b60405190808252806020026020018201604052801561258457816020015b606081526020019060019003908161256f5790505b5090505f5b8451811015611e98576125b58582815181106125a7576125a76154f6565b602002602001015185611dca565b8282815181106125c7576125c76154f6565b6020908102919091010152600101612589565b6125e2613692565b6001600160a01b0381166126475760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016122e7565b612650816136ec565b50565b5f7f000000000000000000000000000000000000000000000000000000000000000046146127135750604080518082018252600a81526922b4b3b2b72630bcb2b960b11b60209182015281517f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a866818301527f71b625cfad44bac63b13dba07f2e1d6084ee04b6f8752101ece6126d584ee6ea81840152466060820152306080808301919091528351808303909101815260a0909101909252815191012090565b507f000000000000000000000000000000000000000000000000000000000000000090565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612794573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906127b8919061577b565b6001600160a01b0316336001600160a01b0316146127e95760405163794821ff60e01b815260040160405180910390fd5b606654801982198116146128105760405163c61dca5d60e01b815260040160405180910390fd5b606682905560405182815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c906020015b60405180910390a25050565b6001600160a01b0381165f90815260a360205260409020606090611c8190613f1b565b5f61287b612653565b60405161190160f01b6020820152602281019190915260428101839052606201611126565b60605f82516001600160401b038111156128bc576128bc614a7a565b6040519080825280602002602001820160405280156128e5578160200160208202803683370190505b5090505f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663547afb8786866040518363ffffffff1660e01b8152600401612937929190615796565b5f60405180830381865afa158015612951573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261297891908101906157b9565b90505f5b8451811015610b21576129c28786838151811061299b5761299b6154f6565b60200260200101518484815181106129b5576129b56154f6565b602002602001015161309c565b8382815181106129d4576129d46154f6565b602090810291909101015260010161297c565b5f6001600160a01b038616612a0f576040516339b190bb60e11b815260040160405180910390fd5b83515f03612a305760405163796cc52560e01b815260040160405180910390fd5b5f84516001600160401b03811115612a4a57612a4a614a7a565b604051908082528060200260200182016040528015612a73578160200160208202803683370190505b5090505f85516001600160401b03811115612a9057612a90614a7a565b604051908082528060200260200182016040528015612ab9578160200160208202803683370190505b5090505f5b8651811015612d0f575f612add88838151811061209c5761209c6154f6565b90505f60a25f8c6001600160a01b03166001600160a01b031681526020019081526020015f205f8a8581518110612b1657612b166154f6565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020015f206040518060200160405290815f820154815250509050612b82888481518110612b6857612b686154f6565b6020026020010151888581518110612207576122076154f6565b848481518110612b9457612b946154f6565b602002602001018181525050612bcc888481518110612bb557612bb56154f6565b602002602001015182613f2790919063ffffffff16565b858481518110612bde57612bde6154f6565b60209081029190910101526001600160a01b038a1615612c7357612c358a8a8581518110612c0e57612c0e6154f6565b6020026020010151878681518110612c2857612c286154f6565b6020026020010151613f3b565b612c738a8c8b8681518110612c4c57612c4c6154f6565b6020026020010151878781518110612c6657612c666154f6565b6020026020010151613574565b816001600160a01b031663724af4238c8b8681518110612c9557612c956154f6565b60200260200101518b8781518110612caf57612caf6154f6565b60200260200101516040518463ffffffff1660e01b8152600401612cd593929190615848565b5f604051808303815f87803b158015612cec575f5ffd5b505af1158015612cfe573d5f5f3e3d5ffd5b505050505050806001019050612abe565b506001600160a01b0388165f908152609f60205260408120805491829190612d368361586c565b91905055505f6040518060e001604052808b6001600160a01b031681526020018a6001600160a01b031681526020018b6001600160a01b031681526020018381526020014363ffffffff1681526020018981526020018581525090505f612d9c82611114565b5f818152609e602090815260408083208054600160ff19909116811790915560a4835292819020865181546001600160a01b03199081166001600160a01b039283161783558885015195830180548216968316969096179095559187015160028201805490951692169190911790925560608501516003830155608085015160048301805463ffffffff191663ffffffff90921691909117905560a085015180519394508593612e52926005850192019061486c565b5060c08201518051612e6e9160068401916020909101906148cf565b5050506001600160a01b038b165f90815260a360205260409020612e929082613fc9565b507f26b2aae26516e8719ef50ea2f6831a2efbd4e37dccdf0f6936b27bc08e793e30818386604051612ec693929190615884565b60405180910390a19a9950505050505050505050565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a250565b5f611d2982612f31612f2a87613bd8565b8690613fd4565b90613fd4565b6001600160a01b038281165f8181526099602090815260409182902060010180546001600160a01b0319169486169485179055905192835290917f773b54c04d756fcc5e678111f7d730de3be98192000799eee3d63716055a87c69101612843565b6066545f90600190811603612fc15760405163840a48d560e01b815260040160405180910390fd5b6001600160a01b038381165f818152609a602052604080822080546001600160a01b0319169487169485179055517fc3ee9f2e5fda98e8066a1f745b2df9285f416fe98cf2559cd21484b3d87433049190a35f5f61301e8561194f565b915091505f61302e8686856128a0565b90505f5b8351811015610fe1576130948688868481518110613052576130526154f6565b60200260200101515f87868151811061306d5761306d6154f6565b6020026020010151878781518110613087576130876154f6565b602002602001015161317e565b600101613032565b5f73beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeabf196001600160a01b0384160161316e5760405163a3d75e0960e01b81526001600160a01b0385811660048301525f917f00000000000000000000000000000000000000000000000000000000000000009091169063a3d75e0990602401602060405180830381865afa15801561312a573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061314e91906155b6565b90506131666001600160401b03848116908316613660565b915050610d5a565b506001600160401b031692915050565b805f0361319e57604051630a33bc6960e21b815260040160405180910390fd5b6001600160a01b038086165f90815260a2602090815260408083209388168352929052206131ce81858585613fe8565b6040805160208101909152815481527f8be932bac54561f27260f95463d9b8ab37e06b2842e5ee2404157cc13df6eb8f908790879061320c90613bd8565b60405161321b93929190615848565b60405180910390a161322c86610fea565b15610fe1576001600160a01b038088165f90815260986020908152604080832093891683529290529081208054859290613267908490615601565b92505081905550866001600160a01b03167f1ec042c965e2edd7107b51188ee0f383e22e76179041ab3a9d18ff151405166c8787866040516132ab93929190615848565b60405180910390a250505050505050565b604051631beb2b9760e31b81526001600160a01b0382811660048301523360248301523060448301525f80356001600160e01b0319166064840152917f00000000000000000000000000000000000000000000000000000000000000009091169063df595cb8906084016020604051808303815f875af1158015613342573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611c81919061556d565b60605f83516001600160401b0381111561338257613382614a7a565b6040519080825280602002602001820160405280156133ab578160200160208202803683370190505b5090505f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166394d7d00c8787876040518463ffffffff1660e01b81526004016133ff939291906158ae565b5f60405180830381865afa158015613419573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261344091908101906157b9565b90505f5b8551811015613488576134638887838151811061299b5761299b6154f6565b838281518110613475576134756154f6565b6020908102919091010152600101613444565b50909695505050505050565b5f610d5a8383613660565b5f6134ad8483856001614057565b611d2990856158e7565b6001600160a01b038085165f90815260a560209081526040808320938716835292905290812081906134e8906140b2565b90505f61354e600161351a7f0000000000000000000000000000000000000000000000000000000000000000436158fa565b61352491906158fa565b6001600160a01b03808a165f90815260a560209081526040808320938c16835292905220906140cc565b90505f61355b82846158e7565b90506135688187876140e8565b98975050505050505050565b6001600160a01b038085165f908152609860209081526040808320938616835292905290812080548392906135aa9084906158e7565b92505081905550836001600160a01b03167f6909600037b75d7b4733aedd815442b5ec018a827751c832aaff64eba5d6d2dd848484604051610e9593929190615848565b5f6001600160a01b03821673beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac014613639577f0000000000000000000000000000000000000000000000000000000000000000611c81565b7f000000000000000000000000000000000000000000000000000000000000000092915050565b5f610d5a8383670de0b6b3a7640000614106565b5f611d298261368c61368587613bd8565b8690613660565b90613660565b6033546001600160a01b031633146111125760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016122e7565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b600260c9540361378f5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016122e7565b600260c955565b60a08401515182146137bb576040516343714afd60e01b815260040160405180910390fd5b83604001516001600160a01b0316336001600160a01b0316146137f1576040516316110d3560e21b815260040160405180910390fd5b5f6137fb85611114565b5f818152609e602052604090205490915060ff1661382c576040516387c9d21960e01b815260040160405180910390fd5b60605f7f0000000000000000000000000000000000000000000000000000000000000000876080015161385f91906155e5565b90508063ffffffff164363ffffffff161161388d576040516378f67ae160e11b815260040160405180910390fd5b6138a4875f015188602001518960a0015184613366565b87516001600160a01b03165f90815260a3602052604090209092506138ca9150836141eb565b505f82815260a46020526040812080546001600160a01b031990811682556001820180548216905560028201805490911690556003810182905560048101805463ffffffff19169055906139216005830182614908565b61392e600683015f614908565b50505f828152609e602052604090819020805460ff19169055517f1f40400889274ed07b24845e5054a87a0cab969eb1277aafe61ae352e7c32a00906139779084815260200190565b60405180910390a185516001600160a01b039081165f908152609a6020526040812054885160a08a015191909316926139b19184906128a0565b90505f5b8860a0015151811015613bcd575f6139dc8a60a00151838151811061209c5761209c6154f6565b90505f613a128b60c0015184815181106139f8576139f86154f6565b6020026020010151878581518110611632576116326154f6565b9050805f03613a22575050613bc5565b8715613af057816001600160a01b0316632eae418c8c5f01518d60a001518681518110613a5157613a516154f6565b60200260200101518d8d88818110613a6b57613a6b6154f6565b9050602002016020810190613a809190614da9565b60405160e085901b6001600160e01b03191681526001600160a01b03938416600482015291831660248301529091166044820152606481018490526084015f604051808303815f87803b158015613ad5575f5ffd5b505af1158015613ae7573d5f5f3e3d5ffd5b50505050613bc2565b5f5f836001600160a01b03166350ff72258e5f01518f60a001518881518110613b1b57613b1b6154f6565b6020026020010151866040518463ffffffff1660e01b8152600401613b4293929190615848565b60408051808303815f875af1158015613b5d573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613b819190615916565b91509150613bbf878e5f01518f60a001518881518110613ba357613ba36154f6565b602002602001015185858b8b81518110613087576130876154f6565b50505b50505b6001016139b5565b505050505050505050565b80515f9015613be8578151611c81565b670de0b6b3a764000092915050565b606654606090600190600290811603613c235760405163840a48d560e01b815260040160405180910390fd5b6001600160a01b038084165f818152609a602052604080822080546001600160a01b0319811690915590519316928392917ffee30966a256b71e14bc0ebfc94315e28ef4a97a7131a9e2b7a310a73af4467691a35f5f613c828661194f565b9150915081515f03613c9657505050613e50565b81516001600160401b03811115613caf57613caf614a7a565b604051908082528060200260200182016040528015613cd8578160200160208202803683370190505b5094505f613ce78785856128a0565b90505f5b8351811015613e4a576040805160018082528183019092525f916020808301908036833750506040805160018082528183019092529293505f9291506020808301908036833750506040805160018082528183019092529293505f92915060208083019080368337019050509050868481518110613d6b57613d6b6154f6565b6020026020010151835f81518110613d8557613d856154f6565b60200260200101906001600160a01b031690816001600160a01b031681525050858481518110613db757613db76154f6565b6020026020010151825f81518110613dd157613dd16154f6565b602002602001018181525050848481518110613def57613def6154f6565b6020026020010151815f81518110613e0957613e096154f6565b602002602001018181525050613e228b898585856129e7565b8a8581518110613e3457613e346154f6565b6020908102919091010152505050600101613ceb565b50505050505b50919050565b6001600160a01b038084165f908152609960205260409020600101541680613e7e5750613f15565b6001600160a01b0381165f908152609c6020908152604080832085845290915290205460ff1615613ec257604051630d4c4c9160e21b815260040160405180910390fd5b6001600160a01b0381165f908152609c602090815260408083208584528252909120805460ff191660011790558301516124cb908290613f0990889088908490889061081f565b855160208701516141f6565b50505050565b60605f610d5a83614248565b5f610d5a613f3484613bd8565b8390613660565b6001600160a01b03821673beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac014611060576001600160a01b038084165f90815260a5602090815260408083209386168352929052908120613f8e906140b2565b9050613f1543613f9e8484615601565b6001600160a01b038088165f90815260a560209081526040808320938a1683529290522091906142a1565b5f610d5a83836142ac565b5f610d5a83670de0b6b3a764000084614106565b825f0361400857614001670de0b6b3a764000082613fd4565b8455613f15565b6040805160208101909152845481525f90614024908584613674565b90505f6140318483615601565b90505f61404c84612f31614045888a615601565b8590613fd4565b875550505050505050565b5f5f614064868686614106565b9050600183600281111561407a5761407a615938565b14801561409657505f84806140915761409161594c565b868809115b156140a9576140a6600182615601565b90505b95945050505050565b5f6140bd82826142f8565b6001600160e01b031692915050565b5f6140d883838361433d565b6001600160e01b03169392505050565b5f611d296140f68385615960565b85906001600160401b0316613660565b5f80805f19858709858702925082811083820303915050805f0361413d578382816141335761413361594c565b0492505050610d5a565b8084116141845760405162461bcd60e51b81526020600482015260156024820152744d6174683a206d756c446976206f766572666c6f7760581b60448201526064016122e7565b5f8486880960026001871981018816978890046003810283188082028403028082028403028082028403028082028403028082028403029081029092039091025f889003889004909101858311909403939093029303949094049190911702949350505050565b5f610d5a8383614386565b4281101561421757604051630819bdcd60e01b815260040160405180910390fd5b61422b6001600160a01b0385168484614469565b613f1557604051638baa579f60e01b815260040160405180910390fd5b6060815f0180548060200260200160405190810160405280929190818152602001828054801561429557602002820191905f5260205f20905b815481526020019060010190808311614281575b50505050509050919050565b6110608383836144bd565b5f8181526001830160205260408120546142f157508154600181810184555f848152602080822090930184905584548482528286019093526040902091909155611c81565b505f611c81565b81545f9080156143355761431e846143116001846158e7565b5f91825260209091200190565b5464010000000090046001600160e01b0316611d29565b509092915050565b82545f908161434e868683856145c3565b9050801561437c57614365866143116001846158e7565b5464010000000090046001600160e01b031661089d565b5091949350505050565b5f8181526001830160205260408120548015614460575f6143a86001836158e7565b85549091505f906143bb906001906158e7565b905081811461441a575f865f0182815481106143d9576143d96154f6565b905f5260205f200154905080875f0184815481106143f9576143f96154f6565b5f918252602080832090910192909255918252600188019052604090208390555b855486908061442b5761442b61597f565b600190038181905f5260205f20015f90559055856001015f8681526020019081526020015f205f905560019350505050611c81565b5f915050611c81565b5f5f5f6144768585614616565b90925090505f81600481111561448e5761448e615938565b1480156144ac5750856001600160a01b0316826001600160a01b0316145b8061089d575061089d868686614655565b82548015614575575f6144d5856143116001856158e7565b60408051808201909152905463ffffffff8082168084526401000000009092046001600160e01b0316602084015291925090851610156145285760405163151b8e3f60e11b815260040160405180910390fd5b805163ffffffff8086169116036145735782614549866143116001866158e7565b80546001600160e01b03929092166401000000000263ffffffff9092169190911790555050505050565b505b506040805180820190915263ffffffff92831681526001600160e01b03918216602080830191825285546001810187555f968752952091519051909216640100000000029190921617910155565b5f5b81831015611e98575f6145d8848461473c565b5f8781526020902090915063ffffffff86169082015463ffffffff16111561460257809250614610565b61460d816001615601565b93505b506145c5565b5f5f825160410361464a576020830151604084015160608501515f1a61463e87828585614756565b9450945050505061224a565b505f9050600261224a565b5f5f5f856001600160a01b0316631626ba7e60e01b868660405160240161467d929190615993565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b03199094169390931790925290516146bb91906159cf565b5f60405180830381855afa9150503d805f81146146f3576040519150601f19603f3d011682016040523d82523d5f602084013e6146f8565b606091505b509150915081801561470c57506020815110155b801561089d57508051630b135d3f60e11b90614731908301602090810190840161572a565b149695505050505050565b5f61474a60028484186159e5565b610d5a90848416615601565b5f807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a083111561478b57505f9050600361480a565b604080515f8082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa1580156147dc573d5f5f3e3d5ffd5b5050604051601f1901519150506001600160a01b038116614804575f6001925092505061480a565b91505f90505b94509492505050565b6040518060e001604052805f6001600160a01b031681526020015f6001600160a01b031681526020015f6001600160a01b031681526020015f81526020015f63ffffffff16815260200160608152602001606081525090565b828054828255905f5260205f209081019282156148bf579160200282015b828111156148bf57825182546001600160a01b0319166001600160a01b0390911617825560209092019160019091019061488a565b506148cb92915061491f565b5090565b828054828255905f5260205f209081019282156148bf579160200282015b828111156148bf5782518255916020019190600101906148ed565b5080545f8255905f5260205f209081019061265091905b5b808211156148cb575f8155600101614920565b6001600160a01b0381168114612650575f5ffd5b803561495281614933565b919050565b5f5f5f5f5f60a0868803121561496b575f5ffd5b853561497681614933565b9450602086013561498681614933565b9350604086013561499681614933565b94979396509394606081013594506080013592915050565b5f5f83601f8401126149be575f5ffd5b5081356001600160401b038111156149d4575f5ffd5b6020830191508360208260051b850101111561224a575f5ffd5b5f5f602083850312156149ff575f5ffd5b82356001600160401b03811115614a14575f5ffd5b614a20858286016149ae565b90969095509350505050565b602080825282518282018190525f918401906040840190835b81811015610b21578351835260209384019390920191600101614a45565b5f60208284031215614a73575f5ffd5b5035919050565b634e487b7160e01b5f52604160045260245ffd5b60405160e081016001600160401b0381118282101715614ab057614ab0614a7a565b60405290565b604080519081016001600160401b0381118282101715614ab057614ab0614a7a565b604051601f8201601f191681016001600160401b0381118282101715614b0057614b00614a7a565b604052919050565b5f6001600160401b03821115614b2057614b20614a7a565b5060051b60200190565b5f82601f830112614b39575f5ffd5b8135614b4c614b4782614b08565b614ad8565b8082825260208201915060208360051b860101925085831115614b6d575f5ffd5b602085015b83811015614b93578035614b8581614933565b835260209283019201614b72565b5095945050505050565b5f82601f830112614bac575f5ffd5b8135614bba614b4782614b08565b8082825260208201915060208360051b860101925085831115614bdb575f5ffd5b602085015b83811015614b93578035835260209283019201614be0565b5f5f5f60608486031215614c0a575f5ffd5b8335614c1581614933565b925060208401356001600160401b03811115614c2f575f5ffd5b614c3b86828701614b2a565b92505060408401356001600160401b03811115614c56575f5ffd5b614c6286828701614b9d565b9150509250925092565b5f8151808452602084019350602083015f5b82811015614c9c578151865260209586019590910190600101614c7e565b5093949350505050565b602081525f610d5a6020830184614c6c565b803563ffffffff81168114614952575f5ffd5b5f5f83601f840112614cdb575f5ffd5b5081356001600160401b03811115614cf1575f5ffd5b60208301915083602082850101111561224a575f5ffd5b5f5f5f5f60608587031215614d1b575f5ffd5b8435614d2681614933565b9350614d3460208601614cb8565b925060408501356001600160401b03811115614d4e575f5ffd5b614d5a87828801614ccb565b95989497509550505050565b5f5f5f5f60808587031215614d79575f5ffd5b8435614d8481614933565b93506020850135614d9481614933565b93969395505050506040820135916060013590565b5f60208284031215614db9575f5ffd5b8135610d5a81614933565b5f5f60408385031215614dd5575f5ffd5b8235614de081614933565b91506020830135614df081614933565b809150509250929050565b5f60e08284031215614e0b575f5ffd5b614e13614a8e565b9050614e1e82614947565b8152614e2c60208301614947565b6020820152614e3d60408301614947565b604082015260608281013590820152614e5860808301614cb8565b608082015260a08201356001600160401b03811115614e75575f5ffd5b614e8184828501614b2a565b60a08301525060c08201356001600160401b03811115614e9f575f5ffd5b614eab84828501614b9d565b60c08301525092915050565b5f60208284031215614ec7575f5ffd5b81356001600160401b03811115614edc575f5ffd5b611d2984828501614dfb565b5f60208284031215614ef8575f5ffd5b813560ff81168114610d5a575f5ffd5b5f8151808452602084019350602083015f5b82811015614c9c5781516001600160a01b0316865260209586019590910190600101614f1a565b80516001600160a01b03908116835260208083015182169084015260408083015190911690830152606080820151908301526080808201515f91614f8c9085018263ffffffff169052565b5060a082015160e060a0850152614fa660e0850182614f08565b905060c083015184820360c08601526140a98282614c6c565b602081525f610d5a6020830184614f41565b5f82825180855260208501945060208160051b830101602085015f5b8381101561348857601f19858403018852615009838351614c6c565b6020988901989093509190910190600101614fed565b5f604082016040835280855180835260608501915060608160051b8601019250602087015f5b8281101561507657605f19878603018452615061858351614f41565b94506020938401939190910190600101615045565b5050505082810360208401526140a98185614fd1565b6001600160401b0381168114612650575f5ffd5b5f5f5f5f608085870312156150b3575f5ffd5b84356150be81614933565b935060208501356150ce81614933565b925060408501356150de8161508c565b915060608501356150ee8161508c565b939692955090935050565b5f5f5f6060848603121561510b575f5ffd5b833561511681614933565b925060208401359150604084013561512d8161508c565b809150509250925092565b604081525f61514a6040830185614f08565b82810360208401526140a98185614c6c565b5f5f5f6040848603121561516e575f5ffd5b833561517981614933565b925060208401356001600160401b03811115615193575f5ffd5b61519f86828701614ccb565b9497909650939450505050565b5f5f604083850312156151bd575f5ffd5b82356151c881614933565b915060208301356001600160401b038111156151e2575f5ffd5b6151ee85828601614b2a565b9150509250929050565b5f5f5f5f5f5f6060878903121561520d575f5ffd5b86356001600160401b03811115615222575f5ffd5b61522e89828a016149ae565b90975095505060208701356001600160401b0381111561524c575f5ffd5b61525889828a016149ae565b90955093505060408701356001600160401b03811115615276575f5ffd5b61528289828a016149ae565b979a9699509497509295939492505050565b5f5f5f606084860312156152a6575f5ffd5b83356152b181614933565b925060208401356001600160401b038111156152cb575f5ffd5b8401604081870312156152dc575f5ffd5b6152e4614ab6565b81356001600160401b038111156152f9575f5ffd5b8201601f81018813615309575f5ffd5b80356001600160401b0381111561532257615322614a7a565b615335601f8201601f1916602001614ad8565b818152896020838501011115615349575f5ffd5b816020840160208301375f60209282018301528352928301359282019290925293969395505050506040919091013590565b5f5f6040838503121561538c575f5ffd5b823561539781614933565b946020939093013593505050565b604081525f61514a6040830185614c6c565b8015158114612650575f5ffd5b5f5f5f5f606085870312156153d7575f5ffd5b84356001600160401b038111156153ec575f5ffd5b850160e081880312156153fd575f5ffd5b935060208501356001600160401b03811115615417575f5ffd5b615423878288016149ae565b90945092505060408501356150ee816153b7565b5f5f60408385031215615448575f5ffd5b82356001600160401b0381111561545d575f5ffd5b8301601f8101851361546d575f5ffd5b803561547b614b4782614b08565b8082825260208201915060208360051b85010192508783111561549c575f5ffd5b6020840193505b828410156154c75783356154b681614933565b8252602093840193909101906154a3565b945050505060208301356001600160401b038111156151e2575f5ffd5b602081525f610d5a6020830184614fd1565b634e487b7160e01b5f52603260045260245ffd5b5f8235605e1983360301811261551e575f5ffd5b9190910192915050565b5f5f8335601e1984360301811261553d575f5ffd5b8301803591506001600160401b03821115615556575f5ffd5b6020019150600581901b360382131561224a575f5ffd5b5f6020828403121561557d575f5ffd5b8151610d5a816153b7565b60208152816020820152818360408301375f818301604090810191909152601f909201601f19160101919050565b5f602082840312156155c6575f5ffd5b8151610d5a8161508c565b634e487b7160e01b5f52601160045260245ffd5b63ffffffff8181168382160190811115611c8157611c816155d1565b80820180821115611c8157611c816155d1565b5f82601f830112615623575f5ffd5b8151615631614b4782614b08565b8082825260208201915060208360051b860101925085831115615652575f5ffd5b602085015b83811015614b93578051835260209283019201615657565b5f5f60408385031215615680575f5ffd5b82516001600160401b03811115615695575f5ffd5b8301601f810185136156a5575f5ffd5b80516156b3614b4782614b08565b8082825260208201915060208360051b8501019250878311156156d4575f5ffd5b6020840193505b828410156156ff5783516156ee81614933565b8252602093840193909101906156db565b8095505050505060208301516001600160401b0381111561571e575f5ffd5b6151ee85828601615614565b5f6020828403121561573a575f5ffd5b5051919050565b5f823560de1983360301811261551e575f5ffd5b5f611c813683614dfb565b5f60208284031215615770575f5ffd5b8135610d5a816153b7565b5f6020828403121561578b575f5ffd5b8151610d5a81614933565b6001600160a01b03831681526040602082018190525f90611d2990830184614f08565b5f602082840312156157c9575f5ffd5b81516001600160401b038111156157de575f5ffd5b8201601f810184136157ee575f5ffd5b80516157fc614b4782614b08565b8082825260208201915060208360051b85010192508683111561581d575f5ffd5b6020840193505b8284101561089d5783516158378161508c565b825260209384019390910190615824565b6001600160a01b039384168152919092166020820152604081019190915260600190565b5f6001820161587d5761587d6155d1565b5060010190565b838152606060208201525f61589c6060830185614f41565b828103604084015261089d8185614c6c565b6001600160a01b03841681526060602082018190525f906158d190830185614f08565b905063ffffffff83166040830152949350505050565b81810381811115611c8157611c816155d1565b63ffffffff8281168282160390811115611c8157611c816155d1565b5f5f60408385031215615927575f5ffd5b505080516020909101519092909150565b634e487b7160e01b5f52602160045260245ffd5b634e487b7160e01b5f52601260045260245ffd5b6001600160401b038281168282160390811115611c8157611c816155d1565b634e487b7160e01b5f52603160045260245ffd5b828152604060208201525f82518060408401528060208501606085015e5f606082850101526060601f19601f8301168401019150509392505050565b5f82518060208501845e5f920191825250919050565b5f826159ff57634e487b7160e01b5f52601260045260245ffd5b50049056fea26469706673582212200648457bc5b8ec032001d65839829fcf37fc20846fa51b9624f43ca2de62b2a964736f6c634300081b0033", + Bin: "0x610180604052348015610010575f5ffd5b50604051615dd6380380615dd683398101604081905261002f9161021c565b8186868684876001600160a01b03811661005c576040516339b190bb60e11b815260040160405180910390fd5b6001600160a01b0390811660805293841660a05291831660c05290911660e05263ffffffff16610100524661012052610125604080518082018252600a81526922b4b3b2b72630bcb2b960b11b60209182015281517f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a866818301527f71b625cfad44bac63b13dba07f2e1d6084ee04b6f8752101ece6126d584ee6ea81840152466060820152306080808301919091528351808303909101815260a0909101909252815191012090565b610140526001600160a01b03166101605261013e610149565b5050505050506102a7565b5f54610100900460ff16156101b45760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff90811614610203575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b0381168114610219575f5ffd5b50565b5f5f5f5f5f5f60c08789031215610231575f5ffd5b865161023c81610205565b602088015190965061024d81610205565b604088015190955061025e81610205565b606088015190945061026f81610205565b608088015190935061028081610205565b60a088015190925063ffffffff81168114610299575f5ffd5b809150509295509295509295565b60805160a05160c05160e05161010051610120516101405161016051615a3a61039c5f395f818161042c01526132fa01525f61271601525f61265601525f818161070001528181611504015281816134f5015261383101525f818161075001528181610da901528181610f5a0152818161169f0152818161185e01528181611cb2015281816128eb01526133b101525f818161045301528181610ee0015281816117c501528181611a23015281816130e3015261363b01525f818161038901528181610eae01528181611977015261361501525f81816105ee01528181610b410152818161107a015261273a0152615a3a5ff3fe608060405234801561000f575f5ffd5b50600436106102cb575f3560e01c8063715018a61161017b578063bfae3fd2116100e4578063e4cc3f901161009e578063f2fde38b11610079578063f2fde38b146107de578063f698da25146107f1578063fabc1cbc146107f9578063fd8aa88d1461080c575f5ffd5b8063e4cc3f9014610798578063eea9064b146107ab578063f0e0e676146107be575f5ffd5b8063bfae3fd2146106e3578063c448feb8146106f6578063c978f7ac1461072a578063ca8aa7c71461074b578063cd6dc68714610772578063da8be86414610785575f5ffd5b80639104c319116101355780639104c319146106345780639435bb431461064f578063a178848414610662578063a33a343314610681578063b7f06ebe14610694578063bb45fef2146106b6575f5ffd5b8063715018a6146105a4578063778e55f3146105ac57806378296ec5146105d6578063886f1195146105e95780638da5cb5b146106105780639004134714610621575f5ffd5b806354b7c96c116102375780635dd68579116101f157806365da1264116101cc57806365da12641461053557806366d5ba931461055d5780636d70f7ae1461057e5780636e17444814610591575f5ffd5b80635dd68579146104ee578063601bb36f1461050f57806360a0d1ce14610522575f5ffd5b806354b7c96c14610475578063595c6a6714610488578063597b36da146104905780635ac86ab7146104a35780635c975abb146104c65780635d975e88146104ce575f5ffd5b806339b70e381161028857806339b70e38146103845780633c651cf2146103c35780633cdeb5e0146103d65780633e28391d146104045780634657e26a146104275780634665bcda1461044e575f5ffd5b806304a4f979146102cf5780630b9f487a146103095780630dd8dd021461031c578063136439dd1461033c57806325df922e146103515780632aa6d88814610371575b5f5ffd5b6102f67f14bde674c9f64b2ad00eaaee4a8bed1fabef35c7507e3c5b9cfc9436909a2dad81565b6040519081526020015b60405180910390f35b6102f6610317366004614957565b61081f565b61032f61032a3660046149ee565b6108a7565b6040516103009190614a2c565b61034f61034a366004614a63565b610b2c565b005b61036461035f366004614bf8565b610c01565b6040516103009190614ca6565b61034f61037f366004614d08565b610d61565b6103ab7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610300565b61034f6103d1366004614d66565b610ea3565b6103ab6103e4366004614da9565b6001600160a01b039081165f908152609960205260409020600101541690565b610417610412366004614da9565b610fea565b6040519015158152602001610300565b6103ab7f000000000000000000000000000000000000000000000000000000000000000081565b6103ab7f000000000000000000000000000000000000000000000000000000000000000081565b61034f610483366004614dc4565b611009565b61034f611065565b6102f661049e366004614eb7565b611114565b6104176104b1366004614ee8565b606654600160ff9092169190911b9081161490565b6066546102f6565b6104e16104dc366004614a63565b611143565b6040516103009190614fbf565b6105016104fc366004614da9565b61125f565b60405161030092919061501f565b61034f61051d3660046150a0565b611694565b61034f6105303660046150f9565b6117ba565b6103ab610543366004614da9565b609a6020525f90815260409020546001600160a01b031681565b61057061056b366004614da9565b61194f565b604051610300929190615138565b61041761058c366004614da9565b611c4f565b6102f661059f366004614dc4565b611c87565b61034f611d31565b6102f66105ba366004614dc4565b609860209081525f928352604080842090915290825290205481565b61034f6105e436600461515c565b611d42565b6103ab7f000000000000000000000000000000000000000000000000000000000000000081565b6033546001600160a01b03166103ab565b61036461062f3660046151ac565b611dca565b6103ab73beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac081565b61034f61065d3660046151f8565b611ea0565b6102f6610670366004614da9565b609f6020525f908152604090205481565b61032f61068f366004615294565b611f70565b6104176106a2366004614a63565b609e6020525f908152604090205460ff1681565b6104176106c436600461537b565b609c60209081525f928352604080842090915290825290205460ff1681565b6102f66106f1366004614dc4565b611f88565b60405163ffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152602001610300565b61073d6107383660046151ac565b611fc4565b6040516103009291906153a5565b6103ab7f000000000000000000000000000000000000000000000000000000000000000081565b61034f61078036600461537b565b612251565b61032f610793366004614da9565b61236c565b61034f6107a63660046153c4565b61247c565b61034f6107b9366004615294565b6124d2565b6107d16107cc366004615437565b612535565b60405161030091906154e4565b61034f6107ec366004614da9565b6125da565b6102f6612653565b61034f610807366004614a63565b612738565b61032f61081a366004614da9565b61284f565b604080517f14bde674c9f64b2ad00eaaee4a8bed1fabef35c7507e3c5b9cfc9436909a2dad60208201526001600160a01b03808616928201929092528187166060820152908516608082015260a0810183905260c081018290525f9061089d9060e00160405160208183030381529060405280519060200120612872565b9695505050505050565b6066546060906001906002908116036108d35760405163840a48d560e01b815260040160405180910390fd5b5f836001600160401b038111156108ec576108ec614a7a565b604051908082528060200260200182016040528015610915578160200160208202803683370190505b50335f908152609a60205260408120549192506001600160a01b03909116905b85811015610b215786868281811061094f5761094f6154f6565b9050602002810190610961919061550a565b61096f906020810190615528565b9050878783818110610983576109836154f6565b9050602002810190610995919061550a565b61099f9080615528565b9050146109bf576040516343714afd60e01b815260040160405180910390fd5b5f610a2933848a8a868181106109d7576109d76154f6565b90506020028101906109e9919061550a565b6109f39080615528565b808060200260200160405190810160405280939291908181526020018383602002808284375f920191909152506128a092505050565b9050610afb33848a8a86818110610a4257610a426154f6565b9050602002810190610a54919061550a565b610a5e9080615528565b808060200260200160405190810160405280939291908181526020018383602002808284375f920191909152508e92508d9150889050818110610aa357610aa36154f6565b9050602002810190610ab5919061550a565b610ac3906020810190615528565b808060200260200160405190810160405280939291908181526020018383602002808284375f920191909152508892506129e7915050565b848381518110610b0d57610b0d6154f6565b602090810291909101015250600101610935565b509095945050505050565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa158015610b8e573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610bb2919061556d565b610bcf57604051631d77d47760e21b815260040160405180910390fd5b6066548181168114610bf45760405163c61dca5d60e01b815260040160405180910390fd5b610bfd82612edc565b5050565b6001600160a01b038084165f908152609a60205260408120546060921690610c2a8683876128a0565b90505f85516001600160401b03811115610c4657610c46614a7a565b604051908082528060200260200182016040528015610c6f578160200160208202803683370190505b5090505f5b8651811015610d54576001600160a01b0388165f90815260a260205260408120885182908a9085908110610caa57610caa6154f6565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020015f206040518060200160405290815f820154815250509050610d2e878381518110610cfc57610cfc6154f6565b6020026020010151858481518110610d1657610d166154f6565b602002602001015183612f199092919063ffffffff16565b838381518110610d4057610d406154f6565b602090810291909101015250600101610c74565b50925050505b9392505050565b610d6a33610fea565b15610d8857604051633bf2b50360e11b815260040160405180910390fd5b604051632b6241f360e11b815233600482015263ffffffff841660248201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906356c483e6906044015f604051808303815f87803b158015610df2575f5ffd5b505af1158015610e04573d5f5f3e3d5ffd5b50505050610e123385612f37565b610e1c3333612f99565b6040516001600160a01b038516815233907fa453db612af59e5521d6ab9284dc3e2d06af286eb1b1b7b771fce4716c19f2c19060200160405180910390a2336001600160a01b03167f02a919ed0e2acad1dd90f17ef2fa4ae5462ee1339170034a8531cca4b67080908383604051610e95929190615588565b60405180910390a250505050565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161480610f025750336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016145b610f1f5760405163045206a560e21b815260040160405180910390fd5b6001600160a01b038481165f908152609a602052604080822054905163152667d960e31b8152908316600482018190528684166024830152927f0000000000000000000000000000000000000000000000000000000000000000169063a9333ec890604401602060405180830381865afa158015610f9f573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610fc391906155b6565b90505f610fd187878461309c565b9050610fe183888888888661317e565b50505050505050565b6001600160a01b039081165f908152609a602052604090205416151590565b81611013816132bc565b6110305760405163932d94f760e01b815260040160405180910390fd5b61103983611c4f565b611056576040516325ec6c1f60e01b815260040160405180910390fd5b6110608383612f37565b505050565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa1580156110c7573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110eb919061556d565b61110857604051631d77d47760e21b815260040160405180910390fd5b6111125f19612edc565b565b5f816040516020016111269190614fbf565b604051602081830303815290604052805190602001209050919050565b61114b614813565b5f82815260a46020908152604091829020825160e08101845281546001600160a01b03908116825260018301548116828501526002830154168185015260038201546060820152600482015463ffffffff1660808201526005820180548551818602810186019096528086529194929360a086019392908301828280156111f957602002820191905f5260205f20905b81546001600160a01b031681526001909101906020018083116111db575b505050505081526020016006820180548060200260200160405190810160405280929190818152602001828054801561124f57602002820191905f5260205f20905b81548152602001906001019080831161123b575b5050505050815250509050919050565b6060805f61126c8461284f565b8051909150806001600160401b0381111561128957611289614a7a565b6040519080825280602002602001820160405280156112c257816020015b6112af614813565b8152602001906001900390816112a75790505b509350806001600160401b038111156112dd576112dd614a7a565b60405190808252806020026020018201604052801561131057816020015b60608152602001906001900390816112fb5790505b506001600160a01b038087165f908152609a60205260408120549295509116905b8281101561168b5760a45f85838151811061134e5761134e6154f6565b60209081029190910181015182528181019290925260409081015f20815160e08101835281546001600160a01b03908116825260018301548116828601526002830154168184015260038201546060820152600482015463ffffffff1660808201526005820180548451818702810187019095528085529194929360a086019390929083018282801561140857602002820191905f5260205f20905b81546001600160a01b031681526001909101906020018083116113ea575b505050505081526020016006820180548060200260200160405190810160405280929190818152602001828054801561145e57602002820191905f5260205f20905b81548152602001906001019080831161144a575b505050505081525050868281518110611479576114796154f6565b6020026020010181905250858181518110611496576114966154f6565b602002602001015160a00151516001600160401b038111156114ba576114ba614a7a565b6040519080825280602002602001820160405280156114e3578160200160208202803683370190505b508582815181106114f6576114f66154f6565b60200260200101819052505f7f0000000000000000000000000000000000000000000000000000000000000000878381518110611535576115356154f6565b60200260200101516080015161154b91906155e5565b905060604363ffffffff168263ffffffff1610156115935761158c89858a868151811061157a5761157a6154f6565b602002602001015160a0015185613366565b90506115be565b6115bb89858a86815181106115aa576115aa6154f6565b602002602001015160a001516128a0565b90505b5f5b8884815181106115d2576115d26154f6565b602002602001015160a001515181101561167d5761163f8985815181106115fb576115fb6154f6565b602002602001015160c001518281518110611618576116186154f6565b6020026020010151838381518110611632576116326154f6565b6020026020010151613494565b888581518110611651576116516154f6565b6020026020010151828151811061166a5761166a6154f6565b60209081029190910101526001016115c0565b505050806001019050611331565b50505050915091565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146116dd576040516323d871a560e01b815260040160405180910390fd5b6001600160a01b038085165f90815260986020908152604080832093871683529290529081205461171b906001600160401b0380861690851661349f565b90505f61172a868686866134b7565b90505f6117378284615601565b9050611745875f8886613574565b5f61174f876135ee565b60405163debe1eab60e01b81526001600160a01b038981166004830152602482018590529192509082169063debe1eab906044015f604051808303815f87803b15801561179a575f5ffd5b505af11580156117ac573d5f5f3e3d5ffd5b505050505050505050505050565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461180357604051633213a66160e21b815260040160405180910390fd5b61180c83610fea565b15611060576001600160a01b038381165f908152609a602052604080822054905163152667d960e31b81529083166004820181905273beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac06024830152927f0000000000000000000000000000000000000000000000000000000000000000169063a9333ec890604401602060405180830381865afa1580156118a3573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906118c791906155b6565b6001600160a01b0386165f90815260a26020908152604080832073beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac084528252808320815192830190915254815291925061192d866119256001600160401b03808716908916613660565b849190613674565b9050610fe1848873beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac084613574565b6040516394f649dd60e01b81526001600160a01b03828116600483015260609182915f9182917f000000000000000000000000000000000000000000000000000000000000000016906394f649dd906024015f60405180830381865afa1580156119bb573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526119e2919081019061566f565b60405163fe243a1760e01b81526001600160a01b03888116600483015273beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac060248301529294509092505f917f0000000000000000000000000000000000000000000000000000000000000000169063fe243a1790604401602060405180830381865afa158015611a68573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a8c919061572a565b9050805f03611aa057509094909350915050565b5f83516001611aaf9190615601565b6001600160401b03811115611ac657611ac6614a7a565b604051908082528060200260200182016040528015611aef578160200160208202803683370190505b5090505f84516001611b019190615601565b6001600160401b03811115611b1857611b18614a7a565b604051908082528060200260200182016040528015611b41578160200160208202803683370190505b50905073beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac082865181518110611b6c57611b6c6154f6565b60200260200101906001600160a01b031690816001600160a01b0316815250508281865181518110611ba057611ba06154f6565b60209081029190910101525f5b8551811015611c4157858181518110611bc857611bc86154f6565b6020026020010151838281518110611be257611be26154f6565b60200260200101906001600160a01b031690816001600160a01b031681525050848181518110611c1457611c146154f6565b6020026020010151828281518110611c2e57611c2e6154f6565b6020908102919091010152600101611bad565b509097909650945050505050565b5f6001600160a01b03821615801590611c8157506001600160a01b038083165f818152609a6020526040902054909116145b92915050565b60405163152667d960e31b81526001600160a01b03838116600483015282811660248301525f9182917f0000000000000000000000000000000000000000000000000000000000000000169063a9333ec890604401602060405180830381865afa158015611cf7573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611d1b91906155b6565b9050611d298484835f6134b7565b949350505050565b611d39613692565b6111125f6136ec565b82611d4c816132bc565b611d695760405163932d94f760e01b815260040160405180910390fd5b611d7284611c4f565b611d8f576040516325ec6c1f60e01b815260040160405180910390fd5b836001600160a01b03167f02a919ed0e2acad1dd90f17ef2fa4ae5462ee1339170034a8531cca4b67080908484604051610e95929190615588565b60605f82516001600160401b03811115611de657611de6614a7a565b604051908082528060200260200182016040528015611e0f578160200160208202803683370190505b5090505f5b8351811015611e98576001600160a01b0385165f9081526098602052604081208551909190869084908110611e4b57611e4b6154f6565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020015f2054828281518110611e8557611e856154f6565b6020908102919091010152600101611e14565b509392505050565b606654600290600490811603611ec95760405163840a48d560e01b815260040160405180910390fd5b611ed161373d565b855f5b81811015611f6457611f5c898983818110611ef157611ef16154f6565b9050602002810190611f039190615741565b611f0c90615755565b888884818110611f1e57611f1e6154f6565b9050602002810190611f309190615528565b888886818110611f4257611f426154f6565b9050602002016020810190611f579190615760565b613796565b600101611ed4565b5050610fe1600160c955565b6060611f7b3361236c565b9050610d5a8484846124d2565b6001600160a01b038083165f90815260a260209081526040808320938516835292815282822083519182019093529154825290610d5a90613bd8565b60608082516001600160401b03811115611fe057611fe0614a7a565b604051908082528060200260200182016040528015612009578160200160208202803683370190505b50915082516001600160401b0381111561202557612025614a7a565b60405190808252806020026020018201604052801561204e578160200160208202803683370190505b506001600160a01b038086165f908152609a60205260408120549293509116906120798683876128a0565b90505f5b8551811015612246575f6120a987838151811061209c5761209c6154f6565b60200260200101516135ee565b9050806001600160a01b031663fe243a17898985815181106120cd576120cd6154f6565b60200260200101516040518363ffffffff1660e01b81526004016121079291906001600160a01b0392831681529116602082015260400190565b602060405180830381865afa158015612122573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612146919061572a565b858381518110612158576121586154f6565b6020026020010181815250505f60a25f8a6001600160a01b03166001600160a01b031681526020019081526020015f205f89858151811061219b5761219b6154f6565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020015f206040518060200160405290815f82015481525050905061221f8684815181106121ed576121ed6154f6565b6020026020010151858581518110612207576122076154f6565b6020026020010151836136749092919063ffffffff16565b878481518110612231576122316154f6565b6020908102919091010152505060010161207d565b5050505b9250929050565b5f54610100900460ff161580801561226f57505f54600160ff909116105b806122885750303b15801561228857505f5460ff166001145b6122f05760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b5f805460ff191660011790558015612311575f805461ff0019166101001790555b61231a82612edc565b612323836136ec565b8015611060575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a1505050565b606061237782610fea565b6123945760405163a5c7c44560e01b815260040160405180910390fd5b61239d82611c4f565b156123bb576040516311ca333560e31b815260040160405180910390fd5b336001600160a01b03831614612473576001600160a01b038083165f908152609a6020526040902054166123ee816132bc565b8061241457506001600160a01b038181165f908152609960205260409020600101541633145b61243157604051631e499a2360e11b815260040160405180910390fd5b806001600160a01b0316836001600160a01b03167ff0eddf07e6ea14f388b47e1e94a0f464ecbd9eed4171130e0fc0e99fb4030a8a60405160405180910390a3505b611c8182613bf7565b6066546002906004908116036124a55760405163840a48d560e01b815260040160405180910390fd5b6124ad61373d565b6124c16124b986615755565b858585613796565b6124cb600160c955565b5050505050565b6124db33610fea565b156124f957604051633bf2b50360e11b815260040160405180910390fd5b61250283611c4f565b61251f576040516325ec6c1f60e01b815260040160405180910390fd5b61252b33848484613e56565b6110603384612f99565b60605f83516001600160401b0381111561255157612551614a7a565b60405190808252806020026020018201604052801561258457816020015b606081526020019060019003908161256f5790505b5090505f5b8451811015611e98576125b58582815181106125a7576125a76154f6565b602002602001015185611dca565b8282815181106125c7576125c76154f6565b6020908102919091010152600101612589565b6125e2613692565b6001600160a01b0381166126475760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016122e7565b612650816136ec565b50565b5f7f000000000000000000000000000000000000000000000000000000000000000046146127135750604080518082018252600a81526922b4b3b2b72630bcb2b960b11b60209182015281517f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a866818301527f71b625cfad44bac63b13dba07f2e1d6084ee04b6f8752101ece6126d584ee6ea81840152466060820152306080808301919091528351808303909101815260a0909101909252815191012090565b507f000000000000000000000000000000000000000000000000000000000000000090565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612794573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906127b8919061577b565b6001600160a01b0316336001600160a01b0316146127e95760405163794821ff60e01b815260040160405180910390fd5b606654801982198116146128105760405163c61dca5d60e01b815260040160405180910390fd5b606682905560405182815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c906020015b60405180910390a25050565b6001600160a01b0381165f90815260a360205260409020606090611c8190613f1b565b5f61287b612653565b60405161190160f01b6020820152602281019190915260428101839052606201611126565b60605f82516001600160401b038111156128bc576128bc614a7a565b6040519080825280602002602001820160405280156128e5578160200160208202803683370190505b5090505f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663547afb8786866040518363ffffffff1660e01b8152600401612937929190615796565b5f60405180830381865afa158015612951573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261297891908101906157b9565b90505f5b8451811015610b21576129c28786838151811061299b5761299b6154f6565b60200260200101518484815181106129b5576129b56154f6565b602002602001015161309c565b8382815181106129d4576129d46154f6565b602090810291909101015260010161297c565b5f6001600160a01b038616612a0f576040516339b190bb60e11b815260040160405180910390fd5b83515f03612a305760405163796cc52560e01b815260040160405180910390fd5b5f84516001600160401b03811115612a4a57612a4a614a7a565b604051908082528060200260200182016040528015612a73578160200160208202803683370190505b5090505f85516001600160401b03811115612a9057612a90614a7a565b604051908082528060200260200182016040528015612ab9578160200160208202803683370190505b5090505f5b8651811015612d0f575f612add88838151811061209c5761209c6154f6565b90505f60a25f8c6001600160a01b03166001600160a01b031681526020019081526020015f205f8a8581518110612b1657612b166154f6565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020015f206040518060200160405290815f820154815250509050612b82888481518110612b6857612b686154f6565b6020026020010151888581518110612207576122076154f6565b848481518110612b9457612b946154f6565b602002602001018181525050612bcc888481518110612bb557612bb56154f6565b602002602001015182613f2790919063ffffffff16565b858481518110612bde57612bde6154f6565b60209081029190910101526001600160a01b038a1615612c7357612c358a8a8581518110612c0e57612c0e6154f6565b6020026020010151878681518110612c2857612c286154f6565b6020026020010151613f3b565b612c738a8c8b8681518110612c4c57612c4c6154f6565b6020026020010151878781518110612c6657612c666154f6565b6020026020010151613574565b816001600160a01b031663724af4238c8b8681518110612c9557612c956154f6565b60200260200101518b8781518110612caf57612caf6154f6565b60200260200101516040518463ffffffff1660e01b8152600401612cd593929190615848565b5f604051808303815f87803b158015612cec575f5ffd5b505af1158015612cfe573d5f5f3e3d5ffd5b505050505050806001019050612abe565b506001600160a01b0388165f908152609f60205260408120805491829190612d368361586c565b91905055505f6040518060e001604052808b6001600160a01b031681526020018a6001600160a01b031681526020018b6001600160a01b031681526020018381526020014363ffffffff1681526020018981526020018581525090505f612d9c82611114565b5f818152609e602090815260408083208054600160ff19909116811790915560a4835292819020865181546001600160a01b03199081166001600160a01b039283161783558885015195830180548216968316969096179095559187015160028201805490951692169190911790925560608501516003830155608085015160048301805463ffffffff191663ffffffff90921691909117905560a085015180519394508593612e52926005850192019061486c565b5060c08201518051612e6e9160068401916020909101906148cf565b5050506001600160a01b038b165f90815260a360205260409020612e929082613fc9565b507f26b2aae26516e8719ef50ea2f6831a2efbd4e37dccdf0f6936b27bc08e793e30818386604051612ec693929190615884565b60405180910390a19a9950505050505050505050565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a250565b5f611d2982612f31612f2a87613bd8565b8690613fd4565b90613fd4565b6001600160a01b038281165f8181526099602090815260409182902060010180546001600160a01b0319169486169485179055905192835290917f773b54c04d756fcc5e678111f7d730de3be98192000799eee3d63716055a87c69101612843565b6066545f90600190811603612fc15760405163840a48d560e01b815260040160405180910390fd5b6001600160a01b038381165f818152609a602052604080822080546001600160a01b0319169487169485179055517fc3ee9f2e5fda98e8066a1f745b2df9285f416fe98cf2559cd21484b3d87433049190a35f5f61301e8561194f565b915091505f61302e8686856128a0565b90505f5b8351811015610fe1576130948688868481518110613052576130526154f6565b60200260200101515f87868151811061306d5761306d6154f6565b6020026020010151878781518110613087576130876154f6565b602002602001015161317e565b600101613032565b5f73beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeabf196001600160a01b0384160161316e5760405163a3d75e0960e01b81526001600160a01b0385811660048301525f917f00000000000000000000000000000000000000000000000000000000000000009091169063a3d75e0990602401602060405180830381865afa15801561312a573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061314e91906155b6565b90506131666001600160401b03848116908316613660565b915050610d5a565b506001600160401b031692915050565b805f0361319e57604051630a33bc6960e21b815260040160405180910390fd5b6001600160a01b038086165f90815260a2602090815260408083209388168352929052206131ce81858585613fe8565b6040805160208101909152815481527f8be932bac54561f27260f95463d9b8ab37e06b2842e5ee2404157cc13df6eb8f908790879061320c90613bd8565b60405161321b93929190615848565b60405180910390a161322c86610fea565b15610fe1576001600160a01b038088165f90815260986020908152604080832093891683529290529081208054859290613267908490615601565b92505081905550866001600160a01b03167f1ec042c965e2edd7107b51188ee0f383e22e76179041ab3a9d18ff151405166c8787866040516132ab93929190615848565b60405180910390a250505050505050565b604051631beb2b9760e31b81526001600160a01b0382811660048301523360248301523060448301525f80356001600160e01b0319166064840152917f00000000000000000000000000000000000000000000000000000000000000009091169063df595cb8906084016020604051808303815f875af1158015613342573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611c81919061556d565b60605f83516001600160401b0381111561338257613382614a7a565b6040519080825280602002602001820160405280156133ab578160200160208202803683370190505b5090505f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166394d7d00c8787876040518463ffffffff1660e01b81526004016133ff939291906158ae565b5f60405180830381865afa158015613419573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261344091908101906157b9565b90505f5b8551811015613488576134638887838151811061299b5761299b6154f6565b838281518110613475576134756154f6565b6020908102919091010152600101613444565b50909695505050505050565b5f610d5a8383613660565b5f6134ad8483856001614057565b611d2990856158e7565b6001600160a01b038085165f90815260a560209081526040808320938716835292905290812081906134e8906140b2565b90505f61354e600161351a7f0000000000000000000000000000000000000000000000000000000000000000436158fa565b61352491906158fa565b6001600160a01b03808a165f90815260a560209081526040808320938c16835292905220906140cc565b90505f61355b82846158e7565b90506135688187876140e8565b98975050505050505050565b6001600160a01b038085165f908152609860209081526040808320938616835292905290812080548392906135aa9084906158e7565b92505081905550836001600160a01b03167f6909600037b75d7b4733aedd815442b5ec018a827751c832aaff64eba5d6d2dd848484604051610e9593929190615848565b5f6001600160a01b03821673beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac014613639577f0000000000000000000000000000000000000000000000000000000000000000611c81565b7f000000000000000000000000000000000000000000000000000000000000000092915050565b5f610d5a8383670de0b6b3a7640000614106565b5f611d298261368c61368587613bd8565b8690613660565b90613660565b6033546001600160a01b031633146111125760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016122e7565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b600260c9540361378f5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016122e7565b600260c955565b60a08401515182146137bb576040516343714afd60e01b815260040160405180910390fd5b83604001516001600160a01b0316336001600160a01b0316146137f1576040516316110d3560e21b815260040160405180910390fd5b5f6137fb85611114565b5f818152609e602052604090205490915060ff1661382c576040516387c9d21960e01b815260040160405180910390fd5b60605f7f0000000000000000000000000000000000000000000000000000000000000000876080015161385f91906155e5565b90508063ffffffff164363ffffffff161161388d576040516378f67ae160e11b815260040160405180910390fd5b6138a4875f015188602001518960a0015184613366565b87516001600160a01b03165f90815260a3602052604090209092506138ca9150836141eb565b505f82815260a46020526040812080546001600160a01b031990811682556001820180548216905560028201805490911690556003810182905560048101805463ffffffff19169055906139216005830182614908565b61392e600683015f614908565b50505f828152609e602052604090819020805460ff19169055517f1f40400889274ed07b24845e5054a87a0cab969eb1277aafe61ae352e7c32a00906139779084815260200190565b60405180910390a185516001600160a01b039081165f908152609a6020526040812054885160a08a015191909316926139b19184906128a0565b90505f5b8860a0015151811015613bcd575f6139dc8a60a00151838151811061209c5761209c6154f6565b90505f613a128b60c0015184815181106139f8576139f86154f6565b6020026020010151878581518110611632576116326154f6565b9050805f03613a22575050613bc5565b8715613af057816001600160a01b0316632eae418c8c5f01518d60a001518681518110613a5157613a516154f6565b60200260200101518d8d88818110613a6b57613a6b6154f6565b9050602002016020810190613a809190614da9565b60405160e085901b6001600160e01b03191681526001600160a01b03938416600482015291831660248301529091166044820152606481018490526084015f604051808303815f87803b158015613ad5575f5ffd5b505af1158015613ae7573d5f5f3e3d5ffd5b50505050613bc2565b5f5f836001600160a01b03166350ff72258e5f01518f60a001518881518110613b1b57613b1b6154f6565b6020026020010151866040518463ffffffff1660e01b8152600401613b4293929190615848565b60408051808303815f875af1158015613b5d573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613b819190615916565b91509150613bbf878e5f01518f60a001518881518110613ba357613ba36154f6565b602002602001015185858b8b81518110613087576130876154f6565b50505b50505b6001016139b5565b505050505050505050565b80515f9015613be8578151611c81565b670de0b6b3a764000092915050565b606654606090600190600290811603613c235760405163840a48d560e01b815260040160405180910390fd5b6001600160a01b038084165f818152609a602052604080822080546001600160a01b0319811690915590519316928392917ffee30966a256b71e14bc0ebfc94315e28ef4a97a7131a9e2b7a310a73af4467691a35f5f613c828661194f565b9150915081515f03613c9657505050613e50565b81516001600160401b03811115613caf57613caf614a7a565b604051908082528060200260200182016040528015613cd8578160200160208202803683370190505b5094505f613ce78785856128a0565b90505f5b8351811015613e4a576040805160018082528183019092525f916020808301908036833750506040805160018082528183019092529293505f9291506020808301908036833750506040805160018082528183019092529293505f92915060208083019080368337019050509050868481518110613d6b57613d6b6154f6565b6020026020010151835f81518110613d8557613d856154f6565b60200260200101906001600160a01b031690816001600160a01b031681525050858481518110613db757613db76154f6565b6020026020010151825f81518110613dd157613dd16154f6565b602002602001018181525050848481518110613def57613def6154f6565b6020026020010151815f81518110613e0957613e096154f6565b602002602001018181525050613e228b898585856129e7565b8a8581518110613e3457613e346154f6565b6020908102919091010152505050600101613ceb565b50505050505b50919050565b6001600160a01b038084165f908152609960205260409020600101541680613e7e5750613f15565b6001600160a01b0381165f908152609c6020908152604080832085845290915290205460ff1615613ec257604051630d4c4c9160e21b815260040160405180910390fd5b6001600160a01b0381165f908152609c602090815260408083208584528252909120805460ff191660011790558301516124cb908290613f0990889088908490889061081f565b855160208701516141f6565b50505050565b60605f610d5a83614248565b5f610d5a613f3484613bd8565b8390613660565b6001600160a01b03821673beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac014611060576001600160a01b038084165f90815260a5602090815260408083209386168352929052908120613f8e906140b2565b9050613f1543613f9e8484615601565b6001600160a01b038088165f90815260a560209081526040808320938a1683529290522091906142a1565b5f610d5a83836142ac565b5f610d5a83670de0b6b3a764000084614106565b825f0361400857614001670de0b6b3a764000082613fd4565b8455613f15565b6040805160208101909152845481525f90614024908584613674565b90505f6140318483615601565b90505f61404c84612f31614045888a615601565b8590613fd4565b875550505050505050565b5f5f614064868686614106565b9050600183600281111561407a5761407a615938565b14801561409657505f84806140915761409161594c565b868809115b156140a9576140a6600182615601565b90505b95945050505050565b5f6140bd82826142f8565b6001600160e01b031692915050565b5f6140d883838361433d565b6001600160e01b03169392505050565b5f611d296140f68385615960565b85906001600160401b0316613660565b5f80805f19858709858702925082811083820303915050805f0361413d578382816141335761413361594c565b0492505050610d5a565b8084116141845760405162461bcd60e51b81526020600482015260156024820152744d6174683a206d756c446976206f766572666c6f7760581b60448201526064016122e7565b5f8486880960026001871981018816978890046003810283188082028403028082028403028082028403028082028403028082028403029081029092039091025f889003889004909101858311909403939093029303949094049190911702949350505050565b5f610d5a8383614386565b4281101561421757604051630819bdcd60e01b815260040160405180910390fd5b61422b6001600160a01b0385168484614469565b613f1557604051638baa579f60e01b815260040160405180910390fd5b6060815f0180548060200260200160405190810160405280929190818152602001828054801561429557602002820191905f5260205f20905b815481526020019060010190808311614281575b50505050509050919050565b6110608383836144bd565b5f8181526001830160205260408120546142f157508154600181810184555f848152602080822090930184905584548482528286019093526040902091909155611c81565b505f611c81565b81545f9080156143355761431e846143116001846158e7565b5f91825260209091200190565b5464010000000090046001600160e01b0316611d29565b509092915050565b82545f908161434e868683856145c3565b9050801561437c57614365866143116001846158e7565b5464010000000090046001600160e01b031661089d565b5091949350505050565b5f8181526001830160205260408120548015614460575f6143a86001836158e7565b85549091505f906143bb906001906158e7565b905081811461441a575f865f0182815481106143d9576143d96154f6565b905f5260205f200154905080875f0184815481106143f9576143f96154f6565b5f918252602080832090910192909255918252600188019052604090208390555b855486908061442b5761442b61597f565b600190038181905f5260205f20015f90559055856001015f8681526020019081526020015f205f905560019350505050611c81565b5f915050611c81565b5f5f5f6144768585614616565b90925090505f81600481111561448e5761448e615938565b1480156144ac5750856001600160a01b0316826001600160a01b0316145b8061089d575061089d868686614655565b82548015614575575f6144d5856143116001856158e7565b60408051808201909152905463ffffffff8082168084526401000000009092046001600160e01b0316602084015291925090851610156145285760405163151b8e3f60e11b815260040160405180910390fd5b805163ffffffff8086169116036145735782614549866143116001866158e7565b80546001600160e01b03929092166401000000000263ffffffff9092169190911790555050505050565b505b506040805180820190915263ffffffff92831681526001600160e01b03918216602080830191825285546001810187555f968752952091519051909216640100000000029190921617910155565b5f5b81831015611e98575f6145d8848461473c565b5f8781526020902090915063ffffffff86169082015463ffffffff16111561460257809250614610565b61460d816001615601565b93505b506145c5565b5f5f825160410361464a576020830151604084015160608501515f1a61463e87828585614756565b9450945050505061224a565b505f9050600261224a565b5f5f5f856001600160a01b0316631626ba7e60e01b868660405160240161467d929190615993565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b03199094169390931790925290516146bb91906159cf565b5f60405180830381855afa9150503d805f81146146f3576040519150601f19603f3d011682016040523d82523d5f602084013e6146f8565b606091505b509150915081801561470c57506020815110155b801561089d57508051630b135d3f60e11b90614731908301602090810190840161572a565b149695505050505050565b5f61474a60028484186159e5565b610d5a90848416615601565b5f807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a083111561478b57505f9050600361480a565b604080515f8082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa1580156147dc573d5f5f3e3d5ffd5b5050604051601f1901519150506001600160a01b038116614804575f6001925092505061480a565b91505f90505b94509492505050565b6040518060e001604052805f6001600160a01b031681526020015f6001600160a01b031681526020015f6001600160a01b031681526020015f81526020015f63ffffffff16815260200160608152602001606081525090565b828054828255905f5260205f209081019282156148bf579160200282015b828111156148bf57825182546001600160a01b0319166001600160a01b0390911617825560209092019160019091019061488a565b506148cb92915061491f565b5090565b828054828255905f5260205f209081019282156148bf579160200282015b828111156148bf5782518255916020019190600101906148ed565b5080545f8255905f5260205f209081019061265091905b5b808211156148cb575f8155600101614920565b6001600160a01b0381168114612650575f5ffd5b803561495281614933565b919050565b5f5f5f5f5f60a0868803121561496b575f5ffd5b853561497681614933565b9450602086013561498681614933565b9350604086013561499681614933565b94979396509394606081013594506080013592915050565b5f5f83601f8401126149be575f5ffd5b5081356001600160401b038111156149d4575f5ffd5b6020830191508360208260051b850101111561224a575f5ffd5b5f5f602083850312156149ff575f5ffd5b82356001600160401b03811115614a14575f5ffd5b614a20858286016149ae565b90969095509350505050565b602080825282518282018190525f918401906040840190835b81811015610b21578351835260209384019390920191600101614a45565b5f60208284031215614a73575f5ffd5b5035919050565b634e487b7160e01b5f52604160045260245ffd5b60405160e081016001600160401b0381118282101715614ab057614ab0614a7a565b60405290565b604080519081016001600160401b0381118282101715614ab057614ab0614a7a565b604051601f8201601f191681016001600160401b0381118282101715614b0057614b00614a7a565b604052919050565b5f6001600160401b03821115614b2057614b20614a7a565b5060051b60200190565b5f82601f830112614b39575f5ffd5b8135614b4c614b4782614b08565b614ad8565b8082825260208201915060208360051b860101925085831115614b6d575f5ffd5b602085015b83811015614b93578035614b8581614933565b835260209283019201614b72565b5095945050505050565b5f82601f830112614bac575f5ffd5b8135614bba614b4782614b08565b8082825260208201915060208360051b860101925085831115614bdb575f5ffd5b602085015b83811015614b93578035835260209283019201614be0565b5f5f5f60608486031215614c0a575f5ffd5b8335614c1581614933565b925060208401356001600160401b03811115614c2f575f5ffd5b614c3b86828701614b2a565b92505060408401356001600160401b03811115614c56575f5ffd5b614c6286828701614b9d565b9150509250925092565b5f8151808452602084019350602083015f5b82811015614c9c578151865260209586019590910190600101614c7e565b5093949350505050565b602081525f610d5a6020830184614c6c565b803563ffffffff81168114614952575f5ffd5b5f5f83601f840112614cdb575f5ffd5b5081356001600160401b03811115614cf1575f5ffd5b60208301915083602082850101111561224a575f5ffd5b5f5f5f5f60608587031215614d1b575f5ffd5b8435614d2681614933565b9350614d3460208601614cb8565b925060408501356001600160401b03811115614d4e575f5ffd5b614d5a87828801614ccb565b95989497509550505050565b5f5f5f5f60808587031215614d79575f5ffd5b8435614d8481614933565b93506020850135614d9481614933565b93969395505050506040820135916060013590565b5f60208284031215614db9575f5ffd5b8135610d5a81614933565b5f5f60408385031215614dd5575f5ffd5b8235614de081614933565b91506020830135614df081614933565b809150509250929050565b5f60e08284031215614e0b575f5ffd5b614e13614a8e565b9050614e1e82614947565b8152614e2c60208301614947565b6020820152614e3d60408301614947565b604082015260608281013590820152614e5860808301614cb8565b608082015260a08201356001600160401b03811115614e75575f5ffd5b614e8184828501614b2a565b60a08301525060c08201356001600160401b03811115614e9f575f5ffd5b614eab84828501614b9d565b60c08301525092915050565b5f60208284031215614ec7575f5ffd5b81356001600160401b03811115614edc575f5ffd5b611d2984828501614dfb565b5f60208284031215614ef8575f5ffd5b813560ff81168114610d5a575f5ffd5b5f8151808452602084019350602083015f5b82811015614c9c5781516001600160a01b0316865260209586019590910190600101614f1a565b80516001600160a01b03908116835260208083015182169084015260408083015190911690830152606080820151908301526080808201515f91614f8c9085018263ffffffff169052565b5060a082015160e060a0850152614fa660e0850182614f08565b905060c083015184820360c08601526140a98282614c6c565b602081525f610d5a6020830184614f41565b5f82825180855260208501945060208160051b830101602085015f5b8381101561348857601f19858403018852615009838351614c6c565b6020988901989093509190910190600101614fed565b5f604082016040835280855180835260608501915060608160051b8601019250602087015f5b8281101561507657605f19878603018452615061858351614f41565b94506020938401939190910190600101615045565b5050505082810360208401526140a98185614fd1565b6001600160401b0381168114612650575f5ffd5b5f5f5f5f608085870312156150b3575f5ffd5b84356150be81614933565b935060208501356150ce81614933565b925060408501356150de8161508c565b915060608501356150ee8161508c565b939692955090935050565b5f5f5f6060848603121561510b575f5ffd5b833561511681614933565b925060208401359150604084013561512d8161508c565b809150509250925092565b604081525f61514a6040830185614f08565b82810360208401526140a98185614c6c565b5f5f5f6040848603121561516e575f5ffd5b833561517981614933565b925060208401356001600160401b03811115615193575f5ffd5b61519f86828701614ccb565b9497909650939450505050565b5f5f604083850312156151bd575f5ffd5b82356151c881614933565b915060208301356001600160401b038111156151e2575f5ffd5b6151ee85828601614b2a565b9150509250929050565b5f5f5f5f5f5f6060878903121561520d575f5ffd5b86356001600160401b03811115615222575f5ffd5b61522e89828a016149ae565b90975095505060208701356001600160401b0381111561524c575f5ffd5b61525889828a016149ae565b90955093505060408701356001600160401b03811115615276575f5ffd5b61528289828a016149ae565b979a9699509497509295939492505050565b5f5f5f606084860312156152a6575f5ffd5b83356152b181614933565b925060208401356001600160401b038111156152cb575f5ffd5b8401604081870312156152dc575f5ffd5b6152e4614ab6565b81356001600160401b038111156152f9575f5ffd5b8201601f81018813615309575f5ffd5b80356001600160401b0381111561532257615322614a7a565b615335601f8201601f1916602001614ad8565b818152896020838501011115615349575f5ffd5b816020840160208301375f60209282018301528352928301359282019290925293969395505050506040919091013590565b5f5f6040838503121561538c575f5ffd5b823561539781614933565b946020939093013593505050565b604081525f61514a6040830185614c6c565b8015158114612650575f5ffd5b5f5f5f5f606085870312156153d7575f5ffd5b84356001600160401b038111156153ec575f5ffd5b850160e081880312156153fd575f5ffd5b935060208501356001600160401b03811115615417575f5ffd5b615423878288016149ae565b90945092505060408501356150ee816153b7565b5f5f60408385031215615448575f5ffd5b82356001600160401b0381111561545d575f5ffd5b8301601f8101851361546d575f5ffd5b803561547b614b4782614b08565b8082825260208201915060208360051b85010192508783111561549c575f5ffd5b6020840193505b828410156154c75783356154b681614933565b8252602093840193909101906154a3565b945050505060208301356001600160401b038111156151e2575f5ffd5b602081525f610d5a6020830184614fd1565b634e487b7160e01b5f52603260045260245ffd5b5f8235605e1983360301811261551e575f5ffd5b9190910192915050565b5f5f8335601e1984360301811261553d575f5ffd5b8301803591506001600160401b03821115615556575f5ffd5b6020019150600581901b360382131561224a575f5ffd5b5f6020828403121561557d575f5ffd5b8151610d5a816153b7565b60208152816020820152818360408301375f818301604090810191909152601f909201601f19160101919050565b5f602082840312156155c6575f5ffd5b8151610d5a8161508c565b634e487b7160e01b5f52601160045260245ffd5b63ffffffff8181168382160190811115611c8157611c816155d1565b80820180821115611c8157611c816155d1565b5f82601f830112615623575f5ffd5b8151615631614b4782614b08565b8082825260208201915060208360051b860101925085831115615652575f5ffd5b602085015b83811015614b93578051835260209283019201615657565b5f5f60408385031215615680575f5ffd5b82516001600160401b03811115615695575f5ffd5b8301601f810185136156a5575f5ffd5b80516156b3614b4782614b08565b8082825260208201915060208360051b8501019250878311156156d4575f5ffd5b6020840193505b828410156156ff5783516156ee81614933565b8252602093840193909101906156db565b8095505050505060208301516001600160401b0381111561571e575f5ffd5b6151ee85828601615614565b5f6020828403121561573a575f5ffd5b5051919050565b5f823560de1983360301811261551e575f5ffd5b5f611c813683614dfb565b5f60208284031215615770575f5ffd5b8135610d5a816153b7565b5f6020828403121561578b575f5ffd5b8151610d5a81614933565b6001600160a01b03831681526040602082018190525f90611d2990830184614f08565b5f602082840312156157c9575f5ffd5b81516001600160401b038111156157de575f5ffd5b8201601f810184136157ee575f5ffd5b80516157fc614b4782614b08565b8082825260208201915060208360051b85010192508683111561581d575f5ffd5b6020840193505b8284101561089d5783516158378161508c565b825260209384019390910190615824565b6001600160a01b039384168152919092166020820152604081019190915260600190565b5f6001820161587d5761587d6155d1565b5060010190565b838152606060208201525f61589c6060830185614f41565b828103604084015261089d8185614c6c565b6001600160a01b03841681526060602082018190525f906158d190830185614f08565b905063ffffffff83166040830152949350505050565b81810381811115611c8157611c816155d1565b63ffffffff8281168282160390811115611c8157611c816155d1565b5f5f60408385031215615927575f5ffd5b505080516020909101519092909150565b634e487b7160e01b5f52602160045260245ffd5b634e487b7160e01b5f52601260045260245ffd5b6001600160401b038281168282160390811115611c8157611c816155d1565b634e487b7160e01b5f52603160045260245ffd5b828152604060208201525f82518060408401528060208501606085015e5f606082850101526060601f19601f8301168401019150509392505050565b5f82518060208501845e5f920191825250919050565b5f826159ff57634e487b7160e01b5f52601260045260245ffd5b50049056fea26469706673582212208b259668ef4236859230dcc42d032e50151a07b76513431816695b7c6e7ceef264736f6c634300081b0033", } // DelegationManagerABI 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 5662a0b235..093f64d84c 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: "0x60a060405234801561000f575f5ffd5b5060405161352938038061352983398101604081905261002e91610105565b6001600160a01b038116608052610043610049565b50610132565b5f54610100900460ff16156100b45760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff90811614610103575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b5f60208284031215610115575f5ffd5b81516001600160a01b038116811461012b575f5ffd5b9392505050565b6080516133ca61015f5f395f81816103410152818161083e0152818161149e015261158a01526133ca5ff3fe608060405234801561000f575f5ffd5b5060043610610255575f3560e01c806381b9716111610140578063a9059cbb116100bf578063dd62ed3e11610084578063dd62ed3e146105b9578063de0e9a3e146105cc578063ea598cb0146105df578063eb415f45146105f2578063f1127ed8146105fa578063f2fde38b14610637575f5ffd5b8063a9059cbb1461055a578063aad41a411461056d578063b8c2559414610580578063c3cda52014610593578063d505accf146105a6575f5ffd5b806395d89b411161010557806395d89b411461050f5780639ab24eb0146105175780639aec4bae1461052a578063a457c2d714610534578063a7d1195d14610547575f5ffd5b806381b971611461049157806384b0196e146104b15780638da5cb5b146104cc5780638e539e8c146104dd57806391ddadf4146104f0575f5ffd5b80633a46b1a8116101d75780635c19a95c1161019c5780635c19a95c146103f05780636fcfff451461040357806370a082311461042b578063715018a61461045357806378aa33ba1461045b5780637ecebe001461047e575f5ffd5b80633a46b1a8146103295780633f4da4c61461033c5780634bf5d7e91461037b57806353957125146103a5578063587cde1e146103c5575f5ffd5b80631ffacdef1161021d5780631ffacdef146102d957806323b872dd146102ec578063313ce567146102ff5780633644e5151461030e5780633950935114610316575f5ffd5b80630455e6941461025957806306fdde0314610291578063095ea7b3146102a65780631249c58b146102b957806318160ddd146102c3575b5f5ffd5b61027c610267366004612c01565b6101336020525f908152604090205460ff1681565b60405190151581526020015b60405180910390f35b61029961064a565b6040516102889190612c48565b61027c6102b4366004612c5a565b6106da565b6102c16106f3565b005b6102cb61083b565b604051908152602001610288565b6102c16102e7366004612c8f565b6108c1565b61027c6102fa366004612cc4565b610929565b60405160128152602001610288565b6102cb61094c565b61027c610324366004612c5a565b610955565b6102cb610337366004612c5a565b610976565b6103637f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610288565b60408051808201909152600e81526d06d6f64653d74696d657374616d760941b6020820152610299565b6102cb6103b3366004612c01565b6101306020525f908152604090205481565b6103636103d3366004612c01565b6001600160a01b039081165f90815260fe60205260409020541690565b6102c16103fe366004612c01565b6109f9565b610416610411366004612c01565b610a06565b60405163ffffffff9091168152602001610288565b6102cb610439366004612c01565b6001600160a01b03165f9081526065602052604090205490565b6102c1610a27565b61027c610469366004612c01565b6101346020525f908152604090205460ff1681565b6102cb61048c366004612c01565b610a3a565b6102cb61049f366004612c01565b6101316020525f908152604090205481565b6104b9610a57565b6040516102889796959493929190612cfe565b6033546001600160a01b0316610363565b6102cb6104eb366004612d94565b610af0565b6104f8610b57565b60405165ffffffffffff9091168152602001610288565b610299610b61565b6102cb610525366004612c01565b610b70565b6102cb6101325481565b61027c610542366004612c5a565b610bed565b6102c1610555366004612e73565b610c67565b61027c610568366004612c5a565b61107b565b6102c161057b366004612fb8565b611088565b6102c161058e366004612c8f565b611158565b6102c16105a1366004613034565b6111b8565b6102c16105b4366004613088565b6112ed565b6102cb6105c73660046130ee565b61144e565b6102c16105da366004612d94565b611478565b6102c16105ed366004612d94565b611568565b6102c161165d565b61060d61060836600461311f565b611724565b60408051825163ffffffff1681526020928301516001600160e01b03169281019290925201610288565b6102c1610645366004612c01565b6117a5565b60606068805461065990613151565b80601f016020809104026020016040519081016040528092919081815260200182805461068590613151565b80156106d05780601f106106a7576101008083540402835291602001916106d0565b820191905f5260205f20905b8154815290600101906020018083116106b357829003601f168201915b5050505050905090565b5f336106e781858561181b565b60019150505b92915050565b335f908152610131602052604090205461076c5760405162461bcd60e51b815260206004820152602f60248201527f456967656e2e6d696e743a206d73672e73656e64657220686173206e6f206d6960448201526e6e74696e6720616c6c6f77616e636560881b60648201526084015b60405180910390fd5b335f908152610130602052604090205442116107e45760405162461bcd60e51b815260206004820152603160248201527f456967656e2e6d696e743a206d73672e73656e646572206973206e6f7420616c6044820152701b1bddd959081d1bc81b5a5b9d081e595d607a1b6064820152608401610763565b335f81815261013160205260408120805491905590610803908261193e565b60405181815233907f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d41213968859060200160405180910390a250565b5f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610898573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108bc9190613183565b905090565b6108c96119d4565b6001600160a01b0382165f8181526101336020908152604091829020805460ff191685151590811790915591519182527fcf20b1ecb604b0e8888d579c64e8a3b10e590d45c1c2dddb393bed284362227191015b60405180910390a25050565b5f33610936858285611a2e565b610941858585611aa0565b506001949350505050565b5f6108bc611c5a565b5f336106e7818585610967838361144e565b61097191906131ae565b61181b565b5f61097f610b57565b65ffffffffffff1682106109d15760405162461bcd60e51b815260206004820152601960248201527804552433230566f7465733a20667574757265206c6f6f6b757603c1b6044820152606401610763565b6001600160a01b0383165f90815260ff602052604090206109f29083611c63565b9392505050565b610a033382611d44565b50565b6001600160a01b0381165f90815260ff60205260408120546106ed90611dbd565b610a2f6119d4565b610a385f611e25565b565b6001600160a01b0381165f90815260cb60205260408120546106ed565b5f6060805f5f5f60606097545f5f1b148015610a735750609854155b610ab75760405162461bcd60e51b81526020600482015260156024820152741152540dcc4c8e88155b9a5b9a5d1a585b1a5e9959605a1b6044820152606401610763565b610abf611e76565b610ac7611e85565b604080515f80825260208201909252600f60f81b9b939a50919850469750309650945092509050565b5f610af9610b57565b65ffffffffffff168210610b4b5760405162461bcd60e51b815260206004820152601960248201527804552433230566f7465733a20667574757265206c6f6f6b757603c1b6044820152606401610763565b6106ed61010083611c63565b5f6108bc42611e94565b60606069805461065990613151565b6001600160a01b0381165f90815260ff60205260408120548015610bdb576001600160a01b0383165f90815260ff6020526040902080545f198301908110610bba57610bba6131c1565b5f9182526020909120015464010000000090046001600160e01b0316610bdd565b5f5b6001600160e01b03169392505050565b5f3381610bfa828661144e565b905083811015610c5a5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610763565b610941828686840361181b565b5f54610100900460ff1615808015610c8557505f54600160ff909116105b80610c9e5750303b158015610c9e57505f5460ff166001145b610d015760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610763565b5f805460ff191660011790558015610d22575f805461ff0019166101001790555b610d2a611efa565b610d6e6040518060400160405280600581526020016422b4b3b2b760d91b8152506040518060400160405280600581526020016422a4a3a2a760d91b815250611f28565b610d7785611e25565b610d9d6040518060400160405280600581526020016422a4a3a2a760d91b815250611f5c565b8251845114610e245760405162461bcd60e51b815260206004820152604760248201527f456967656e2e696e697469616c697a653a206d696e7465727320616e64206d6960448201527f6e74696e67416c6c6f77616e636573206d757374206265207468652073616d65606482015266040d8cadccee8d60cb1b608482015260a401610763565b8151845114610eab5760405162461bcd60e51b815260206004820152604760248201527f456967656e2e696e697469616c697a653a206d696e7465727320616e64206d6960448201527f6e74416c6c6f776564416674657273206d757374206265207468652073616d65606482015266040d8cadccee8d60cb1b608482015260a401610763565b5f5b845181101561102857838181518110610ec857610ec86131c1565b60200260200101516101315f878481518110610ee657610ee66131c1565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020015f2081905550828181518110610f2357610f236131c1565b60200260200101516101305f878481518110610f4157610f416131c1565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020015f208190555060016101335f878481518110610f8457610f846131c1565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020015f205f6101000a81548160ff021916908315150217905550848181518110610fd357610fd36131c1565b60200260200101516001600160a01b03167fcf20b1ecb604b0e8888d579c64e8a3b10e590d45c1c2dddb393bed28436222716001604051611018911515815260200190565b60405180910390a2600101610ead565b505f19610132558015611074575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050505050565b5f336106e7818585611aa0565b8281146110fd5760405162461bcd60e51b815260206004820152603e60248201527f456967656e2e6d756c746973656e643a2072656365697665727320616e64206160448201527f6d6f756e7473206d757374206265207468652073616d65206c656e67746800006064820152608401610763565b5f5b83811015611074576111503386868481811061111d5761111d6131c1565b90506020020160208101906111329190612c01565b858585818110611144576111446131c1565b90506020020135611aa0565b6001016110ff565b6111606119d4565b6001600160a01b0382165f8181526101346020908152604091829020805460ff191685151590811790915591519182527f72a561d1af7409467dae4f1e9fc52590a9335a1dda17727e2b6aa8c4db35109b910161091d565b834211156112085760405162461bcd60e51b815260206004820152601d60248201527f4552433230566f7465733a207369676e617475726520657870697265640000006044820152606401610763565b604080517fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf60208201526001600160a01b0388169181019190915260608101869052608081018590525f90611281906112799060a00160405160208183030381529060405280519060200120611fa5565b858585611fd1565b905061128c81611ff7565b86146112da5760405162461bcd60e51b815260206004820152601960248201527f4552433230566f7465733a20696e76616c6964206e6f6e6365000000000000006044820152606401610763565b6112e48188611d44565b50505050505050565b8342111561133d5760405162461bcd60e51b815260206004820152601d60248201527f45524332305065726d69743a206578706972656420646561646c696e650000006044820152606401610763565b5f7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c988888861136b8c611ff7565b6040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090505f6113c582611fa5565b90505f6113d482878787611fd1565b9050896001600160a01b0316816001600160a01b0316146114375760405162461bcd60e51b815260206004820152601e60248201527f45524332305065726d69743a20696e76616c6964207369676e617475726500006044820152606401610763565b6114428a8a8a61181b565b50505050505050505050565b6001600160a01b039182165f90815260666020908152604080832093909416825291909152205490565b611482338261201e565b60405163a9059cbb60e01b8152336004820152602481018290527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063a9059cbb906044016020604051808303815f875af11580156114ec573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061151091906131d5565b610a035760405162461bcd60e51b8152602060048201526024808201527f456967656e2e756e777261703a2062454947454e207472616e736665722066616044820152631a5b195960e21b6064820152608401610763565b6040516323b872dd60e01b8152336004820152306024820152604481018290527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906323b872dd906064016020604051808303815f875af11580156115d8573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115fc91906131d5565b6116535760405162461bcd60e51b815260206004820152602260248201527f456967656e2e777261703a2062454947454e207472616e73666572206661696c604482015261195960f21b6064820152608401610763565b610a03338261193e565b6116656119d4565b5f1961013254146116f45760405162461bcd60e51b815260206004820152604d60248201527f456967656e2e64697361626c655472616e736665725265737472696374696f6e60448201527f733a207472616e73666572207265737472696374696f6e732061726520616c7260648201526c1958591e48191a5cd8589b1959609a1b608482015260a401610763565b5f6101328190556040517f2b18986d3ba809db2f13a5d7bf17f60d357b37d9cbb55dd71cbbac8dc4060f649190a1565b604080518082019091525f80825260208201526001600160a01b0383165f90815260ff60205260409020805463ffffffff8416908110611766576117666131c1565b5f9182526020918290206040805180820190915291015463ffffffff8116825264010000000090046001600160e01b0316918101919091529392505050565b6117ad6119d4565b6001600160a01b0381166118125760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610763565b610a0381611e25565b6001600160a01b03831661187d5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610763565b6001600160a01b0382166118de5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610763565b6001600160a01b038381165f8181526066602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6119488282612037565b6001600160e01b0361195861083b565b11156119bf5760405162461bcd60e51b815260206004820152603060248201527f4552433230566f7465733a20746f74616c20737570706c79207269736b73206f60448201526f766572666c6f77696e6720766f74657360801b6064820152608401610763565b6119ce61010061210883612113565b50505050565b6033546001600160a01b03163314610a385760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610763565b5f611a39848461144e565b90505f1981146119ce5781811015611a935760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610763565b6119ce848484840361181b565b6001600160a01b038316611b045760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610763565b6001600160a01b038216611b665760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610763565b611b7183838361227f565b6001600160a01b0383165f9081526065602052604090205481811015611be85760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610763565b6001600160a01b038085165f8181526065602052604080822086860390559286168082529083902080548601905591517fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90611c479086815260200190565b60405180910390a36119ce848484612363565b5f6108bc612394565b81545f9081816005811115611cba575f611c7c84612407565b611c8690856131f0565b5f88815260209020909150869082015463ffffffff161115611caa57809150611cb8565b611cb58160016131ae565b92505b505b80821015611d05575f611ccd83836124eb565b5f88815260209020909150869082015463ffffffff161115611cf157809150611cff565b611cfc8160016131ae565b92505b50611cba565b8015611d2f575f8681526020902081015f19015464010000000090046001600160e01b0316611d31565b5f5b6001600160e01b03169695505050505050565b6001600160a01b038281165f81815260fe6020818152604080842080546065845282862054949093528787166001600160a01b03198416811790915590519190951694919391928592917f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f9190a46119ce828483612505565b5f63ffffffff821115611e215760405162461bcd60e51b815260206004820152602660248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203360448201526532206269747360d01b6064820152608401610763565b5090565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b60606099805461065990613151565b6060609a805461065990613151565b5f65ffffffffffff821115611e215760405162461bcd60e51b815260206004820152602660248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203460448201526538206269747360d01b6064820152608401610763565b5f54610100900460ff16611f205760405162461bcd60e51b815260040161076390613203565b610a3861263f565b5f54610100900460ff16611f4e5760405162461bcd60e51b815260040161076390613203565b611f58828261266e565b5050565b5f54610100900460ff16611f825760405162461bcd60e51b815260040161076390613203565b610a0381604051806040016040528060018152602001603160f81b8152506126ad565b5f6106ed611fb1611c5a565b8360405161190160f01b8152600281019290925260228201526042902090565b5f5f5f611fe0878787876126fa565b91509150611fed816127b7565b5095945050505050565b6001600160a01b0381165f90815260cb602052604090208054600181018255905b50919050565b6120288282612900565b6119ce610100612a4383612113565b6001600160a01b03821661208d5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610763565b6120985f838361227f565b8060675f8282546120a991906131ae565b90915550506001600160a01b0382165f818152606560209081526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3611f585f8383612363565b5f6109f282846131ae565b82545f90819081811561215d575f8781526020902082015f190160408051808201909152905463ffffffff8116825264010000000090046001600160e01b03166020820152612171565b604080518082019091525f80825260208201525b905080602001516001600160e01b0316935061219184868863ffffffff16565b92505f821180156121b957506121a5610b57565b65ffffffffffff16815f015163ffffffff16145b156121fc576121c783612a4e565b5f8881526020902083015f190180546001600160e01b03929092166401000000000263ffffffff909216919091179055612275565b866040518060400160405280612220612213610b57565b65ffffffffffff16611dbd565b63ffffffff16815260200161223486612a4e565b6001600160e01b0390811690915282546001810184555f938452602093849020835194909301519091166401000000000263ffffffff909316929092179101555b5050935093915050565b61013254421161235e576001600160a01b03831615806122a657506001600160a01b038216155b806122c957506001600160a01b0383165f908152610133602052604090205460ff165b806122ec57506001600160a01b0382165f908152610134602052604090205460ff165b61235e5760405162461bcd60e51b815260206004820152603a60248201527f456967656e2e5f6265666f7265546f6b656e5472616e736665723a2066726f6d60448201527f206f7220746f206d7573742062652077686974656c69737465640000000000006064820152608401610763565b505050565b6001600160a01b038381165f90815260fe602052604080822054858416835291205461235e92918216911683612505565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f6123be612ab6565b6123c6612b0e565b60408051602081019490945283019190915260608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b5f815f0361241657505f919050565b5f600161242284612b3e565b901c6001901b9050600181848161243b5761243b61324e565b048201901c905060018184816124535761245361324e565b048201901c9050600181848161246b5761246b61324e565b048201901c905060018184816124835761248361324e565b048201901c9050600181848161249b5761249b61324e565b048201901c905060018184816124b3576124b361324e565b048201901c905060018184816124cb576124cb61324e565b048201901c90506109f2818285816124e5576124e561324e565b04612bd1565b5f6124f96002848418613262565b6109f2908484166131ae565b816001600160a01b0316836001600160a01b03161415801561252657505f81115b1561235e576001600160a01b038316156125b3576001600160a01b0383165f90815260ff60205260408120819061256090612a4385612113565b91509150846001600160a01b03167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a72483836040516125a8929190918252602082015260400190565b60405180910390a250505b6001600160a01b0382161561235e576001600160a01b0382165f90815260ff6020526040812081906125e89061210885612113565b91509150836001600160a01b03167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a7248383604051612630929190918252602082015260400190565b60405180910390a25050505050565b5f54610100900460ff166126655760405162461bcd60e51b815260040161076390613203565b610a3833611e25565b5f54610100900460ff166126945760405162461bcd60e51b815260040161076390613203565b60686126a083826132c5565b50606961235e82826132c5565b5f54610100900460ff166126d35760405162461bcd60e51b815260040161076390613203565b60996126df83826132c5565b50609a6126ec82826132c5565b50505f609781905560985550565b5f807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a083111561272f57505f905060036127ae565b604080515f8082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015612780573d5f5f3e3d5ffd5b5050604051601f1901519150506001600160a01b0381166127a8575f600192509250506127ae565b91505f90505b94509492505050565b5f8160048111156127ca576127ca613380565b036127d25750565b60018160048111156127e6576127e6613380565b036128335760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610763565b600281600481111561284757612847613380565b036128945760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610763565b60038160048111156128a8576128a8613380565b03610a035760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401610763565b6001600160a01b0382166129605760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401610763565b61296b825f8361227f565b6001600160a01b0382165f90815260656020526040902054818110156129de5760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b6064820152608401610763565b6001600160a01b0383165f8181526065602090815260408083208686039055606780548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a361235e835f84612363565b5f6109f282846131f0565b5f6001600160e01b03821115611e215760405162461bcd60e51b815260206004820152602760248201527f53616665436173743a2076616c756520646f65736e27742066697420696e20326044820152663234206269747360c81b6064820152608401610763565b5f5f612ac0611e76565b805190915015612ad7578051602090910120919050565b6097548015612ae65792915050565b7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4709250505090565b5f5f612b18611e85565b805190915015612b2f578051602090910120919050565b6098548015612ae65792915050565b5f80608083901c15612b5257608092831c92015b604083901c15612b6457604092831c92015b602083901c15612b7657602092831c92015b601083901c15612b8857601092831c92015b600883901c15612b9a57600892831c92015b600483901c15612bac57600492831c92015b600283901c15612bbe57600292831c92015b600183901c156106ed5760010192915050565b5f818310612bdf57816109f2565b5090919050565b80356001600160a01b0381168114612bfc575f5ffd5b919050565b5f60208284031215612c11575f5ffd5b6109f282612be6565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f6109f26020830184612c1a565b5f5f60408385031215612c6b575f5ffd5b612c7483612be6565b946020939093013593505050565b8015158114610a03575f5ffd5b5f5f60408385031215612ca0575f5ffd5b612ca983612be6565b91506020830135612cb981612c82565b809150509250929050565b5f5f5f60608486031215612cd6575f5ffd5b612cdf84612be6565b9250612ced60208501612be6565b929592945050506040919091013590565b60ff60f81b8816815260e060208201525f612d1c60e0830189612c1a565b8281036040840152612d2e8189612c1a565b606084018890526001600160a01b038716608085015260a0840186905283810360c0850152845180825260208087019350909101905f5b81811015612d83578351835260209384019390920191600101612d65565b50909b9a5050505050505050505050565b5f60208284031215612da4575f5ffd5b5035919050565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f1916810167ffffffffffffffff81118282101715612de857612de8612dab565b604052919050565b5f67ffffffffffffffff821115612e0957612e09612dab565b5060051b60200190565b5f82601f830112612e22575f5ffd5b8135612e35612e3082612df0565b612dbf565b8082825260208201915060208360051b860101925085831115612e56575f5ffd5b602085015b83811015611fed578035835260209283019201612e5b565b5f5f5f5f60808587031215612e86575f5ffd5b612e8f85612be6565b9350602085013567ffffffffffffffff811115612eaa575f5ffd5b8501601f81018713612eba575f5ffd5b8035612ec8612e3082612df0565b8082825260208201915060208360051b850101925089831115612ee9575f5ffd5b6020840193505b82841015612f1257612f0184612be6565b825260209384019390910190612ef0565b9550505050604085013567ffffffffffffffff811115612f30575f5ffd5b612f3c87828801612e13565b925050606085013567ffffffffffffffff811115612f58575f5ffd5b612f6487828801612e13565b91505092959194509250565b5f5f83601f840112612f80575f5ffd5b50813567ffffffffffffffff811115612f97575f5ffd5b6020830191508360208260051b8501011115612fb1575f5ffd5b9250929050565b5f5f5f5f60408587031215612fcb575f5ffd5b843567ffffffffffffffff811115612fe1575f5ffd5b612fed87828801612f70565b909550935050602085013567ffffffffffffffff81111561300c575f5ffd5b61301887828801612f70565b95989497509550505050565b803560ff81168114612bfc575f5ffd5b5f5f5f5f5f5f60c08789031215613049575f5ffd5b61305287612be6565b9550602087013594506040870135935061306e60608801613024565b9598949750929560808101359460a0909101359350915050565b5f5f5f5f5f5f5f60e0888a03121561309e575f5ffd5b6130a788612be6565b96506130b560208901612be6565b955060408801359450606088013593506130d160808901613024565b9699959850939692959460a0840135945060c09093013592915050565b5f5f604083850312156130ff575f5ffd5b61310883612be6565b915061311660208401612be6565b90509250929050565b5f5f60408385031215613130575f5ffd5b61313983612be6565b9150602083013563ffffffff81168114612cb9575f5ffd5b600181811c9082168061316557607f821691505b60208210810361201857634e487b7160e01b5f52602260045260245ffd5b5f60208284031215613193575f5ffd5b5051919050565b634e487b7160e01b5f52601160045260245ffd5b808201808211156106ed576106ed61319a565b634e487b7160e01b5f52603260045260245ffd5b5f602082840312156131e5575f5ffd5b81516109f281612c82565b818103818111156106ed576106ed61319a565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b634e487b7160e01b5f52601260045260245ffd5b5f8261327c57634e487b7160e01b5f52601260045260245ffd5b500490565b601f82111561235e57805f5260205f20601f840160051c810160208510156132a65750805b601f840160051c820191505b81811015611074575f81556001016132b2565b815167ffffffffffffffff8111156132df576132df612dab565b6132f3816132ed8454613151565b84613281565b6020601f821160018114613325575f831561330e5750848201515b5f19600385901b1c1916600184901b178455611074565b5f84815260208120601f198516915b828110156133545787850151825560209485019460019092019101613334565b508482101561337157868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b634e487b7160e01b5f52602160045260245ffdfea264697066735822122087556507a13c767e1ac5fae7a99abc6e15a1498b1060ca1cde8c320d6d57627664736f6c634300081b0033", + Bin: "0x60a060405234801561000f575f5ffd5b5060405161352938038061352983398101604081905261002e91610105565b6001600160a01b038116608052610043610049565b50610132565b5f54610100900460ff16156100b45760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff90811614610103575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b5f60208284031215610115575f5ffd5b81516001600160a01b038116811461012b575f5ffd5b9392505050565b6080516133ca61015f5f395f81816103410152818161083e0152818161149e015261158a01526133ca5ff3fe608060405234801561000f575f5ffd5b5060043610610255575f3560e01c806381b9716111610140578063a9059cbb116100bf578063dd62ed3e11610084578063dd62ed3e146105b9578063de0e9a3e146105cc578063ea598cb0146105df578063eb415f45146105f2578063f1127ed8146105fa578063f2fde38b14610637575f5ffd5b8063a9059cbb1461055a578063aad41a411461056d578063b8c2559414610580578063c3cda52014610593578063d505accf146105a6575f5ffd5b806395d89b411161010557806395d89b411461050f5780639ab24eb0146105175780639aec4bae1461052a578063a457c2d714610534578063a7d1195d14610547575f5ffd5b806381b971611461049157806384b0196e146104b15780638da5cb5b146104cc5780638e539e8c146104dd57806391ddadf4146104f0575f5ffd5b80633a46b1a8116101d75780635c19a95c1161019c5780635c19a95c146103f05780636fcfff451461040357806370a082311461042b578063715018a61461045357806378aa33ba1461045b5780637ecebe001461047e575f5ffd5b80633a46b1a8146103295780633f4da4c61461033c5780634bf5d7e91461037b57806353957125146103a5578063587cde1e146103c5575f5ffd5b80631ffacdef1161021d5780631ffacdef146102d957806323b872dd146102ec578063313ce567146102ff5780633644e5151461030e5780633950935114610316575f5ffd5b80630455e6941461025957806306fdde0314610291578063095ea7b3146102a65780631249c58b146102b957806318160ddd146102c3575b5f5ffd5b61027c610267366004612c01565b6101336020525f908152604090205460ff1681565b60405190151581526020015b60405180910390f35b61029961064a565b6040516102889190612c48565b61027c6102b4366004612c5a565b6106da565b6102c16106f3565b005b6102cb61083b565b604051908152602001610288565b6102c16102e7366004612c8f565b6108c1565b61027c6102fa366004612cc4565b610929565b60405160128152602001610288565b6102cb61094c565b61027c610324366004612c5a565b610955565b6102cb610337366004612c5a565b610976565b6103637f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610288565b60408051808201909152600e81526d06d6f64653d74696d657374616d760941b6020820152610299565b6102cb6103b3366004612c01565b6101306020525f908152604090205481565b6103636103d3366004612c01565b6001600160a01b039081165f90815260fe60205260409020541690565b6102c16103fe366004612c01565b6109f9565b610416610411366004612c01565b610a06565b60405163ffffffff9091168152602001610288565b6102cb610439366004612c01565b6001600160a01b03165f9081526065602052604090205490565b6102c1610a27565b61027c610469366004612c01565b6101346020525f908152604090205460ff1681565b6102cb61048c366004612c01565b610a3a565b6102cb61049f366004612c01565b6101316020525f908152604090205481565b6104b9610a57565b6040516102889796959493929190612cfe565b6033546001600160a01b0316610363565b6102cb6104eb366004612d94565b610af0565b6104f8610b57565b60405165ffffffffffff9091168152602001610288565b610299610b61565b6102cb610525366004612c01565b610b70565b6102cb6101325481565b61027c610542366004612c5a565b610bed565b6102c1610555366004612e73565b610c67565b61027c610568366004612c5a565b61107b565b6102c161057b366004612fb8565b611088565b6102c161058e366004612c8f565b611158565b6102c16105a1366004613034565b6111b8565b6102c16105b4366004613088565b6112ed565b6102cb6105c73660046130ee565b61144e565b6102c16105da366004612d94565b611478565b6102c16105ed366004612d94565b611568565b6102c161165d565b61060d61060836600461311f565b611724565b60408051825163ffffffff1681526020928301516001600160e01b03169281019290925201610288565b6102c1610645366004612c01565b6117a5565b60606068805461065990613151565b80601f016020809104026020016040519081016040528092919081815260200182805461068590613151565b80156106d05780601f106106a7576101008083540402835291602001916106d0565b820191905f5260205f20905b8154815290600101906020018083116106b357829003601f168201915b5050505050905090565b5f336106e781858561181b565b60019150505b92915050565b335f908152610131602052604090205461076c5760405162461bcd60e51b815260206004820152602f60248201527f456967656e2e6d696e743a206d73672e73656e64657220686173206e6f206d6960448201526e6e74696e6720616c6c6f77616e636560881b60648201526084015b60405180910390fd5b335f908152610130602052604090205442116107e45760405162461bcd60e51b815260206004820152603160248201527f456967656e2e6d696e743a206d73672e73656e646572206973206e6f7420616c6044820152701b1bddd959081d1bc81b5a5b9d081e595d607a1b6064820152608401610763565b335f81815261013160205260408120805491905590610803908261193e565b60405181815233907f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d41213968859060200160405180910390a250565b5f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610898573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108bc9190613183565b905090565b6108c96119d4565b6001600160a01b0382165f8181526101336020908152604091829020805460ff191685151590811790915591519182527fcf20b1ecb604b0e8888d579c64e8a3b10e590d45c1c2dddb393bed284362227191015b60405180910390a25050565b5f33610936858285611a2e565b610941858585611aa0565b506001949350505050565b5f6108bc611c5a565b5f336106e7818585610967838361144e565b61097191906131ae565b61181b565b5f61097f610b57565b65ffffffffffff1682106109d15760405162461bcd60e51b815260206004820152601960248201527804552433230566f7465733a20667574757265206c6f6f6b757603c1b6044820152606401610763565b6001600160a01b0383165f90815260ff602052604090206109f29083611c63565b9392505050565b610a033382611d44565b50565b6001600160a01b0381165f90815260ff60205260408120546106ed90611dbd565b610a2f6119d4565b610a385f611e25565b565b6001600160a01b0381165f90815260cb60205260408120546106ed565b5f6060805f5f5f60606097545f5f1b148015610a735750609854155b610ab75760405162461bcd60e51b81526020600482015260156024820152741152540dcc4c8e88155b9a5b9a5d1a585b1a5e9959605a1b6044820152606401610763565b610abf611e76565b610ac7611e85565b604080515f80825260208201909252600f60f81b9b939a50919850469750309650945092509050565b5f610af9610b57565b65ffffffffffff168210610b4b5760405162461bcd60e51b815260206004820152601960248201527804552433230566f7465733a20667574757265206c6f6f6b757603c1b6044820152606401610763565b6106ed61010083611c63565b5f6108bc42611e94565b60606069805461065990613151565b6001600160a01b0381165f90815260ff60205260408120548015610bdb576001600160a01b0383165f90815260ff6020526040902080545f198301908110610bba57610bba6131c1565b5f9182526020909120015464010000000090046001600160e01b0316610bdd565b5f5b6001600160e01b03169392505050565b5f3381610bfa828661144e565b905083811015610c5a5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610763565b610941828686840361181b565b5f54610100900460ff1615808015610c8557505f54600160ff909116105b80610c9e5750303b158015610c9e57505f5460ff166001145b610d015760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610763565b5f805460ff191660011790558015610d22575f805461ff0019166101001790555b610d2a611efa565b610d6e6040518060400160405280600581526020016422b4b3b2b760d91b8152506040518060400160405280600581526020016422a4a3a2a760d91b815250611f28565b610d7785611e25565b610d9d6040518060400160405280600581526020016422a4a3a2a760d91b815250611f5c565b8251845114610e245760405162461bcd60e51b815260206004820152604760248201527f456967656e2e696e697469616c697a653a206d696e7465727320616e64206d6960448201527f6e74696e67416c6c6f77616e636573206d757374206265207468652073616d65606482015266040d8cadccee8d60cb1b608482015260a401610763565b8151845114610eab5760405162461bcd60e51b815260206004820152604760248201527f456967656e2e696e697469616c697a653a206d696e7465727320616e64206d6960448201527f6e74416c6c6f776564416674657273206d757374206265207468652073616d65606482015266040d8cadccee8d60cb1b608482015260a401610763565b5f5b845181101561102857838181518110610ec857610ec86131c1565b60200260200101516101315f878481518110610ee657610ee66131c1565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020015f2081905550828181518110610f2357610f236131c1565b60200260200101516101305f878481518110610f4157610f416131c1565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020015f208190555060016101335f878481518110610f8457610f846131c1565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020015f205f6101000a81548160ff021916908315150217905550848181518110610fd357610fd36131c1565b60200260200101516001600160a01b03167fcf20b1ecb604b0e8888d579c64e8a3b10e590d45c1c2dddb393bed28436222716001604051611018911515815260200190565b60405180910390a2600101610ead565b505f19610132558015611074575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050505050565b5f336106e7818585611aa0565b8281146110fd5760405162461bcd60e51b815260206004820152603e60248201527f456967656e2e6d756c746973656e643a2072656365697665727320616e64206160448201527f6d6f756e7473206d757374206265207468652073616d65206c656e67746800006064820152608401610763565b5f5b83811015611074576111503386868481811061111d5761111d6131c1565b90506020020160208101906111329190612c01565b858585818110611144576111446131c1565b90506020020135611aa0565b6001016110ff565b6111606119d4565b6001600160a01b0382165f8181526101346020908152604091829020805460ff191685151590811790915591519182527f72a561d1af7409467dae4f1e9fc52590a9335a1dda17727e2b6aa8c4db35109b910161091d565b834211156112085760405162461bcd60e51b815260206004820152601d60248201527f4552433230566f7465733a207369676e617475726520657870697265640000006044820152606401610763565b604080517fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf60208201526001600160a01b0388169181019190915260608101869052608081018590525f90611281906112799060a00160405160208183030381529060405280519060200120611fa5565b858585611fd1565b905061128c81611ff7565b86146112da5760405162461bcd60e51b815260206004820152601960248201527f4552433230566f7465733a20696e76616c6964206e6f6e6365000000000000006044820152606401610763565b6112e48188611d44565b50505050505050565b8342111561133d5760405162461bcd60e51b815260206004820152601d60248201527f45524332305065726d69743a206578706972656420646561646c696e650000006044820152606401610763565b5f7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c988888861136b8c611ff7565b6040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090505f6113c582611fa5565b90505f6113d482878787611fd1565b9050896001600160a01b0316816001600160a01b0316146114375760405162461bcd60e51b815260206004820152601e60248201527f45524332305065726d69743a20696e76616c6964207369676e617475726500006044820152606401610763565b6114428a8a8a61181b565b50505050505050505050565b6001600160a01b039182165f90815260666020908152604080832093909416825291909152205490565b611482338261201e565b60405163a9059cbb60e01b8152336004820152602481018290527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063a9059cbb906044016020604051808303815f875af11580156114ec573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061151091906131d5565b610a035760405162461bcd60e51b8152602060048201526024808201527f456967656e2e756e777261703a2062454947454e207472616e736665722066616044820152631a5b195960e21b6064820152608401610763565b6040516323b872dd60e01b8152336004820152306024820152604481018290527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906323b872dd906064016020604051808303815f875af11580156115d8573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115fc91906131d5565b6116535760405162461bcd60e51b815260206004820152602260248201527f456967656e2e777261703a2062454947454e207472616e73666572206661696c604482015261195960f21b6064820152608401610763565b610a03338261193e565b6116656119d4565b5f1961013254146116f45760405162461bcd60e51b815260206004820152604d60248201527f456967656e2e64697361626c655472616e736665725265737472696374696f6e60448201527f733a207472616e73666572207265737472696374696f6e732061726520616c7260648201526c1958591e48191a5cd8589b1959609a1b608482015260a401610763565b5f6101328190556040517f2b18986d3ba809db2f13a5d7bf17f60d357b37d9cbb55dd71cbbac8dc4060f649190a1565b604080518082019091525f80825260208201526001600160a01b0383165f90815260ff60205260409020805463ffffffff8416908110611766576117666131c1565b5f9182526020918290206040805180820190915291015463ffffffff8116825264010000000090046001600160e01b0316918101919091529392505050565b6117ad6119d4565b6001600160a01b0381166118125760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610763565b610a0381611e25565b6001600160a01b03831661187d5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610763565b6001600160a01b0382166118de5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610763565b6001600160a01b038381165f8181526066602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6119488282612037565b6001600160e01b0361195861083b565b11156119bf5760405162461bcd60e51b815260206004820152603060248201527f4552433230566f7465733a20746f74616c20737570706c79207269736b73206f60448201526f766572666c6f77696e6720766f74657360801b6064820152608401610763565b6119ce61010061210883612113565b50505050565b6033546001600160a01b03163314610a385760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610763565b5f611a39848461144e565b90505f1981146119ce5781811015611a935760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610763565b6119ce848484840361181b565b6001600160a01b038316611b045760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610763565b6001600160a01b038216611b665760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610763565b611b7183838361227f565b6001600160a01b0383165f9081526065602052604090205481811015611be85760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610763565b6001600160a01b038085165f8181526065602052604080822086860390559286168082529083902080548601905591517fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90611c479086815260200190565b60405180910390a36119ce848484612363565b5f6108bc612394565b81545f9081816005811115611cba575f611c7c84612407565b611c8690856131f0565b5f88815260209020909150869082015463ffffffff161115611caa57809150611cb8565b611cb58160016131ae565b92505b505b80821015611d05575f611ccd83836124eb565b5f88815260209020909150869082015463ffffffff161115611cf157809150611cff565b611cfc8160016131ae565b92505b50611cba565b8015611d2f575f8681526020902081015f19015464010000000090046001600160e01b0316611d31565b5f5b6001600160e01b03169695505050505050565b6001600160a01b038281165f81815260fe6020818152604080842080546065845282862054949093528787166001600160a01b03198416811790915590519190951694919391928592917f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f9190a46119ce828483612505565b5f63ffffffff821115611e215760405162461bcd60e51b815260206004820152602660248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203360448201526532206269747360d01b6064820152608401610763565b5090565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b60606099805461065990613151565b6060609a805461065990613151565b5f65ffffffffffff821115611e215760405162461bcd60e51b815260206004820152602660248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203460448201526538206269747360d01b6064820152608401610763565b5f54610100900460ff16611f205760405162461bcd60e51b815260040161076390613203565b610a3861263f565b5f54610100900460ff16611f4e5760405162461bcd60e51b815260040161076390613203565b611f58828261266e565b5050565b5f54610100900460ff16611f825760405162461bcd60e51b815260040161076390613203565b610a0381604051806040016040528060018152602001603160f81b8152506126ad565b5f6106ed611fb1611c5a565b8360405161190160f01b8152600281019290925260228201526042902090565b5f5f5f611fe0878787876126fa565b91509150611fed816127b7565b5095945050505050565b6001600160a01b0381165f90815260cb602052604090208054600181018255905b50919050565b6120288282612900565b6119ce610100612a4383612113565b6001600160a01b03821661208d5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610763565b6120985f838361227f565b8060675f8282546120a991906131ae565b90915550506001600160a01b0382165f818152606560209081526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3611f585f8383612363565b5f6109f282846131ae565b82545f90819081811561215d575f8781526020902082015f190160408051808201909152905463ffffffff8116825264010000000090046001600160e01b03166020820152612171565b604080518082019091525f80825260208201525b905080602001516001600160e01b0316935061219184868863ffffffff16565b92505f821180156121b957506121a5610b57565b65ffffffffffff16815f015163ffffffff16145b156121fc576121c783612a4e565b5f8881526020902083015f190180546001600160e01b03929092166401000000000263ffffffff909216919091179055612275565b866040518060400160405280612220612213610b57565b65ffffffffffff16611dbd565b63ffffffff16815260200161223486612a4e565b6001600160e01b0390811690915282546001810184555f938452602093849020835194909301519091166401000000000263ffffffff909316929092179101555b5050935093915050565b61013254421161235e576001600160a01b03831615806122a657506001600160a01b038216155b806122c957506001600160a01b0383165f908152610133602052604090205460ff165b806122ec57506001600160a01b0382165f908152610134602052604090205460ff165b61235e5760405162461bcd60e51b815260206004820152603a60248201527f456967656e2e5f6265666f7265546f6b656e5472616e736665723a2066726f6d60448201527f206f7220746f206d7573742062652077686974656c69737465640000000000006064820152608401610763565b505050565b6001600160a01b038381165f90815260fe602052604080822054858416835291205461235e92918216911683612505565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f6123be612ab6565b6123c6612b0e565b60408051602081019490945283019190915260608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b5f815f0361241657505f919050565b5f600161242284612b3e565b901c6001901b9050600181848161243b5761243b61324e565b048201901c905060018184816124535761245361324e565b048201901c9050600181848161246b5761246b61324e565b048201901c905060018184816124835761248361324e565b048201901c9050600181848161249b5761249b61324e565b048201901c905060018184816124b3576124b361324e565b048201901c905060018184816124cb576124cb61324e565b048201901c90506109f2818285816124e5576124e561324e565b04612bd1565b5f6124f96002848418613262565b6109f2908484166131ae565b816001600160a01b0316836001600160a01b03161415801561252657505f81115b1561235e576001600160a01b038316156125b3576001600160a01b0383165f90815260ff60205260408120819061256090612a4385612113565b91509150846001600160a01b03167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a72483836040516125a8929190918252602082015260400190565b60405180910390a250505b6001600160a01b0382161561235e576001600160a01b0382165f90815260ff6020526040812081906125e89061210885612113565b91509150836001600160a01b03167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a7248383604051612630929190918252602082015260400190565b60405180910390a25050505050565b5f54610100900460ff166126655760405162461bcd60e51b815260040161076390613203565b610a3833611e25565b5f54610100900460ff166126945760405162461bcd60e51b815260040161076390613203565b60686126a083826132c5565b50606961235e82826132c5565b5f54610100900460ff166126d35760405162461bcd60e51b815260040161076390613203565b60996126df83826132c5565b50609a6126ec82826132c5565b50505f609781905560985550565b5f807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a083111561272f57505f905060036127ae565b604080515f8082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015612780573d5f5f3e3d5ffd5b5050604051601f1901519150506001600160a01b0381166127a8575f600192509250506127ae565b91505f90505b94509492505050565b5f8160048111156127ca576127ca613380565b036127d25750565b60018160048111156127e6576127e6613380565b036128335760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610763565b600281600481111561284757612847613380565b036128945760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610763565b60038160048111156128a8576128a8613380565b03610a035760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401610763565b6001600160a01b0382166129605760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401610763565b61296b825f8361227f565b6001600160a01b0382165f90815260656020526040902054818110156129de5760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b6064820152608401610763565b6001600160a01b0383165f8181526065602090815260408083208686039055606780548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a361235e835f84612363565b5f6109f282846131f0565b5f6001600160e01b03821115611e215760405162461bcd60e51b815260206004820152602760248201527f53616665436173743a2076616c756520646f65736e27742066697420696e20326044820152663234206269747360c81b6064820152608401610763565b5f5f612ac0611e76565b805190915015612ad7578051602090910120919050565b6097548015612ae65792915050565b7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4709250505090565b5f5f612b18611e85565b805190915015612b2f578051602090910120919050565b6098548015612ae65792915050565b5f80608083901c15612b5257608092831c92015b604083901c15612b6457604092831c92015b602083901c15612b7657602092831c92015b601083901c15612b8857601092831c92015b600883901c15612b9a57600892831c92015b600483901c15612bac57600492831c92015b600283901c15612bbe57600292831c92015b600183901c156106ed5760010192915050565b5f818310612bdf57816109f2565b5090919050565b80356001600160a01b0381168114612bfc575f5ffd5b919050565b5f60208284031215612c11575f5ffd5b6109f282612be6565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f6109f26020830184612c1a565b5f5f60408385031215612c6b575f5ffd5b612c7483612be6565b946020939093013593505050565b8015158114610a03575f5ffd5b5f5f60408385031215612ca0575f5ffd5b612ca983612be6565b91506020830135612cb981612c82565b809150509250929050565b5f5f5f60608486031215612cd6575f5ffd5b612cdf84612be6565b9250612ced60208501612be6565b929592945050506040919091013590565b60ff60f81b8816815260e060208201525f612d1c60e0830189612c1a565b8281036040840152612d2e8189612c1a565b606084018890526001600160a01b038716608085015260a0840186905283810360c0850152845180825260208087019350909101905f5b81811015612d83578351835260209384019390920191600101612d65565b50909b9a5050505050505050505050565b5f60208284031215612da4575f5ffd5b5035919050565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f1916810167ffffffffffffffff81118282101715612de857612de8612dab565b604052919050565b5f67ffffffffffffffff821115612e0957612e09612dab565b5060051b60200190565b5f82601f830112612e22575f5ffd5b8135612e35612e3082612df0565b612dbf565b8082825260208201915060208360051b860101925085831115612e56575f5ffd5b602085015b83811015611fed578035835260209283019201612e5b565b5f5f5f5f60808587031215612e86575f5ffd5b612e8f85612be6565b9350602085013567ffffffffffffffff811115612eaa575f5ffd5b8501601f81018713612eba575f5ffd5b8035612ec8612e3082612df0565b8082825260208201915060208360051b850101925089831115612ee9575f5ffd5b6020840193505b82841015612f1257612f0184612be6565b825260209384019390910190612ef0565b9550505050604085013567ffffffffffffffff811115612f30575f5ffd5b612f3c87828801612e13565b925050606085013567ffffffffffffffff811115612f58575f5ffd5b612f6487828801612e13565b91505092959194509250565b5f5f83601f840112612f80575f5ffd5b50813567ffffffffffffffff811115612f97575f5ffd5b6020830191508360208260051b8501011115612fb1575f5ffd5b9250929050565b5f5f5f5f60408587031215612fcb575f5ffd5b843567ffffffffffffffff811115612fe1575f5ffd5b612fed87828801612f70565b909550935050602085013567ffffffffffffffff81111561300c575f5ffd5b61301887828801612f70565b95989497509550505050565b803560ff81168114612bfc575f5ffd5b5f5f5f5f5f5f60c08789031215613049575f5ffd5b61305287612be6565b9550602087013594506040870135935061306e60608801613024565b9598949750929560808101359460a0909101359350915050565b5f5f5f5f5f5f5f60e0888a03121561309e575f5ffd5b6130a788612be6565b96506130b560208901612be6565b955060408801359450606088013593506130d160808901613024565b9699959850939692959460a0840135945060c09093013592915050565b5f5f604083850312156130ff575f5ffd5b61310883612be6565b915061311660208401612be6565b90509250929050565b5f5f60408385031215613130575f5ffd5b61313983612be6565b9150602083013563ffffffff81168114612cb9575f5ffd5b600181811c9082168061316557607f821691505b60208210810361201857634e487b7160e01b5f52602260045260245ffd5b5f60208284031215613193575f5ffd5b5051919050565b634e487b7160e01b5f52601160045260245ffd5b808201808211156106ed576106ed61319a565b634e487b7160e01b5f52603260045260245ffd5b5f602082840312156131e5575f5ffd5b81516109f281612c82565b818103818111156106ed576106ed61319a565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b634e487b7160e01b5f52601260045260245ffd5b5f8261327c57634e487b7160e01b5f52601260045260245ffd5b500490565b601f82111561235e57805f5260205f20601f840160051c810160208510156132a65750805b601f840160051c820191505b81811015611074575f81556001016132b2565b815167ffffffffffffffff8111156132df576132df612dab565b6132f3816132ed8454613151565b84613281565b6020601f821160018114613325575f831561330e5750848201515b5f19600385901b1c1916600184901b178455611074565b5f84815260208120601f198516915b828110156133545787850151825560209485019460019092019101613334565b508482101561337157868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b634e487b7160e01b5f52602160045260245ffdfea2646970667358221220288064199d2be90b93729dff2dcc2497b661bd2af455c43da5f6db62c74e88c364736f6c634300081b0033", } // 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 085cd0e8cc..7f3d80518c 100644 --- a/pkg/bindings/EigenPod/binding.go +++ b/pkg/bindings/EigenPod/binding.go @@ -74,7 +74,7 @@ type IEigenPodTypesValidatorInfo struct { // EigenPodMetaData contains all meta data concerning the EigenPod contract. var EigenPodMetaData = &bind.MetaData{ ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"_ethPOS\",\"type\":\"address\",\"internalType\":\"contractIETHPOSDeposit\"},{\"name\":\"_eigenPodManager\",\"type\":\"address\",\"internalType\":\"contractIEigenPodManager\"},{\"name\":\"_GENESIS_TIME\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"receive\",\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"GENESIS_TIME\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidatorCount\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"checkpointBalanceExitedGwei\",\"inputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"currentCheckpoint\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIEigenPodTypes.Checkpoint\",\"components\":[{\"name\":\"beaconBlockRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"proofsRemaining\",\"type\":\"uint24\",\"internalType\":\"uint24\"},{\"name\":\"podBalanceGwei\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"balanceDeltasGwei\",\"type\":\"int64\",\"internalType\":\"int64\"},{\"name\":\"prevBeaconBalanceGwei\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"currentCheckpointTimestamp\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"eigenPodManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIEigenPodManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"ethPOS\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIETHPOSDeposit\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getParentBlockRoot\",\"inputs\":[{\"name\":\"timestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"_podOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"lastCheckpointTimestamp\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"podOwner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"proofSubmitter\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"recoverTokens\",\"inputs\":[{\"name\":\"tokenList\",\"type\":\"address[]\",\"internalType\":\"contractIERC20[]\"},{\"name\":\"amountsToWithdraw\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"},{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setProofSubmitter\",\"inputs\":[{\"name\":\"newProofSubmitter\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"stake\",\"inputs\":[{\"name\":\"pubkey\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"depositDataRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"startCheckpoint\",\"inputs\":[{\"name\":\"revertIfNoBalance\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"validatorPubkeyHashToInfo\",\"inputs\":[{\"name\":\"validatorPubkeyHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIEigenPodTypes.ValidatorInfo\",\"components\":[{\"name\":\"validatorIndex\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"restakedBalanceGwei\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"lastCheckpointedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumIEigenPodTypes.VALIDATOR_STATUS\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"validatorPubkeyToInfo\",\"inputs\":[{\"name\":\"validatorPubkey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIEigenPodTypes.ValidatorInfo\",\"components\":[{\"name\":\"validatorIndex\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"restakedBalanceGwei\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"lastCheckpointedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumIEigenPodTypes.VALIDATOR_STATUS\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"validatorStatus\",\"inputs\":[{\"name\":\"validatorPubkey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"enumIEigenPodTypes.VALIDATOR_STATUS\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"validatorStatus\",\"inputs\":[{\"name\":\"pubkeyHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"enumIEigenPodTypes.VALIDATOR_STATUS\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"verifyCheckpointProofs\",\"inputs\":[{\"name\":\"balanceContainerProof\",\"type\":\"tuple\",\"internalType\":\"structBeaconChainProofs.BalanceContainerProof\",\"components\":[{\"name\":\"balanceContainerRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"proof\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"proofs\",\"type\":\"tuple[]\",\"internalType\":\"structBeaconChainProofs.BalanceProof[]\",\"components\":[{\"name\":\"pubkeyHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"balanceRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"proof\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"verifyStaleBalance\",\"inputs\":[{\"name\":\"beaconTimestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"stateRootProof\",\"type\":\"tuple\",\"internalType\":\"structBeaconChainProofs.StateRootProof\",\"components\":[{\"name\":\"beaconStateRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"proof\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"proof\",\"type\":\"tuple\",\"internalType\":\"structBeaconChainProofs.ValidatorProof\",\"components\":[{\"name\":\"validatorFields\",\"type\":\"bytes32[]\",\"internalType\":\"bytes32[]\"},{\"name\":\"proof\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"verifyWithdrawalCredentials\",\"inputs\":[{\"name\":\"beaconTimestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"stateRootProof\",\"type\":\"tuple\",\"internalType\":\"structBeaconChainProofs.StateRootProof\",\"components\":[{\"name\":\"beaconStateRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"proof\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"validatorIndices\",\"type\":\"uint40[]\",\"internalType\":\"uint40[]\"},{\"name\":\"validatorFieldsProofs\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"},{\"name\":\"validatorFields\",\"type\":\"bytes32[][]\",\"internalType\":\"bytes32[][]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"withdrawRestakedBeaconChainETH\",\"inputs\":[{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amountWei\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"withdrawableRestakedExecutionLayerGwei\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"event\",\"name\":\"CheckpointCreated\",\"inputs\":[{\"name\":\"checkpointTimestamp\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"beaconBlockRoot\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"validatorCount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"CheckpointFinalized\",\"inputs\":[{\"name\":\"checkpointTimestamp\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"totalShareDeltaWei\",\"type\":\"int256\",\"indexed\":false,\"internalType\":\"int256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"EigenPodStaked\",\"inputs\":[{\"name\":\"pubkey\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"NonBeaconChainETHReceived\",\"inputs\":[{\"name\":\"amountReceived\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ProofSubmitterUpdated\",\"inputs\":[{\"name\":\"prevProofSubmitter\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"newProofSubmitter\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RestakedBeaconChainETHWithdrawn\",\"inputs\":[{\"name\":\"recipient\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorBalanceUpdated\",\"inputs\":[{\"name\":\"validatorIndex\",\"type\":\"uint40\",\"indexed\":false,\"internalType\":\"uint40\"},{\"name\":\"balanceTimestamp\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"newValidatorBalanceGwei\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorCheckpointed\",\"inputs\":[{\"name\":\"checkpointTimestamp\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorIndex\",\"type\":\"uint40\",\"indexed\":true,\"internalType\":\"uint40\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorRestaked\",\"inputs\":[{\"name\":\"validatorIndex\",\"type\":\"uint40\",\"indexed\":false,\"internalType\":\"uint40\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorWithdrawn\",\"inputs\":[{\"name\":\"checkpointTimestamp\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorIndex\",\"type\":\"uint40\",\"indexed\":true,\"internalType\":\"uint40\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"BeaconTimestampTooFarInPast\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"CannotCheckpointTwiceInSingleBlock\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"CheckpointAlreadyActive\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"CredentialsAlreadyVerified\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"CurrentlyPaused\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InputAddressZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InputArrayLengthMismatch\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InsufficientWithdrawableBalance\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidEIP4788Response\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidProof\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidProofLength\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidProofLength\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidPubKeyLength\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidValidatorFieldsLength\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"MsgValueNot32ETH\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NoActiveCheckpoint\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NoBalanceToCheckpoint\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyEigenPodManager\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyEigenPodOwner\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyEigenPodOwnerOrProofSubmitter\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"TimestampOutOfRange\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ValidatorInactiveOnBeaconChain\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ValidatorIsExitingBeaconChain\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ValidatorNotActiveInPod\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ValidatorNotSlashedOnBeaconChain\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"WithdrawalCredentialsNotForEigenPod\",\"inputs\":[]}]", - Bin: "0x60e060405234801561000f575f5ffd5b50604051613c7c380380613c7c83398101604081905261002e91610131565b6001600160a01b03808416608052821660a0526001600160401b03811660c05261005661005e565b505050610186565b5f54610100900460ff16156100c95760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff90811614610118575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b038116811461012e575f5ffd5b50565b5f5f5f60608486031215610143575f5ffd5b835161014e8161011a565b602085015190935061015f8161011a565b60408501519092506001600160401b038116811461017b575f5ffd5b809150509250925092565b60805160a05160c051613a7f6101fd5f395f61060401525f81816102a90152818161063f015281816106e7015281816109ab01528181610b7501528181610e4e01528181610ef50152818161112b01528181611479015281816115ad01526127bb01525f81816104c60152610f5e0152613a7f5ff3fe608060405260043610610164575f3560e01c80636fcd0e53116100cd578063c490744211610087578063dda3346c11610062578063dda3346c14610596578063ee94d67c146105b5578063f074ba62146105d4578063f2882461146105f3575f5ffd5b8063c490744214610539578063c4d66de814610558578063d06d558714610577575f5ffd5b80636fcd0e53146104545780637439841f1461048057806374cdd798146104b557806388676cad146104e85780639b4e463414610507578063b522538a1461051a575f5ffd5b80634665bcda1161011e5780634665bcda1461029857806347d28372146102cb57806352396a59146103b657806358753357146103ea57806358eaee79146104095780636c0d2d5a14610435575f5ffd5b8063039157d2146101a25780630b18ff66146101c35780632340e8d3146101ff5780633474aa16146102225780633f65cf191461025357806342ecff2a14610272575f5ffd5b3661019e576040513481527f6fdd3dbdb173299608c0aa9f368735857c8842b581f8389238bf05bd04b3bf499060200160405180910390a1005b5f5ffd5b3480156101ad575f5ffd5b506101c16101bc366004612ff3565b610626565b005b3480156101ce575f5ffd5b506033546101e2906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b34801561020a575f5ffd5b5061021460395481565b6040519081526020016101f6565b34801561022d575f5ffd5b506034546001600160401b03165b6040516001600160401b0390911681526020016101f6565b34801561025e575f5ffd5b506101c161026d3660046130ac565b610952565b34801561027d575f5ffd5b50603a5461023b90600160401b90046001600160401b031681565b3480156102a3575f5ffd5b506101e27f000000000000000000000000000000000000000000000000000000000000000081565b3480156102d6575f5ffd5b5061035b6040805160a0810182525f80825260208201819052918101829052606081018290526080810191909152506040805160a081018252603c548152603d5462ffffff811660208301526001600160401b0363010000008204811693830193909352600160581b810460070b6060830152600160981b9004909116608082015290565b6040516101f691905f60a0820190508251825262ffffff60208401511660208301526001600160401b036040840151166040830152606083015160070b60608301526001600160401b03608084015116608083015292915050565b3480156103c1575f5ffd5b5061023b6103d0366004613181565b603b6020525f90815260409020546001600160401b031681565b3480156103f5575f5ffd5b50603e546101e2906001600160a01b031681565b348015610414575f5ffd5b506104286104233660046131de565b610bda565b6040516101f69190613250565b348015610440575f5ffd5b5061021461044f366004613181565b610c3c565b34801561045f575f5ffd5b5061047361046e36600461325e565b610d4a565b6040516101f69190613275565b34801561048b575f5ffd5b5061042861049a36600461325e565b5f90815260366020526040902054600160c01b900460ff1690565b3480156104c0575f5ffd5b506101e27f000000000000000000000000000000000000000000000000000000000000000081565b3480156104f3575f5ffd5b506101c16105023660046132d8565b610df5565b6101c16105153660046132f3565b610eea565b348015610525575f5ffd5b506104736105343660046131de565b611031565b348015610544575f5ffd5b506101c1610553366004613383565b611120565b348015610563575f5ffd5b506101c16105723660046133ad565b611257565b348015610582575f5ffd5b506101c16105913660046133ad565b6113a1565b3480156105a1575f5ffd5b506101c16105b0366004613498565b611435565b3480156105c0575f5ffd5b50603a5461023b906001600160401b031681565b3480156105df575f5ffd5b506101c16105ee36600461356a565b611594565b3480156105fe575f5ffd5b5061023b7f000000000000000000000000000000000000000000000000000000000000000081565b604051635ac86ab760e01b8152600660048201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635ac86ab790602401602060405180830381865afa15801561068c573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106b091906135d1565b156106ce5760405163840a48d560e01b815260040160405180910390fd5b604051635ac86ab760e01b8152600860048201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635ac86ab790602401602060405180830381865afa158015610734573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061075891906135d1565b156107765760405163840a48d560e01b815260040160405180910390fd5b5f6107ba61078485806135ec565b808060200260200160405190810160405280939291908181526020018383602002808284375f9201919091525061199192505050565b5f818152603660209081526040808320815160808101835281546001600160401b038082168352600160401b8204811695830195909552600160801b8104909416928101929092529394509192906060830190600160c01b900460ff1660028111156108285761082861321c565b60028111156108395761083961321c565b81525050905080604001516001600160401b0316876001600160401b031611610875576040516337e07ffd60e01b815260040160405180910390fd5b60018160600151600281111561088d5761088d61321c565b146108ab5760405163d49e19a760e01b815260040160405180910390fd5b6108ee6108b886806135ec565b808060200260200160405190810160405280939291908181526020018383602002808284375f920191909152506119b392505050565b61090b5760405163161ce5ed60e31b815260040160405180910390fd5b61091d61091788610c3c565b876119db565b610940863561092c87806135ec565b61093960208a018a613631565b8651611a80565b6109495f611ba7565b50505050505050565b6033546001600160a01b03163314806109755750603e546001600160a01b031633145b6109925760405163427a777960e01b815260040160405180910390fd5b604051635ac86ab760e01b8152600260048201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635ac86ab790602401602060405180830381865afa1580156109f8573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a1c91906135d1565b15610a3a5760405163840a48d560e01b815260040160405180910390fd5b8584148015610a4857508382145b610a65576040516343714afd60e01b815260040160405180910390fd5b603a546001600160401b03600160401b9091048116908a1611610a9b576040516337e07ffd60e01b815260040160405180910390fd5b610aad610aa78a610c3c565b896119db565b5f805b87811015610b4557610b318a358a8a84818110610acf57610acf613673565b9050602002016020810190610ae49190613687565b898985818110610af657610af6613673565b9050602002810190610b089190613631565b898987818110610b1a57610b1a613673565b9050602002810190610b2c91906135ec565b611d27565b610b3b90836136bf565b9150600101610ab0565b5060335460405163a1ca780b60e01b81526001600160a01b0391821660048201525f6024820152604481018390527f00000000000000000000000000000000000000000000000000000000000000009091169063a1ca780b906064015f604051808303815f87803b158015610bb8575f5ffd5b505af1158015610bca573d5f5f3e3d5ffd5b5050505050505050505050505050565b5f5f610c1a84848080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152506121dc92505050565b5f90815260366020526040902054600160c01b900460ff169150505b92915050565b5f610c4a611fff600c6136d2565b610c5d6001600160401b038416426136e9565b10610c7b57604051637944e66d60e11b815260040160405180910390fd5b604080516001600160401b03841660208201525f918291720f3df6d732807ef1319fb7b8bb8522d0beac02910160408051601f1981840301815290829052610cc291613713565b5f60405180830381855afa9150503d805f8114610cfa576040519150601f19603f3d011682016040523d82523d5f602084013e610cff565b606091505b5091509150818015610d1157505f8151115b610d2e5760405163558ad0a360e01b815260040160405180910390fd5b80806020019051810190610d42919061371e565b949350505050565b610d71604080516080810182525f8082526020820181905291810182905290606082015290565b5f82815260366020908152604091829020825160808101845281546001600160401b038082168352600160401b8204811694830194909452600160801b810490931693810193909352906060830190600160c01b900460ff166002811115610ddb57610ddb61321c565b6002811115610dec57610dec61321c565b90525092915050565b6033546001600160a01b0316331480610e185750603e546001600160a01b031633145b610e355760405163427a777960e01b815260040160405180910390fd5b604051635ac86ab760e01b8152600660048201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635ac86ab790602401602060405180830381865afa158015610e9b573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ebf91906135d1565b15610edd5760405163840a48d560e01b815260040160405180910390fd5b610ee682611ba7565b5050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610f3357604051633213a66160e21b815260040160405180910390fd5b346801bc16d674ec80000014610f5c5760405163049696b360e31b815260040160405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663228951186801bc16d674ec8000008787610f9f61226d565b8888886040518863ffffffff1660e01b8152600401610fc39695949392919061378b565b5f604051808303818588803b158015610fda575f5ffd5b505af1158015610fec573d5f5f3e3d5ffd5b50505050507f606865b7934a25d4aed43f6cdb426403353fa4b3009c4d228407474581b01e2385856040516110229291906137d9565b60405180910390a15050505050565b611058604080516080810182525f8082526020820181905291810182905290606082015290565b60365f61109985858080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152506121dc92505050565b815260208082019290925260409081015f20815160808101835281546001600160401b038082168352600160401b8204811695830195909552600160801b81049094169281019290925290916060830190600160c01b900460ff1660028111156111055761110561321c565b60028111156111165761111661321c565b9052509392505050565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461116957604051633213a66160e21b815260040160405180910390fd5b5f611178633b9aca0083613800565b9050611191633b9aca006001600160401b0383166136d2565b6034549092506001600160401b0390811690821611156111c4576040516302c6f54760e21b815260040160405180910390fd5b603480548291905f906111e19084906001600160401b0316613813565b92506101000a8154816001600160401b0302191690836001600160401b03160217905550826001600160a01b03167f8947fd2ce07ef9cc302c4e8f0461015615d91ce851564839e91cc804c2f49d8e8360405161124091815260200190565b60405180910390a261125283836122b1565b505050565b5f54610100900460ff161580801561127557505f54600160ff909116105b8061128e5750303b15801561128e57505f5460ff166001145b6112f65760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b5f805460ff191660011790558015611317575f805461ff0019166101001790555b6001600160a01b03821661133e576040516339b190bb60e11b815260040160405180910390fd5b603380546001600160a01b0319166001600160a01b0384161790558015610ee6575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15050565b6033546001600160a01b031633146113cc5760405163719f370360e11b815260040160405180910390fd5b603e54604080516001600160a01b03928316815291831660208301527ffb8129080a19d34dceac04ba253fc50304dc86c729bd63cdca4a969ad19a5eac910160405180910390a1603e80546001600160a01b0319166001600160a01b0392909216919091179055565b6033546001600160a01b031633146114605760405163719f370360e11b815260040160405180910390fd5b604051635ac86ab760e01b8152600560048201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635ac86ab790602401602060405180830381865afa1580156114c6573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114ea91906135d1565b156115085760405163840a48d560e01b815260040160405180910390fd5b825184511461152a576040516343714afd60e01b815260040160405180910390fd5b5f5b845181101561158d576115858385838151811061154b5761154b613673565b602002602001015187848151811061156557611565613673565b60200260200101516001600160a01b03166123c69092919063ffffffff16565b60010161152c565b5050505050565b604051635ac86ab760e01b8152600760048201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635ac86ab790602401602060405180830381865afa1580156115fa573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061161e91906135d1565b1561163c5760405163840a48d560e01b815260040160405180910390fd5b603a54600160401b90046001600160401b03165f81900361167057604051631a544f4960e01b815260040160405180910390fd5b6040805160a081018252603c54808252603d5462ffffff811660208401526001600160401b0363010000008204811694840194909452600160581b810460070b6060840152600160981b90049092166080820152906116cf9087612418565b5f805b8581101561193857368787838181106116ed576116ed613673565b90506020028101906116ff9190613832565b80355f908152603660209081526040808320815160808101835281546001600160401b038082168352600160401b8204811695830195909552600160801b8104909416928101929092529394509192906060830190600160c01b900460ff16600281111561176f5761176f61321c565b60028111156117805761178061321c565b905250905060018160600151600281111561179d5761179d61321c565b146117a9575050611930565b856001600160401b031681604001516001600160401b0316106117cd575050611930565b5f80806117dd848a8f35886124c9565b60208b01805193965091945092506117f482613850565b62ffffff1690525060808801805184919061181090839061386d565b6001600160401b031690525060608801805183919061183090839061388c565b60070b905250611840818861386d565b85355f908152603660209081526040918290208751815492890151938901516001600160401b03908116600160801b0267ffffffffffffffff60801b19958216600160401b026001600160801b0319909516919092161792909217928316821781556060880151939a50879390929091839160ff60c01b1990911668ffffffffffffffffff60801b1990911617600160c01b8360028111156118e4576118e461321c565b021790555050845160405164ffffffffff90911691506001600160401b038b16907fa91c59033c3423e18b54d0acecebb4972f9ea95aedf5f4cae3b677b02eaf3a3f905f90a350505050505b6001016116d2565b506001600160401b038084165f908152603b60205260408120805484939192916119649185911661386d565b92506101000a8154816001600160401b0302191690836001600160401b03160217905550610949826125ec565b5f815f815181106119a4576119a4613673565b60200260200101519050919050565b5f816003815181106119c7576119c7613673565b60200260200101515f5f1b14159050919050565b6119e7600360206136d2565b6119f46020830183613631565b905014611a14576040516313717da960e21b815260040160405180910390fd5b611a63611a246020830183613631565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152508692505084359050600361281b565b610ee6576040516309bde33960e01b815260040160405180910390fd5b60088414611aa15760405163200591bd60e01b815260040160405180910390fd5b6005611aaf602860016136bf565b611ab991906136bf565b611ac49060206136d2565b8214611ae3576040516313717da960e21b815260040160405180910390fd5b5f611b1f8686808060200260200160405190810160405280939291908181526020018383602002808284375f9201919091525061283292505050565b90505f64ffffffffff8316611b36602860016136bf565b600b901b179050611b8085858080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152508c925086915085905061281b565b611b9d576040516309bde33960e01b815260040160405180910390fd5b5050505050505050565b603a54600160401b90046001600160401b031615611bd75760405162be9bc360e81b815260040160405180910390fd5b603a546001600160401b03428116911603611c05576040516367db5b8b60e01b815260040160405180910390fd5b6034545f906001600160401b0316611c21633b9aca0047613800565b611c2b9190613813565b9050818015611c4157506001600160401b038116155b15611c5f576040516332dea95960e21b815260040160405180910390fd5b5f6040518060a00160405280611c7442610c3c565b815260395462ffffff1660208201526001600160401b0380851660408301525f60608301819052608090920191909152603a805442909216600160401b026fffffffffffffffff0000000000000000199092169190911790559050611cd8816125ec565b805160208083015160405162ffffff90911681526001600160401b034216917f575796133bbed337e5b39aa49a30dc2556a91e0c6c2af4b7b886ae77ebef1076910160405180910390a3505050565b5f5f611d648484808060200260200160405190810160405280939291908181526020018383602002808284375f9201919091525061199192505050565b5f818152603660209081526040808320815160808101835281546001600160401b038082168352600160401b8204811695830195909552600160801b8104909416928101929092529394509192906060830190600160c01b900460ff166002811115611dd257611dd261321c565b6002811115611de357611de361321c565b90525090505f81606001516002811115611dff57611dff61321c565b14611e1d576040516335e09e9d60e01b815260040160405180910390fd5b6001600160401b038016611e628686808060200260200160405190810160405280939291908181526020018383602002808284375f92019190915250612ac292505050565b6001600160401b031603611e8957604051631958236d60e21b815260040160405180910390fd5b6001600160401b038016611ece8686808060200260200160405190810160405280939291908181526020018383602002808284375f92019190915250612ae692505050565b6001600160401b031614611ef557604051632eade63760e01b815260040160405180910390fd5b611efd61226d565b611f06906138bb565b611f418686808060200260200160405190810160405280939291908181526020018383602002808284375f92019190915250612afd92505050565b14611f5f57604051633772dd5360e11b815260040160405180910390fd5b5f611f9b8686808060200260200160405190810160405280939291908181526020018383602002808284375f92019190915250612b1192505050565b9050611fab8a87878b8b8e611a80565b60398054905f611fba836138de565b9091555050603a545f90600160401b90046001600160401b031615611ff157603a54600160401b90046001600160401b0316611ffe565b603a546001600160401b03165b6040805160808101825264ffffffffff8d1681526001600160401b03858116602083015283169181019190915290915060608101600190525f858152603660209081526040918290208351815492850151938501516001600160401b03908116600160801b0267ffffffffffffffff60801b19958216600160401b026001600160801b031990951691909216179290921792831682178155606084015190929091839160ff60c01b1990911668ffffffffffffffffff60801b1990911617600160c01b8360028111156120d3576120d361321c565b021790555050603d80548492506013906120fe908490600160981b90046001600160401b031661386d565b92506101000a8154816001600160401b0302191690836001600160401b031602179055507f2d0800bbc377ea54a08c5db6a87aafff5e3e9c8fead0eda110e40e0c104414498a60405161215e919064ffffffffff91909116815260200190565b60405180910390a16040805164ffffffffff8c1681526001600160401b03838116602083015284168183015290517f0e5fac175b83177cc047381e030d8fb3b42b37bd1c025e22c280facad62c32df9181900360600190a16121cd633b9aca006001600160401b0384166136d2565b9b9a5050505050505050505050565b5f81516030146121ff57604051634f88323960e11b815260040160405180910390fd5b6040516002906122159084905f906020016138f6565b60408051601f198184030181529082905261222f91613713565b602060405180830381855afa15801561224a573d5f5f3e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610c36919061371e565b60408051600160f81b60208201525f602182015230606090811b6bffffffffffffffffffffffff1916602c8301529101604051602081830303815290604052905090565b804710156123015760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e636500000060448201526064016112ed565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f811461234a576040519150601f19603f3d011682016040523d82523d5f602084013e61234f565b606091505b50509050806112525760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d6179206861766520726576657274656400000000000060648201526084016112ed565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052611252908490612b28565b612424600560036136bf565b61242f9060206136d2565b61243c6020830183613631565b90501461245c576040516313717da960e21b815260040160405180910390fd5b606c6124ac61246e6020840184613631565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525087925050853590508461281b565b611252576040516309bde33960e01b815260040160405180910390fd5b83516020850151905f908190816124e1878388612bfb565b9050846001600160401b0316816001600160401b03161461255b57612506858261391a565b6040805164ffffffffff851681526001600160401b038b8116602083015284168183015290519195507f0e5fac175b83177cc047381e030d8fb3b42b37bd1c025e22c280facad62c32df919081900360600190a15b6001600160401b0380821660208b0181905290891660408b01525f036125e05760398054905f61258a83613949565b9091555050600260608a015261259f8461395e565b92508164ffffffffff16886001600160401b03167f2a02361ffa66cf2c2da4682c2355a6adcaa9f6c227b6e6563e68480f9587626a60405160405180910390a35b50509450945094915050565b602081015162ffffff161561268c578051603c556020810151603d80546040840151606085015160809095015162ffffff9094166affffffffffffffffffffff199092169190911763010000006001600160401b0392831602176fffffffffffffffffffffffffffffffff60581b1916600160581b9482169490940267ffffffffffffffff60981b191693909317600160981b9390921692909202179055565b60808101516034545f916126a8916001600160401b031661386d565b90505f826060015183604001516126bf919061388c565b60408401516034805492935090915f906126e39084906001600160401b031661386d565b82546101009290920a6001600160401b03818102199093169183160217909155603a8054600160401b810483166001600160801b03199091161790555f915061273390633b9aca009085166136d2565b90505f612748633b9aca00600785900b613983565b603a546040518281529192506001600160401b0316907f525408c201bc1576eb44116f6478f1c2a54775b19a043bcfdc708364f74f8e449060200160405180910390a260335460405163a1ca780b60e01b81526001600160a01b03918216600482015260248101849052604481018390527f00000000000000000000000000000000000000000000000000000000000000009091169063a1ca780b906064015f604051808303815f87803b1580156127fe575f5ffd5b505af1158015612810573d5f5f3e3d5ffd5b505050505050505050565b5f83612828868585612cd9565b1495945050505050565b5f5f600283516128429190613800565b90505f816001600160401b0381111561285d5761285d6133c8565b604051908082528060200260200182016040528015612886578160200160208202803683370190505b5090505f5b82811015612980576002856128a083836136d2565b815181106128b0576128b0613673565b6020026020010151868360026128c691906136d2565b6128d19060016136bf565b815181106128e1576128e1613673565b6020026020010151604051602001612903929190918252602082015260400190565b60408051601f198184030181529082905261291d91613713565b602060405180830381855afa158015612938573d5f5f3e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061295b919061371e565b82828151811061296d5761296d613673565b602090810291909101015260010161288b565b5061298c600283613800565b91505b8115612a9f575f5b82811015612a8c576002826129ac83836136d2565b815181106129bc576129bc613673565b6020026020010151838360026129d291906136d2565b6129dd9060016136bf565b815181106129ed576129ed613673565b6020026020010151604051602001612a0f929190918252602082015260400190565b60408051601f1981840301815290829052612a2991613713565b602060405180830381855afa158015612a44573d5f5f3e3d5ffd5b5050506040513d601f19601f82011682018060405250810190612a67919061371e565b828281518110612a7957612a79613673565b6020908102919091010152600101612997565b50612a98600283613800565b915061298f565b805f81518110612ab157612ab1613673565b602002602001015192505050919050565b5f610c3682600581518110612ad957612ad9613673565b6020026020010151612dad565b5f610c3682600681518110612ad957612ad9613673565b5f816001815181106119a4576119a4613673565b5f610c3682600281518110612ad957612ad9613673565b5f612b7c826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316612e149092919063ffffffff16565b905080515f1480612b9c575080806020019051810190612b9c91906135d1565b6112525760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016112ed565b5f612c08602660016136bf565b612c139060206136d2565b612c206040840184613631565b905014612c40576040516313717da960e21b815260040160405180910390fd5b5f612c4c6004856139b2565b64ffffffffff169050612ca5612c656040850185613631565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250899250505060208601358461281b565b612cc2576040516309bde33960e01b815260040160405180910390fd5b612cd0836020013585612e22565b95945050505050565b5f83515f14158015612cf6575060208451612cf491906139db565b155b612d13576040516313717da960e21b815260040160405180910390fd5b604080516020808201909252848152905b85518111612da357612d376002856139db565b5f03612d695781515f528086015160205260208260405f60026107d05a03fa612d5e575f5ffd5b600284049350612d91565b808601515f52815160205260208260405f60026107d05a03fa612d8a575f5ffd5b6002840493505b612d9c6020826136bf565b9050612d24565b5051949350505050565b60f881901c60e882901c61ff00161760d882901c62ff0000161760c882901c63ff000000161764ff0000000060b883901c161765ff000000000060a883901c161766ff000000000000609883901c161767ff0000000000000060889290921c919091161790565b6060610d4284845f85612e4e565b5f80612e2f6004846139ee565b612e3a906040613a17565b64ffffffffff169050610d4284821b612dad565b606082471015612eaf5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b60648201526084016112ed565b5f5f866001600160a01b03168587604051612eca9190613713565b5f6040518083038185875af1925050503d805f8114612f04576040519150601f19603f3d011682016040523d82523d5f602084013e612f09565b606091505b5091509150612f1a87838387612f25565b979650505050505050565b60608315612f935782515f03612f8c576001600160a01b0385163b612f8c5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016112ed565b5081610d42565b610d428383815115612fa85781518083602001fd5b8060405162461bcd60e51b81526004016112ed9190613a37565b80356001600160401b0381168114612fd8575f5ffd5b919050565b5f60408284031215612fed575f5ffd5b50919050565b5f5f5f60608486031215613005575f5ffd5b61300e84612fc2565b925060208401356001600160401b03811115613028575f5ffd5b61303486828701612fdd565b92505060408401356001600160401b0381111561304f575f5ffd5b61305b86828701612fdd565b9150509250925092565b5f5f83601f840112613075575f5ffd5b5081356001600160401b0381111561308b575f5ffd5b6020830191508360208260051b85010111156130a5575f5ffd5b9250929050565b5f5f5f5f5f5f5f5f60a0898b0312156130c3575f5ffd5b6130cc89612fc2565b975060208901356001600160401b038111156130e6575f5ffd5b6130f28b828c01612fdd565b97505060408901356001600160401b0381111561310d575f5ffd5b6131198b828c01613065565b90975095505060608901356001600160401b03811115613137575f5ffd5b6131438b828c01613065565b90955093505060808901356001600160401b03811115613161575f5ffd5b61316d8b828c01613065565b999c989b5096995094979396929594505050565b5f60208284031215613191575f5ffd5b61319a82612fc2565b9392505050565b5f5f83601f8401126131b1575f5ffd5b5081356001600160401b038111156131c7575f5ffd5b6020830191508360208285010111156130a5575f5ffd5b5f5f602083850312156131ef575f5ffd5b82356001600160401b03811115613204575f5ffd5b613210858286016131a1565b90969095509350505050565b634e487b7160e01b5f52602160045260245ffd5b6003811061324c57634e487b7160e01b5f52602160045260245ffd5b9052565b60208101610c368284613230565b5f6020828403121561326e575f5ffd5b5035919050565b5f6080820190506001600160401b0383511682526001600160401b0360208401511660208301526001600160401b03604084015116604083015260608301516132c16060840182613230565b5092915050565b80151581146132d5575f5ffd5b50565b5f602082840312156132e8575f5ffd5b813561319a816132c8565b5f5f5f5f5f60608688031215613307575f5ffd5b85356001600160401b0381111561331c575f5ffd5b613328888289016131a1565b90965094505060208601356001600160401b03811115613346575f5ffd5b613352888289016131a1565b96999598509660400135949350505050565b6001600160a01b03811681146132d5575f5ffd5b8035612fd881613364565b5f5f60408385031215613394575f5ffd5b823561339f81613364565b946020939093013593505050565b5f602082840312156133bd575f5ffd5b813561319a81613364565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f191681016001600160401b0381118282101715613404576134046133c8565b604052919050565b5f6001600160401b03821115613424576134246133c8565b5060051b60200190565b5f82601f83011261343d575f5ffd5b813561345061344b8261340c565b6133dc565b8082825260208201915060208360051b860101925085831115613471575f5ffd5b602085015b8381101561348e578035835260209283019201613476565b5095945050505050565b5f5f5f606084860312156134aa575f5ffd5b83356001600160401b038111156134bf575f5ffd5b8401601f810186136134cf575f5ffd5b80356134dd61344b8261340c565b8082825260208201915060208360051b8501019250888311156134fe575f5ffd5b6020840193505b8284101561352957833561351881613364565b825260209384019390910190613505565b955050505060208401356001600160401b03811115613546575f5ffd5b6135528682870161342e565b92505061356160408501613378565b90509250925092565b5f5f5f6040848603121561357c575f5ffd5b83356001600160401b03811115613591575f5ffd5b61359d86828701612fdd565b93505060208401356001600160401b038111156135b8575f5ffd5b6135c486828701613065565b9497909650939450505050565b5f602082840312156135e1575f5ffd5b815161319a816132c8565b5f5f8335601e19843603018112613601575f5ffd5b8301803591506001600160401b0382111561361a575f5ffd5b6020019150600581901b36038213156130a5575f5ffd5b5f5f8335601e19843603018112613646575f5ffd5b8301803591506001600160401b0382111561365f575f5ffd5b6020019150368190038213156130a5575f5ffd5b634e487b7160e01b5f52603260045260245ffd5b5f60208284031215613697575f5ffd5b813564ffffffffff8116811461319a575f5ffd5b634e487b7160e01b5f52601160045260245ffd5b80820180821115610c3657610c366136ab565b8082028115828204841417610c3657610c366136ab565b81810381811115610c3657610c366136ab565b5f81518060208401855e5f93019283525090919050565b5f61319a82846136fc565b5f6020828403121561372e575f5ffd5b5051919050565b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b608081525f61379e60808301888a613735565b82810360208401526137b0818861375d565b905082810360408401526137c5818688613735565b915050826060830152979650505050505050565b602081525f610d42602083018486613735565b634e487b7160e01b5f52601260045260245ffd5b5f8261380e5761380e6137ec565b500490565b6001600160401b038281168282160390811115610c3657610c366136ab565b5f8235605e19833603018112613846575f5ffd5b9190910192915050565b5f62ffffff821680613864576138646136ab565b5f190192915050565b6001600160401b038181168382160190811115610c3657610c366136ab565b600781810b9083900b01677fffffffffffffff8113677fffffffffffffff1982121715610c3657610c366136ab565b80516020808301519190811015612fed575f1960209190910360031b1b16919050565b5f600182016138ef576138ef6136ab565b5060010190565b5f61390182856136fc565b6001600160801b03199390931683525050601001919050565b600782810b9082900b03677fffffffffffffff198112677fffffffffffffff82131715610c3657610c366136ab565b5f81613957576139576136ab565b505f190190565b5f8160070b677fffffffffffffff19810361397b5761397b6136ab565b5f0392915050565b8082025f8212600160ff1b8414161561399e5761399e6136ab565b8181058314821517610c3657610c366136ab565b5f64ffffffffff8316806139c8576139c86137ec565b8064ffffffffff84160491505092915050565b5f826139e9576139e96137ec565b500690565b5f64ffffffffff831680613a0457613a046137ec565b8064ffffffffff84160691505092915050565b64ffffffffff81811683821602908116908181146132c1576132c16136ab565b602081525f61319a602083018461375d56fea264697066735822122007815605a1d21d99dfb435f0a8187ba9bf7f85f2c035861388eafeb2f157218d64736f6c634300081b0033", + Bin: "0x60e060405234801561000f575f5ffd5b50604051613c7c380380613c7c83398101604081905261002e91610131565b6001600160a01b03808416608052821660a0526001600160401b03811660c05261005661005e565b505050610186565b5f54610100900460ff16156100c95760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff90811614610118575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b038116811461012e575f5ffd5b50565b5f5f5f60608486031215610143575f5ffd5b835161014e8161011a565b602085015190935061015f8161011a565b60408501519092506001600160401b038116811461017b575f5ffd5b809150509250925092565b60805160a05160c051613a7f6101fd5f395f61060401525f81816102a90152818161063f015281816106e7015281816109ab01528181610b7501528181610e4e01528181610ef50152818161112b01528181611479015281816115ad01526127bb01525f81816104c60152610f5e0152613a7f5ff3fe608060405260043610610164575f3560e01c80636fcd0e53116100cd578063c490744211610087578063dda3346c11610062578063dda3346c14610596578063ee94d67c146105b5578063f074ba62146105d4578063f2882461146105f3575f5ffd5b8063c490744214610539578063c4d66de814610558578063d06d558714610577575f5ffd5b80636fcd0e53146104545780637439841f1461048057806374cdd798146104b557806388676cad146104e85780639b4e463414610507578063b522538a1461051a575f5ffd5b80634665bcda1161011e5780634665bcda1461029857806347d28372146102cb57806352396a59146103b657806358753357146103ea57806358eaee79146104095780636c0d2d5a14610435575f5ffd5b8063039157d2146101a25780630b18ff66146101c35780632340e8d3146101ff5780633474aa16146102225780633f65cf191461025357806342ecff2a14610272575f5ffd5b3661019e576040513481527f6fdd3dbdb173299608c0aa9f368735857c8842b581f8389238bf05bd04b3bf499060200160405180910390a1005b5f5ffd5b3480156101ad575f5ffd5b506101c16101bc366004612ff3565b610626565b005b3480156101ce575f5ffd5b506033546101e2906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b34801561020a575f5ffd5b5061021460395481565b6040519081526020016101f6565b34801561022d575f5ffd5b506034546001600160401b03165b6040516001600160401b0390911681526020016101f6565b34801561025e575f5ffd5b506101c161026d3660046130ac565b610952565b34801561027d575f5ffd5b50603a5461023b90600160401b90046001600160401b031681565b3480156102a3575f5ffd5b506101e27f000000000000000000000000000000000000000000000000000000000000000081565b3480156102d6575f5ffd5b5061035b6040805160a0810182525f80825260208201819052918101829052606081018290526080810191909152506040805160a081018252603c548152603d5462ffffff811660208301526001600160401b0363010000008204811693830193909352600160581b810460070b6060830152600160981b9004909116608082015290565b6040516101f691905f60a0820190508251825262ffffff60208401511660208301526001600160401b036040840151166040830152606083015160070b60608301526001600160401b03608084015116608083015292915050565b3480156103c1575f5ffd5b5061023b6103d0366004613181565b603b6020525f90815260409020546001600160401b031681565b3480156103f5575f5ffd5b50603e546101e2906001600160a01b031681565b348015610414575f5ffd5b506104286104233660046131de565b610bda565b6040516101f69190613250565b348015610440575f5ffd5b5061021461044f366004613181565b610c3c565b34801561045f575f5ffd5b5061047361046e36600461325e565b610d4a565b6040516101f69190613275565b34801561048b575f5ffd5b5061042861049a36600461325e565b5f90815260366020526040902054600160c01b900460ff1690565b3480156104c0575f5ffd5b506101e27f000000000000000000000000000000000000000000000000000000000000000081565b3480156104f3575f5ffd5b506101c16105023660046132d8565b610df5565b6101c16105153660046132f3565b610eea565b348015610525575f5ffd5b506104736105343660046131de565b611031565b348015610544575f5ffd5b506101c1610553366004613383565b611120565b348015610563575f5ffd5b506101c16105723660046133ad565b611257565b348015610582575f5ffd5b506101c16105913660046133ad565b6113a1565b3480156105a1575f5ffd5b506101c16105b0366004613498565b611435565b3480156105c0575f5ffd5b50603a5461023b906001600160401b031681565b3480156105df575f5ffd5b506101c16105ee36600461356a565b611594565b3480156105fe575f5ffd5b5061023b7f000000000000000000000000000000000000000000000000000000000000000081565b604051635ac86ab760e01b8152600660048201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635ac86ab790602401602060405180830381865afa15801561068c573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106b091906135d1565b156106ce5760405163840a48d560e01b815260040160405180910390fd5b604051635ac86ab760e01b8152600860048201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635ac86ab790602401602060405180830381865afa158015610734573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061075891906135d1565b156107765760405163840a48d560e01b815260040160405180910390fd5b5f6107ba61078485806135ec565b808060200260200160405190810160405280939291908181526020018383602002808284375f9201919091525061199192505050565b5f818152603660209081526040808320815160808101835281546001600160401b038082168352600160401b8204811695830195909552600160801b8104909416928101929092529394509192906060830190600160c01b900460ff1660028111156108285761082861321c565b60028111156108395761083961321c565b81525050905080604001516001600160401b0316876001600160401b031611610875576040516337e07ffd60e01b815260040160405180910390fd5b60018160600151600281111561088d5761088d61321c565b146108ab5760405163d49e19a760e01b815260040160405180910390fd5b6108ee6108b886806135ec565b808060200260200160405190810160405280939291908181526020018383602002808284375f920191909152506119b392505050565b61090b5760405163161ce5ed60e31b815260040160405180910390fd5b61091d61091788610c3c565b876119db565b610940863561092c87806135ec565b61093960208a018a613631565b8651611a80565b6109495f611ba7565b50505050505050565b6033546001600160a01b03163314806109755750603e546001600160a01b031633145b6109925760405163427a777960e01b815260040160405180910390fd5b604051635ac86ab760e01b8152600260048201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635ac86ab790602401602060405180830381865afa1580156109f8573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a1c91906135d1565b15610a3a5760405163840a48d560e01b815260040160405180910390fd5b8584148015610a4857508382145b610a65576040516343714afd60e01b815260040160405180910390fd5b603a546001600160401b03600160401b9091048116908a1611610a9b576040516337e07ffd60e01b815260040160405180910390fd5b610aad610aa78a610c3c565b896119db565b5f805b87811015610b4557610b318a358a8a84818110610acf57610acf613673565b9050602002016020810190610ae49190613687565b898985818110610af657610af6613673565b9050602002810190610b089190613631565b898987818110610b1a57610b1a613673565b9050602002810190610b2c91906135ec565b611d27565b610b3b90836136bf565b9150600101610ab0565b5060335460405163a1ca780b60e01b81526001600160a01b0391821660048201525f6024820152604481018390527f00000000000000000000000000000000000000000000000000000000000000009091169063a1ca780b906064015f604051808303815f87803b158015610bb8575f5ffd5b505af1158015610bca573d5f5f3e3d5ffd5b5050505050505050505050505050565b5f5f610c1a84848080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152506121dc92505050565b5f90815260366020526040902054600160c01b900460ff169150505b92915050565b5f610c4a611fff600c6136d2565b610c5d6001600160401b038416426136e9565b10610c7b57604051637944e66d60e11b815260040160405180910390fd5b604080516001600160401b03841660208201525f918291720f3df6d732807ef1319fb7b8bb8522d0beac02910160408051601f1981840301815290829052610cc291613713565b5f60405180830381855afa9150503d805f8114610cfa576040519150601f19603f3d011682016040523d82523d5f602084013e610cff565b606091505b5091509150818015610d1157505f8151115b610d2e5760405163558ad0a360e01b815260040160405180910390fd5b80806020019051810190610d42919061371e565b949350505050565b610d71604080516080810182525f8082526020820181905291810182905290606082015290565b5f82815260366020908152604091829020825160808101845281546001600160401b038082168352600160401b8204811694830194909452600160801b810490931693810193909352906060830190600160c01b900460ff166002811115610ddb57610ddb61321c565b6002811115610dec57610dec61321c565b90525092915050565b6033546001600160a01b0316331480610e185750603e546001600160a01b031633145b610e355760405163427a777960e01b815260040160405180910390fd5b604051635ac86ab760e01b8152600660048201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635ac86ab790602401602060405180830381865afa158015610e9b573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ebf91906135d1565b15610edd5760405163840a48d560e01b815260040160405180910390fd5b610ee682611ba7565b5050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610f3357604051633213a66160e21b815260040160405180910390fd5b346801bc16d674ec80000014610f5c5760405163049696b360e31b815260040160405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663228951186801bc16d674ec8000008787610f9f61226d565b8888886040518863ffffffff1660e01b8152600401610fc39695949392919061378b565b5f604051808303818588803b158015610fda575f5ffd5b505af1158015610fec573d5f5f3e3d5ffd5b50505050507f606865b7934a25d4aed43f6cdb426403353fa4b3009c4d228407474581b01e2385856040516110229291906137d9565b60405180910390a15050505050565b611058604080516080810182525f8082526020820181905291810182905290606082015290565b60365f61109985858080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152506121dc92505050565b815260208082019290925260409081015f20815160808101835281546001600160401b038082168352600160401b8204811695830195909552600160801b81049094169281019290925290916060830190600160c01b900460ff1660028111156111055761110561321c565b60028111156111165761111661321c565b9052509392505050565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461116957604051633213a66160e21b815260040160405180910390fd5b5f611178633b9aca0083613800565b9050611191633b9aca006001600160401b0383166136d2565b6034549092506001600160401b0390811690821611156111c4576040516302c6f54760e21b815260040160405180910390fd5b603480548291905f906111e19084906001600160401b0316613813565b92506101000a8154816001600160401b0302191690836001600160401b03160217905550826001600160a01b03167f8947fd2ce07ef9cc302c4e8f0461015615d91ce851564839e91cc804c2f49d8e8360405161124091815260200190565b60405180910390a261125283836122b1565b505050565b5f54610100900460ff161580801561127557505f54600160ff909116105b8061128e5750303b15801561128e57505f5460ff166001145b6112f65760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b5f805460ff191660011790558015611317575f805461ff0019166101001790555b6001600160a01b03821661133e576040516339b190bb60e11b815260040160405180910390fd5b603380546001600160a01b0319166001600160a01b0384161790558015610ee6575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15050565b6033546001600160a01b031633146113cc5760405163719f370360e11b815260040160405180910390fd5b603e54604080516001600160a01b03928316815291831660208301527ffb8129080a19d34dceac04ba253fc50304dc86c729bd63cdca4a969ad19a5eac910160405180910390a1603e80546001600160a01b0319166001600160a01b0392909216919091179055565b6033546001600160a01b031633146114605760405163719f370360e11b815260040160405180910390fd5b604051635ac86ab760e01b8152600560048201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635ac86ab790602401602060405180830381865afa1580156114c6573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114ea91906135d1565b156115085760405163840a48d560e01b815260040160405180910390fd5b825184511461152a576040516343714afd60e01b815260040160405180910390fd5b5f5b845181101561158d576115858385838151811061154b5761154b613673565b602002602001015187848151811061156557611565613673565b60200260200101516001600160a01b03166123c69092919063ffffffff16565b60010161152c565b5050505050565b604051635ac86ab760e01b8152600760048201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635ac86ab790602401602060405180830381865afa1580156115fa573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061161e91906135d1565b1561163c5760405163840a48d560e01b815260040160405180910390fd5b603a54600160401b90046001600160401b03165f81900361167057604051631a544f4960e01b815260040160405180910390fd5b6040805160a081018252603c54808252603d5462ffffff811660208401526001600160401b0363010000008204811694840194909452600160581b810460070b6060840152600160981b90049092166080820152906116cf9087612418565b5f805b8581101561193857368787838181106116ed576116ed613673565b90506020028101906116ff9190613832565b80355f908152603660209081526040808320815160808101835281546001600160401b038082168352600160401b8204811695830195909552600160801b8104909416928101929092529394509192906060830190600160c01b900460ff16600281111561176f5761176f61321c565b60028111156117805761178061321c565b905250905060018160600151600281111561179d5761179d61321c565b146117a9575050611930565b856001600160401b031681604001516001600160401b0316106117cd575050611930565b5f80806117dd848a8f35886124c9565b60208b01805193965091945092506117f482613850565b62ffffff1690525060808801805184919061181090839061386d565b6001600160401b031690525060608801805183919061183090839061388c565b60070b905250611840818861386d565b85355f908152603660209081526040918290208751815492890151938901516001600160401b03908116600160801b0267ffffffffffffffff60801b19958216600160401b026001600160801b0319909516919092161792909217928316821781556060880151939a50879390929091839160ff60c01b1990911668ffffffffffffffffff60801b1990911617600160c01b8360028111156118e4576118e461321c565b021790555050845160405164ffffffffff90911691506001600160401b038b16907fa91c59033c3423e18b54d0acecebb4972f9ea95aedf5f4cae3b677b02eaf3a3f905f90a350505050505b6001016116d2565b506001600160401b038084165f908152603b60205260408120805484939192916119649185911661386d565b92506101000a8154816001600160401b0302191690836001600160401b03160217905550610949826125ec565b5f815f815181106119a4576119a4613673565b60200260200101519050919050565b5f816003815181106119c7576119c7613673565b60200260200101515f5f1b14159050919050565b6119e7600360206136d2565b6119f46020830183613631565b905014611a14576040516313717da960e21b815260040160405180910390fd5b611a63611a246020830183613631565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152508692505084359050600361281b565b610ee6576040516309bde33960e01b815260040160405180910390fd5b60088414611aa15760405163200591bd60e01b815260040160405180910390fd5b6005611aaf602860016136bf565b611ab991906136bf565b611ac49060206136d2565b8214611ae3576040516313717da960e21b815260040160405180910390fd5b5f611b1f8686808060200260200160405190810160405280939291908181526020018383602002808284375f9201919091525061283292505050565b90505f64ffffffffff8316611b36602860016136bf565b600b901b179050611b8085858080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152508c925086915085905061281b565b611b9d576040516309bde33960e01b815260040160405180910390fd5b5050505050505050565b603a54600160401b90046001600160401b031615611bd75760405162be9bc360e81b815260040160405180910390fd5b603a546001600160401b03428116911603611c05576040516367db5b8b60e01b815260040160405180910390fd5b6034545f906001600160401b0316611c21633b9aca0047613800565b611c2b9190613813565b9050818015611c4157506001600160401b038116155b15611c5f576040516332dea95960e21b815260040160405180910390fd5b5f6040518060a00160405280611c7442610c3c565b815260395462ffffff1660208201526001600160401b0380851660408301525f60608301819052608090920191909152603a805442909216600160401b026fffffffffffffffff0000000000000000199092169190911790559050611cd8816125ec565b805160208083015160405162ffffff90911681526001600160401b034216917f575796133bbed337e5b39aa49a30dc2556a91e0c6c2af4b7b886ae77ebef1076910160405180910390a3505050565b5f5f611d648484808060200260200160405190810160405280939291908181526020018383602002808284375f9201919091525061199192505050565b5f818152603660209081526040808320815160808101835281546001600160401b038082168352600160401b8204811695830195909552600160801b8104909416928101929092529394509192906060830190600160c01b900460ff166002811115611dd257611dd261321c565b6002811115611de357611de361321c565b90525090505f81606001516002811115611dff57611dff61321c565b14611e1d576040516335e09e9d60e01b815260040160405180910390fd5b6001600160401b038016611e628686808060200260200160405190810160405280939291908181526020018383602002808284375f92019190915250612ac292505050565b6001600160401b031603611e8957604051631958236d60e21b815260040160405180910390fd5b6001600160401b038016611ece8686808060200260200160405190810160405280939291908181526020018383602002808284375f92019190915250612ae692505050565b6001600160401b031614611ef557604051632eade63760e01b815260040160405180910390fd5b611efd61226d565b611f06906138bb565b611f418686808060200260200160405190810160405280939291908181526020018383602002808284375f92019190915250612afd92505050565b14611f5f57604051633772dd5360e11b815260040160405180910390fd5b5f611f9b8686808060200260200160405190810160405280939291908181526020018383602002808284375f92019190915250612b1192505050565b9050611fab8a87878b8b8e611a80565b60398054905f611fba836138de565b9091555050603a545f90600160401b90046001600160401b031615611ff157603a54600160401b90046001600160401b0316611ffe565b603a546001600160401b03165b6040805160808101825264ffffffffff8d1681526001600160401b03858116602083015283169181019190915290915060608101600190525f858152603660209081526040918290208351815492850151938501516001600160401b03908116600160801b0267ffffffffffffffff60801b19958216600160401b026001600160801b031990951691909216179290921792831682178155606084015190929091839160ff60c01b1990911668ffffffffffffffffff60801b1990911617600160c01b8360028111156120d3576120d361321c565b021790555050603d80548492506013906120fe908490600160981b90046001600160401b031661386d565b92506101000a8154816001600160401b0302191690836001600160401b031602179055507f2d0800bbc377ea54a08c5db6a87aafff5e3e9c8fead0eda110e40e0c104414498a60405161215e919064ffffffffff91909116815260200190565b60405180910390a16040805164ffffffffff8c1681526001600160401b03838116602083015284168183015290517f0e5fac175b83177cc047381e030d8fb3b42b37bd1c025e22c280facad62c32df9181900360600190a16121cd633b9aca006001600160401b0384166136d2565b9b9a5050505050505050505050565b5f81516030146121ff57604051634f88323960e11b815260040160405180910390fd5b6040516002906122159084905f906020016138f6565b60408051601f198184030181529082905261222f91613713565b602060405180830381855afa15801561224a573d5f5f3e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610c36919061371e565b60408051600160f81b60208201525f602182015230606090811b6bffffffffffffffffffffffff1916602c8301529101604051602081830303815290604052905090565b804710156123015760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e636500000060448201526064016112ed565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f811461234a576040519150601f19603f3d011682016040523d82523d5f602084013e61234f565b606091505b50509050806112525760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d6179206861766520726576657274656400000000000060648201526084016112ed565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052611252908490612b28565b612424600560036136bf565b61242f9060206136d2565b61243c6020830183613631565b90501461245c576040516313717da960e21b815260040160405180910390fd5b606c6124ac61246e6020840184613631565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525087925050853590508461281b565b611252576040516309bde33960e01b815260040160405180910390fd5b83516020850151905f908190816124e1878388612bfb565b9050846001600160401b0316816001600160401b03161461255b57612506858261391a565b6040805164ffffffffff851681526001600160401b038b8116602083015284168183015290519195507f0e5fac175b83177cc047381e030d8fb3b42b37bd1c025e22c280facad62c32df919081900360600190a15b6001600160401b0380821660208b0181905290891660408b01525f036125e05760398054905f61258a83613949565b9091555050600260608a015261259f8461395e565b92508164ffffffffff16886001600160401b03167f2a02361ffa66cf2c2da4682c2355a6adcaa9f6c227b6e6563e68480f9587626a60405160405180910390a35b50509450945094915050565b602081015162ffffff161561268c578051603c556020810151603d80546040840151606085015160809095015162ffffff9094166affffffffffffffffffffff199092169190911763010000006001600160401b0392831602176fffffffffffffffffffffffffffffffff60581b1916600160581b9482169490940267ffffffffffffffff60981b191693909317600160981b9390921692909202179055565b60808101516034545f916126a8916001600160401b031661386d565b90505f826060015183604001516126bf919061388c565b60408401516034805492935090915f906126e39084906001600160401b031661386d565b82546101009290920a6001600160401b03818102199093169183160217909155603a8054600160401b810483166001600160801b03199091161790555f915061273390633b9aca009085166136d2565b90505f612748633b9aca00600785900b613983565b603a546040518281529192506001600160401b0316907f525408c201bc1576eb44116f6478f1c2a54775b19a043bcfdc708364f74f8e449060200160405180910390a260335460405163a1ca780b60e01b81526001600160a01b03918216600482015260248101849052604481018390527f00000000000000000000000000000000000000000000000000000000000000009091169063a1ca780b906064015f604051808303815f87803b1580156127fe575f5ffd5b505af1158015612810573d5f5f3e3d5ffd5b505050505050505050565b5f83612828868585612cd9565b1495945050505050565b5f5f600283516128429190613800565b90505f816001600160401b0381111561285d5761285d6133c8565b604051908082528060200260200182016040528015612886578160200160208202803683370190505b5090505f5b82811015612980576002856128a083836136d2565b815181106128b0576128b0613673565b6020026020010151868360026128c691906136d2565b6128d19060016136bf565b815181106128e1576128e1613673565b6020026020010151604051602001612903929190918252602082015260400190565b60408051601f198184030181529082905261291d91613713565b602060405180830381855afa158015612938573d5f5f3e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061295b919061371e565b82828151811061296d5761296d613673565b602090810291909101015260010161288b565b5061298c600283613800565b91505b8115612a9f575f5b82811015612a8c576002826129ac83836136d2565b815181106129bc576129bc613673565b6020026020010151838360026129d291906136d2565b6129dd9060016136bf565b815181106129ed576129ed613673565b6020026020010151604051602001612a0f929190918252602082015260400190565b60408051601f1981840301815290829052612a2991613713565b602060405180830381855afa158015612a44573d5f5f3e3d5ffd5b5050506040513d601f19601f82011682018060405250810190612a67919061371e565b828281518110612a7957612a79613673565b6020908102919091010152600101612997565b50612a98600283613800565b915061298f565b805f81518110612ab157612ab1613673565b602002602001015192505050919050565b5f610c3682600581518110612ad957612ad9613673565b6020026020010151612dad565b5f610c3682600681518110612ad957612ad9613673565b5f816001815181106119a4576119a4613673565b5f610c3682600281518110612ad957612ad9613673565b5f612b7c826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316612e149092919063ffffffff16565b905080515f1480612b9c575080806020019051810190612b9c91906135d1565b6112525760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016112ed565b5f612c08602660016136bf565b612c139060206136d2565b612c206040840184613631565b905014612c40576040516313717da960e21b815260040160405180910390fd5b5f612c4c6004856139b2565b64ffffffffff169050612ca5612c656040850185613631565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250899250505060208601358461281b565b612cc2576040516309bde33960e01b815260040160405180910390fd5b612cd0836020013585612e22565b95945050505050565b5f83515f14158015612cf6575060208451612cf491906139db565b155b612d13576040516313717da960e21b815260040160405180910390fd5b604080516020808201909252848152905b85518111612da357612d376002856139db565b5f03612d695781515f528086015160205260208260405f60026107d05a03fa612d5e575f5ffd5b600284049350612d91565b808601515f52815160205260208260405f60026107d05a03fa612d8a575f5ffd5b6002840493505b612d9c6020826136bf565b9050612d24565b5051949350505050565b60f881901c60e882901c61ff00161760d882901c62ff0000161760c882901c63ff000000161764ff0000000060b883901c161765ff000000000060a883901c161766ff000000000000609883901c161767ff0000000000000060889290921c919091161790565b6060610d4284845f85612e4e565b5f80612e2f6004846139ee565b612e3a906040613a17565b64ffffffffff169050610d4284821b612dad565b606082471015612eaf5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b60648201526084016112ed565b5f5f866001600160a01b03168587604051612eca9190613713565b5f6040518083038185875af1925050503d805f8114612f04576040519150601f19603f3d011682016040523d82523d5f602084013e612f09565b606091505b5091509150612f1a87838387612f25565b979650505050505050565b60608315612f935782515f03612f8c576001600160a01b0385163b612f8c5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016112ed565b5081610d42565b610d428383815115612fa85781518083602001fd5b8060405162461bcd60e51b81526004016112ed9190613a37565b80356001600160401b0381168114612fd8575f5ffd5b919050565b5f60408284031215612fed575f5ffd5b50919050565b5f5f5f60608486031215613005575f5ffd5b61300e84612fc2565b925060208401356001600160401b03811115613028575f5ffd5b61303486828701612fdd565b92505060408401356001600160401b0381111561304f575f5ffd5b61305b86828701612fdd565b9150509250925092565b5f5f83601f840112613075575f5ffd5b5081356001600160401b0381111561308b575f5ffd5b6020830191508360208260051b85010111156130a5575f5ffd5b9250929050565b5f5f5f5f5f5f5f5f60a0898b0312156130c3575f5ffd5b6130cc89612fc2565b975060208901356001600160401b038111156130e6575f5ffd5b6130f28b828c01612fdd565b97505060408901356001600160401b0381111561310d575f5ffd5b6131198b828c01613065565b90975095505060608901356001600160401b03811115613137575f5ffd5b6131438b828c01613065565b90955093505060808901356001600160401b03811115613161575f5ffd5b61316d8b828c01613065565b999c989b5096995094979396929594505050565b5f60208284031215613191575f5ffd5b61319a82612fc2565b9392505050565b5f5f83601f8401126131b1575f5ffd5b5081356001600160401b038111156131c7575f5ffd5b6020830191508360208285010111156130a5575f5ffd5b5f5f602083850312156131ef575f5ffd5b82356001600160401b03811115613204575f5ffd5b613210858286016131a1565b90969095509350505050565b634e487b7160e01b5f52602160045260245ffd5b6003811061324c57634e487b7160e01b5f52602160045260245ffd5b9052565b60208101610c368284613230565b5f6020828403121561326e575f5ffd5b5035919050565b5f6080820190506001600160401b0383511682526001600160401b0360208401511660208301526001600160401b03604084015116604083015260608301516132c16060840182613230565b5092915050565b80151581146132d5575f5ffd5b50565b5f602082840312156132e8575f5ffd5b813561319a816132c8565b5f5f5f5f5f60608688031215613307575f5ffd5b85356001600160401b0381111561331c575f5ffd5b613328888289016131a1565b90965094505060208601356001600160401b03811115613346575f5ffd5b613352888289016131a1565b96999598509660400135949350505050565b6001600160a01b03811681146132d5575f5ffd5b8035612fd881613364565b5f5f60408385031215613394575f5ffd5b823561339f81613364565b946020939093013593505050565b5f602082840312156133bd575f5ffd5b813561319a81613364565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f191681016001600160401b0381118282101715613404576134046133c8565b604052919050565b5f6001600160401b03821115613424576134246133c8565b5060051b60200190565b5f82601f83011261343d575f5ffd5b813561345061344b8261340c565b6133dc565b8082825260208201915060208360051b860101925085831115613471575f5ffd5b602085015b8381101561348e578035835260209283019201613476565b5095945050505050565b5f5f5f606084860312156134aa575f5ffd5b83356001600160401b038111156134bf575f5ffd5b8401601f810186136134cf575f5ffd5b80356134dd61344b8261340c565b8082825260208201915060208360051b8501019250888311156134fe575f5ffd5b6020840193505b8284101561352957833561351881613364565b825260209384019390910190613505565b955050505060208401356001600160401b03811115613546575f5ffd5b6135528682870161342e565b92505061356160408501613378565b90509250925092565b5f5f5f6040848603121561357c575f5ffd5b83356001600160401b03811115613591575f5ffd5b61359d86828701612fdd565b93505060208401356001600160401b038111156135b8575f5ffd5b6135c486828701613065565b9497909650939450505050565b5f602082840312156135e1575f5ffd5b815161319a816132c8565b5f5f8335601e19843603018112613601575f5ffd5b8301803591506001600160401b0382111561361a575f5ffd5b6020019150600581901b36038213156130a5575f5ffd5b5f5f8335601e19843603018112613646575f5ffd5b8301803591506001600160401b0382111561365f575f5ffd5b6020019150368190038213156130a5575f5ffd5b634e487b7160e01b5f52603260045260245ffd5b5f60208284031215613697575f5ffd5b813564ffffffffff8116811461319a575f5ffd5b634e487b7160e01b5f52601160045260245ffd5b80820180821115610c3657610c366136ab565b8082028115828204841417610c3657610c366136ab565b81810381811115610c3657610c366136ab565b5f81518060208401855e5f93019283525090919050565b5f61319a82846136fc565b5f6020828403121561372e575f5ffd5b5051919050565b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b608081525f61379e60808301888a613735565b82810360208401526137b0818861375d565b905082810360408401526137c5818688613735565b915050826060830152979650505050505050565b602081525f610d42602083018486613735565b634e487b7160e01b5f52601260045260245ffd5b5f8261380e5761380e6137ec565b500490565b6001600160401b038281168282160390811115610c3657610c366136ab565b5f8235605e19833603018112613846575f5ffd5b9190910192915050565b5f62ffffff821680613864576138646136ab565b5f190192915050565b6001600160401b038181168382160190811115610c3657610c366136ab565b600781810b9083900b01677fffffffffffffff8113677fffffffffffffff1982121715610c3657610c366136ab565b80516020808301519190811015612fed575f1960209190910360031b1b16919050565b5f600182016138ef576138ef6136ab565b5060010190565b5f61390182856136fc565b6001600160801b03199390931683525050601001919050565b600782810b9082900b03677fffffffffffffff198112677fffffffffffffff82131715610c3657610c366136ab565b5f81613957576139576136ab565b505f190190565b5f8160070b677fffffffffffffff19810361397b5761397b6136ab565b5f0392915050565b8082025f8212600160ff1b8414161561399e5761399e6136ab565b8181058314821517610c3657610c366136ab565b5f64ffffffffff8316806139c8576139c86137ec565b8064ffffffffff84160491505092915050565b5f826139e9576139e96137ec565b500690565b5f64ffffffffff831680613a0457613a046137ec565b8064ffffffffff84160691505092915050565b64ffffffffff81811683821602908116908181146132c1576132c16136ab565b602081525f61319a602083018461375d56fea26469706673582212208c7e9e7731d6c30987b3a93a2e5abd65e7e50f80eb07d3ef12b55b4d0eaed21b64736f6c634300081b0033", } // 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 5647956988..828e78392e 100644 --- a/pkg/bindings/EigenPodManager/binding.go +++ b/pkg/bindings/EigenPodManager/binding.go @@ -32,7 +32,7 @@ var ( // EigenPodManagerMetaData contains all meta data concerning the EigenPodManager contract. var EigenPodManagerMetaData = &bind.MetaData{ ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"_ethPOS\",\"type\":\"address\",\"internalType\":\"contractIETHPOSDeposit\"},{\"name\":\"_eigenPodBeacon\",\"type\":\"address\",\"internalType\":\"contractIBeacon\"},{\"name\":\"_delegationManager\",\"type\":\"address\",\"internalType\":\"contractIDelegationManager\"},{\"name\":\"_pauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"addShares\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"shares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"beaconChainETHStrategy\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"beaconChainSlashingFactor\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"burnableETHShares\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"createPod\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"delegationManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIDelegationManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"eigenPodBeacon\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIBeacon\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"ethPOS\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIETHPOSDeposit\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getPod\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIEigenPod\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"hasPod\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"increaseBurnableShares\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"addedSharesToBurn\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"initialOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_initPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"numPods\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"ownerToPod\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIEigenPod\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"pauseAll\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[{\"name\":\"index\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pauserRegistry\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"podOwnerDepositShares\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"shares\",\"type\":\"int256\",\"internalType\":\"int256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"recordBeaconChainETHBalanceUpdate\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"prevRestakedBalanceWei\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"balanceDeltaWei\",\"type\":\"int256\",\"internalType\":\"int256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"removeDepositShares\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"depositSharesToRemove\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"stake\",\"inputs\":[{\"name\":\"pubkey\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"depositDataRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"stakerDepositShares\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"depositShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"withdrawSharesAsTokens\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"shares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"BeaconChainETHDeposited\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BeaconChainETHWithdrawalCompleted\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"shares\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"nonce\",\"type\":\"uint96\",\"indexed\":false,\"internalType\":\"uint96\"},{\"name\":\"delegatedAddress\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"withdrawer\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"withdrawalRoot\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BeaconChainSlashingFactorDecreased\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"prevBeaconChainSlashingFactor\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"newBeaconChainSlashingFactor\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BurnableETHSharesIncreased\",\"inputs\":[{\"name\":\"shares\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"NewTotalShares\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newTotalShares\",\"type\":\"int256\",\"indexed\":false,\"internalType\":\"int256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"PodDeployed\",\"inputs\":[{\"name\":\"eigenPod\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"podOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"PodSharesUpdated\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"sharesDelta\",\"type\":\"int256\",\"indexed\":false,\"internalType\":\"int256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"CurrentlyPaused\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"EigenPodAlreadyExists\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InputAddressZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidNewPausedStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidStrategy\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"LegacyWithdrawalsNotCompleted\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyDelegationManager\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyEigenPod\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyPauser\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyUnpauser\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SharesNegative\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SharesNotMultipleOfGwei\",\"inputs\":[]}]", - Bin: "0x610100604052348015610010575f5ffd5b50604051612a80380380612a8083398101604081905261002f9161015c565b838383836001600160a01b03811661005a576040516339b190bb60e11b815260040160405180910390fd5b6001600160a01b0390811660805292831660a05290821660c0521660e052610080610089565b505050506101b8565b5f54610100900460ff16156100f45760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff90811614610143575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b0381168114610159575f5ffd5b50565b5f5f5f5f6080858703121561016f575f5ffd5b845161017a81610145565b602086015190945061018b81610145565b604086015190935061019c81610145565b60608601519092506101ad81610145565b939692955090935050565b60805160a05160c05160e0516128486102385f395f8181610530015281816106dd0152818161092501528181610a8101528181610df801528181610ea5015261116c01525f81816101f001528181610f6b015261167001525f61033701525f818161037e01528181610612015281816109cb015261127201526128485ff3fe6080604052600436106101ba575f3560e01c80639b4e4634116100f2578063d48e889411610092578063f5d4fed311610062578063f5d4fed314610571578063f6848d2414610586578063fabc1cbc146105bf578063fe243a17146105de575f5ffd5b8063d48e8894146104d5578063debe1eab14610500578063ea4d3c9b1461051f578063f2fde38b14610552575f5ffd5b8063a38406a3116100cd578063a38406a31461044a578063a3d75e0914610469578063a6a509be146104a1578063cd6dc687146104b6575f5ffd5b80639b4e4634146103e45780639ba06275146103f7578063a1ca780b1461042b575f5ffd5b8063715018a61161015d57806384d810621161013857806384d8106214610359578063886f11951461036d5780638da5cb5b146103a05780639104c319146103bd575f5ffd5b8063715018a6146102f3578063724af4231461030757806374cdd79814610326575f5ffd5b806350ff72251161019857806350ff72251461024e578063595c6a67146102825780635ac86ab7146102965780635c975abb146102d5575f5ffd5b8063136439dd146101be578063292b7b2b146101df5780632eae418c1461022f575b5f5ffd5b3480156101c9575f5ffd5b506101dd6101d8366004611af4565b6105fd565b005b3480156101ea575f5ffd5b506102127f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020015b60405180910390f35b34801561023a575f5ffd5b506101dd610249366004611b1f565b6106d2565b348015610259575f5ffd5b5061026d610268366004611b6d565b610918565b60408051928352602083019190915201610226565b34801561028d575f5ffd5b506101dd6109b6565b3480156102a1575f5ffd5b506102c56102b0366004611bab565b606654600160ff9092169190911b9081161490565b6040519015158152602001610226565b3480156102e0575f5ffd5b506066545b604051908152602001610226565b3480156102fe575f5ffd5b506101dd610a65565b348015610312575f5ffd5b506101dd610321366004611b6d565b610a76565b348015610331575f5ffd5b506102127f000000000000000000000000000000000000000000000000000000000000000081565b348015610364575f5ffd5b50610212610b9c565b348015610378575f5ffd5b506102127f000000000000000000000000000000000000000000000000000000000000000081565b3480156103ab575f5ffd5b506033546001600160a01b0316610212565b3480156103c8575f5ffd5b5061021273beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac081565b6101dd6103f2366004611c09565b610c0c565b348015610402575f5ffd5b50610212610411366004611c7c565b60986020525f90815260409020546001600160a01b031681565b348015610436575f5ffd5b506101dd610445366004611c97565b610cc9565b348015610455575f5ffd5b50610212610464366004611c7c565b610f11565b348015610474575f5ffd5b50610488610483366004611c7c565b610fe2565b60405167ffffffffffffffff9091168152602001610226565b3480156104ac575f5ffd5b506102e560995481565b3480156104c1575f5ffd5b506101dd6104d0366004611cc9565b611045565b3480156104e0575f5ffd5b506102e56104ef366004611c7c565b609b6020525f908152604090205481565b34801561050b575f5ffd5b506101dd61051a366004611cc9565b611161565b34801561052a575f5ffd5b506102127f000000000000000000000000000000000000000000000000000000000000000081565b34801561055d575f5ffd5b506101dd61056c366004611c7c565b6111f7565b34801561057c575f5ffd5b506102e5609e5481565b348015610591575f5ffd5b506102c56105a0366004611c7c565b6001600160a01b039081165f9081526098602052604090205416151590565b3480156105ca575f5ffd5b506101dd6105d9366004611af4565b611270565b3480156105e9575f5ffd5b506102e56105f8366004611cf3565b611386565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa15801561065f573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106839190611d2a565b6106a057604051631d77d47760e21b815260040160405180910390fd5b60665481811681146106c55760405163c61dca5d60e01b815260040160405180910390fd5b6106ce82611406565b5050565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461071b5760405163f739589b60e01b815260040160405180910390fd5b6001600160a01b03831673beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac01461075857604051632711b74d60e11b815260040160405180910390fd5b6001600160a01b03841661077f576040516339b190bb60e11b815260040160405180910390fd5b5f811361079f5760405163ef147de160e01b815260040160405180910390fd5b6001600160a01b0384165f908152609b6020526040812054908290821215610899575f6107cb83611d5d565b90505f818511156107e95750806107e28186611d77565b92506107ef565b505f9150835b5f6107fa8286611d8a565b6001600160a01b038a165f818152609b60205260409081902083905551919250907f4e2b791dedccd9fb30141b088cabf5c14a8912b52f59375c95c010700b8c61939061084a9085815260200190565b60405180910390a2886001600160a01b03167fd4def76d6d2bed6f14d5cd9af73cc2913d618d00edde42432e81c09bfe0770988260405161088d91815260200190565b60405180910390a25050505b8015610910576001600160a01b038681165f81815260986020526040908190205490516362483a2160e11b81526004810192909252602482018490529091169063c4907442906044015f604051808303815f87803b1580156108f9575f5ffd5b505af115801561090b573d5f5f3e3d5ffd5b505050505b505050505050565b5f80336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146109635760405163f739589b60e01b815260040160405180910390fd5b6001600160a01b03841673beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac0146109a057604051632711b74d60e11b815260040160405180910390fd5b6109aa8584611443565b91509150935093915050565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa158015610a18573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a3c9190611d2a565b610a5957604051631d77d47760e21b815260040160405180910390fd5b610a635f19611406565b565b610a6d611580565b610a635f6115da565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610abf5760405163f739589b60e01b815260040160405180910390fd5b6001600160a01b03821673beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac014610afc57604051632711b74d60e11b815260040160405180910390fd5b6001600160a01b0383165f908152609b6020526040812054610b1f908390611db1565b90505f811215610b425760405163ef147de160e01b815260040160405180910390fd5b6001600160a01b0384165f818152609b602052604090819020839055517fd4def76d6d2bed6f14d5cd9af73cc2913d618d00edde42432e81c09bfe07709890610b8e9084815260200190565b60405180910390a250505050565b6066545f908190600190811603610bc65760405163840a48d560e01b815260040160405180910390fd5b335f908152609860205260409020546001600160a01b031615610bfc5760405163031a852160e21b815260040160405180910390fd5b5f610c0561162b565b9250505090565b6066545f90600190811603610c345760405163840a48d560e01b815260040160405180910390fd5b335f908152609860205260409020546001600160a01b031680610c5c57610c5961162b565b90505b6040516326d3918d60e21b81526001600160a01b03821690639b4e4634903490610c92908b908b908b908b908b90600401611dff565b5f604051808303818588803b158015610ca9575f5ffd5b505af1158015610cbb573d5f5f3e3d5ffd5b505050505050505050505050565b6001600160a01b038084165f908152609860205260409020548491163314610d04576040516312e16d7160e11b815260040160405180910390fd5b610d0c611786565b6001600160a01b038416610d33576040516339b190bb60e11b815260040160405180910390fd5b610d41633b9aca0083611e4c565b15610d5f576040516347d072bb60e11b815260040160405180910390fd5b6001600160a01b0384165f908152609b602052604081205490811215610d9857604051634b692bcf60e01b815260040160405180910390fd5b5f8312610e58575f5f610dab8786611443565b604051631e328e7960e11b81526001600160a01b038a8116600483015273beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac0602483015260448201849052606482018390529294509092507f000000000000000000000000000000000000000000000000000000000000000090911690633c651cf2906084015f604051808303815f87803b158015610e3b575f5ffd5b505af1158015610e4d573d5f5f3e3d5ffd5b505050505050610f00565b5f610e6c8686610e6787611d5d565b6117df565b60405163305068e760e11b81526001600160a01b0388811660048301526024820185905267ffffffffffffffff831660448301529192507f0000000000000000000000000000000000000000000000000000000000000000909116906360a0d1ce906064015f604051808303815f87803b158015610ee8575f5ffd5b505af1158015610efa573d5f5f3e3d5ffd5b50505050505b50610f0b600160c955565b50505050565b6001600160a01b038082165f9081526098602052604081205490911680610fdc57610fd9836001600160a01b03165f1b60405180610940016040528061090e8152602001611f0561090e9139604080516001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000166020820152808201919091525f606082015260800160408051601f1981840301815290829052610fbe9291602001611e82565b604051602081830303815290604052805190602001206118d8565b90505b92915050565b6001600160a01b0381165f908152609d6020908152604080832081518083019092525460ff8116151580835261010090910467ffffffffffffffff16928201929092529061103857670de0b6b3a764000061103e565b80602001515b9392505050565b5f54610100900460ff161580801561106357505f54600160ff909116105b8061107c5750303b15801561107c57505f5460ff166001145b6110e45760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b5f805460ff191660011790558015611105575f805461ff0019166101001790555b61110e836115da565b61111782611406565b801561115c575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146111aa5760405163f739589b60e01b815260040160405180910390fd5b80609e5f8282546111bb9190611e9e565b90915550506040518181527f1ed04b7fd262c0d9e50fa02957f32a81a151f03baaa367faeedc7521b001c4a49060200160405180910390a15050565b6111ff611580565b6001600160a01b0381166112645760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016110db565b61126d816115da565b50565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156112cc573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906112f09190611eb1565b6001600160a01b0316336001600160a01b0316146113215760405163794821ff60e01b815260040160405180910390fd5b606654801982198116146113485760405163c61dca5d60e01b815260040160405180910390fd5b606682905560405182815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c9060200160405180910390a25050565b5f6001600160a01b03821673beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac0146113c457604051632711b74d60e11b815260040160405180910390fd5b6001600160a01b0383165f908152609b6020526040812054126113fe576001600160a01b0383165f908152609b6020526040902054610fd9565b505f92915050565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a250565b5f806001600160a01b03841661146c576040516339b190bb60e11b815260040160405180910390fd5b5f83121561148d5760405163ef147de160e01b815260040160405180910390fd5b6001600160a01b0384165f908152609b602052604081205484916114b18383611d8a565b6001600160a01b0388165f818152609b60205260409081902083905551919250907f4e2b791dedccd9fb30141b088cabf5c14a8912b52f59375c95c010700b8c6193906115019086815260200190565b60405180910390a2866001600160a01b03167fd4def76d6d2bed6f14d5cd9af73cc2913d618d00edde42432e81c09bfe0770988260405161154491815260200190565b60405180910390a25f8113611561575f5f94509450505050611579565b5f821261156e5781611570565b5f5b86945094505050505b9250929050565b6033546001600160a01b03163314610a635760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016110db565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b5f60995f815461163a90611ecc565b9091555060408051610940810190915261090e8082525f916116d79183913391611f056020830139604080516001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000166020820152808201919091525f606082015260800160408051601f19818403018152908290526116c39291602001611e82565b6040516020818303038152906040526118e4565b60405163189acdbd60e31b81523360048201529091506001600160a01b0382169063c4d66de8906024015f604051808303815f87803b158015611718575f5ffd5b505af115801561172a573d5f5f3e3d5ffd5b5050335f8181526098602052604080822080546001600160a01b0319166001600160a01b038816908117909155905192945092507f21c99d0db02213c32fff5b05cf0a718ab5f858802b91498f80d82270289d856a91a3919050565b600260c954036117d85760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016110db565b600260c955565b5f806117eb8385611d77565b90505f6117f786610fe2565b90505f61180f67ffffffffffffffff831684886119e6565b90505f61181c8284611ee4565b6040805180820182526001815267ffffffffffffffff85811660208084018281526001600160a01b038f165f818152609d845287902095518654925168ffffffffffffffffff1990931690151568ffffffffffffffff001916176101009286169290920291909117909455845193845291881691830191909152918101919091529091507fb160ab8589bf47dc04ea11b50d46678d21590cea2ed3e454e7bd3e41510f98cf9060600160405180910390a1979650505050505050565b5f610fd9838330611acb565b5f834710156119355760405162461bcd60e51b815260206004820152601d60248201527f437265617465323a20696e73756666696369656e742062616c616e636500000060448201526064016110db565b81515f036119855760405162461bcd60e51b815260206004820181905260248201527f437265617465323a2062797465636f6465206c656e677468206973207a65726f60448201526064016110db565b8282516020840186f590506001600160a01b03811661103e5760405162461bcd60e51b815260206004820152601960248201527f437265617465323a204661696c6564206f6e206465706c6f790000000000000060448201526064016110db565b5f80805f19858709858702925082811083820303915050805f03611a1d57838281611a1357611a13611e38565b049250505061103e565b808411611a645760405162461bcd60e51b81526020600482015260156024820152744d6174683a206d756c446976206f766572666c6f7760581b60448201526064016110db565b5f8486880960026001871981018816978890046003810283188082028403028082028403028082028403028082028403028082028403029081029092039091025f889003889004909101858311909403939093029303949094049190911702949350505050565b5f604051836040820152846020820152828152600b8101905060ff815360559020949350505050565b5f60208284031215611b04575f5ffd5b5035919050565b6001600160a01b038116811461126d575f5ffd5b5f5f5f5f60808587031215611b32575f5ffd5b8435611b3d81611b0b565b93506020850135611b4d81611b0b565b92506040850135611b5d81611b0b565b9396929550929360600135925050565b5f5f5f60608486031215611b7f575f5ffd5b8335611b8a81611b0b565b92506020840135611b9a81611b0b565b929592945050506040919091013590565b5f60208284031215611bbb575f5ffd5b813560ff8116811461103e575f5ffd5b5f5f83601f840112611bdb575f5ffd5b50813567ffffffffffffffff811115611bf2575f5ffd5b602083019150836020828501011115611579575f5ffd5b5f5f5f5f5f60608688031215611c1d575f5ffd5b853567ffffffffffffffff811115611c33575f5ffd5b611c3f88828901611bcb565b909650945050602086013567ffffffffffffffff811115611c5e575f5ffd5b611c6a88828901611bcb565b96999598509660400135949350505050565b5f60208284031215611c8c575f5ffd5b813561103e81611b0b565b5f5f5f60608486031215611ca9575f5ffd5b8335611cb481611b0b565b95602085013595506040909401359392505050565b5f5f60408385031215611cda575f5ffd5b8235611ce581611b0b565b946020939093013593505050565b5f5f60408385031215611d04575f5ffd5b8235611d0f81611b0b565b91506020830135611d1f81611b0b565b809150509250929050565b5f60208284031215611d3a575f5ffd5b8151801515811461103e575f5ffd5b634e487b7160e01b5f52601160045260245ffd5b5f600160ff1b8201611d7157611d71611d49565b505f0390565b81810381811115610fdc57610fdc611d49565b8082018281125f831280158216821582161715611da957611da9611d49565b505092915050565b8181035f831280158383131683831282161715611dd057611dd0611d49565b5092915050565b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b606081525f611e12606083018789611dd7565b8281036020840152611e25818688611dd7565b9150508260408301529695505050505050565b634e487b7160e01b5f52601260045260245ffd5b5f82611e6657634e487b7160e01b5f52601260045260245ffd5b500790565b5f81518060208401855e5f93019283525090919050565b5f611e96611e908386611e6b565b84611e6b565b949350505050565b80820180821115610fdc57610fdc611d49565b5f60208284031215611ec1575f5ffd5b815161103e81611b0b565b5f60018201611edd57611edd611d49565b5060010190565b67ffffffffffffffff8281168282160390811115610fdc57610fdc611d4956fe608060405260405161090e38038061090e83398101604081905261002291610460565b61002e82826000610035565b505061058a565b61003e83610100565b6040516001600160a01b038416907f1cf3b03a6cf19fa2baba4df148e9dcabedea7f8a5c07840e207e5c089be95d3e90600090a260008251118061007f5750805b156100fb576100f9836001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156100c5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906100e99190610520565b836102a360201b6100291760201c565b505b505050565b610113816102cf60201b6100551760201c565b6101725760405162461bcd60e51b815260206004820152602560248201527f455243313936373a206e657720626561636f6e206973206e6f74206120636f6e6044820152641d1c9858dd60da1b60648201526084015b60405180910390fd5b6101e6816001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156101b3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101d79190610520565b6102cf60201b6100551760201c565b61024b5760405162461bcd60e51b815260206004820152603060248201527f455243313936373a20626561636f6e20696d706c656d656e746174696f6e206960448201526f1cc81b9bdd08184818dbdb9d1c9858dd60821b6064820152608401610169565b806102827fa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d5060001b6102de60201b6100641760201c565b80546001600160a01b0319166001600160a01b039290921691909117905550565b60606102c883836040518060600160405280602781526020016108e7602791396102e1565b9392505050565b6001600160a01b03163b151590565b90565b6060600080856001600160a01b0316856040516102fe919061053b565b600060405180830381855af49150503d8060008114610339576040519150601f19603f3d011682016040523d82523d6000602084013e61033e565b606091505b5090925090506103508683838761035a565b9695505050505050565b606083156103c65782516103bf576001600160a01b0385163b6103bf5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610169565b50816103d0565b6103d083836103d8565b949350505050565b8151156103e85781518083602001fd5b8060405162461bcd60e51b81526004016101699190610557565b80516001600160a01b038116811461041957600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b60005b8381101561044f578181015183820152602001610437565b838111156100f95750506000910152565b6000806040838503121561047357600080fd5b61047c83610402565b60208401519092506001600160401b038082111561049957600080fd5b818501915085601f8301126104ad57600080fd5b8151818111156104bf576104bf61041e565b604051601f8201601f19908116603f011681019083821181831017156104e7576104e761041e565b8160405282815288602084870101111561050057600080fd5b610511836020830160208801610434565b80955050505050509250929050565b60006020828403121561053257600080fd5b6102c882610402565b6000825161054d818460208701610434565b9190910192915050565b6020815260008251806020840152610576816040850160208701610434565b601f01601f19169190910160400192915050565b61034e806105996000396000f3fe60806040523661001357610011610017565b005b6100115b610027610022610067565b610100565b565b606061004e83836040518060600160405280602781526020016102f260279139610124565b9392505050565b6001600160a01b03163b151590565b90565b600061009a7fa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50546001600160a01b031690565b6001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156100d7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906100fb9190610249565b905090565b3660008037600080366000845af43d6000803e80801561011f573d6000f35b3d6000fd5b6060600080856001600160a01b03168560405161014191906102a2565b600060405180830381855af49150503d806000811461017c576040519150601f19603f3d011682016040523d82523d6000602084013e610181565b606091505b50915091506101928683838761019c565b9695505050505050565b6060831561020d578251610206576001600160a01b0385163b6102065760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064015b60405180910390fd5b5081610217565b610217838361021f565b949350505050565b81511561022f5781518083602001fd5b8060405162461bcd60e51b81526004016101fd91906102be565b60006020828403121561025b57600080fd5b81516001600160a01b038116811461004e57600080fd5b60005b8381101561028d578181015183820152602001610275565b8381111561029c576000848401525b50505050565b600082516102b4818460208701610272565b9190910192915050565b60208152600082518060208401526102dd816040850160208701610272565b601f01601f1916919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220d51e81d3bc5ed20a26aeb05dce7e825c503b2061aa78628027300c8d65b9d89a64736f6c634300080c0033416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a264697066735822122026e4ca77dbd21a235eab6803258d25d7f72c1fe0d91d73a37779c4d6847423fd64736f6c634300081b0033", + Bin: "0x610100604052348015610010575f5ffd5b50604051612a80380380612a8083398101604081905261002f9161015c565b838383836001600160a01b03811661005a576040516339b190bb60e11b815260040160405180910390fd5b6001600160a01b0390811660805292831660a05290821660c0521660e052610080610089565b505050506101b8565b5f54610100900460ff16156100f45760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff90811614610143575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b0381168114610159575f5ffd5b50565b5f5f5f5f6080858703121561016f575f5ffd5b845161017a81610145565b602086015190945061018b81610145565b604086015190935061019c81610145565b60608601519092506101ad81610145565b939692955090935050565b60805160a05160c05160e0516128486102385f395f8181610530015281816106dd0152818161092501528181610a8101528181610df801528181610ea5015261116c01525f81816101f001528181610f6b015261167001525f61033701525f818161037e01528181610612015281816109cb015261127201526128485ff3fe6080604052600436106101ba575f3560e01c80639b4e4634116100f2578063d48e889411610092578063f5d4fed311610062578063f5d4fed314610571578063f6848d2414610586578063fabc1cbc146105bf578063fe243a17146105de575f5ffd5b8063d48e8894146104d5578063debe1eab14610500578063ea4d3c9b1461051f578063f2fde38b14610552575f5ffd5b8063a38406a3116100cd578063a38406a31461044a578063a3d75e0914610469578063a6a509be146104a1578063cd6dc687146104b6575f5ffd5b80639b4e4634146103e45780639ba06275146103f7578063a1ca780b1461042b575f5ffd5b8063715018a61161015d57806384d810621161013857806384d8106214610359578063886f11951461036d5780638da5cb5b146103a05780639104c319146103bd575f5ffd5b8063715018a6146102f3578063724af4231461030757806374cdd79814610326575f5ffd5b806350ff72251161019857806350ff72251461024e578063595c6a67146102825780635ac86ab7146102965780635c975abb146102d5575f5ffd5b8063136439dd146101be578063292b7b2b146101df5780632eae418c1461022f575b5f5ffd5b3480156101c9575f5ffd5b506101dd6101d8366004611af4565b6105fd565b005b3480156101ea575f5ffd5b506102127f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020015b60405180910390f35b34801561023a575f5ffd5b506101dd610249366004611b1f565b6106d2565b348015610259575f5ffd5b5061026d610268366004611b6d565b610918565b60408051928352602083019190915201610226565b34801561028d575f5ffd5b506101dd6109b6565b3480156102a1575f5ffd5b506102c56102b0366004611bab565b606654600160ff9092169190911b9081161490565b6040519015158152602001610226565b3480156102e0575f5ffd5b506066545b604051908152602001610226565b3480156102fe575f5ffd5b506101dd610a65565b348015610312575f5ffd5b506101dd610321366004611b6d565b610a76565b348015610331575f5ffd5b506102127f000000000000000000000000000000000000000000000000000000000000000081565b348015610364575f5ffd5b50610212610b9c565b348015610378575f5ffd5b506102127f000000000000000000000000000000000000000000000000000000000000000081565b3480156103ab575f5ffd5b506033546001600160a01b0316610212565b3480156103c8575f5ffd5b5061021273beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac081565b6101dd6103f2366004611c09565b610c0c565b348015610402575f5ffd5b50610212610411366004611c7c565b60986020525f90815260409020546001600160a01b031681565b348015610436575f5ffd5b506101dd610445366004611c97565b610cc9565b348015610455575f5ffd5b50610212610464366004611c7c565b610f11565b348015610474575f5ffd5b50610488610483366004611c7c565b610fe2565b60405167ffffffffffffffff9091168152602001610226565b3480156104ac575f5ffd5b506102e560995481565b3480156104c1575f5ffd5b506101dd6104d0366004611cc9565b611045565b3480156104e0575f5ffd5b506102e56104ef366004611c7c565b609b6020525f908152604090205481565b34801561050b575f5ffd5b506101dd61051a366004611cc9565b611161565b34801561052a575f5ffd5b506102127f000000000000000000000000000000000000000000000000000000000000000081565b34801561055d575f5ffd5b506101dd61056c366004611c7c565b6111f7565b34801561057c575f5ffd5b506102e5609e5481565b348015610591575f5ffd5b506102c56105a0366004611c7c565b6001600160a01b039081165f9081526098602052604090205416151590565b3480156105ca575f5ffd5b506101dd6105d9366004611af4565b611270565b3480156105e9575f5ffd5b506102e56105f8366004611cf3565b611386565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa15801561065f573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106839190611d2a565b6106a057604051631d77d47760e21b815260040160405180910390fd5b60665481811681146106c55760405163c61dca5d60e01b815260040160405180910390fd5b6106ce82611406565b5050565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461071b5760405163f739589b60e01b815260040160405180910390fd5b6001600160a01b03831673beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac01461075857604051632711b74d60e11b815260040160405180910390fd5b6001600160a01b03841661077f576040516339b190bb60e11b815260040160405180910390fd5b5f811361079f5760405163ef147de160e01b815260040160405180910390fd5b6001600160a01b0384165f908152609b6020526040812054908290821215610899575f6107cb83611d5d565b90505f818511156107e95750806107e28186611d77565b92506107ef565b505f9150835b5f6107fa8286611d8a565b6001600160a01b038a165f818152609b60205260409081902083905551919250907f4e2b791dedccd9fb30141b088cabf5c14a8912b52f59375c95c010700b8c61939061084a9085815260200190565b60405180910390a2886001600160a01b03167fd4def76d6d2bed6f14d5cd9af73cc2913d618d00edde42432e81c09bfe0770988260405161088d91815260200190565b60405180910390a25050505b8015610910576001600160a01b038681165f81815260986020526040908190205490516362483a2160e11b81526004810192909252602482018490529091169063c4907442906044015f604051808303815f87803b1580156108f9575f5ffd5b505af115801561090b573d5f5f3e3d5ffd5b505050505b505050505050565b5f80336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146109635760405163f739589b60e01b815260040160405180910390fd5b6001600160a01b03841673beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac0146109a057604051632711b74d60e11b815260040160405180910390fd5b6109aa8584611443565b91509150935093915050565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa158015610a18573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a3c9190611d2a565b610a5957604051631d77d47760e21b815260040160405180910390fd5b610a635f19611406565b565b610a6d611580565b610a635f6115da565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610abf5760405163f739589b60e01b815260040160405180910390fd5b6001600160a01b03821673beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac014610afc57604051632711b74d60e11b815260040160405180910390fd5b6001600160a01b0383165f908152609b6020526040812054610b1f908390611db1565b90505f811215610b425760405163ef147de160e01b815260040160405180910390fd5b6001600160a01b0384165f818152609b602052604090819020839055517fd4def76d6d2bed6f14d5cd9af73cc2913d618d00edde42432e81c09bfe07709890610b8e9084815260200190565b60405180910390a250505050565b6066545f908190600190811603610bc65760405163840a48d560e01b815260040160405180910390fd5b335f908152609860205260409020546001600160a01b031615610bfc5760405163031a852160e21b815260040160405180910390fd5b5f610c0561162b565b9250505090565b6066545f90600190811603610c345760405163840a48d560e01b815260040160405180910390fd5b335f908152609860205260409020546001600160a01b031680610c5c57610c5961162b565b90505b6040516326d3918d60e21b81526001600160a01b03821690639b4e4634903490610c92908b908b908b908b908b90600401611dff565b5f604051808303818588803b158015610ca9575f5ffd5b505af1158015610cbb573d5f5f3e3d5ffd5b505050505050505050505050565b6001600160a01b038084165f908152609860205260409020548491163314610d04576040516312e16d7160e11b815260040160405180910390fd5b610d0c611786565b6001600160a01b038416610d33576040516339b190bb60e11b815260040160405180910390fd5b610d41633b9aca0083611e4c565b15610d5f576040516347d072bb60e11b815260040160405180910390fd5b6001600160a01b0384165f908152609b602052604081205490811215610d9857604051634b692bcf60e01b815260040160405180910390fd5b5f8312610e58575f5f610dab8786611443565b604051631e328e7960e11b81526001600160a01b038a8116600483015273beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac0602483015260448201849052606482018390529294509092507f000000000000000000000000000000000000000000000000000000000000000090911690633c651cf2906084015f604051808303815f87803b158015610e3b575f5ffd5b505af1158015610e4d573d5f5f3e3d5ffd5b505050505050610f00565b5f610e6c8686610e6787611d5d565b6117df565b60405163305068e760e11b81526001600160a01b0388811660048301526024820185905267ffffffffffffffff831660448301529192507f0000000000000000000000000000000000000000000000000000000000000000909116906360a0d1ce906064015f604051808303815f87803b158015610ee8575f5ffd5b505af1158015610efa573d5f5f3e3d5ffd5b50505050505b50610f0b600160c955565b50505050565b6001600160a01b038082165f9081526098602052604081205490911680610fdc57610fd9836001600160a01b03165f1b60405180610940016040528061090e8152602001611f0561090e9139604080516001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000166020820152808201919091525f606082015260800160408051601f1981840301815290829052610fbe9291602001611e82565b604051602081830303815290604052805190602001206118d8565b90505b92915050565b6001600160a01b0381165f908152609d6020908152604080832081518083019092525460ff8116151580835261010090910467ffffffffffffffff16928201929092529061103857670de0b6b3a764000061103e565b80602001515b9392505050565b5f54610100900460ff161580801561106357505f54600160ff909116105b8061107c5750303b15801561107c57505f5460ff166001145b6110e45760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b5f805460ff191660011790558015611105575f805461ff0019166101001790555b61110e836115da565b61111782611406565b801561115c575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146111aa5760405163f739589b60e01b815260040160405180910390fd5b80609e5f8282546111bb9190611e9e565b90915550506040518181527f1ed04b7fd262c0d9e50fa02957f32a81a151f03baaa367faeedc7521b001c4a49060200160405180910390a15050565b6111ff611580565b6001600160a01b0381166112645760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016110db565b61126d816115da565b50565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156112cc573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906112f09190611eb1565b6001600160a01b0316336001600160a01b0316146113215760405163794821ff60e01b815260040160405180910390fd5b606654801982198116146113485760405163c61dca5d60e01b815260040160405180910390fd5b606682905560405182815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c9060200160405180910390a25050565b5f6001600160a01b03821673beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac0146113c457604051632711b74d60e11b815260040160405180910390fd5b6001600160a01b0383165f908152609b6020526040812054126113fe576001600160a01b0383165f908152609b6020526040902054610fd9565b505f92915050565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a250565b5f806001600160a01b03841661146c576040516339b190bb60e11b815260040160405180910390fd5b5f83121561148d5760405163ef147de160e01b815260040160405180910390fd5b6001600160a01b0384165f908152609b602052604081205484916114b18383611d8a565b6001600160a01b0388165f818152609b60205260409081902083905551919250907f4e2b791dedccd9fb30141b088cabf5c14a8912b52f59375c95c010700b8c6193906115019086815260200190565b60405180910390a2866001600160a01b03167fd4def76d6d2bed6f14d5cd9af73cc2913d618d00edde42432e81c09bfe0770988260405161154491815260200190565b60405180910390a25f8113611561575f5f94509450505050611579565b5f821261156e5781611570565b5f5b86945094505050505b9250929050565b6033546001600160a01b03163314610a635760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016110db565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b5f60995f815461163a90611ecc565b9091555060408051610940810190915261090e8082525f916116d79183913391611f056020830139604080516001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000166020820152808201919091525f606082015260800160408051601f19818403018152908290526116c39291602001611e82565b6040516020818303038152906040526118e4565b60405163189acdbd60e31b81523360048201529091506001600160a01b0382169063c4d66de8906024015f604051808303815f87803b158015611718575f5ffd5b505af115801561172a573d5f5f3e3d5ffd5b5050335f8181526098602052604080822080546001600160a01b0319166001600160a01b038816908117909155905192945092507f21c99d0db02213c32fff5b05cf0a718ab5f858802b91498f80d82270289d856a91a3919050565b600260c954036117d85760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016110db565b600260c955565b5f806117eb8385611d77565b90505f6117f786610fe2565b90505f61180f67ffffffffffffffff831684886119e6565b90505f61181c8284611ee4565b6040805180820182526001815267ffffffffffffffff85811660208084018281526001600160a01b038f165f818152609d845287902095518654925168ffffffffffffffffff1990931690151568ffffffffffffffff001916176101009286169290920291909117909455845193845291881691830191909152918101919091529091507fb160ab8589bf47dc04ea11b50d46678d21590cea2ed3e454e7bd3e41510f98cf9060600160405180910390a1979650505050505050565b5f610fd9838330611acb565b5f834710156119355760405162461bcd60e51b815260206004820152601d60248201527f437265617465323a20696e73756666696369656e742062616c616e636500000060448201526064016110db565b81515f036119855760405162461bcd60e51b815260206004820181905260248201527f437265617465323a2062797465636f6465206c656e677468206973207a65726f60448201526064016110db565b8282516020840186f590506001600160a01b03811661103e5760405162461bcd60e51b815260206004820152601960248201527f437265617465323a204661696c6564206f6e206465706c6f790000000000000060448201526064016110db565b5f80805f19858709858702925082811083820303915050805f03611a1d57838281611a1357611a13611e38565b049250505061103e565b808411611a645760405162461bcd60e51b81526020600482015260156024820152744d6174683a206d756c446976206f766572666c6f7760581b60448201526064016110db565b5f8486880960026001871981018816978890046003810283188082028403028082028403028082028403028082028403028082028403029081029092039091025f889003889004909101858311909403939093029303949094049190911702949350505050565b5f604051836040820152846020820152828152600b8101905060ff815360559020949350505050565b5f60208284031215611b04575f5ffd5b5035919050565b6001600160a01b038116811461126d575f5ffd5b5f5f5f5f60808587031215611b32575f5ffd5b8435611b3d81611b0b565b93506020850135611b4d81611b0b565b92506040850135611b5d81611b0b565b9396929550929360600135925050565b5f5f5f60608486031215611b7f575f5ffd5b8335611b8a81611b0b565b92506020840135611b9a81611b0b565b929592945050506040919091013590565b5f60208284031215611bbb575f5ffd5b813560ff8116811461103e575f5ffd5b5f5f83601f840112611bdb575f5ffd5b50813567ffffffffffffffff811115611bf2575f5ffd5b602083019150836020828501011115611579575f5ffd5b5f5f5f5f5f60608688031215611c1d575f5ffd5b853567ffffffffffffffff811115611c33575f5ffd5b611c3f88828901611bcb565b909650945050602086013567ffffffffffffffff811115611c5e575f5ffd5b611c6a88828901611bcb565b96999598509660400135949350505050565b5f60208284031215611c8c575f5ffd5b813561103e81611b0b565b5f5f5f60608486031215611ca9575f5ffd5b8335611cb481611b0b565b95602085013595506040909401359392505050565b5f5f60408385031215611cda575f5ffd5b8235611ce581611b0b565b946020939093013593505050565b5f5f60408385031215611d04575f5ffd5b8235611d0f81611b0b565b91506020830135611d1f81611b0b565b809150509250929050565b5f60208284031215611d3a575f5ffd5b8151801515811461103e575f5ffd5b634e487b7160e01b5f52601160045260245ffd5b5f600160ff1b8201611d7157611d71611d49565b505f0390565b81810381811115610fdc57610fdc611d49565b8082018281125f831280158216821582161715611da957611da9611d49565b505092915050565b8181035f831280158383131683831282161715611dd057611dd0611d49565b5092915050565b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b606081525f611e12606083018789611dd7565b8281036020840152611e25818688611dd7565b9150508260408301529695505050505050565b634e487b7160e01b5f52601260045260245ffd5b5f82611e6657634e487b7160e01b5f52601260045260245ffd5b500790565b5f81518060208401855e5f93019283525090919050565b5f611e96611e908386611e6b565b84611e6b565b949350505050565b80820180821115610fdc57610fdc611d49565b5f60208284031215611ec1575f5ffd5b815161103e81611b0b565b5f60018201611edd57611edd611d49565b5060010190565b67ffffffffffffffff8281168282160390811115610fdc57610fdc611d4956fe608060405260405161090e38038061090e83398101604081905261002291610460565b61002e82826000610035565b505061058a565b61003e83610100565b6040516001600160a01b038416907f1cf3b03a6cf19fa2baba4df148e9dcabedea7f8a5c07840e207e5c089be95d3e90600090a260008251118061007f5750805b156100fb576100f9836001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156100c5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906100e99190610520565b836102a360201b6100291760201c565b505b505050565b610113816102cf60201b6100551760201c565b6101725760405162461bcd60e51b815260206004820152602560248201527f455243313936373a206e657720626561636f6e206973206e6f74206120636f6e6044820152641d1c9858dd60da1b60648201526084015b60405180910390fd5b6101e6816001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156101b3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101d79190610520565b6102cf60201b6100551760201c565b61024b5760405162461bcd60e51b815260206004820152603060248201527f455243313936373a20626561636f6e20696d706c656d656e746174696f6e206960448201526f1cc81b9bdd08184818dbdb9d1c9858dd60821b6064820152608401610169565b806102827fa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d5060001b6102de60201b6100641760201c565b80546001600160a01b0319166001600160a01b039290921691909117905550565b60606102c883836040518060600160405280602781526020016108e7602791396102e1565b9392505050565b6001600160a01b03163b151590565b90565b6060600080856001600160a01b0316856040516102fe919061053b565b600060405180830381855af49150503d8060008114610339576040519150601f19603f3d011682016040523d82523d6000602084013e61033e565b606091505b5090925090506103508683838761035a565b9695505050505050565b606083156103c65782516103bf576001600160a01b0385163b6103bf5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610169565b50816103d0565b6103d083836103d8565b949350505050565b8151156103e85781518083602001fd5b8060405162461bcd60e51b81526004016101699190610557565b80516001600160a01b038116811461041957600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b60005b8381101561044f578181015183820152602001610437565b838111156100f95750506000910152565b6000806040838503121561047357600080fd5b61047c83610402565b60208401519092506001600160401b038082111561049957600080fd5b818501915085601f8301126104ad57600080fd5b8151818111156104bf576104bf61041e565b604051601f8201601f19908116603f011681019083821181831017156104e7576104e761041e565b8160405282815288602084870101111561050057600080fd5b610511836020830160208801610434565b80955050505050509250929050565b60006020828403121561053257600080fd5b6102c882610402565b6000825161054d818460208701610434565b9190910192915050565b6020815260008251806020840152610576816040850160208701610434565b601f01601f19169190910160400192915050565b61034e806105996000396000f3fe60806040523661001357610011610017565b005b6100115b610027610022610067565b610100565b565b606061004e83836040518060600160405280602781526020016102f260279139610124565b9392505050565b6001600160a01b03163b151590565b90565b600061009a7fa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50546001600160a01b031690565b6001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156100d7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906100fb9190610249565b905090565b3660008037600080366000845af43d6000803e80801561011f573d6000f35b3d6000fd5b6060600080856001600160a01b03168560405161014191906102a2565b600060405180830381855af49150503d806000811461017c576040519150601f19603f3d011682016040523d82523d6000602084013e610181565b606091505b50915091506101928683838761019c565b9695505050505050565b6060831561020d578251610206576001600160a01b0385163b6102065760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064015b60405180910390fd5b5081610217565b610217838361021f565b949350505050565b81511561022f5781518083602001fd5b8060405162461bcd60e51b81526004016101fd91906102be565b60006020828403121561025b57600080fd5b81516001600160a01b038116811461004e57600080fd5b60005b8381101561028d578181015183820152602001610275565b8381111561029c576000848401525b50505050565b600082516102b4818460208701610272565b9190910192915050565b60208152600082518060208401526102dd816040850160208701610272565b601f01601f1916919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220d51e81d3bc5ed20a26aeb05dce7e825c503b2061aa78628027300c8d65b9d89a64736f6c634300080c0033416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220206da8ee7fc533b672cccd953d3cea25dfbc2b47e0cf8cbf020dfa09efcccb8264736f6c634300081b0033", } // EigenPodManagerABI is the input ABI used to generate the binding from. diff --git a/pkg/bindings/EigenStrategy/binding.go b/pkg/bindings/EigenStrategy/binding.go index 1b2b0002e2..e26e04bc48 100644 --- a/pkg/bindings/EigenStrategy/binding.go +++ b/pkg/bindings/EigenStrategy/binding.go @@ -32,7 +32,7 @@ var ( // EigenStrategyMetaData contains all meta data concerning the EigenStrategy contract. var EigenStrategyMetaData = &bind.MetaData{ ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"_strategyManager\",\"type\":\"address\",\"internalType\":\"contractIStrategyManager\"},{\"name\":\"_pauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"EIGEN\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIEigen\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"deposit\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"newShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"explanation\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"_EIGEN\",\"type\":\"address\",\"internalType\":\"contractIEigen\"},{\"name\":\"_bEIGEN\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"_underlyingToken\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"pauseAll\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[{\"name\":\"index\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pauserRegistry\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"shares\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"sharesToUnderlying\",\"inputs\":[{\"name\":\"amountShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"sharesToUnderlyingView\",\"inputs\":[{\"name\":\"amountShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"strategyManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategyManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"totalShares\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"underlyingToShares\",\"inputs\":[{\"name\":\"amountUnderlying\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"underlyingToSharesView\",\"inputs\":[{\"name\":\"amountUnderlying\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"underlyingToken\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"userUnderlying\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"userUnderlyingView\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"withdraw\",\"inputs\":[{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amountShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"ExchangeRateEmitted\",\"inputs\":[{\"name\":\"rate\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StrategyTokenSet\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIERC20\"},{\"name\":\"decimals\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"BalanceExceedsMaxTotalDeposits\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"CurrentlyPaused\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InputAddressZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidNewPausedStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"MaxPerDepositExceedsMax\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NewSharesZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyPauser\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyStrategyManager\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyUnderlyingToken\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyUnpauser\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"TotalSharesExceedsMax\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"WithdrawalAmountExceedsTotalDeposits\",\"inputs\":[]}]", - Bin: "0x60c060405234801561000f575f5ffd5b5060405161168d38038061168d83398101604081905261002e9161014f565b8181806001600160a01b038116610058576040516339b190bb60e11b815260040160405180910390fd5b6001600160a01b03908116608052821660a05261007361007c565b50505050610187565b5f54610100900460ff16156100e75760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff90811614610136575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b038116811461014c575f5ffd5b50565b5f5f60408385031215610160575f5ffd5b825161016b81610138565b602084015190925061017c81610138565b809150509250929050565b60805160a0516114bb6101d25f395f818161018b0152818161043e01528181610871015261090e01525f81816102540152818161034b0152818161066a0152610a3c01526114bb5ff3fe608060405234801561000f575f5ffd5b506004361061013d575f3560e01c8063886f1195116100b4578063ce7c2ac211610079578063ce7c2ac2146102c4578063d9caed12146102d7578063e3dae51c146102ea578063f3e73875146102fd578063fabc1cbc14610310578063fdc371ce14610323575f5ffd5b8063886f11951461024f5780638c871019146102765780638f6a624014610289578063ab5921e11461029c578063c4d66de8146102b1575f5ffd5b8063485cc95511610105578063485cc955146101d7578063553ca5f8146101ea578063595c6a67146101fd5780635ac86ab7146102055780635c975abb146102345780637a8b26371461023c575f5ffd5b8063136439dd146101415780632495a5991461015657806339b70e38146101865780633a98ef39146101ad57806347e7ef24146101c4575b5f5ffd5b61015461014f3660046111ab565b610336565b005b603254610169906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b6101697f000000000000000000000000000000000000000000000000000000000000000081565b6101b660335481565b60405190815260200161017d565b6101b66101d23660046111d9565b61040b565b6101546101e5366004611203565b610557565b6101b66101f836600461123a565b610642565b610154610655565b61022461021336600461126a565b6001805460ff9092161b9081161490565b604051901515815260200161017d565b6001546101b6565b6101b661024a3660046111ab565b610704565b6101697f000000000000000000000000000000000000000000000000000000000000000081565b6101b66102843660046111ab565b61074d565b6101b661029736600461123a565b610757565b6102a4610764565b60405161017d9190611285565b6101546102bf36600461123a565b610784565b6101b66102d236600461123a565b61084a565b6101546102e53660046112ba565b6108dc565b6101b66102f83660046111ab565b6109f9565b6101b661030b3660046111ab565b610a30565b61015461031e3660046111ab565b610a3a565b606454610169906001600160a01b031681565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa158015610398573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103bc91906112f8565b6103d957604051631d77d47760e21b815260040160405180910390fd5b60015481811681146103fe5760405163c61dca5d60e01b815260040160405180910390fd5b61040782610b50565b5050565b600180545f9182918116036104335760405163840a48d560e01b815260040160405180910390fd5b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461047c576040516348da714f60e01b815260040160405180910390fd5b6104868484610b8d565b6033545f6104966103e88361132b565b90505f6103e86104a4610c46565b6104ae919061132b565b90505f6104bb878361133e565b9050806104c88489611351565b6104d29190611368565b9550855f036104f457604051630c392ed360e11b815260040160405180910390fd5b6104fe868561132b565b60338190556f4b3b4ca85a86c47a098a223fffffffff101561053357604051632f14e8a360e11b815260040160405180910390fd5b61054c826103e8603354610547919061132b565b610cb5565b505050505092915050565b5f54610100900460ff161580801561057557505f54600160ff909116105b8061058e5750303b15801561058e57505f5460ff166001145b6105b35760405162461bcd60e51b81526004016105aa90611387565b60405180910390fd5b5f805460ff1916600117905580156105d4575f805461ff0019166101001790555b606480546001600160a01b0319166001600160a01b0385161790556105f882610d01565b801561063d575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050565b5f61064f61024a8361084a565b92915050565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa1580156106b7573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106db91906112f8565b6106f857604051631d77d47760e21b815260040160405180910390fd5b6107025f19610b50565b565b5f5f6103e8603354610716919061132b565b90505f6103e8610724610c46565b61072e919061132b565b90508161073b8583611351565b6107459190611368565b949350505050565b5f61064f826109f9565b5f61064f61030b8361084a565b60606040518060800160405280604d8152602001611439604d9139905090565b5f54610100900460ff16158080156107a257505f54600160ff909116105b806107bb5750303b1580156107bb57505f5460ff166001145b6107d75760405162461bcd60e51b81526004016105aa90611387565b5f805460ff1916600117905580156107f8575f805461ff0019166101001790555b61080182610d01565b8015610407575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498906020015b60405180910390a15050565b60405163fe243a1760e01b81526001600160a01b0382811660048301523060248301525f917f00000000000000000000000000000000000000000000000000000000000000009091169063fe243a1790604401602060405180830381865afa1580156108b8573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061064f91906113d5565b600180546002908116036109035760405163840a48d560e01b815260040160405180910390fd5b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461094c576040516348da714f60e01b815260040160405180910390fd5b610957848484610e4c565b6033548083111561097b57604051630b469df360e41b815260040160405180910390fd5b5f6109886103e88361132b565b90505f6103e8610996610c46565b6109a0919061132b565b90505f826109ae8784611351565b6109b89190611368565b90506109c4868561133e565b6033556109e46109d4828461133e565b6103e8603354610547919061132b565b6109ef888883610e92565b5050505050505050565b5f5f6103e8603354610a0b919061132b565b90505f6103e8610a19610c46565b610a23919061132b565b90508061073b8386611351565b5f61064f82610704565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610a96573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610aba91906113ec565b6001600160a01b0316336001600160a01b031614610aeb5760405163794821ff60e01b815260040160405180910390fd5b60015480198219811614610b125760405163c61dca5d60e01b815260040160405180910390fd5b600182905560405182815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c9060200160405180910390a25050565b600181905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a250565b6032546001600160a01b0383811691161480610bb657506064546001600160a01b038381169116145b610bd357604051630312abdd60e61b815260040160405180910390fd5b6064546001600160a01b039081169083160361040757606454604051636f074d1f60e11b8152600481018390526001600160a01b039091169063de0e9a3e906024015f604051808303815f87803b158015610c2c575f5ffd5b505af1158015610c3e573d5f5f3e3d5ffd5b505050505050565b6032546040516370a0823160e01b81523060048201525f916001600160a01b0316906370a0823190602401602060405180830381865afa158015610c8c573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610cb091906113d5565b905090565b7fd2494f3479e5da49d386657c292c610b5b01df313d07c62eb0cfa49924a31be881610ce984670de0b6b3a7640000611351565b610cf39190611368565b60405190815260200161083e565b5f54610100900460ff16610d6b5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b60648201526084016105aa565b603280546001600160a01b0319166001600160a01b038316179055610d8f5f610b50565b7f1c540707b00eb5427b6b774fc799d756516a54aee108b64b327acc55af55750760325f9054906101000a90046001600160a01b0316826001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e01573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e259190611407565b604080516001600160a01b03909316835260ff90911660208301520160405180910390a150565b6032546001600160a01b0383811691161480610e7557506064546001600160a01b038381169116145b61063d57604051630312abdd60e61b815260040160405180910390fd5b6064546001600160a01b0390811690831603610f775760325460405163095ea7b360e01b81526001600160a01b038481166004830152602482018490529091169063095ea7b3906044016020604051808303815f875af1158015610ef8573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f1c91906112f8565b50606454604051630ea598cb60e41b8152600481018390526001600160a01b039091169063ea598cb0906024015f604051808303815f87803b158015610f60575f5ffd5b505af1158015610f72573d5f5f3e3d5ffd5b505050505b604080516001600160a01b03858116602483015260448083018590528351808403909101815260649092018352602080830180516001600160e01b031663a9059cbb60e01b17905283518085019094528084527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65649084015261063d92908516918691859185918591905f9061100f908490849061108e565b905080515f148061102f57508080602001905181019061102f91906112f8565b61063d5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016105aa565b606061074584845f85855f5f866001600160a01b031685876040516110b39190611422565b5f6040518083038185875af1925050503d805f81146110ed576040519150601f19603f3d011682016040523d82523d5f602084013e6110f2565b606091505b50915091506111038783838761110e565b979650505050505050565b6060831561117c5782515f03611175576001600160a01b0385163b6111755760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016105aa565b5081610745565b61074583838151156111915781518083602001fd5b8060405162461bcd60e51b81526004016105aa9190611285565b5f602082840312156111bb575f5ffd5b5035919050565b6001600160a01b03811681146111d6575f5ffd5b50565b5f5f604083850312156111ea575f5ffd5b82356111f5816111c2565b946020939093013593505050565b5f5f60408385031215611214575f5ffd5b823561121f816111c2565b9150602083013561122f816111c2565b809150509250929050565b5f6020828403121561124a575f5ffd5b8135611255816111c2565b9392505050565b60ff811681146111d6575f5ffd5b5f6020828403121561127a575f5ffd5b81356112558161125c565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b5f5f5f606084860312156112cc575f5ffd5b83356112d7816111c2565b925060208401356112e7816111c2565b929592945050506040919091013590565b5f60208284031215611308575f5ffd5b81518015158114611255575f5ffd5b634e487b7160e01b5f52601160045260245ffd5b8082018082111561064f5761064f611317565b8181038181111561064f5761064f611317565b808202811582820484141761064f5761064f611317565b5f8261138257634e487b7160e01b5f52601260045260245ffd5b500490565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b5f602082840312156113e5575f5ffd5b5051919050565b5f602082840312156113fc575f5ffd5b8151611255816111c2565b5f60208284031215611417575f5ffd5b81516112558161125c565b5f82518060208501845e5f92019182525091905056fe4261736520537472617465677920696d706c656d656e746174696f6e20746f20696e68657269742066726f6d20666f72206d6f726520636f6d706c657820696d706c656d656e746174696f6e73a264697066735822122076f7e98368e74126349ea5d562a11c4c3acea991bef004fc2d3c9aeb09c1789064736f6c634300081b0033", + Bin: "0x60c060405234801561000f575f5ffd5b5060405161168d38038061168d83398101604081905261002e9161014f565b8181806001600160a01b038116610058576040516339b190bb60e11b815260040160405180910390fd5b6001600160a01b03908116608052821660a05261007361007c565b50505050610187565b5f54610100900460ff16156100e75760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff90811614610136575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b038116811461014c575f5ffd5b50565b5f5f60408385031215610160575f5ffd5b825161016b81610138565b602084015190925061017c81610138565b809150509250929050565b60805160a0516114bb6101d25f395f818161018b0152818161043e01528181610871015261090e01525f81816102540152818161034b0152818161066a0152610a3c01526114bb5ff3fe608060405234801561000f575f5ffd5b506004361061013d575f3560e01c8063886f1195116100b4578063ce7c2ac211610079578063ce7c2ac2146102c4578063d9caed12146102d7578063e3dae51c146102ea578063f3e73875146102fd578063fabc1cbc14610310578063fdc371ce14610323575f5ffd5b8063886f11951461024f5780638c871019146102765780638f6a624014610289578063ab5921e11461029c578063c4d66de8146102b1575f5ffd5b8063485cc95511610105578063485cc955146101d7578063553ca5f8146101ea578063595c6a67146101fd5780635ac86ab7146102055780635c975abb146102345780637a8b26371461023c575f5ffd5b8063136439dd146101415780632495a5991461015657806339b70e38146101865780633a98ef39146101ad57806347e7ef24146101c4575b5f5ffd5b61015461014f3660046111ab565b610336565b005b603254610169906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b6101697f000000000000000000000000000000000000000000000000000000000000000081565b6101b660335481565b60405190815260200161017d565b6101b66101d23660046111d9565b61040b565b6101546101e5366004611203565b610557565b6101b66101f836600461123a565b610642565b610154610655565b61022461021336600461126a565b6001805460ff9092161b9081161490565b604051901515815260200161017d565b6001546101b6565b6101b661024a3660046111ab565b610704565b6101697f000000000000000000000000000000000000000000000000000000000000000081565b6101b66102843660046111ab565b61074d565b6101b661029736600461123a565b610757565b6102a4610764565b60405161017d9190611285565b6101546102bf36600461123a565b610784565b6101b66102d236600461123a565b61084a565b6101546102e53660046112ba565b6108dc565b6101b66102f83660046111ab565b6109f9565b6101b661030b3660046111ab565b610a30565b61015461031e3660046111ab565b610a3a565b606454610169906001600160a01b031681565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa158015610398573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103bc91906112f8565b6103d957604051631d77d47760e21b815260040160405180910390fd5b60015481811681146103fe5760405163c61dca5d60e01b815260040160405180910390fd5b61040782610b50565b5050565b600180545f9182918116036104335760405163840a48d560e01b815260040160405180910390fd5b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461047c576040516348da714f60e01b815260040160405180910390fd5b6104868484610b8d565b6033545f6104966103e88361132b565b90505f6103e86104a4610c46565b6104ae919061132b565b90505f6104bb878361133e565b9050806104c88489611351565b6104d29190611368565b9550855f036104f457604051630c392ed360e11b815260040160405180910390fd5b6104fe868561132b565b60338190556f4b3b4ca85a86c47a098a223fffffffff101561053357604051632f14e8a360e11b815260040160405180910390fd5b61054c826103e8603354610547919061132b565b610cb5565b505050505092915050565b5f54610100900460ff161580801561057557505f54600160ff909116105b8061058e5750303b15801561058e57505f5460ff166001145b6105b35760405162461bcd60e51b81526004016105aa90611387565b60405180910390fd5b5f805460ff1916600117905580156105d4575f805461ff0019166101001790555b606480546001600160a01b0319166001600160a01b0385161790556105f882610d01565b801561063d575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050565b5f61064f61024a8361084a565b92915050565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa1580156106b7573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106db91906112f8565b6106f857604051631d77d47760e21b815260040160405180910390fd5b6107025f19610b50565b565b5f5f6103e8603354610716919061132b565b90505f6103e8610724610c46565b61072e919061132b565b90508161073b8583611351565b6107459190611368565b949350505050565b5f61064f826109f9565b5f61064f61030b8361084a565b60606040518060800160405280604d8152602001611439604d9139905090565b5f54610100900460ff16158080156107a257505f54600160ff909116105b806107bb5750303b1580156107bb57505f5460ff166001145b6107d75760405162461bcd60e51b81526004016105aa90611387565b5f805460ff1916600117905580156107f8575f805461ff0019166101001790555b61080182610d01565b8015610407575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498906020015b60405180910390a15050565b60405163fe243a1760e01b81526001600160a01b0382811660048301523060248301525f917f00000000000000000000000000000000000000000000000000000000000000009091169063fe243a1790604401602060405180830381865afa1580156108b8573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061064f91906113d5565b600180546002908116036109035760405163840a48d560e01b815260040160405180910390fd5b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461094c576040516348da714f60e01b815260040160405180910390fd5b610957848484610e4c565b6033548083111561097b57604051630b469df360e41b815260040160405180910390fd5b5f6109886103e88361132b565b90505f6103e8610996610c46565b6109a0919061132b565b90505f826109ae8784611351565b6109b89190611368565b90506109c4868561133e565b6033556109e46109d4828461133e565b6103e8603354610547919061132b565b6109ef888883610e92565b5050505050505050565b5f5f6103e8603354610a0b919061132b565b90505f6103e8610a19610c46565b610a23919061132b565b90508061073b8386611351565b5f61064f82610704565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610a96573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610aba91906113ec565b6001600160a01b0316336001600160a01b031614610aeb5760405163794821ff60e01b815260040160405180910390fd5b60015480198219811614610b125760405163c61dca5d60e01b815260040160405180910390fd5b600182905560405182815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c9060200160405180910390a25050565b600181905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a250565b6032546001600160a01b0383811691161480610bb657506064546001600160a01b038381169116145b610bd357604051630312abdd60e61b815260040160405180910390fd5b6064546001600160a01b039081169083160361040757606454604051636f074d1f60e11b8152600481018390526001600160a01b039091169063de0e9a3e906024015f604051808303815f87803b158015610c2c575f5ffd5b505af1158015610c3e573d5f5f3e3d5ffd5b505050505050565b6032546040516370a0823160e01b81523060048201525f916001600160a01b0316906370a0823190602401602060405180830381865afa158015610c8c573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610cb091906113d5565b905090565b7fd2494f3479e5da49d386657c292c610b5b01df313d07c62eb0cfa49924a31be881610ce984670de0b6b3a7640000611351565b610cf39190611368565b60405190815260200161083e565b5f54610100900460ff16610d6b5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b60648201526084016105aa565b603280546001600160a01b0319166001600160a01b038316179055610d8f5f610b50565b7f1c540707b00eb5427b6b774fc799d756516a54aee108b64b327acc55af55750760325f9054906101000a90046001600160a01b0316826001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e01573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e259190611407565b604080516001600160a01b03909316835260ff90911660208301520160405180910390a150565b6032546001600160a01b0383811691161480610e7557506064546001600160a01b038381169116145b61063d57604051630312abdd60e61b815260040160405180910390fd5b6064546001600160a01b0390811690831603610f775760325460405163095ea7b360e01b81526001600160a01b038481166004830152602482018490529091169063095ea7b3906044016020604051808303815f875af1158015610ef8573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f1c91906112f8565b50606454604051630ea598cb60e41b8152600481018390526001600160a01b039091169063ea598cb0906024015f604051808303815f87803b158015610f60575f5ffd5b505af1158015610f72573d5f5f3e3d5ffd5b505050505b604080516001600160a01b03858116602483015260448083018590528351808403909101815260649092018352602080830180516001600160e01b031663a9059cbb60e01b17905283518085019094528084527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65649084015261063d92908516918691859185918591905f9061100f908490849061108e565b905080515f148061102f57508080602001905181019061102f91906112f8565b61063d5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016105aa565b606061074584845f85855f5f866001600160a01b031685876040516110b39190611422565b5f6040518083038185875af1925050503d805f81146110ed576040519150601f19603f3d011682016040523d82523d5f602084013e6110f2565b606091505b50915091506111038783838761110e565b979650505050505050565b6060831561117c5782515f03611175576001600160a01b0385163b6111755760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016105aa565b5081610745565b61074583838151156111915781518083602001fd5b8060405162461bcd60e51b81526004016105aa9190611285565b5f602082840312156111bb575f5ffd5b5035919050565b6001600160a01b03811681146111d6575f5ffd5b50565b5f5f604083850312156111ea575f5ffd5b82356111f5816111c2565b946020939093013593505050565b5f5f60408385031215611214575f5ffd5b823561121f816111c2565b9150602083013561122f816111c2565b809150509250929050565b5f6020828403121561124a575f5ffd5b8135611255816111c2565b9392505050565b60ff811681146111d6575f5ffd5b5f6020828403121561127a575f5ffd5b81356112558161125c565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b5f5f5f606084860312156112cc575f5ffd5b83356112d7816111c2565b925060208401356112e7816111c2565b929592945050506040919091013590565b5f60208284031215611308575f5ffd5b81518015158114611255575f5ffd5b634e487b7160e01b5f52601160045260245ffd5b8082018082111561064f5761064f611317565b8181038181111561064f5761064f611317565b808202811582820484141761064f5761064f611317565b5f8261138257634e487b7160e01b5f52601260045260245ffd5b500490565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b5f602082840312156113e5575f5ffd5b5051919050565b5f602082840312156113fc575f5ffd5b8151611255816111c2565b5f60208284031215611417575f5ffd5b81516112558161125c565b5f82518060208501845e5f92019182525091905056fe4261736520537472617465677920696d706c656d656e746174696f6e20746f20696e68657269742066726f6d20666f72206d6f726520636f6d706c657820696d706c656d656e746174696f6e73a26469706673582212204794c1422585f6a4511ce762465f8983be336de03796ce3647c1c2018cda2b7764736f6c634300081b0033", } // 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 e2995571cc..b2a1f90fff 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: "0x60556032600b8282823980515f1a607314602657634e487b7160e01b5f525f60045260245ffd5b305f52607381538281f3fe730000000000000000000000000000000000000000301460806040525f5ffdfea264697066735822122065de58e62fc0153ec81e59074101ab95f4a50a4dc9b195d91698d58ec6e19dcb64736f6c634300081b0033", + Bin: "0x60556032600b8282823980515f1a607314602657634e487b7160e01b5f525f60045260245ffd5b305f52607381538281f3fe730000000000000000000000000000000000000000301460806040525f5ffdfea2646970667358221220d31d5c2b691cbd0a659ac6a2d7575448cb9db5c1e8b20efb6f6fe9e398049e6b64736f6c634300081b0033", } // EndianABI 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 670d9dfcf5..b5d574db7f 100644 --- a/pkg/bindings/IStrategyManager/binding.go +++ b/pkg/bindings/IStrategyManager/binding.go @@ -31,7 +31,7 @@ var ( // IStrategyManagerMetaData contains all meta data concerning the IStrategyManager contract. var IStrategyManagerMetaData = &bind.MetaData{ - ABI: "[{\"type\":\"function\",\"name\":\"addShares\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"shares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"addStrategiesToDepositWhitelist\",\"inputs\":[{\"name\":\"strategiesToWhitelist\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"burnShares\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"calculateStrategyDepositDigestHash\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"nonce\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"delegation\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIDelegationManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"depositIntoStrategy\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"depositShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"depositIntoStrategyWithSignature\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"depositShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"getDeposits\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getStakerStrategyList\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"increaseBurnableShares\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"addedSharesToBurn\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"initialOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"initialStrategyWhitelister\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"initialPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"removeDepositShares\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"depositSharesToRemove\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"removeStrategiesFromDepositWhitelist\",\"inputs\":[{\"name\":\"strategiesToRemoveFromWhitelist\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setStrategyWhitelister\",\"inputs\":[{\"name\":\"newStrategyWhitelister\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"stakerDepositShares\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"shares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"stakerStrategyListLength\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"strategyIsWhitelistedForDeposit\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"strategyWhitelister\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"withdrawSharesAsTokens\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"shares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"BurnableSharesDecreased\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"shares\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BurnableSharesIncreased\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"shares\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Deposit\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"shares\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StrategyAddedToDepositWhitelist\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StrategyRemovedFromDepositWhitelist\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StrategyWhitelisterChanged\",\"inputs\":[{\"name\":\"previousAddress\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"newAddress\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"MaxStrategiesExceeded\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyDelegationManager\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyStrategyWhitelister\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SharesAmountTooHigh\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SharesAmountZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StakerAddressZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StrategyNotFound\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StrategyNotWhitelisted\",\"inputs\":[]}]", + ABI: "[{\"type\":\"function\",\"name\":\"addShares\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"shares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"addStrategiesToDepositWhitelist\",\"inputs\":[{\"name\":\"strategiesToWhitelist\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"burnShares\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"calculateStrategyDepositDigestHash\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"nonce\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"delegation\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIDelegationManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"depositIntoStrategy\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"depositShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"depositIntoStrategyWithSignature\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"depositShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"getBurnableShares\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getDeposits\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getStakerStrategyList\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getStrategiesWithBurnableShares\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"increaseBurnableShares\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"addedSharesToBurn\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"initialOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"initialStrategyWhitelister\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"initialPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"removeDepositShares\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"depositSharesToRemove\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"removeStrategiesFromDepositWhitelist\",\"inputs\":[{\"name\":\"strategiesToRemoveFromWhitelist\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setStrategyWhitelister\",\"inputs\":[{\"name\":\"newStrategyWhitelister\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"stakerDepositShares\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"shares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"stakerStrategyListLength\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"strategyIsWhitelistedForDeposit\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"strategyWhitelister\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"withdrawSharesAsTokens\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"shares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"BurnableSharesDecreased\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"shares\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BurnableSharesIncreased\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"shares\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Deposit\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"shares\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StrategyAddedToDepositWhitelist\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StrategyRemovedFromDepositWhitelist\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StrategyWhitelisterChanged\",\"inputs\":[{\"name\":\"previousAddress\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"newAddress\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"MaxStrategiesExceeded\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyDelegationManager\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyStrategyWhitelister\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SharesAmountTooHigh\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SharesAmountZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StakerAddressZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StrategyNotFound\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StrategyNotWhitelisted\",\"inputs\":[]}]", } // IStrategyManagerABI is the input ABI used to generate the binding from. @@ -242,6 +242,37 @@ func (_IStrategyManager *IStrategyManagerCallerSession) Delegation() (common.Add return _IStrategyManager.Contract.Delegation(&_IStrategyManager.CallOpts) } +// GetBurnableShares is a free data retrieval call binding the contract method 0xfd980423. +// +// Solidity: function getBurnableShares(address strategy) view returns(uint256) +func (_IStrategyManager *IStrategyManagerCaller) GetBurnableShares(opts *bind.CallOpts, strategy common.Address) (*big.Int, error) { + var out []interface{} + err := _IStrategyManager.contract.Call(opts, &out, "getBurnableShares", strategy) + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// GetBurnableShares is a free data retrieval call binding the contract method 0xfd980423. +// +// Solidity: function getBurnableShares(address strategy) view returns(uint256) +func (_IStrategyManager *IStrategyManagerSession) GetBurnableShares(strategy common.Address) (*big.Int, error) { + return _IStrategyManager.Contract.GetBurnableShares(&_IStrategyManager.CallOpts, strategy) +} + +// GetBurnableShares is a free data retrieval call binding the contract method 0xfd980423. +// +// Solidity: function getBurnableShares(address strategy) view returns(uint256) +func (_IStrategyManager *IStrategyManagerCallerSession) GetBurnableShares(strategy common.Address) (*big.Int, error) { + return _IStrategyManager.Contract.GetBurnableShares(&_IStrategyManager.CallOpts, strategy) +} + // GetDeposits is a free data retrieval call binding the contract method 0x94f649dd. // // Solidity: function getDeposits(address staker) view returns(address[], uint256[]) @@ -305,6 +336,38 @@ func (_IStrategyManager *IStrategyManagerCallerSession) GetStakerStrategyList(st return _IStrategyManager.Contract.GetStakerStrategyList(&_IStrategyManager.CallOpts, staker) } +// GetStrategiesWithBurnableShares is a free data retrieval call binding the contract method 0x36a8c500. +// +// Solidity: function getStrategiesWithBurnableShares() view returns(address[], uint256[]) +func (_IStrategyManager *IStrategyManagerCaller) GetStrategiesWithBurnableShares(opts *bind.CallOpts) ([]common.Address, []*big.Int, error) { + var out []interface{} + err := _IStrategyManager.contract.Call(opts, &out, "getStrategiesWithBurnableShares") + + if err != nil { + return *new([]common.Address), *new([]*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new([]common.Address)).(*[]common.Address) + out1 := *abi.ConvertType(out[1], new([]*big.Int)).(*[]*big.Int) + + return out0, out1, err + +} + +// GetStrategiesWithBurnableShares is a free data retrieval call binding the contract method 0x36a8c500. +// +// Solidity: function getStrategiesWithBurnableShares() view returns(address[], uint256[]) +func (_IStrategyManager *IStrategyManagerSession) GetStrategiesWithBurnableShares() ([]common.Address, []*big.Int, error) { + return _IStrategyManager.Contract.GetStrategiesWithBurnableShares(&_IStrategyManager.CallOpts) +} + +// GetStrategiesWithBurnableShares is a free data retrieval call binding the contract method 0x36a8c500. +// +// Solidity: function getStrategiesWithBurnableShares() view returns(address[], uint256[]) +func (_IStrategyManager *IStrategyManagerCallerSession) GetStrategiesWithBurnableShares() ([]common.Address, []*big.Int, error) { + return _IStrategyManager.Contract.GetStrategiesWithBurnableShares(&_IStrategyManager.CallOpts) +} + // StakerDepositShares is a free data retrieval call binding the contract method 0xfe243a17. // // Solidity: function stakerDepositShares(address user, address strategy) view returns(uint256 shares) diff --git a/pkg/bindings/Merkle/binding.go b/pkg/bindings/Merkle/binding.go index d1795f6605..0dc9f1d9c9 100644 --- a/pkg/bindings/Merkle/binding.go +++ b/pkg/bindings/Merkle/binding.go @@ -32,7 +32,7 @@ var ( // MerkleMetaData contains all meta data concerning the Merkle contract. var MerkleMetaData = &bind.MetaData{ ABI: "[{\"type\":\"error\",\"name\":\"InvalidProofLength\",\"inputs\":[]}]", - Bin: "0x60556032600b8282823980515f1a607314602657634e487b7160e01b5f525f60045260245ffd5b305f52607381538281f3fe730000000000000000000000000000000000000000301460806040525f5ffdfea26469706673582212208de82ea7f1a22cc126cdf4c3791b57f420fcc4ed980bdbddf119e15f4a112e8964736f6c634300081b0033", + Bin: "0x60556032600b8282823980515f1a607314602657634e487b7160e01b5f525f60045260245ffd5b305f52607381538281f3fe730000000000000000000000000000000000000000301460806040525f5ffdfea264697066735822122085b24342099ee34c979b25a8181cab47b19a7b5bb98497e7c396cfeef68fc84564736f6c634300081b0033", } // MerkleABI is the input ABI used to generate the binding from. diff --git a/pkg/bindings/OperatorSetLib/binding.go b/pkg/bindings/OperatorSetLib/binding.go index a48c2cefdd..6053888ada 100644 --- a/pkg/bindings/OperatorSetLib/binding.go +++ b/pkg/bindings/OperatorSetLib/binding.go @@ -32,7 +32,7 @@ var ( // OperatorSetLibMetaData contains all meta data concerning the OperatorSetLib contract. var OperatorSetLibMetaData = &bind.MetaData{ ABI: "[]", - Bin: "0x60556032600b8282823980515f1a607314602657634e487b7160e01b5f525f60045260245ffd5b305f52607381538281f3fe730000000000000000000000000000000000000000301460806040525f5ffdfea264697066735822122023e8e6cb91eee2d3c43ff6cfc219a624b12892e20fd5158ca2b4e1484806bb9c64736f6c634300081b0033", + Bin: "0x60556032600b8282823980515f1a607314602657634e487b7160e01b5f525f60045260245ffd5b305f52607381538281f3fe730000000000000000000000000000000000000000301460806040525f5ffdfea26469706673582212208e75671188dda11a78514701822a433b1e7210d9141d5e2911f793e717037afc64736f6c634300081b0033", } // OperatorSetLibABI is the input ABI used to generate the binding from. diff --git a/pkg/bindings/PauserRegistry/binding.go b/pkg/bindings/PauserRegistry/binding.go index a77ccb9e9d..1e8885e369 100644 --- a/pkg/bindings/PauserRegistry/binding.go +++ b/pkg/bindings/PauserRegistry/binding.go @@ -32,7 +32,7 @@ var ( // PauserRegistryMetaData contains all meta data concerning the PauserRegistry contract. var PauserRegistryMetaData = &bind.MetaData{ ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"_pausers\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"_unpauser\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"isPauser\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"setIsPauser\",\"inputs\":[{\"name\":\"newPauser\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"canPause\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setUnpauser\",\"inputs\":[{\"name\":\"newUnpauser\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unpauser\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"event\",\"name\":\"PauserStatusChanged\",\"inputs\":[{\"name\":\"pauser\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"canPause\",\"type\":\"bool\",\"indexed\":false,\"internalType\":\"bool\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"UnpauserChanged\",\"inputs\":[{\"name\":\"previousUnpauser\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"newUnpauser\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"InputAddressZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyUnpauser\",\"inputs\":[]}]", - Bin: "0x608060405234801561000f575f5ffd5b506040516105c83803806105c883398101604081905261002e916101c2565b5f5b825181101561006b5761006383828151811061004e5761004e61029e565b6020026020010151600161007c60201b60201c565b600101610030565b5061007581610103565b50506102b2565b6001600160a01b0382166100a3576040516339b190bb60e11b815260040160405180910390fd5b6001600160a01b0382165f8181526020818152604091829020805460ff19168515159081179091558251938452908301527f65d3a1fd4c13f05cba164f80d03ce90fb4b5e21946bfc3ab7dbd434c2d0b9152910160405180910390a15050565b6001600160a01b03811661012a576040516339b190bb60e11b815260040160405180910390fd5b600154604080516001600160a01b03928316815291831660208301527f06b4167a2528887a1e97a366eefe8549bfbf1ea3e6ac81cb2564a934d20e8892910160405180910390a1600180546001600160a01b0319166001600160a01b0392909216919091179055565b634e487b7160e01b5f52604160045260245ffd5b80516001600160a01b03811681146101bd575f5ffd5b919050565b5f5f604083850312156101d3575f5ffd5b82516001600160401b038111156101e8575f5ffd5b8301601f810185136101f8575f5ffd5b80516001600160401b0381111561021157610211610193565b604051600582901b90603f8201601f191681016001600160401b038111828210171561023f5761023f610193565b60405291825260208184018101929081018884111561025c575f5ffd5b6020850194505b8385101561028257610274856101a7565b815260209485019401610263565b50945061029592505050602084016101a7565b90509250929050565b634e487b7160e01b5f52603260045260245ffd5b610309806102bf5f395ff3fe608060405234801561000f575f5ffd5b506004361061004a575f3560e01c806346fbf68e1461004e5780638568520614610085578063ce5484281461009a578063eab66d7a146100ad575b5f5ffd5b61007061005c36600461027a565b5f6020819052908152604090205460ff1681565b60405190151581526020015b60405180910390f35b61009861009336600461029a565b6100d8565b005b6100986100a836600461027a565b610111565b6001546100c0906001600160a01b031681565b6040516001600160a01b03909116815260200161007c565b6001546001600160a01b031633146101035760405163794821ff60e01b815260040160405180910390fd5b61010d8282610148565b5050565b6001546001600160a01b0316331461013c5760405163794821ff60e01b815260040160405180910390fd5b610145816101cf565b50565b6001600160a01b03821661016f576040516339b190bb60e11b815260040160405180910390fd5b6001600160a01b0382165f8181526020818152604091829020805460ff19168515159081179091558251938452908301527f65d3a1fd4c13f05cba164f80d03ce90fb4b5e21946bfc3ab7dbd434c2d0b9152910160405180910390a15050565b6001600160a01b0381166101f6576040516339b190bb60e11b815260040160405180910390fd5b600154604080516001600160a01b03928316815291831660208301527f06b4167a2528887a1e97a366eefe8549bfbf1ea3e6ac81cb2564a934d20e8892910160405180910390a1600180546001600160a01b0319166001600160a01b0392909216919091179055565b80356001600160a01b0381168114610275575f5ffd5b919050565b5f6020828403121561028a575f5ffd5b6102938261025f565b9392505050565b5f5f604083850312156102ab575f5ffd5b6102b48361025f565b9150602083013580151581146102c8575f5ffd5b80915050925092905056fea264697066735822122009d8ba5b235f31c96a07127caff39f4f0438590d75b714b9d6de67448091f19864736f6c634300081b0033", + Bin: "0x608060405234801561000f575f5ffd5b506040516105c83803806105c883398101604081905261002e916101c2565b5f5b825181101561006b5761006383828151811061004e5761004e61029e565b6020026020010151600161007c60201b60201c565b600101610030565b5061007581610103565b50506102b2565b6001600160a01b0382166100a3576040516339b190bb60e11b815260040160405180910390fd5b6001600160a01b0382165f8181526020818152604091829020805460ff19168515159081179091558251938452908301527f65d3a1fd4c13f05cba164f80d03ce90fb4b5e21946bfc3ab7dbd434c2d0b9152910160405180910390a15050565b6001600160a01b03811661012a576040516339b190bb60e11b815260040160405180910390fd5b600154604080516001600160a01b03928316815291831660208301527f06b4167a2528887a1e97a366eefe8549bfbf1ea3e6ac81cb2564a934d20e8892910160405180910390a1600180546001600160a01b0319166001600160a01b0392909216919091179055565b634e487b7160e01b5f52604160045260245ffd5b80516001600160a01b03811681146101bd575f5ffd5b919050565b5f5f604083850312156101d3575f5ffd5b82516001600160401b038111156101e8575f5ffd5b8301601f810185136101f8575f5ffd5b80516001600160401b0381111561021157610211610193565b604051600582901b90603f8201601f191681016001600160401b038111828210171561023f5761023f610193565b60405291825260208184018101929081018884111561025c575f5ffd5b6020850194505b8385101561028257610274856101a7565b815260209485019401610263565b50945061029592505050602084016101a7565b90509250929050565b634e487b7160e01b5f52603260045260245ffd5b610309806102bf5f395ff3fe608060405234801561000f575f5ffd5b506004361061004a575f3560e01c806346fbf68e1461004e5780638568520614610085578063ce5484281461009a578063eab66d7a146100ad575b5f5ffd5b61007061005c36600461027a565b5f6020819052908152604090205460ff1681565b60405190151581526020015b60405180910390f35b61009861009336600461029a565b6100d8565b005b6100986100a836600461027a565b610111565b6001546100c0906001600160a01b031681565b6040516001600160a01b03909116815260200161007c565b6001546001600160a01b031633146101035760405163794821ff60e01b815260040160405180910390fd5b61010d8282610148565b5050565b6001546001600160a01b0316331461013c5760405163794821ff60e01b815260040160405180910390fd5b610145816101cf565b50565b6001600160a01b03821661016f576040516339b190bb60e11b815260040160405180910390fd5b6001600160a01b0382165f8181526020818152604091829020805460ff19168515159081179091558251938452908301527f65d3a1fd4c13f05cba164f80d03ce90fb4b5e21946bfc3ab7dbd434c2d0b9152910160405180910390a15050565b6001600160a01b0381166101f6576040516339b190bb60e11b815260040160405180910390fd5b600154604080516001600160a01b03928316815291831660208301527f06b4167a2528887a1e97a366eefe8549bfbf1ea3e6ac81cb2564a934d20e8892910160405180910390a1600180546001600160a01b0319166001600160a01b0392909216919091179055565b80356001600160a01b0381168114610275575f5ffd5b919050565b5f6020828403121561028a575f5ffd5b6102938261025f565b9392505050565b5f5f604083850312156102ab575f5ffd5b6102b48361025f565b9150602083013580151581146102c8575f5ffd5b80915050925092905056fea2646970667358221220db74dd8a1c2636fc45fee53a0fefff90f86f0498901cb732dc4c0ce26247557164736f6c634300081b0033", } // PauserRegistryABI is the input ABI used to generate the binding from. diff --git a/pkg/bindings/PermissionController/binding.go b/pkg/bindings/PermissionController/binding.go index 21f037d593..42053b7097 100644 --- a/pkg/bindings/PermissionController/binding.go +++ b/pkg/bindings/PermissionController/binding.go @@ -32,7 +32,7 @@ var ( // PermissionControllerMetaData contains all meta data concerning the PermissionController contract. var PermissionControllerMetaData = &bind.MetaData{ ABI: "[{\"type\":\"constructor\",\"inputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"acceptAdmin\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"addPendingAdmin\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"admin\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"canCall\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"caller\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"target\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"selector\",\"type\":\"bytes4\",\"internalType\":\"bytes4\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAdmins\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAppointeePermissions\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"appointee\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"\",\"type\":\"bytes4[]\",\"internalType\":\"bytes4[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAppointees\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"target\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"selector\",\"type\":\"bytes4\",\"internalType\":\"bytes4\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getPendingAdmins\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isAdmin\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"caller\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isPendingAdmin\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"pendingAdmin\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"removeAdmin\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"admin\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"removeAppointee\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"appointee\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"target\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"selector\",\"type\":\"bytes4\",\"internalType\":\"bytes4\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"removePendingAdmin\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"admin\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setAppointee\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"appointee\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"target\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"selector\",\"type\":\"bytes4\",\"internalType\":\"bytes4\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"AdminRemoved\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"admin\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"AdminSet\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"admin\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"AppointeeRemoved\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"appointee\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"target\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"selector\",\"type\":\"bytes4\",\"indexed\":false,\"internalType\":\"bytes4\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"AppointeeSet\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"appointee\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"target\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"selector\",\"type\":\"bytes4\",\"indexed\":false,\"internalType\":\"bytes4\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"PendingAdminAdded\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"admin\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"PendingAdminRemoved\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"admin\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"AdminAlreadyPending\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"AdminAlreadySet\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"AdminNotPending\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"AdminNotSet\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"AppointeeAlreadySet\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"AppointeeNotSet\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"CannotHaveZeroAdmins\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotAdmin\",\"inputs\":[]}]", - Bin: "0x6080604052348015600e575f5ffd5b5060156019565b60d3565b5f54610100900460ff161560835760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff9081161460d1575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b610f40806100e05f395ff3fe608060405234801561000f575f5ffd5b50600436106100cb575f3560e01c80639100674511610088578063ad8aca7711610063578063ad8aca77146101b0578063df595cb8146101c3578063eb5a4e87146101d6578063fddbdefd146101e9575f5ffd5b80639100674514610167578063950d806e1461018a578063ad5f22101461019d575f5ffd5b806306641201146100cf578063268959e5146100e45780634f906cf9146100f7578063628806ef1461010a5780636bddfa1f1461011d578063882a3b3814610146575b5f5ffd5b6100e26100dd366004610cfa565b6101fc565b005b6100e26100f2366004610d4b565b61031d565b6100e2610105366004610d4b565b6103f8565b6100e2610118366004610d7c565b61049b565b61013061012b366004610d7c565b610529565b60405161013d9190610dd8565b60405180910390f35b610159610154366004610d4b565b610552565b60405161013d929190610dea565b61017a610175366004610d4b565b6106b3565b604051901515815260200161013d565b6100e2610198366004610cfa565b610723565b6101306101ab366004610d7c565b610834565b61017a6101be366004610d4b565b6108da565b61017a6101d1366004610cfa565b6108fb565b6100e26101e4366004610d4b565b610950565b6101306101f7366004610e4c565b610a1e565b8361020781336106b3565b61022457604051637bfa4b9f60e01b815260040160405180910390fd5b6001600160a01b0385165f908152600160205260408120906102468585610a5c565b6001600160a01b0387165f908152600484016020526040902090915061026c9082610a89565b6102895760405163262118cd60e01b815260040160405180910390fd5b6001600160a01b0386165f90815260048301602052604090206102ac9082610aa0565b505f81815260058301602052604090206102c69087610aab565b50856001600160a01b0316876001600160a01b03167f18242326b6b862126970679759169f01f646bd55ec5bfcab85ba9f337a74e0c6878760405161030c929190610e8c565b60405180910390a350505050505050565b8161032881336106b3565b61034557604051637bfa4b9f60e01b815260040160405180910390fd5b6001600160a01b0383165f9081526001602081905260409091206002019061036c82610abf565b1161038a576040516310ce892b60e31b815260040160405180910390fd5b6103948184610aab565b6103b157604051630716d81b60e51b815260040160405180910390fd5b6040516001600160a01b0384811682528516907fdb9d5d31320daf5bc7181d565b6da4d12e30f0f4d5aa324a992426c14a1d19ce906020015b60405180910390a250505050565b8161040381336106b3565b61042057604051637bfa4b9f60e01b815260040160405180910390fd5b6001600160a01b0383165f9081526001602052604090206104418184610aab565b61045e5760405163bed8295f60e01b815260040160405180910390fd5b6040516001600160a01b0384811682528516907fd706ed7ae044d795b49e54c9f519f663053951011985f663a862cd9ee72a9ac7906020016103ea565b6001600160a01b0381165f9081526001602052604090206104bc8133610aab565b6104d95760405163bed8295f60e01b815260040160405180910390fd5b6104e66002820133610ac8565b506040513381526001600160a01b038316907fbf265e8326285a2747e33e54d5945f7111f2b5edb826eb8c08d4677779b3ff979060200160405180910390a25050565b6001600160a01b0381165f90815260016020526040902060609061054c90610adc565b92915050565b6001600160a01b038083165f90815260016020908152604080832093851683526004909301905290812060609182919061058b82610abf565b90505f8167ffffffffffffffff8111156105a7576105a7610eaf565b6040519080825280602002602001820160405280156105d0578160200160208202803683370190505b5090505f8267ffffffffffffffff8111156105ed576105ed610eaf565b604051908082528060200260200182016040528015610616578160200160208202803683370190505b5090505f5b838110156106a5576106496106308683610ae8565b606081901c9160a09190911b6001600160e01b03191690565b84838151811061065b5761065b610ec3565b6020026020010184848151811061067457610674610ec3565b6001600160e01b0319909316602093840291909101909201919091526001600160a01b03909116905260010161061b565b509097909650945050505050565b6001600160a01b0382165f9081526001602052604081206106d690600201610abf565b5f036106f857816001600160a01b0316836001600160a01b031614905061054c565b6001600160a01b0383165f90815260016020526040902061071c9060020183610af3565b9392505050565b8361072e81336106b3565b61074b57604051637bfa4b9f60e01b815260040160405180910390fd5b6001600160a01b0385165f9081526001602052604081209061076d8585610a5c565b6001600160a01b0387165f90815260048401602052604090209091506107939082610a89565b156107b15760405163ad8efeb760e01b815260040160405180910390fd5b6001600160a01b0386165f90815260048301602052604090206107d49082610b14565b505f81815260058301602052604090206107ee9087610ac8565b50856001600160a01b0316876001600160a01b03167f037f03a2ad6b967df4a01779b6d2b4c85950df83925d9e31362b519422fc0169878760405161030c929190610e8c565b6001600160a01b0381165f90815260016020526040902060609061085a90600201610abf565b5f036108b2576040805160018082528183019092525f916020808301908036833701905050905082815f8151811061089457610894610ec3565b6001600160a01b039092166020928302919091019091015292915050565b6001600160a01b0382165f90815260016020526040902061054c90600201610adc565b919050565b6001600160a01b0382165f90815260016020526040812061071c9083610af3565b5f61090685856106b3565b8061094757506109476109198484610a5c565b6001600160a01b038088165f908152600160209081526040808320938a168352600490930190522090610a89565b95945050505050565b8161095b81336106b3565b61097857604051637bfa4b9f60e01b815260040160405180910390fd5b6001600160a01b0383165f90815260016020526040902061099c6002820184610af3565b156109ba5760405163130160e560e31b815260040160405180910390fd5b6109c48184610ac8565b6109e1576040516319abede360e11b815260040160405180910390fd5b6040516001600160a01b0384811682528516907fb14b9a3d448c5b04f0e5b087b6f5193390db7955482a6ffb841e7b3ba61a460c906020016103ea565b60605f610a2b8484610a5c565b6001600160a01b0386165f908152600160209081526040808320848452600501909152902090915061094790610adc565b60609190911b6bffffffffffffffffffffffff191660a09190911c6bffffffff0000000000000000161790565b5f818152600183016020526040812054151561071c565b5f61071c8383610b1f565b5f61071c836001600160a01b038416610b1f565b5f61054c825490565b5f61071c836001600160a01b038416610c02565b60605f61071c83610c4e565b5f61071c8383610ca7565b6001600160a01b0381165f908152600183016020526040812054151561071c565b5f61071c8383610c02565b5f8181526001830160205260408120548015610bf9575f610b41600183610ed7565b85549091505f90610b5490600190610ed7565b9050818114610bb3575f865f018281548110610b7257610b72610ec3565b905f5260205f200154905080875f018481548110610b9257610b92610ec3565b5f918252602080832090910192909255918252600188019052604090208390555b8554869080610bc457610bc4610ef6565b600190038181905f5260205f20015f90559055856001015f8681526020019081526020015f205f90556001935050505061054c565b5f91505061054c565b5f818152600183016020526040812054610c4757508154600181810184555f84815260208082209093018490558454848252828601909352604090209190915561054c565b505f61054c565b6060815f01805480602002602001604051908101604052809291908181526020018280548015610c9b57602002820191905f5260205f20905b815481526020019060010190808311610c87575b50505050509050919050565b5f825f018281548110610cbc57610cbc610ec3565b905f5260205f200154905092915050565b80356001600160a01b03811681146108d5575f5ffd5b80356001600160e01b0319811681146108d5575f5ffd5b5f5f5f5f60808587031215610d0d575f5ffd5b610d1685610ccd565b9350610d2460208601610ccd565b9250610d3260408601610ccd565b9150610d4060608601610ce3565b905092959194509250565b5f5f60408385031215610d5c575f5ffd5b610d6583610ccd565b9150610d7360208401610ccd565b90509250929050565b5f60208284031215610d8c575f5ffd5b61071c82610ccd565b5f8151808452602084019350602083015f5b82811015610dce5781516001600160a01b0316865260209586019590910190600101610da7565b5093949350505050565b602081525f61071c6020830184610d95565b604081525f610dfc6040830185610d95565b82810360208401528084518083526020830191506020860192505f5b81811015610e405783516001600160e01b031916835260209384019390920191600101610e18565b50909695505050505050565b5f5f5f60608486031215610e5e575f5ffd5b610e6784610ccd565b9250610e7560208501610ccd565b9150610e8360408501610ce3565b90509250925092565b6001600160a01b039290921682526001600160e01b031916602082015260400190565b634e487b7160e01b5f52604160045260245ffd5b634e487b7160e01b5f52603260045260245ffd5b8181038181111561054c57634e487b7160e01b5f52601160045260245ffd5b634e487b7160e01b5f52603160045260245ffdfea2646970667358221220b63ce7fd361f505a43fbbc1e192d669b57efb369c86636afa2dd2f0c28075a1264736f6c634300081b0033", + Bin: "0x6080604052348015600e575f5ffd5b5060156019565b60d3565b5f54610100900460ff161560835760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff9081161460d1575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b610f40806100e05f395ff3fe608060405234801561000f575f5ffd5b50600436106100cb575f3560e01c80639100674511610088578063ad8aca7711610063578063ad8aca77146101b0578063df595cb8146101c3578063eb5a4e87146101d6578063fddbdefd146101e9575f5ffd5b80639100674514610167578063950d806e1461018a578063ad5f22101461019d575f5ffd5b806306641201146100cf578063268959e5146100e45780634f906cf9146100f7578063628806ef1461010a5780636bddfa1f1461011d578063882a3b3814610146575b5f5ffd5b6100e26100dd366004610cfa565b6101fc565b005b6100e26100f2366004610d4b565b61031d565b6100e2610105366004610d4b565b6103f8565b6100e2610118366004610d7c565b61049b565b61013061012b366004610d7c565b610529565b60405161013d9190610dd8565b60405180910390f35b610159610154366004610d4b565b610552565b60405161013d929190610dea565b61017a610175366004610d4b565b6106b3565b604051901515815260200161013d565b6100e2610198366004610cfa565b610723565b6101306101ab366004610d7c565b610834565b61017a6101be366004610d4b565b6108da565b61017a6101d1366004610cfa565b6108fb565b6100e26101e4366004610d4b565b610950565b6101306101f7366004610e4c565b610a1e565b8361020781336106b3565b61022457604051637bfa4b9f60e01b815260040160405180910390fd5b6001600160a01b0385165f908152600160205260408120906102468585610a5c565b6001600160a01b0387165f908152600484016020526040902090915061026c9082610a89565b6102895760405163262118cd60e01b815260040160405180910390fd5b6001600160a01b0386165f90815260048301602052604090206102ac9082610aa0565b505f81815260058301602052604090206102c69087610aab565b50856001600160a01b0316876001600160a01b03167f18242326b6b862126970679759169f01f646bd55ec5bfcab85ba9f337a74e0c6878760405161030c929190610e8c565b60405180910390a350505050505050565b8161032881336106b3565b61034557604051637bfa4b9f60e01b815260040160405180910390fd5b6001600160a01b0383165f9081526001602081905260409091206002019061036c82610abf565b1161038a576040516310ce892b60e31b815260040160405180910390fd5b6103948184610aab565b6103b157604051630716d81b60e51b815260040160405180910390fd5b6040516001600160a01b0384811682528516907fdb9d5d31320daf5bc7181d565b6da4d12e30f0f4d5aa324a992426c14a1d19ce906020015b60405180910390a250505050565b8161040381336106b3565b61042057604051637bfa4b9f60e01b815260040160405180910390fd5b6001600160a01b0383165f9081526001602052604090206104418184610aab565b61045e5760405163bed8295f60e01b815260040160405180910390fd5b6040516001600160a01b0384811682528516907fd706ed7ae044d795b49e54c9f519f663053951011985f663a862cd9ee72a9ac7906020016103ea565b6001600160a01b0381165f9081526001602052604090206104bc8133610aab565b6104d95760405163bed8295f60e01b815260040160405180910390fd5b6104e66002820133610ac8565b506040513381526001600160a01b038316907fbf265e8326285a2747e33e54d5945f7111f2b5edb826eb8c08d4677779b3ff979060200160405180910390a25050565b6001600160a01b0381165f90815260016020526040902060609061054c90610adc565b92915050565b6001600160a01b038083165f90815260016020908152604080832093851683526004909301905290812060609182919061058b82610abf565b90505f8167ffffffffffffffff8111156105a7576105a7610eaf565b6040519080825280602002602001820160405280156105d0578160200160208202803683370190505b5090505f8267ffffffffffffffff8111156105ed576105ed610eaf565b604051908082528060200260200182016040528015610616578160200160208202803683370190505b5090505f5b838110156106a5576106496106308683610ae8565b606081901c9160a09190911b6001600160e01b03191690565b84838151811061065b5761065b610ec3565b6020026020010184848151811061067457610674610ec3565b6001600160e01b0319909316602093840291909101909201919091526001600160a01b03909116905260010161061b565b509097909650945050505050565b6001600160a01b0382165f9081526001602052604081206106d690600201610abf565b5f036106f857816001600160a01b0316836001600160a01b031614905061054c565b6001600160a01b0383165f90815260016020526040902061071c9060020183610af3565b9392505050565b8361072e81336106b3565b61074b57604051637bfa4b9f60e01b815260040160405180910390fd5b6001600160a01b0385165f9081526001602052604081209061076d8585610a5c565b6001600160a01b0387165f90815260048401602052604090209091506107939082610a89565b156107b15760405163ad8efeb760e01b815260040160405180910390fd5b6001600160a01b0386165f90815260048301602052604090206107d49082610b14565b505f81815260058301602052604090206107ee9087610ac8565b50856001600160a01b0316876001600160a01b03167f037f03a2ad6b967df4a01779b6d2b4c85950df83925d9e31362b519422fc0169878760405161030c929190610e8c565b6001600160a01b0381165f90815260016020526040902060609061085a90600201610abf565b5f036108b2576040805160018082528183019092525f916020808301908036833701905050905082815f8151811061089457610894610ec3565b6001600160a01b039092166020928302919091019091015292915050565b6001600160a01b0382165f90815260016020526040902061054c90600201610adc565b919050565b6001600160a01b0382165f90815260016020526040812061071c9083610af3565b5f61090685856106b3565b8061094757506109476109198484610a5c565b6001600160a01b038088165f908152600160209081526040808320938a168352600490930190522090610a89565b95945050505050565b8161095b81336106b3565b61097857604051637bfa4b9f60e01b815260040160405180910390fd5b6001600160a01b0383165f90815260016020526040902061099c6002820184610af3565b156109ba5760405163130160e560e31b815260040160405180910390fd5b6109c48184610ac8565b6109e1576040516319abede360e11b815260040160405180910390fd5b6040516001600160a01b0384811682528516907fb14b9a3d448c5b04f0e5b087b6f5193390db7955482a6ffb841e7b3ba61a460c906020016103ea565b60605f610a2b8484610a5c565b6001600160a01b0386165f908152600160209081526040808320848452600501909152902090915061094790610adc565b60609190911b6bffffffffffffffffffffffff191660a09190911c6bffffffff0000000000000000161790565b5f818152600183016020526040812054151561071c565b5f61071c8383610b1f565b5f61071c836001600160a01b038416610b1f565b5f61054c825490565b5f61071c836001600160a01b038416610c02565b60605f61071c83610c4e565b5f61071c8383610ca7565b6001600160a01b0381165f908152600183016020526040812054151561071c565b5f61071c8383610c02565b5f8181526001830160205260408120548015610bf9575f610b41600183610ed7565b85549091505f90610b5490600190610ed7565b9050818114610bb3575f865f018281548110610b7257610b72610ec3565b905f5260205f200154905080875f018481548110610b9257610b92610ec3565b5f918252602080832090910192909255918252600188019052604090208390555b8554869080610bc457610bc4610ef6565b600190038181905f5260205f20015f90559055856001015f8681526020019081526020015f205f90556001935050505061054c565b5f91505061054c565b5f818152600183016020526040812054610c4757508154600181810184555f84815260208082209093018490558454848252828601909352604090209190915561054c565b505f61054c565b6060815f01805480602002602001604051908101604052809291908181526020018280548015610c9b57602002820191905f5260205f20905b815481526020019060010190808311610c87575b50505050509050919050565b5f825f018281548110610cbc57610cbc610ec3565b905f5260205f200154905092915050565b80356001600160a01b03811681146108d5575f5ffd5b80356001600160e01b0319811681146108d5575f5ffd5b5f5f5f5f60808587031215610d0d575f5ffd5b610d1685610ccd565b9350610d2460208601610ccd565b9250610d3260408601610ccd565b9150610d4060608601610ce3565b905092959194509250565b5f5f60408385031215610d5c575f5ffd5b610d6583610ccd565b9150610d7360208401610ccd565b90509250929050565b5f60208284031215610d8c575f5ffd5b61071c82610ccd565b5f8151808452602084019350602083015f5b82811015610dce5781516001600160a01b0316865260209586019590910190600101610da7565b5093949350505050565b602081525f61071c6020830184610d95565b604081525f610dfc6040830185610d95565b82810360208401528084518083526020830191506020860192505f5b81811015610e405783516001600160e01b031916835260209384019390920191600101610e18565b50909695505050505050565b5f5f5f60608486031215610e5e575f5ffd5b610e6784610ccd565b9250610e7560208501610ccd565b9150610e8360408501610ce3565b90509250925092565b6001600160a01b039290921682526001600160e01b031916602082015260400190565b634e487b7160e01b5f52604160045260245ffd5b634e487b7160e01b5f52603260045260245ffd5b8181038181111561054c57634e487b7160e01b5f52601160045260245ffd5b634e487b7160e01b5f52603160045260245ffdfea2646970667358221220d51174d6b3c524ff4f2a28349f859cd925e5fb8f0c1cd6c178158e9059cdc26c64736f6c634300081b0033", } // PermissionControllerABI 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 491ad3fa54..80d435d426 100644 --- a/pkg/bindings/RewardsCoordinator/binding.go +++ b/pkg/bindings/RewardsCoordinator/binding.go @@ -105,6 +105,7 @@ var RewardsCoordinatorMetaData = &bind.MetaData{ ======= ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"_delegationManager\",\"type\":\"address\",\"internalType\":\"contractIDelegationManager\"},{\"name\":\"_strategyManager\",\"type\":\"address\",\"internalType\":\"contractIStrategyManager\"},{\"name\":\"_allocationManager\",\"type\":\"address\",\"internalType\":\"contractIAllocationManager\"},{\"name\":\"_pauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"},{\"name\":\"_permissionController\",\"type\":\"address\",\"internalType\":\"contractIPermissionController\"},{\"name\":\"_CALCULATION_INTERVAL_SECONDS\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"_MAX_REWARDS_DURATION\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"_MAX_RETROACTIVE_LENGTH\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"_MAX_FUTURE_LENGTH\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"_GENESIS_REWARDS_TIMESTAMP\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"CALCULATION_INTERVAL_SECONDS\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"GENESIS_REWARDS_TIMESTAMP\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAX_FUTURE_LENGTH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAX_RETROACTIVE_LENGTH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAX_REWARDS_DURATION\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activationDelay\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"allocationManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIAllocationManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"beaconChainETHStrategy\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"calculateEarnerLeafHash\",\"inputs\":[{\"name\":\"leaf\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinatorTypes.EarnerTreeMerkleLeaf\",\"components\":[{\"name\":\"earner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"earnerTokenRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"calculateTokenLeafHash\",\"inputs\":[{\"name\":\"leaf\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinatorTypes.TokenTreeMerkleLeaf\",\"components\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"cumulativeEarnings\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"checkClaim\",\"inputs\":[{\"name\":\"claim\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinatorTypes.RewardsMerkleClaim\",\"components\":[{\"name\":\"rootIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"earnerIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"earnerTreeProof\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"earnerLeaf\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinatorTypes.EarnerTreeMerkleLeaf\",\"components\":[{\"name\":\"earner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"earnerTokenRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"tokenIndices\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"},{\"name\":\"tokenTreeProofs\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"},{\"name\":\"tokenLeaves\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.TokenTreeMerkleLeaf[]\",\"components\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"cumulativeEarnings\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"claimerFor\",\"inputs\":[{\"name\":\"earner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"claimer\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"createAVSRewardsSubmission\",\"inputs\":[{\"name\":\"rewardsSubmissions\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.RewardsSubmission[]\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.StrategyAndMultiplier[]\",\"components\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"multiplier\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"duration\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"createOperatorDirectedAVSRewardsSubmission\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorDirectedRewardsSubmissions\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.OperatorDirectedRewardsSubmission[]\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.StrategyAndMultiplier[]\",\"components\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"multiplier\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"operatorRewards\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.OperatorReward[]\",\"components\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"startTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"duration\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"description\",\"type\":\"string\",\"internalType\":\"string\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"createRewardsForAllEarners\",\"inputs\":[{\"name\":\"rewardsSubmissions\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.RewardsSubmission[]\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.StrategyAndMultiplier[]\",\"components\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"multiplier\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"duration\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"createRewardsForAllSubmission\",\"inputs\":[{\"name\":\"rewardsSubmissions\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.RewardsSubmission[]\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.StrategyAndMultiplier[]\",\"components\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"multiplier\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"duration\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"cumulativeClaimed\",\"inputs\":[{\"name\":\"earner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"outputs\":[{\"name\":\"totalClaimed\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"currRewardsCalculationEndTimestamp\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"defaultOperatorSplitBips\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"delegationManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIDelegationManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"disableRoot\",\"inputs\":[{\"name\":\"rootIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"getCurrentClaimableDistributionRoot\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinatorTypes.DistributionRoot\",\"components\":[{\"name\":\"root\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"rewardsCalculationEndTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"activatedAt\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"disabled\",\"type\":\"bool\",\"internalType\":\"bool\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getCurrentDistributionRoot\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinatorTypes.DistributionRoot\",\"components\":[{\"name\":\"root\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"rewardsCalculationEndTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"activatedAt\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"disabled\",\"type\":\"bool\",\"internalType\":\"bool\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getDistributionRootAtIndex\",\"inputs\":[{\"name\":\"index\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinatorTypes.DistributionRoot\",\"components\":[{\"name\":\"root\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"rewardsCalculationEndTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"activatedAt\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"disabled\",\"type\":\"bool\",\"internalType\":\"bool\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getDistributionRootsLength\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getOperatorAVSSplit\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getOperatorPISplit\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getRootIndexFromHash\",\"inputs\":[{\"name\":\"rootHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"initialOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"initialPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_rewardsUpdater\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_activationDelay\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"_defaultSplitBips\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"isAVSRewardsSubmissionHash\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"hash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"valid\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isOperatorDirectedAVSRewardsSubmissionHash\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isRewardsForAllSubmitter\",\"inputs\":[{\"name\":\"submitter\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"valid\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isRewardsSubmissionForAllEarnersHash\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"hash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"valid\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isRewardsSubmissionForAllHash\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"hash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"valid\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"pauseAll\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[{\"name\":\"index\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pauserRegistry\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"permissionController\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIPermissionController\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"processClaim\",\"inputs\":[{\"name\":\"claim\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinatorTypes.RewardsMerkleClaim\",\"components\":[{\"name\":\"rootIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"earnerIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"earnerTreeProof\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"earnerLeaf\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinatorTypes.EarnerTreeMerkleLeaf\",\"components\":[{\"name\":\"earner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"earnerTokenRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"tokenIndices\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"},{\"name\":\"tokenTreeProofs\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"},{\"name\":\"tokenLeaves\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.TokenTreeMerkleLeaf[]\",\"components\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"cumulativeEarnings\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}]},{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"processClaims\",\"inputs\":[{\"name\":\"claims\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.RewardsMerkleClaim[]\",\"components\":[{\"name\":\"rootIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"earnerIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"earnerTreeProof\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"earnerLeaf\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinatorTypes.EarnerTreeMerkleLeaf\",\"components\":[{\"name\":\"earner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"earnerTokenRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"tokenIndices\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"},{\"name\":\"tokenTreeProofs\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"},{\"name\":\"tokenLeaves\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.TokenTreeMerkleLeaf[]\",\"components\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"cumulativeEarnings\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}]},{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"rewardsUpdater\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"setActivationDelay\",\"inputs\":[{\"name\":\"_activationDelay\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setClaimerFor\",\"inputs\":[{\"name\":\"claimer\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setClaimerFor\",\"inputs\":[{\"name\":\"earner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"claimer\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setDefaultOperatorSplit\",\"inputs\":[{\"name\":\"split\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setOperatorAVSSplit\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"split\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setOperatorPISplit\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"split\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setRewardsForAllSubmitter\",\"inputs\":[{\"name\":\"_submitter\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_newValue\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setRewardsUpdater\",\"inputs\":[{\"name\":\"_rewardsUpdater\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"strategyManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategyManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"submissionNonce\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"nonce\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"submitRoot\",\"inputs\":[{\"name\":\"root\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"rewardsCalculationEndTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"AVSRewardsSubmissionCreated\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"submissionNonce\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"rewardsSubmissionHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"rewardsSubmission\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIRewardsCoordinatorTypes.RewardsSubmission\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.StrategyAndMultiplier[]\",\"components\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"multiplier\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"duration\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ActivationDelaySet\",\"inputs\":[{\"name\":\"oldActivationDelay\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"},{\"name\":\"newActivationDelay\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ClaimerForSet\",\"inputs\":[{\"name\":\"earner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"oldClaimer\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"claimer\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DefaultOperatorSplitBipsSet\",\"inputs\":[{\"name\":\"oldDefaultOperatorSplitBips\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"},{\"name\":\"newDefaultOperatorSplitBips\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DistributionRootDisabled\",\"inputs\":[{\"name\":\"rootIndex\",\"type\":\"uint32\",\"indexed\":true,\"internalType\":\"uint32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DistributionRootSubmitted\",\"inputs\":[{\"name\":\"rootIndex\",\"type\":\"uint32\",\"indexed\":true,\"internalType\":\"uint32\"},{\"name\":\"root\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"rewardsCalculationEndTimestamp\",\"type\":\"uint32\",\"indexed\":true,\"internalType\":\"uint32\"},{\"name\":\"activatedAt\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorAVSSplitBipsSet\",\"inputs\":[{\"name\":\"caller\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"avs\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"activatedAt\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"},{\"name\":\"oldOperatorAVSSplitBips\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"},{\"name\":\"newOperatorAVSSplitBips\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorDirectedAVSRewardsSubmissionCreated\",\"inputs\":[{\"name\":\"caller\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"avs\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"operatorDirectedRewardsSubmissionHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"submissionNonce\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"operatorDirectedRewardsSubmission\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIRewardsCoordinatorTypes.OperatorDirectedRewardsSubmission\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.StrategyAndMultiplier[]\",\"components\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"multiplier\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"operatorRewards\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.OperatorReward[]\",\"components\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"startTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"duration\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"description\",\"type\":\"string\",\"internalType\":\"string\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorPISplitBipsSet\",\"inputs\":[{\"name\":\"caller\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"activatedAt\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"},{\"name\":\"oldOperatorPISplitBips\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"},{\"name\":\"newOperatorPISplitBips\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RewardsClaimed\",\"inputs\":[{\"name\":\"root\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"},{\"name\":\"earner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"claimer\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"recipient\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"token\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIERC20\"},{\"name\":\"claimedAmount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RewardsForAllSubmitterSet\",\"inputs\":[{\"name\":\"rewardsForAllSubmitter\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"oldValue\",\"type\":\"bool\",\"indexed\":true,\"internalType\":\"bool\"},{\"name\":\"newValue\",\"type\":\"bool\",\"indexed\":true,\"internalType\":\"bool\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RewardsSubmissionForAllCreated\",\"inputs\":[{\"name\":\"submitter\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"submissionNonce\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"rewardsSubmissionHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"rewardsSubmission\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIRewardsCoordinatorTypes.RewardsSubmission\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.StrategyAndMultiplier[]\",\"components\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"multiplier\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"duration\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RewardsSubmissionForAllEarnersCreated\",\"inputs\":[{\"name\":\"tokenHopper\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"submissionNonce\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"rewardsSubmissionHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"rewardsSubmission\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIRewardsCoordinatorTypes.RewardsSubmission\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.StrategyAndMultiplier[]\",\"components\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"multiplier\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"duration\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RewardsUpdaterSet\",\"inputs\":[{\"name\":\"oldRewardsUpdater\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newRewardsUpdater\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"AmountExceedsMax\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"AmountIsZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"CurrentlyPaused\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"DurationExceedsMax\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"EarningsNotGreaterThanClaimed\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InputAddressZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InputArrayLengthMismatch\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InputArrayLengthZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidAddressZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidCalculationIntervalSecondsRemainder\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidClaimProof\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidDurationRemainder\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidEarner\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidEarnerLeafIndex\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidGenesisRewardsTimestampRemainder\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidNewPausedStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidPermissions\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidProofLength\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidRoot\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidRootIndex\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidStartTimestampRemainder\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidTokenLeafIndex\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NewRootMustBeForNewCalculatedPeriod\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyPauser\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyUnpauser\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OperatorsNotInAscendingOrder\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"PreviousSplitPending\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RewardsEndTimestampNotElapsed\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RootAlreadyActivated\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RootDisabled\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RootNotActivated\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SplitExceedsMax\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StartTimestampTooFarInFuture\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StartTimestampTooFarInPast\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StrategiesNotInAscendingOrder\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StrategyNotWhitelisted\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SubmissionNotRetroactive\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"UnauthorizedCaller\",\"inputs\":[]}]", <<<<<<< HEAD +<<<<<<< HEAD <<<<<<< HEAD Bin: "0x6101c0604052348015610010575f5ffd5b506040516142d63803806142d683398101604081905261002f91610211565b858a8a8a88888888888f6001600160a01b038116610060576040516339b190bb60e11b815260040160405180910390fd5b6001600160a01b031660805261007685826102d3565b63ffffffff161561009a57604051630e06bd3160e01b815260040160405180910390fd5b6100a762015180866102d3565b63ffffffff16156100cb5760405163223c7b3960e11b815260040160405180910390fd5b6001600160a01b0397881660a05295871660c05293861660e05263ffffffff9283166101005290821661012052811661014052908116610160521661018052166101a052610117610126565b50505050505050505050610306565b5f54610100900460ff16156101915760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff908116146101e0575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b03811681146101f6575f5ffd5b50565b805163ffffffff8116811461020c575f5ffd5b919050565b5f5f5f5f5f5f5f5f5f5f6101408b8d03121561022b575f5ffd5b8a51610236816101e2565b60208c0151909a50610247816101e2565b60408c0151909950610258816101e2565b60608c0151909850610269816101e2565b60808c015190975061027a816101e2565b955061028860a08c016101f9565b945061029660c08c016101f9565b93506102a460e08c016101f9565b92506102b36101008c016101f9565b91506102c26101208c016101f9565b90509295989b9194979a5092959850565b5f63ffffffff8316806102f457634e487b7160e01b5f52601260045260245ffd5b8063ffffffff84160691505092915050565b60805160a05160c05160e05161010051610120516101405161016051610180516101a051613f066103d05f395f81816105a601526129ee01525f818161045a0152612f2f01525f81816103bc015261233201525f81816105080152612eed01525f818161080c0152612dfd01525f818161076001528181612e4d0152612e9b01525f81816108600152611a2601525f818161052f0152612fca01525f81816108d3015261199601525f81816106f201528181610b62015281816111750152611dcb0152613f065ff3fe608060405234801561000f575f5ffd5b506004361061037c575f3560e01c8063886f1195116101d4578063dcbb03b311610109578063f2fde38b116100a9578063fabc1cbc11610079578063fabc1cbc14610981578063fbf1e2c114610994578063fce36c7d146109a7578063ff9f6cce146109ba575f5ffd5b8063f2fde38b14610935578063f6efbb5914610948578063f8cd84481461095b578063f96abf2e1461096e575f5ffd5b8063e810ce21116100e4578063e810ce21146108bb578063ea4d3c9b146108ce578063ed71e6a2146108f5578063f22cef8514610922575f5ffd5b8063dcbb03b314610882578063de02e50314610895578063e063f81f146108a8575f5ffd5b8063a50a1d9c11610174578063bb7e451f1161014f578063bb7e451f146107e8578063bf21a8aa14610807578063c46db6061461082e578063ca8aa7c71461085b575f5ffd5b8063a50a1d9c14610795578063aebd8bae146107a8578063b3dbb0e0146107d5575f5ffd5b80639be3d4e4116101af5780639be3d4e4146107405780639cb9a5fa146107485780639d45c2811461075b578063a0169ddd14610782575f5ffd5b8063886f1195146106ed5780638da5cb5b146107145780639104c31914610725575f5ffd5b80634596021c116102b55780635c975abb11610255578063715018a611610225578063715018a6146106a05780637b8f8b05146106a8578063863cb9a9146106b0578063865c6953146106c3575f5ffd5b80635c975abb146106435780635e9d83481461064b57806363f6a7981461065e5780636d21117e14610673575f5ffd5b80634d18cc35116102905780634d18cc35146105ee57806358baaa3e14610605578063595c6a67146106185780635ac86ab714610620575f5ffd5b80634596021c1461058e5780634657e26a146105a15780634b943960146105c8575f5ffd5b80632b9f64a41161032057806339b70e38116102fb57806339b70e381461052a5780633a8c0786146105515780633ccc861d146105685780633efe1db61461057b575f5ffd5b80632b9f64a4146104b057806336af41fa146104f057806337838ed014610503575f5ffd5b80630eb383451161035b5780630eb3834514610440578063131433b414610455578063136439dd1461047c578063149bc8721461048f575f5ffd5b806218572c1461038057806304a0c502146103b75780630e9a53cf146103f3575b5f5ffd5b6103a261038e3660046134e6565b60d16020525f908152604090205460ff1681565b60405190151581526020015b60405180910390f35b6103de7f000000000000000000000000000000000000000000000000000000000000000081565b60405163ffffffff90911681526020016103ae565b6103fb6109cd565b6040516103ae91905f6080820190508251825263ffffffff602084015116602083015263ffffffff604084015116604083015260608301511515606083015292915050565b61045361044e36600461350e565b610acd565b005b6103de7f000000000000000000000000000000000000000000000000000000000000000081565b61045361048a366004613545565b610b4d565b6104a261049d366004613572565b610c22565b6040519081526020016103ae565b6104d86104be3660046134e6565b60cc6020525f90815260409020546001600160a01b031681565b6040516001600160a01b0390911681526020016103ae565b6104536104fe3660046135d4565b610c97565b6103de7f000000000000000000000000000000000000000000000000000000000000000081565b6104d87f000000000000000000000000000000000000000000000000000000000000000081565b60cb546103de90600160a01b900463ffffffff1681565b610453610576366004613624565b610e37565b61045361058936600461367b565b610e7c565b61045361059c3660046136a5565b611070565b6104d87f000000000000000000000000000000000000000000000000000000000000000081565b6105db6105d63660046134e6565b6110f1565b60405161ffff90911681526020016103ae565b60cb546103de90600160c01b900463ffffffff1681565b6104536106133660046136f8565b61114c565b610453611160565b6103a261062e366004613711565b606654600160ff9092169190911b9081161490565b6066546104a2565b6103a2610659366004613731565b61120f565b60cb546105db90600160e01b900461ffff1681565b6103a2610681366004613763565b60cf60209081525f928352604080842090915290825290205460ff1681565b61045361129a565b60ca546104a2565b6104536106be3660046134e6565b6112ab565b6104a26106d136600461378d565b60cd60209081525f928352604080842090915290825290205481565b6104d87f000000000000000000000000000000000000000000000000000000000000000081565b6033546001600160a01b03166104d8565b6104d873beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac081565b6103fb6112bc565b6104536107563660046137b9565b611358565b6103de7f000000000000000000000000000000000000000000000000000000000000000081565b6104536107903660046134e6565b611503565b6104536107a336600461381b565b61150e565b6103a26107b6366004613763565b60d260209081525f928352604080842090915290825290205460ff1681565b6104536107e3366004613834565b61151f565b6104a26107f63660046134e6565b60ce6020525f908152604090205481565b6103de7f000000000000000000000000000000000000000000000000000000000000000081565b6103a261083c366004613763565b60d060209081525f928352604080842090915290825290205460ff1681565b6104d87f000000000000000000000000000000000000000000000000000000000000000081565b61045361089036600461385e565b611668565b6103fb6108a3366004613545565b6117d3565b6105db6108b636600461378d565b611863565b6103de6108c9366004613545565b6118cf565b6104d87f000000000000000000000000000000000000000000000000000000000000000081565b6103a2610903366004613763565b60d360209081525f928352604080842090915290825290205460ff1681565b61045361093036600461378d565b611950565b6104536109433660046134e6565b611aba565b6104536109563660046138a2565b611b35565b6104a2610969366004613572565b611c6a565b61045361097c3660046136f8565b611c7a565b61045361098f366004613545565b611dc9565b60cb546104d8906001600160a01b031681565b6104536109b53660046135d4565b611edf565b6104536109c83660046135d4565b61202e565b604080516080810182525f80825260208201819052918101829052606081019190915260ca545b8015610aa5575f60ca610a08600184613914565b81548110610a1857610a18613927565b5f91825260209182902060408051608081018252600293909302909101805483526001015463ffffffff80821694840194909452600160201b810490931690820152600160401b90910460ff161580156060830181905291925090610a875750806040015163ffffffff164210155b15610a925792915050565b5080610a9d8161393b565b9150506109f4565b5050604080516080810182525f80825260208201819052918101829052606081019190915290565b610ad56121ad565b6001600160a01b0382165f81815260d1602052604080822054905160ff9091169284151592841515927f4de6293e668df1398422e1def12118052c1539a03cbfedc145895d48d7685f1c9190a4506001600160a01b03919091165f90815260d160205260409020805460ff1916911515919091179055565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa158015610baf573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610bd39190613950565b610bf057604051631d77d47760e21b815260040160405180910390fd5b6066548181168114610c155760405163c61dca5d60e01b815260040160405180910390fd5b610c1e82612207565b5050565b5f80610c3160208401846134e6565b8360200135604051602001610c7a9392919060f89390931b6001600160f81b031916835260609190911b6bffffffffffffffffffffffff19166001830152601582015260350190565b604051602081830303815290604052805190602001209050919050565b606654600190600290811603610cc05760405163840a48d560e01b815260040160405180910390fd5b335f90815260d1602052604090205460ff16610cef57604051635c427cd960e01b815260040160405180910390fd5b610cf7612244565b5f5b82811015610e275736848483818110610d1457610d14613927565b9050602002810190610d26919061396b565b335f81815260ce60209081526040808320549051949550939192610d509290918591879101613ab9565b604051602081830303815290604052805190602001209050610d718361229d565b335f90815260d0602090815260408083208484529091529020805460ff19166001908117909155610da3908390613ae8565b335f81815260ce602052604090819020929092559051829184917f51088b8c89628df3a8174002c2a034d0152fce6af8415d651b2a4734bf27048290610dea908890613afb565b60405180910390a4610e1c333060408601803590610e0b90602089016134e6565b6001600160a01b031692919061238d565b505050600101610cf9565b50610e326001609755565b505050565b606654600290600490811603610e605760405163840a48d560e01b815260040160405180910390fd5b610e68612244565b610e7283836123f8565b610e326001609755565b606654600390600890811603610ea55760405163840a48d560e01b815260040160405180910390fd5b60cb546001600160a01b03163314610ed057604051635c427cd960e01b815260040160405180910390fd5b60cb5463ffffffff600160c01b909104811690831611610f0357604051631ca7e50b60e21b815260040160405180910390fd5b428263ffffffff1610610f29576040516306957c9160e11b815260040160405180910390fd5b60ca5460cb545f90610f4890600160a01b900463ffffffff1642613b0d565b6040805160808101825287815263ffffffff87811660208084018281528684168587018181525f6060880181815260ca8054600181018255925297517f42d72674974f694b5f5159593243114d38a5c39c89d6b62fee061ff523240ee160029092029182015592517f42d72674974f694b5f5159593243114d38a5c39c89d6b62fee061ff523240ee290930180549151975193871667ffffffffffffffff1990921691909117600160201b978716979097029690961760ff60401b1916600160401b921515929092029190911790945560cb805463ffffffff60c01b1916600160c01b840217905593519283529394508892908616917fecd866c3c158fa00bf34d803d5f6023000b57080bcb48af004c2b4b46b3afd08910160405180910390a45050505050565b6066546002906004908116036110995760405163840a48d560e01b815260040160405180910390fd5b6110a1612244565b5f5b838110156110e0576110d88585838181106110c0576110c0613927565b90506020028101906110d29190613b29565b846123f8565b6001016110a3565b506110eb6001609755565b50505050565b6001600160a01b0381165f90815260d5602090815260408083208151606081018352905461ffff80821683526201000082041693820193909352600160201b90920463ffffffff169082015261114690612680565b92915050565b6111546121ad565b61115d816126f0565b50565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa1580156111c2573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111e69190613950565b61120357604051631d77d47760e21b815260040160405180910390fd5b61120d5f19612207565b565b5f6112928260ca61122360208301836136f8565b63ffffffff168154811061123957611239613927565b5f91825260209182902060408051608081018252600293909302909101805483526001015463ffffffff80821694840194909452600160201b810490931690820152600160401b90910460ff1615156060820152612761565b506001919050565b6112a26121ad565b61120d5f612904565b6112b36121ad565b61115d81612955565b604080516080810182525f80825260208201819052918101829052606081019190915260ca80546112ef90600190613914565b815481106112ff576112ff613927565b5f91825260209182902060408051608081018252600293909302909101805483526001015463ffffffff80821694840194909452600160201b810490931690820152600160401b90910460ff1615156060820152919050565b6066546005906020908116036113815760405163840a48d560e01b815260040160405180910390fd5b8361138b816129b0565b6113a85760405163932d94f760e01b815260040160405180910390fd5b6113b0612244565b5f5b838110156114f157368585838181106113cd576113cd613927565b90506020028101906113df9190613b3d565b6001600160a01b0388165f90815260ce6020908152604080832054905193945092611410918b918591879101613cab565b6040516020818303038152906040528051906020012090505f61143284612a5a565b6001600160a01b038b165f90815260d3602090815260408083208684529091529020805460ff19166001908117909155909150611470908490613ae8565b6001600160a01b038b165f81815260ce60205260409081902092909255905183919033907ffc8888bffd711da60bc5092b33f677d81896fe80ecc677b84cfab8184462b6e0906114c39088908a90613cd1565b60405180910390a46114e1333083610e0b6040890160208a016134e6565b5050600190920191506113b29050565b506114fc6001609755565b5050505050565b33610c1e8183612c40565b6115166121ad565b61115d81612ca3565b6066546007906080908116036115485760405163840a48d560e01b815260040160405180910390fd5b82611552816129b0565b61156f5760405163932d94f760e01b815260040160405180910390fd5b60cb545f9061158b90600160a01b900463ffffffff1642613b0d565b6001600160a01b0386165f90815260d5602090815260408083208151606081018352905461ffff80821683526201000082041693820193909352600160201b90920463ffffffff1690820152919250906115e490612680565b6001600160a01b0387165f90815260d560205260409020909150611609908684612d0e565b6040805163ffffffff8416815261ffff838116602083015287168183015290516001600160a01b0388169133917fd1e028bd664486a46ad26040e999cd2d22e1e9a094ee6afe19fcf64678f16f749181900360600190a3505050505050565b6066546006906040908116036116915760405163840a48d560e01b815260040160405180910390fd5b8361169b816129b0565b6116b85760405163932d94f760e01b815260040160405180910390fd5b60cb545f906116d490600160a01b900463ffffffff1642613b0d565b6001600160a01b038781165f90815260d460209081526040808320938a1683529281528282208351606081018552905461ffff80821683526201000082041692820192909252600160201b90910463ffffffff169281019290925291925061173b90612680565b6001600160a01b038089165f90815260d460209081526040808320938b1683529290522090915061176d908684612d0e565b6040805163ffffffff8416815261ffff838116602083015287168183015290516001600160a01b0388811692908a169133917f48e198b6ae357e529204ee53a8e514c470ff77d9cc8e4f7207f8b5d490ae6934919081900360600190a450505050505050565b604080516080810182525f80825260208201819052918101829052606081019190915260ca828154811061180957611809613927565b5f91825260209182902060408051608081018252600293909302909101805483526001015463ffffffff80821694840194909452600160201b810490931690820152600160401b90910460ff161515606082015292915050565b6001600160a01b038281165f90815260d46020908152604080832093851683529281528282208351606081018552905461ffff80821683526201000082041692820192909252600160201b90910463ffffffff1692810192909252906118c890612680565b9392505050565b60ca545f905b63ffffffff811615611936578260ca6118ef600184613ce9565b63ffffffff168154811061190557611905613927565b905f5260205f2090600202015f015403611924576118c8600182613ce9565b8061192e81613d05565b9150506118d5565b5060405163504570e360e01b815260040160405180910390fd5b8161195a816129b0565b6119775760405163932d94f760e01b815260040160405180910390fd5b6040516336b87bd760e11b81526001600160a01b0384811660048301527f00000000000000000000000000000000000000000000000000000000000000001690636d70f7ae90602401602060405180830381865afa1580156119db573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906119ff9190613950565b80611a93575060405163ba1a84e560e01b81526001600160a01b0384811660048301525f917f00000000000000000000000000000000000000000000000000000000000000009091169063ba1a84e590602401602060405180830381865afa158015611a6d573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a919190613d23565b115b611ab05760405163fb494ea160e01b815260040160405180910390fd5b610e328383612c40565b611ac26121ad565b6001600160a01b038116611b2c5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084015b60405180910390fd5b61115d81612904565b5f54610100900460ff1615808015611b5357505f54600160ff909116105b80611b6c5750303b158015611b6c57505f5460ff166001145b611bcf5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401611b23565b5f805460ff191660011790558015611bf0575f805461ff0019166101001790555b611bf985612207565b611c0286612904565b611c0b84612955565b611c14836126f0565b611c1d82612ca3565b8015611c62575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050505050565b5f6001610c3160208401846134e6565b606654600390600890811603611ca35760405163840a48d560e01b815260040160405180910390fd5b60cb546001600160a01b03163314611cce57604051635c427cd960e01b815260040160405180910390fd5b60ca5463ffffffff831610611cf6576040516394a8d38960e01b815260040160405180910390fd5b5f60ca8363ffffffff1681548110611d1057611d10613927565b905f5260205f20906002020190508060010160089054906101000a900460ff1615611d4e57604051631b14174b60e01b815260040160405180910390fd5b6001810154600160201b900463ffffffff164210611d7f57604051630c36f66560e21b815260040160405180910390fd5b60018101805460ff60401b1916600160401b17905560405163ffffffff8416907fd850e6e5dfa497b72661fa73df2923464eaed9dc2ff1d3cb82bccbfeabe5c41e905f90a2505050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611e25573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611e499190613d3a565b6001600160a01b0316336001600160a01b031614611e7a5760405163794821ff60e01b815260040160405180910390fd5b60665480198219811614611ea15760405163c61dca5d60e01b815260040160405180910390fd5b606682905560405182815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c9060200160405180910390a25050565b6066545f90600190811603611f075760405163840a48d560e01b815260040160405180910390fd5b611f0f612244565b5f5b82811015610e275736848483818110611f2c57611f2c613927565b9050602002810190611f3e919061396b565b335f81815260ce60209081526040808320549051949550939192611f689290918591879101613ab9565b604051602081830303815290604052805190602001209050611f898361229d565b335f90815260cf602090815260408083208484529091529020805460ff19166001908117909155611fbb908390613ae8565b335f81815260ce602052604090819020929092559051829184917f450a367a380c4e339e5ae7340c8464ef27af7781ad9945cfe8abd828f89e628190612002908890613afb565b60405180910390a4612023333060408601803590610e0b90602089016134e6565b505050600101611f11565b6066546004906010908116036120575760405163840a48d560e01b815260040160405180910390fd5b335f90815260d1602052604090205460ff1661208657604051635c427cd960e01b815260040160405180910390fd5b61208e612244565b5f5b82811015610e2757368484838181106120ab576120ab613927565b90506020028101906120bd919061396b565b335f81815260ce602090815260408083205490519495509391926120e79290918591879101613ab9565b6040516020818303038152906040528051906020012090506121088361229d565b335f90815260d2602090815260408083208484529091529020805460ff1916600190811790915561213a908390613ae8565b335f81815260ce602052604090819020929092559051829184917f5251b6fdefcb5d81144e735f69ea4c695fd43b0289ca53dc075033f5fc80068b90612181908890613afb565b60405180910390a46121a2333060408601803590610e0b90602089016134e6565b505050600101612090565b6033546001600160a01b0316331461120d5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401611b23565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a250565b6002609754036122965760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401611b23565b6002609755565b6122cf6122aa8280613d55565b6122ba60808501606086016136f8565b6122ca60a08601608087016136f8565b612ddd565b5f8160400135116122f3576040516310eb483f60e21b815260040160405180910390fd5b6f4b3b4ca85a86c47a098a223fffffffff816040013511156123285760405163070b5a6f60e21b815260040160405180910390fd5b61235863ffffffff7f00000000000000000000000000000000000000000000000000000000000000001642613ae8565b61236860808301606084016136f8565b63ffffffff16111561115d57604051637ee2b44360e01b815260040160405180910390fd5b6040516001600160a01b03808516602483015283166044820152606481018290526110eb9085906323b872dd60e01b906084015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b0319909316929092179091526130b5565b5f60ca61240860208501856136f8565b63ffffffff168154811061241e5761241e613927565b5f91825260209182902060408051608081018252600293909302909101805483526001015463ffffffff80821694840194909452600160201b810490931690820152600160401b90910460ff1615156060820152905061247e8382612761565b5f61248f60808501606086016134e6565b6001600160a01b038082165f90815260cc602052604090205491925016806124b45750805b336001600160a01b038216146124dd57604051635c427cd960e01b815260040160405180910390fd5b5f5b6124ec60a0870187613d9b565b9050811015611c62573661250360e0880188613d55565b8381811061251357612513613927565b6001600160a01b0387165f90815260cd602090815260408083209302949094019450929091508290612547908501856134e6565b6001600160a01b03166001600160a01b031681526020019081526020015f205490508082602001351161258d5760405163aa385e8160e01b815260040160405180910390fd5b5f61259c826020850135613914565b6001600160a01b0387165f90815260cd602090815260408220929350850180359291906125c990876134e6565b6001600160a01b031681526020808201929092526040015f209190915561260a90899083906125fa908701876134e6565b6001600160a01b03169190613188565b86516001600160a01b03808a1691878216918916907f9543dbd55580842586a951f0386e24d68a5df99ae29e3b216588b45fd684ce319061264e60208901896134e6565b604080519283526001600160a01b039091166020830152810186905260600160405180910390a45050506001016124df565b5f816040015163ffffffff165f14806126b25750815161ffff9081161480156126b25750816040015163ffffffff1642105b156126ca57505060cb54600160e01b900461ffff1690565b816040015163ffffffff164210156126e3578151611146565b506020015190565b919050565b60cb546040805163ffffffff600160a01b9093048316815291831660208301527faf557c6c02c208794817a705609cfa935f827312a1adfdd26494b6b95dd2b4b3910160405180910390a160cb805463ffffffff909216600160a01b0263ffffffff60a01b19909216919091179055565b80606001511561278457604051631b14174b60e01b815260040160405180910390fd5b806040015163ffffffff164210156127af57604051631437a2bb60e31b815260040160405180910390fd5b6127bc60c0830183613d9b565b90506127cb60a0840184613d9b565b9050146127eb576040516343714afd60e01b815260040160405180910390fd5b6127f860e0830183613d55565b905061280760c0840184613d9b565b905014612827576040516343714afd60e01b815260040160405180910390fd5b80516128539061283d60408501602086016136f8565b61284a6040860186613de1565b866060016131b8565b5f5b61286260a0840184613d9b565b9050811015610e32576128fc608084013561288060a0860186613d9b565b8481811061289057612890613927565b90506020020160208101906128a591906136f8565b6128b260c0870187613d9b565b858181106128c2576128c2613927565b90506020028101906128d49190613de1565b6128e160e0890189613d55565b878181106128f1576128f1613927565b90506040020161325c565b600101612855565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b60cb546040516001600160a01b038084169216907f237b82f438d75fc568ebab484b75b01d9287b9e98b490b7c23221623b6705dbb905f90a360cb80546001600160a01b0319166001600160a01b0392909216919091179055565b604051631beb2b9760e31b81526001600160a01b0382811660048301523360248301523060448301525f80356001600160e01b0319166064840152917f00000000000000000000000000000000000000000000000000000000000000009091169063df595cb8906084016020604051808303815f875af1158015612a36573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111469190613950565b5f612a88612a688380613d55565b612a7860808601606087016136f8565b6122ca60a08701608088016136f8565b5f612a966040840184613d55565b905011612ab65760405163796cc52560e01b815260040160405180910390fd5b42612ac760a08401608085016136f8565b612ad760808501606086016136f8565b612ae19190613b0d565b63ffffffff1610612b055760405163150358a160e21b815260040160405180910390fd5b5f80805b612b166040860186613d55565b9050811015612c075736612b2d6040870187613d55565b83818110612b3d57612b3d613927565b6040029190910191505f9050612b5660208301836134e6565b6001600160a01b031603612b7d57604051630863a45360e11b815260040160405180910390fd5b612b8a60208201826134e6565b6001600160a01b0316836001600160a01b031610612bbb576040516310fb47f160e31b815260040160405180910390fd5b5f816020013511612bdf576040516310eb483f60e21b815260040160405180910390fd5b612bec60208201826134e6565b9250612bfc602082013585613ae8565b935050600101612b09565b506f4b3b4ca85a86c47a098a223fffffffff821115612c395760405163070b5a6f60e21b815260040160405180910390fd5b5092915050565b6001600160a01b038083165f81815260cc602052604080822080548686166001600160a01b0319821681179092559151919094169392849290917fbab947934d42e0ad206f25c9cab18b5bb6ae144acfb00f40b4e3aa59590ca3129190a4505050565b60cb546040805161ffff600160e01b9093048316815291831660208301527fe6cd4edfdcc1f6d130ab35f73d72378f3a642944fb4ee5bd84b7807a81ea1c4e910160405180910390a160cb805461ffff909216600160e01b0261ffff60e01b19909216919091179055565b61271061ffff83161115612d355760405163891c63df60e01b815260040160405180910390fd5b8254600160201b900463ffffffff164211612d6357604051637b1e25c560e01b815260040160405180910390fd5b8254600160201b900463ffffffff165f03612d8a57825461ffff191661ffff178355612da1565b825462010000810461ffff1661ffff199091161783555b825463ffffffff909116600160201b0267ffffffff000000001961ffff90931662010000029290921667ffffffffffff00001990911617179055565b82612dfb5760405163796cc52560e01b815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000063ffffffff168163ffffffff161115612e4857604051630dd0b9f560e21b815260040160405180910390fd5b612e727f000000000000000000000000000000000000000000000000000000000000000082613e38565b63ffffffff1615612e965760405163ee66470560e01b815260040160405180910390fd5b612ec07f000000000000000000000000000000000000000000000000000000000000000083613e38565b63ffffffff1615612ee457604051633c1a94f160e21b815260040160405180910390fd5b8163ffffffff167f000000000000000000000000000000000000000000000000000000000000000063ffffffff1642612f1d9190613914565b11158015612f5757508163ffffffff167f000000000000000000000000000000000000000000000000000000000000000063ffffffff1611155b612f745760405163041aa75760e11b815260040160405180910390fd5b5f805b84811015611c62575f868683818110612f9257612f92613927565b612fa892602060409092020190810191506134e6565b60405163198f077960e21b81526001600160a01b0380831660048301529192507f00000000000000000000000000000000000000000000000000000000000000009091169063663c1de490602401602060405180830381865afa158015613011573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906130359190613950565b8061305c57506001600160a01b03811673beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac0145b61307957604051632efd965160e11b815260040160405180910390fd5b806001600160a01b0316836001600160a01b0316106130ab5760405163dfad9ca160e01b815260040160405180910390fd5b9150600101612f77565b5f613109826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b031661329a9092919063ffffffff16565b905080515f14806131295750808060200190518101906131299190613950565b610e325760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401611b23565b6040516001600160a01b038316602482015260448101829052610e3290849063a9059cbb60e01b906064016123c1565b6131c3602083613e5f565b6001901b8463ffffffff16106131eb5760405162c6c39d60e71b815260040160405180910390fd5b5f6131f582610c22565b905061323f84848080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152508a92508591505063ffffffff89166132b0565b611c62576040516369ca16c960e01b815260040160405180910390fd5b613267602083613e5f565b6001901b8463ffffffff16106132905760405163054ff4df60e51b815260040160405180910390fd5b5f6131f582611c6a565b60606132a884845f856132c7565b949350505050565b5f836132bd86858561339e565b1495945050505050565b6060824710156133285760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401611b23565b5f5f866001600160a01b031685876040516133439190613e72565b5f6040518083038185875af1925050503d805f811461337d576040519150601f19603f3d011682016040523d82523d5f602084013e613382565b606091505b509150915061339387838387613435565b979650505050505050565b5f602084516133ad9190613e88565b156133cb576040516313717da960e21b815260040160405180910390fd5b8260205b8551811161342c576133e2600285613e88565b5f0361340357815f528086015160205260405f20915060028404935061341a565b808601515f528160205260405f2091506002840493505b613425602082613ae8565b90506133cf565b50949350505050565b606083156134a35782515f0361349c576001600160a01b0385163b61349c5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401611b23565b50816132a8565b6132a883838151156134b85781518083602001fd5b8060405162461bcd60e51b8152600401611b239190613e9b565b6001600160a01b038116811461115d575f5ffd5b5f602082840312156134f6575f5ffd5b81356118c8816134d2565b801515811461115d575f5ffd5b5f5f6040838503121561351f575f5ffd5b823561352a816134d2565b9150602083013561353a81613501565b809150509250929050565b5f60208284031215613555575f5ffd5b5035919050565b5f6040828403121561356c575f5ffd5b50919050565b5f60408284031215613582575f5ffd5b6118c8838361355c565b5f5f83601f84011261359c575f5ffd5b50813567ffffffffffffffff8111156135b3575f5ffd5b6020830191508360208260051b85010111156135cd575f5ffd5b9250929050565b5f5f602083850312156135e5575f5ffd5b823567ffffffffffffffff8111156135fb575f5ffd5b6136078582860161358c565b90969095509350505050565b5f610100828403121561356c575f5ffd5b5f5f60408385031215613635575f5ffd5b823567ffffffffffffffff81111561364b575f5ffd5b61365785828601613613565b925050602083013561353a816134d2565b803563ffffffff811681146126eb575f5ffd5b5f5f6040838503121561368c575f5ffd5b8235915061369c60208401613668565b90509250929050565b5f5f5f604084860312156136b7575f5ffd5b833567ffffffffffffffff8111156136cd575f5ffd5b6136d98682870161358c565b90945092505060208401356136ed816134d2565b809150509250925092565b5f60208284031215613708575f5ffd5b6118c882613668565b5f60208284031215613721575f5ffd5b813560ff811681146118c8575f5ffd5b5f60208284031215613741575f5ffd5b813567ffffffffffffffff811115613757575f5ffd5b6132a884828501613613565b5f5f60408385031215613774575f5ffd5b823561377f816134d2565b946020939093013593505050565b5f5f6040838503121561379e575f5ffd5b82356137a9816134d2565b9150602083013561353a816134d2565b5f5f5f604084860312156137cb575f5ffd5b83356137d6816134d2565b9250602084013567ffffffffffffffff8111156137f1575f5ffd5b6137fd8682870161358c565b9497909650939450505050565b803561ffff811681146126eb575f5ffd5b5f6020828403121561382b575f5ffd5b6118c88261380a565b5f5f60408385031215613845575f5ffd5b8235613850816134d2565b915061369c6020840161380a565b5f5f5f60608486031215613870575f5ffd5b833561387b816134d2565b9250602084013561388b816134d2565b91506138996040850161380a565b90509250925092565b5f5f5f5f5f60a086880312156138b6575f5ffd5b85356138c1816134d2565b94506020860135935060408601356138d8816134d2565b92506138e660608701613668565b91506138f46080870161380a565b90509295509295909350565b634e487b7160e01b5f52601160045260245ffd5b8181038181111561114657611146613900565b634e487b7160e01b5f52603260045260245ffd5b5f8161394957613949613900565b505f190190565b5f60208284031215613960575f5ffd5b81516118c881613501565b5f8235609e1983360301811261397f575f5ffd5b9190910192915050565b5f5f8335601e1984360301811261399e575f5ffd5b830160208101925035905067ffffffffffffffff8111156139bd575f5ffd5b8060061b36038213156135cd575f5ffd5b8183526020830192505f815f5b84811015613a315781356139ee816134d2565b6001600160a01b0316865260208201356bffffffffffffffffffffffff8116808214613a18575f5ffd5b60208801525060409586019591909101906001016139db565b5093949350505050565b5f613a468283613989565b60a08552613a5860a0860182846139ce565b9150506020830135613a69816134d2565b6001600160a01b031660208501526040838101359085015263ffffffff613a9260608501613668565b16606085015263ffffffff613aa960808501613668565b1660808501528091505092915050565b60018060a01b0384168152826020820152606060408201525f613adf6060830184613a3b565b95945050505050565b8082018082111561114657611146613900565b602081525f6118c86020830184613a3b565b63ffffffff818116838216019081111561114657611146613900565b5f823560fe1983360301811261397f575f5ffd5b5f823560be1983360301811261397f575f5ffd5b5f5f8335601e19843603018112613b66575f5ffd5b830160208101925035905067ffffffffffffffff811115613b85575f5ffd5b8036038213156135cd575f5ffd5b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b5f613bc68283613989565b60c08552613bd860c0860182846139ce565b9150506020830135613be9816134d2565b6001600160a01b03166020850152613c046040840184613989565b858303604087015280835290915f91906020015b81831015613c53578335613c2b816134d2565b6001600160a01b03168152602084810135908201526040938401936001939093019201613c18565b613c5f60608701613668565b63ffffffff811660608901529350613c7960808701613668565b63ffffffff811660808901529350613c9460a0870187613b51565b9450925086810360a0880152613393818585613b93565b60018060a01b0384168152826020820152606060408201525f613adf6060830184613bbb565b828152604060208201525f6132a86040830184613bbb565b63ffffffff828116828216039081111561114657611146613900565b5f63ffffffff821680613d1a57613d1a613900565b5f190192915050565b5f60208284031215613d33575f5ffd5b5051919050565b5f60208284031215613d4a575f5ffd5b81516118c8816134d2565b5f5f8335601e19843603018112613d6a575f5ffd5b83018035915067ffffffffffffffff821115613d84575f5ffd5b6020019150600681901b36038213156135cd575f5ffd5b5f5f8335601e19843603018112613db0575f5ffd5b83018035915067ffffffffffffffff821115613dca575f5ffd5b6020019150600581901b36038213156135cd575f5ffd5b5f5f8335601e19843603018112613df6575f5ffd5b83018035915067ffffffffffffffff821115613e10575f5ffd5b6020019150368190038213156135cd575f5ffd5b634e487b7160e01b5f52601260045260245ffd5b5f63ffffffff831680613e4d57613e4d613e24565b8063ffffffff84160691505092915050565b5f82613e6d57613e6d613e24565b500490565b5f82518060208501845e5f920191825250919050565b5f82613e9657613e96613e24565b500690565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f8301168401019150509291505056fea264697066735822122038b85e072953498a6772816d5247c44e56b614c9fdac6ebf7b0e16c898f84d4b64736f6c634300081b0033", >>>>>>> 7da92a53 (fix: remove token param from Deposit event and related APIs (#1013)) @@ -114,6 +115,9 @@ var RewardsCoordinatorMetaData = &bind.MetaData{ ======= Bin: "0x6101c0604052348015610010575f5ffd5b506040516142d63803806142d683398101604081905261002f91610211565b858a8a8a88888888888f6001600160a01b038116610060576040516339b190bb60e11b815260040160405180910390fd5b6001600160a01b031660805261007685826102d3565b63ffffffff161561009a57604051630e06bd3160e01b815260040160405180910390fd5b6100a762015180866102d3565b63ffffffff16156100cb5760405163223c7b3960e11b815260040160405180910390fd5b6001600160a01b0397881660a05295871660c05293861660e05263ffffffff9283166101005290821661012052811661014052908116610160521661018052166101a052610117610126565b50505050505050505050610306565b5f54610100900460ff16156101915760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff908116146101e0575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b03811681146101f6575f5ffd5b50565b805163ffffffff8116811461020c575f5ffd5b919050565b5f5f5f5f5f5f5f5f5f5f6101408b8d03121561022b575f5ffd5b8a51610236816101e2565b60208c0151909a50610247816101e2565b60408c0151909950610258816101e2565b60608c0151909850610269816101e2565b60808c015190975061027a816101e2565b955061028860a08c016101f9565b945061029660c08c016101f9565b93506102a460e08c016101f9565b92506102b36101008c016101f9565b91506102c26101208c016101f9565b90509295989b9194979a5092959850565b5f63ffffffff8316806102f457634e487b7160e01b5f52601260045260245ffd5b8063ffffffff84160691505092915050565b60805160a05160c05160e05161010051610120516101405161016051610180516101a051613f066103d05f395f81816105a601526129ee01525f818161045a0152612f2f01525f81816103bc015261233201525f81816105080152612eed01525f818161080c0152612dfd01525f818161076001528181612e4d0152612e9b01525f81816108600152611a2601525f818161052f0152612fca01525f81816108d3015261199601525f81816106f201528181610b62015281816111750152611dcb0152613f065ff3fe608060405234801561000f575f5ffd5b506004361061037c575f3560e01c8063886f1195116101d4578063dcbb03b311610109578063f2fde38b116100a9578063fabc1cbc11610079578063fabc1cbc14610981578063fbf1e2c114610994578063fce36c7d146109a7578063ff9f6cce146109ba575f5ffd5b8063f2fde38b14610935578063f6efbb5914610948578063f8cd84481461095b578063f96abf2e1461096e575f5ffd5b8063e810ce21116100e4578063e810ce21146108bb578063ea4d3c9b146108ce578063ed71e6a2146108f5578063f22cef8514610922575f5ffd5b8063dcbb03b314610882578063de02e50314610895578063e063f81f146108a8575f5ffd5b8063a50a1d9c11610174578063bb7e451f1161014f578063bb7e451f146107e8578063bf21a8aa14610807578063c46db6061461082e578063ca8aa7c71461085b575f5ffd5b8063a50a1d9c14610795578063aebd8bae146107a8578063b3dbb0e0146107d5575f5ffd5b80639be3d4e4116101af5780639be3d4e4146107405780639cb9a5fa146107485780639d45c2811461075b578063a0169ddd14610782575f5ffd5b8063886f1195146106ed5780638da5cb5b146107145780639104c31914610725575f5ffd5b80634596021c116102b55780635c975abb11610255578063715018a611610225578063715018a6146106a05780637b8f8b05146106a8578063863cb9a9146106b0578063865c6953146106c3575f5ffd5b80635c975abb146106435780635e9d83481461064b57806363f6a7981461065e5780636d21117e14610673575f5ffd5b80634d18cc35116102905780634d18cc35146105ee57806358baaa3e14610605578063595c6a67146106185780635ac86ab714610620575f5ffd5b80634596021c1461058e5780634657e26a146105a15780634b943960146105c8575f5ffd5b80632b9f64a41161032057806339b70e38116102fb57806339b70e381461052a5780633a8c0786146105515780633ccc861d146105685780633efe1db61461057b575f5ffd5b80632b9f64a4146104b057806336af41fa146104f057806337838ed014610503575f5ffd5b80630eb383451161035b5780630eb3834514610440578063131433b414610455578063136439dd1461047c578063149bc8721461048f575f5ffd5b806218572c1461038057806304a0c502146103b75780630e9a53cf146103f3575b5f5ffd5b6103a261038e3660046134e6565b60d16020525f908152604090205460ff1681565b60405190151581526020015b60405180910390f35b6103de7f000000000000000000000000000000000000000000000000000000000000000081565b60405163ffffffff90911681526020016103ae565b6103fb6109cd565b6040516103ae91905f6080820190508251825263ffffffff602084015116602083015263ffffffff604084015116604083015260608301511515606083015292915050565b61045361044e36600461350e565b610acd565b005b6103de7f000000000000000000000000000000000000000000000000000000000000000081565b61045361048a366004613545565b610b4d565b6104a261049d366004613572565b610c22565b6040519081526020016103ae565b6104d86104be3660046134e6565b60cc6020525f90815260409020546001600160a01b031681565b6040516001600160a01b0390911681526020016103ae565b6104536104fe3660046135d4565b610c97565b6103de7f000000000000000000000000000000000000000000000000000000000000000081565b6104d87f000000000000000000000000000000000000000000000000000000000000000081565b60cb546103de90600160a01b900463ffffffff1681565b610453610576366004613624565b610e37565b61045361058936600461367b565b610e7c565b61045361059c3660046136a5565b611070565b6104d87f000000000000000000000000000000000000000000000000000000000000000081565b6105db6105d63660046134e6565b6110f1565b60405161ffff90911681526020016103ae565b60cb546103de90600160c01b900463ffffffff1681565b6104536106133660046136f8565b61114c565b610453611160565b6103a261062e366004613711565b606654600160ff9092169190911b9081161490565b6066546104a2565b6103a2610659366004613731565b61120f565b60cb546105db90600160e01b900461ffff1681565b6103a2610681366004613763565b60cf60209081525f928352604080842090915290825290205460ff1681565b61045361129a565b60ca546104a2565b6104536106be3660046134e6565b6112ab565b6104a26106d136600461378d565b60cd60209081525f928352604080842090915290825290205481565b6104d87f000000000000000000000000000000000000000000000000000000000000000081565b6033546001600160a01b03166104d8565b6104d873beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac081565b6103fb6112bc565b6104536107563660046137b9565b611358565b6103de7f000000000000000000000000000000000000000000000000000000000000000081565b6104536107903660046134e6565b611503565b6104536107a336600461381b565b61150e565b6103a26107b6366004613763565b60d260209081525f928352604080842090915290825290205460ff1681565b6104536107e3366004613834565b61151f565b6104a26107f63660046134e6565b60ce6020525f908152604090205481565b6103de7f000000000000000000000000000000000000000000000000000000000000000081565b6103a261083c366004613763565b60d060209081525f928352604080842090915290825290205460ff1681565b6104d87f000000000000000000000000000000000000000000000000000000000000000081565b61045361089036600461385e565b611668565b6103fb6108a3366004613545565b6117d3565b6105db6108b636600461378d565b611863565b6103de6108c9366004613545565b6118cf565b6104d87f000000000000000000000000000000000000000000000000000000000000000081565b6103a2610903366004613763565b60d360209081525f928352604080842090915290825290205460ff1681565b61045361093036600461378d565b611950565b6104536109433660046134e6565b611aba565b6104536109563660046138a2565b611b35565b6104a2610969366004613572565b611c6a565b61045361097c3660046136f8565b611c7a565b61045361098f366004613545565b611dc9565b60cb546104d8906001600160a01b031681565b6104536109b53660046135d4565b611edf565b6104536109c83660046135d4565b61202e565b604080516080810182525f80825260208201819052918101829052606081019190915260ca545b8015610aa5575f60ca610a08600184613914565b81548110610a1857610a18613927565b5f91825260209182902060408051608081018252600293909302909101805483526001015463ffffffff80821694840194909452600160201b810490931690820152600160401b90910460ff161580156060830181905291925090610a875750806040015163ffffffff164210155b15610a925792915050565b5080610a9d8161393b565b9150506109f4565b5050604080516080810182525f80825260208201819052918101829052606081019190915290565b610ad56121ad565b6001600160a01b0382165f81815260d1602052604080822054905160ff9091169284151592841515927f4de6293e668df1398422e1def12118052c1539a03cbfedc145895d48d7685f1c9190a4506001600160a01b03919091165f90815260d160205260409020805460ff1916911515919091179055565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa158015610baf573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610bd39190613950565b610bf057604051631d77d47760e21b815260040160405180910390fd5b6066548181168114610c155760405163c61dca5d60e01b815260040160405180910390fd5b610c1e82612207565b5050565b5f80610c3160208401846134e6565b8360200135604051602001610c7a9392919060f89390931b6001600160f81b031916835260609190911b6bffffffffffffffffffffffff19166001830152601582015260350190565b604051602081830303815290604052805190602001209050919050565b606654600190600290811603610cc05760405163840a48d560e01b815260040160405180910390fd5b335f90815260d1602052604090205460ff16610cef57604051635c427cd960e01b815260040160405180910390fd5b610cf7612244565b5f5b82811015610e275736848483818110610d1457610d14613927565b9050602002810190610d26919061396b565b335f81815260ce60209081526040808320549051949550939192610d509290918591879101613ab9565b604051602081830303815290604052805190602001209050610d718361229d565b335f90815260d0602090815260408083208484529091529020805460ff19166001908117909155610da3908390613ae8565b335f81815260ce602052604090819020929092559051829184917f51088b8c89628df3a8174002c2a034d0152fce6af8415d651b2a4734bf27048290610dea908890613afb565b60405180910390a4610e1c333060408601803590610e0b90602089016134e6565b6001600160a01b031692919061238d565b505050600101610cf9565b50610e326001609755565b505050565b606654600290600490811603610e605760405163840a48d560e01b815260040160405180910390fd5b610e68612244565b610e7283836123f8565b610e326001609755565b606654600390600890811603610ea55760405163840a48d560e01b815260040160405180910390fd5b60cb546001600160a01b03163314610ed057604051635c427cd960e01b815260040160405180910390fd5b60cb5463ffffffff600160c01b909104811690831611610f0357604051631ca7e50b60e21b815260040160405180910390fd5b428263ffffffff1610610f29576040516306957c9160e11b815260040160405180910390fd5b60ca5460cb545f90610f4890600160a01b900463ffffffff1642613b0d565b6040805160808101825287815263ffffffff87811660208084018281528684168587018181525f6060880181815260ca8054600181018255925297517f42d72674974f694b5f5159593243114d38a5c39c89d6b62fee061ff523240ee160029092029182015592517f42d72674974f694b5f5159593243114d38a5c39c89d6b62fee061ff523240ee290930180549151975193871667ffffffffffffffff1990921691909117600160201b978716979097029690961760ff60401b1916600160401b921515929092029190911790945560cb805463ffffffff60c01b1916600160c01b840217905593519283529394508892908616917fecd866c3c158fa00bf34d803d5f6023000b57080bcb48af004c2b4b46b3afd08910160405180910390a45050505050565b6066546002906004908116036110995760405163840a48d560e01b815260040160405180910390fd5b6110a1612244565b5f5b838110156110e0576110d88585838181106110c0576110c0613927565b90506020028101906110d29190613b29565b846123f8565b6001016110a3565b506110eb6001609755565b50505050565b6001600160a01b0381165f90815260d5602090815260408083208151606081018352905461ffff80821683526201000082041693820193909352600160201b90920463ffffffff169082015261114690612680565b92915050565b6111546121ad565b61115d816126f0565b50565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa1580156111c2573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111e69190613950565b61120357604051631d77d47760e21b815260040160405180910390fd5b61120d5f19612207565b565b5f6112928260ca61122360208301836136f8565b63ffffffff168154811061123957611239613927565b5f91825260209182902060408051608081018252600293909302909101805483526001015463ffffffff80821694840194909452600160201b810490931690820152600160401b90910460ff1615156060820152612761565b506001919050565b6112a26121ad565b61120d5f612904565b6112b36121ad565b61115d81612955565b604080516080810182525f80825260208201819052918101829052606081019190915260ca80546112ef90600190613914565b815481106112ff576112ff613927565b5f91825260209182902060408051608081018252600293909302909101805483526001015463ffffffff80821694840194909452600160201b810490931690820152600160401b90910460ff1615156060820152919050565b6066546005906020908116036113815760405163840a48d560e01b815260040160405180910390fd5b8361138b816129b0565b6113a85760405163932d94f760e01b815260040160405180910390fd5b6113b0612244565b5f5b838110156114f157368585838181106113cd576113cd613927565b90506020028101906113df9190613b3d565b6001600160a01b0388165f90815260ce6020908152604080832054905193945092611410918b918591879101613cab565b6040516020818303038152906040528051906020012090505f61143284612a5a565b6001600160a01b038b165f90815260d3602090815260408083208684529091529020805460ff19166001908117909155909150611470908490613ae8565b6001600160a01b038b165f81815260ce60205260409081902092909255905183919033907ffc8888bffd711da60bc5092b33f677d81896fe80ecc677b84cfab8184462b6e0906114c39088908a90613cd1565b60405180910390a46114e1333083610e0b6040890160208a016134e6565b5050600190920191506113b29050565b506114fc6001609755565b5050505050565b33610c1e8183612c40565b6115166121ad565b61115d81612ca3565b6066546007906080908116036115485760405163840a48d560e01b815260040160405180910390fd5b82611552816129b0565b61156f5760405163932d94f760e01b815260040160405180910390fd5b60cb545f9061158b90600160a01b900463ffffffff1642613b0d565b6001600160a01b0386165f90815260d5602090815260408083208151606081018352905461ffff80821683526201000082041693820193909352600160201b90920463ffffffff1690820152919250906115e490612680565b6001600160a01b0387165f90815260d560205260409020909150611609908684612d0e565b6040805163ffffffff8416815261ffff838116602083015287168183015290516001600160a01b0388169133917fd1e028bd664486a46ad26040e999cd2d22e1e9a094ee6afe19fcf64678f16f749181900360600190a3505050505050565b6066546006906040908116036116915760405163840a48d560e01b815260040160405180910390fd5b8361169b816129b0565b6116b85760405163932d94f760e01b815260040160405180910390fd5b60cb545f906116d490600160a01b900463ffffffff1642613b0d565b6001600160a01b038781165f90815260d460209081526040808320938a1683529281528282208351606081018552905461ffff80821683526201000082041692820192909252600160201b90910463ffffffff169281019290925291925061173b90612680565b6001600160a01b038089165f90815260d460209081526040808320938b1683529290522090915061176d908684612d0e565b6040805163ffffffff8416815261ffff838116602083015287168183015290516001600160a01b0388811692908a169133917f48e198b6ae357e529204ee53a8e514c470ff77d9cc8e4f7207f8b5d490ae6934919081900360600190a450505050505050565b604080516080810182525f80825260208201819052918101829052606081019190915260ca828154811061180957611809613927565b5f91825260209182902060408051608081018252600293909302909101805483526001015463ffffffff80821694840194909452600160201b810490931690820152600160401b90910460ff161515606082015292915050565b6001600160a01b038281165f90815260d46020908152604080832093851683529281528282208351606081018552905461ffff80821683526201000082041692820192909252600160201b90910463ffffffff1692810192909252906118c890612680565b9392505050565b60ca545f905b63ffffffff811615611936578260ca6118ef600184613ce9565b63ffffffff168154811061190557611905613927565b905f5260205f2090600202015f015403611924576118c8600182613ce9565b8061192e81613d05565b9150506118d5565b5060405163504570e360e01b815260040160405180910390fd5b8161195a816129b0565b6119775760405163932d94f760e01b815260040160405180910390fd5b6040516336b87bd760e11b81526001600160a01b0384811660048301527f00000000000000000000000000000000000000000000000000000000000000001690636d70f7ae90602401602060405180830381865afa1580156119db573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906119ff9190613950565b80611a93575060405163ba1a84e560e01b81526001600160a01b0384811660048301525f917f00000000000000000000000000000000000000000000000000000000000000009091169063ba1a84e590602401602060405180830381865afa158015611a6d573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a919190613d23565b115b611ab05760405163fb494ea160e01b815260040160405180910390fd5b610e328383612c40565b611ac26121ad565b6001600160a01b038116611b2c5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084015b60405180910390fd5b61115d81612904565b5f54610100900460ff1615808015611b5357505f54600160ff909116105b80611b6c5750303b158015611b6c57505f5460ff166001145b611bcf5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401611b23565b5f805460ff191660011790558015611bf0575f805461ff0019166101001790555b611bf985612207565b611c0286612904565b611c0b84612955565b611c14836126f0565b611c1d82612ca3565b8015611c62575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050505050565b5f6001610c3160208401846134e6565b606654600390600890811603611ca35760405163840a48d560e01b815260040160405180910390fd5b60cb546001600160a01b03163314611cce57604051635c427cd960e01b815260040160405180910390fd5b60ca5463ffffffff831610611cf6576040516394a8d38960e01b815260040160405180910390fd5b5f60ca8363ffffffff1681548110611d1057611d10613927565b905f5260205f20906002020190508060010160089054906101000a900460ff1615611d4e57604051631b14174b60e01b815260040160405180910390fd5b6001810154600160201b900463ffffffff164210611d7f57604051630c36f66560e21b815260040160405180910390fd5b60018101805460ff60401b1916600160401b17905560405163ffffffff8416907fd850e6e5dfa497b72661fa73df2923464eaed9dc2ff1d3cb82bccbfeabe5c41e905f90a2505050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611e25573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611e499190613d3a565b6001600160a01b0316336001600160a01b031614611e7a5760405163794821ff60e01b815260040160405180910390fd5b60665480198219811614611ea15760405163c61dca5d60e01b815260040160405180910390fd5b606682905560405182815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c9060200160405180910390a25050565b6066545f90600190811603611f075760405163840a48d560e01b815260040160405180910390fd5b611f0f612244565b5f5b82811015610e275736848483818110611f2c57611f2c613927565b9050602002810190611f3e919061396b565b335f81815260ce60209081526040808320549051949550939192611f689290918591879101613ab9565b604051602081830303815290604052805190602001209050611f898361229d565b335f90815260cf602090815260408083208484529091529020805460ff19166001908117909155611fbb908390613ae8565b335f81815260ce602052604090819020929092559051829184917f450a367a380c4e339e5ae7340c8464ef27af7781ad9945cfe8abd828f89e628190612002908890613afb565b60405180910390a4612023333060408601803590610e0b90602089016134e6565b505050600101611f11565b6066546004906010908116036120575760405163840a48d560e01b815260040160405180910390fd5b335f90815260d1602052604090205460ff1661208657604051635c427cd960e01b815260040160405180910390fd5b61208e612244565b5f5b82811015610e2757368484838181106120ab576120ab613927565b90506020028101906120bd919061396b565b335f81815260ce602090815260408083205490519495509391926120e79290918591879101613ab9565b6040516020818303038152906040528051906020012090506121088361229d565b335f90815260d2602090815260408083208484529091529020805460ff1916600190811790915561213a908390613ae8565b335f81815260ce602052604090819020929092559051829184917f5251b6fdefcb5d81144e735f69ea4c695fd43b0289ca53dc075033f5fc80068b90612181908890613afb565b60405180910390a46121a2333060408601803590610e0b90602089016134e6565b505050600101612090565b6033546001600160a01b0316331461120d5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401611b23565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a250565b6002609754036122965760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401611b23565b6002609755565b6122cf6122aa8280613d55565b6122ba60808501606086016136f8565b6122ca60a08601608087016136f8565b612ddd565b5f8160400135116122f3576040516310eb483f60e21b815260040160405180910390fd5b6f4b3b4ca85a86c47a098a223fffffffff816040013511156123285760405163070b5a6f60e21b815260040160405180910390fd5b61235863ffffffff7f00000000000000000000000000000000000000000000000000000000000000001642613ae8565b61236860808301606084016136f8565b63ffffffff16111561115d57604051637ee2b44360e01b815260040160405180910390fd5b6040516001600160a01b03808516602483015283166044820152606481018290526110eb9085906323b872dd60e01b906084015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b0319909316929092179091526130b5565b5f60ca61240860208501856136f8565b63ffffffff168154811061241e5761241e613927565b5f91825260209182902060408051608081018252600293909302909101805483526001015463ffffffff80821694840194909452600160201b810490931690820152600160401b90910460ff1615156060820152905061247e8382612761565b5f61248f60808501606086016134e6565b6001600160a01b038082165f90815260cc602052604090205491925016806124b45750805b336001600160a01b038216146124dd57604051635c427cd960e01b815260040160405180910390fd5b5f5b6124ec60a0870187613d9b565b9050811015611c62573661250360e0880188613d55565b8381811061251357612513613927565b6001600160a01b0387165f90815260cd602090815260408083209302949094019450929091508290612547908501856134e6565b6001600160a01b03166001600160a01b031681526020019081526020015f205490508082602001351161258d5760405163aa385e8160e01b815260040160405180910390fd5b5f61259c826020850135613914565b6001600160a01b0387165f90815260cd602090815260408220929350850180359291906125c990876134e6565b6001600160a01b031681526020808201929092526040015f209190915561260a90899083906125fa908701876134e6565b6001600160a01b03169190613188565b86516001600160a01b03808a1691878216918916907f9543dbd55580842586a951f0386e24d68a5df99ae29e3b216588b45fd684ce319061264e60208901896134e6565b604080519283526001600160a01b039091166020830152810186905260600160405180910390a45050506001016124df565b5f816040015163ffffffff165f14806126b25750815161ffff9081161480156126b25750816040015163ffffffff1642105b156126ca57505060cb54600160e01b900461ffff1690565b816040015163ffffffff164210156126e3578151611146565b506020015190565b919050565b60cb546040805163ffffffff600160a01b9093048316815291831660208301527faf557c6c02c208794817a705609cfa935f827312a1adfdd26494b6b95dd2b4b3910160405180910390a160cb805463ffffffff909216600160a01b0263ffffffff60a01b19909216919091179055565b80606001511561278457604051631b14174b60e01b815260040160405180910390fd5b806040015163ffffffff164210156127af57604051631437a2bb60e31b815260040160405180910390fd5b6127bc60c0830183613d9b565b90506127cb60a0840184613d9b565b9050146127eb576040516343714afd60e01b815260040160405180910390fd5b6127f860e0830183613d55565b905061280760c0840184613d9b565b905014612827576040516343714afd60e01b815260040160405180910390fd5b80516128539061283d60408501602086016136f8565b61284a6040860186613de1565b866060016131b8565b5f5b61286260a0840184613d9b565b9050811015610e32576128fc608084013561288060a0860186613d9b565b8481811061289057612890613927565b90506020020160208101906128a591906136f8565b6128b260c0870187613d9b565b858181106128c2576128c2613927565b90506020028101906128d49190613de1565b6128e160e0890189613d55565b878181106128f1576128f1613927565b90506040020161325c565b600101612855565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b60cb546040516001600160a01b038084169216907f237b82f438d75fc568ebab484b75b01d9287b9e98b490b7c23221623b6705dbb905f90a360cb80546001600160a01b0319166001600160a01b0392909216919091179055565b604051631beb2b9760e31b81526001600160a01b0382811660048301523360248301523060448301525f80356001600160e01b0319166064840152917f00000000000000000000000000000000000000000000000000000000000000009091169063df595cb8906084016020604051808303815f875af1158015612a36573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111469190613950565b5f612a88612a688380613d55565b612a7860808601606087016136f8565b6122ca60a08701608088016136f8565b5f612a966040840184613d55565b905011612ab65760405163796cc52560e01b815260040160405180910390fd5b42612ac760a08401608085016136f8565b612ad760808501606086016136f8565b612ae19190613b0d565b63ffffffff1610612b055760405163150358a160e21b815260040160405180910390fd5b5f80805b612b166040860186613d55565b9050811015612c075736612b2d6040870187613d55565b83818110612b3d57612b3d613927565b6040029190910191505f9050612b5660208301836134e6565b6001600160a01b031603612b7d57604051630863a45360e11b815260040160405180910390fd5b612b8a60208201826134e6565b6001600160a01b0316836001600160a01b031610612bbb576040516310fb47f160e31b815260040160405180910390fd5b5f816020013511612bdf576040516310eb483f60e21b815260040160405180910390fd5b612bec60208201826134e6565b9250612bfc602082013585613ae8565b935050600101612b09565b506f4b3b4ca85a86c47a098a223fffffffff821115612c395760405163070b5a6f60e21b815260040160405180910390fd5b5092915050565b6001600160a01b038083165f81815260cc602052604080822080548686166001600160a01b0319821681179092559151919094169392849290917fbab947934d42e0ad206f25c9cab18b5bb6ae144acfb00f40b4e3aa59590ca3129190a4505050565b60cb546040805161ffff600160e01b9093048316815291831660208301527fe6cd4edfdcc1f6d130ab35f73d72378f3a642944fb4ee5bd84b7807a81ea1c4e910160405180910390a160cb805461ffff909216600160e01b0261ffff60e01b19909216919091179055565b61271061ffff83161115612d355760405163891c63df60e01b815260040160405180910390fd5b8254600160201b900463ffffffff164211612d6357604051637b1e25c560e01b815260040160405180910390fd5b8254600160201b900463ffffffff165f03612d8a57825461ffff191661ffff178355612da1565b825462010000810461ffff1661ffff199091161783555b825463ffffffff909116600160201b0267ffffffff000000001961ffff90931662010000029290921667ffffffffffff00001990911617179055565b82612dfb5760405163796cc52560e01b815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000063ffffffff168163ffffffff161115612e4857604051630dd0b9f560e21b815260040160405180910390fd5b612e727f000000000000000000000000000000000000000000000000000000000000000082613e38565b63ffffffff1615612e965760405163ee66470560e01b815260040160405180910390fd5b612ec07f000000000000000000000000000000000000000000000000000000000000000083613e38565b63ffffffff1615612ee457604051633c1a94f160e21b815260040160405180910390fd5b8163ffffffff167f000000000000000000000000000000000000000000000000000000000000000063ffffffff1642612f1d9190613914565b11158015612f5757508163ffffffff167f000000000000000000000000000000000000000000000000000000000000000063ffffffff1611155b612f745760405163041aa75760e11b815260040160405180910390fd5b5f805b84811015611c62575f868683818110612f9257612f92613927565b612fa892602060409092020190810191506134e6565b60405163198f077960e21b81526001600160a01b0380831660048301529192507f00000000000000000000000000000000000000000000000000000000000000009091169063663c1de490602401602060405180830381865afa158015613011573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906130359190613950565b8061305c57506001600160a01b03811673beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac0145b61307957604051632efd965160e11b815260040160405180910390fd5b806001600160a01b0316836001600160a01b0316106130ab5760405163dfad9ca160e01b815260040160405180910390fd5b9150600101612f77565b5f613109826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b031661329a9092919063ffffffff16565b905080515f14806131295750808060200190518101906131299190613950565b610e325760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401611b23565b6040516001600160a01b038316602482015260448101829052610e3290849063a9059cbb60e01b906064016123c1565b6131c3602083613e5f565b6001901b8463ffffffff16106131eb5760405162c6c39d60e71b815260040160405180910390fd5b5f6131f582610c22565b905061323f84848080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152508a92508591505063ffffffff89166132b0565b611c62576040516369ca16c960e01b815260040160405180910390fd5b613267602083613e5f565b6001901b8463ffffffff16106132905760405163054ff4df60e51b815260040160405180910390fd5b5f6131f582611c6a565b60606132a884845f856132c7565b949350505050565b5f836132bd86858561339e565b1495945050505050565b6060824710156133285760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401611b23565b5f5f866001600160a01b031685876040516133439190613e72565b5f6040518083038185875af1925050503d805f811461337d576040519150601f19603f3d011682016040523d82523d5f602084013e613382565b606091505b509150915061339387838387613435565b979650505050505050565b5f602084516133ad9190613e88565b156133cb576040516313717da960e21b815260040160405180910390fd5b8260205b8551811161342c576133e2600285613e88565b5f0361340357815f528086015160205260405f20915060028404935061341a565b808601515f528160205260405f2091506002840493505b613425602082613ae8565b90506133cf565b50949350505050565b606083156134a35782515f0361349c576001600160a01b0385163b61349c5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401611b23565b50816132a8565b6132a883838151156134b85781518083602001fd5b8060405162461bcd60e51b8152600401611b239190613e9b565b6001600160a01b038116811461115d575f5ffd5b5f602082840312156134f6575f5ffd5b81356118c8816134d2565b801515811461115d575f5ffd5b5f5f6040838503121561351f575f5ffd5b823561352a816134d2565b9150602083013561353a81613501565b809150509250929050565b5f60208284031215613555575f5ffd5b5035919050565b5f6040828403121561356c575f5ffd5b50919050565b5f60408284031215613582575f5ffd5b6118c8838361355c565b5f5f83601f84011261359c575f5ffd5b50813567ffffffffffffffff8111156135b3575f5ffd5b6020830191508360208260051b85010111156135cd575f5ffd5b9250929050565b5f5f602083850312156135e5575f5ffd5b823567ffffffffffffffff8111156135fb575f5ffd5b6136078582860161358c565b90969095509350505050565b5f610100828403121561356c575f5ffd5b5f5f60408385031215613635575f5ffd5b823567ffffffffffffffff81111561364b575f5ffd5b61365785828601613613565b925050602083013561353a816134d2565b803563ffffffff811681146126eb575f5ffd5b5f5f6040838503121561368c575f5ffd5b8235915061369c60208401613668565b90509250929050565b5f5f5f604084860312156136b7575f5ffd5b833567ffffffffffffffff8111156136cd575f5ffd5b6136d98682870161358c565b90945092505060208401356136ed816134d2565b809150509250925092565b5f60208284031215613708575f5ffd5b6118c882613668565b5f60208284031215613721575f5ffd5b813560ff811681146118c8575f5ffd5b5f60208284031215613741575f5ffd5b813567ffffffffffffffff811115613757575f5ffd5b6132a884828501613613565b5f5f60408385031215613774575f5ffd5b823561377f816134d2565b946020939093013593505050565b5f5f6040838503121561379e575f5ffd5b82356137a9816134d2565b9150602083013561353a816134d2565b5f5f5f604084860312156137cb575f5ffd5b83356137d6816134d2565b9250602084013567ffffffffffffffff8111156137f1575f5ffd5b6137fd8682870161358c565b9497909650939450505050565b803561ffff811681146126eb575f5ffd5b5f6020828403121561382b575f5ffd5b6118c88261380a565b5f5f60408385031215613845575f5ffd5b8235613850816134d2565b915061369c6020840161380a565b5f5f5f60608486031215613870575f5ffd5b833561387b816134d2565b9250602084013561388b816134d2565b91506138996040850161380a565b90509250925092565b5f5f5f5f5f60a086880312156138b6575f5ffd5b85356138c1816134d2565b94506020860135935060408601356138d8816134d2565b92506138e660608701613668565b91506138f46080870161380a565b90509295509295909350565b634e487b7160e01b5f52601160045260245ffd5b8181038181111561114657611146613900565b634e487b7160e01b5f52603260045260245ffd5b5f8161394957613949613900565b505f190190565b5f60208284031215613960575f5ffd5b81516118c881613501565b5f8235609e1983360301811261397f575f5ffd5b9190910192915050565b5f5f8335601e1984360301811261399e575f5ffd5b830160208101925035905067ffffffffffffffff8111156139bd575f5ffd5b8060061b36038213156135cd575f5ffd5b8183526020830192505f815f5b84811015613a315781356139ee816134d2565b6001600160a01b0316865260208201356bffffffffffffffffffffffff8116808214613a18575f5ffd5b60208801525060409586019591909101906001016139db565b5093949350505050565b5f613a468283613989565b60a08552613a5860a0860182846139ce565b9150506020830135613a69816134d2565b6001600160a01b031660208501526040838101359085015263ffffffff613a9260608501613668565b16606085015263ffffffff613aa960808501613668565b1660808501528091505092915050565b60018060a01b0384168152826020820152606060408201525f613adf6060830184613a3b565b95945050505050565b8082018082111561114657611146613900565b602081525f6118c86020830184613a3b565b63ffffffff818116838216019081111561114657611146613900565b5f823560fe1983360301811261397f575f5ffd5b5f823560be1983360301811261397f575f5ffd5b5f5f8335601e19843603018112613b66575f5ffd5b830160208101925035905067ffffffffffffffff811115613b85575f5ffd5b8036038213156135cd575f5ffd5b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b5f613bc68283613989565b60c08552613bd860c0860182846139ce565b9150506020830135613be9816134d2565b6001600160a01b03166020850152613c046040840184613989565b858303604087015280835290915f91906020015b81831015613c53578335613c2b816134d2565b6001600160a01b03168152602084810135908201526040938401936001939093019201613c18565b613c5f60608701613668565b63ffffffff811660608901529350613c7960808701613668565b63ffffffff811660808901529350613c9460a0870187613b51565b9450925086810360a0880152613393818585613b93565b60018060a01b0384168152826020820152606060408201525f613adf6060830184613bbb565b828152604060208201525f6132a86040830184613bbb565b63ffffffff828116828216039081111561114657611146613900565b5f63ffffffff821680613d1a57613d1a613900565b5f190192915050565b5f60208284031215613d33575f5ffd5b5051919050565b5f60208284031215613d4a575f5ffd5b81516118c8816134d2565b5f5f8335601e19843603018112613d6a575f5ffd5b83018035915067ffffffffffffffff821115613d84575f5ffd5b6020019150600681901b36038213156135cd575f5ffd5b5f5f8335601e19843603018112613db0575f5ffd5b83018035915067ffffffffffffffff821115613dca575f5ffd5b6020019150600581901b36038213156135cd575f5ffd5b5f5f8335601e19843603018112613df6575f5ffd5b83018035915067ffffffffffffffff821115613e10575f5ffd5b6020019150368190038213156135cd575f5ffd5b634e487b7160e01b5f52601260045260245ffd5b5f63ffffffff831680613e4d57613e4d613e24565b8063ffffffff84160691505092915050565b5f82613e6d57613e6d613e24565b500490565b5f82518060208501845e5f920191825250919050565b5f82613e9657613e96613e24565b500690565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f8301168401019150509291505056fea26469706673582212201a6084d395aa3a0b3fc41fcd22c6d97318ba5baaa9af9b8f96ae50febc98644c64736f6c634300081b0033", >>>>>>> bb1d64ea (chore: remove unused helper (#1039)) +======= + Bin: "0x6101c0604052348015610010575f5ffd5b506040516142d63803806142d683398101604081905261002f91610211565b858a8a8a88888888888f6001600160a01b038116610060576040516339b190bb60e11b815260040160405180910390fd5b6001600160a01b031660805261007685826102d3565b63ffffffff161561009a57604051630e06bd3160e01b815260040160405180910390fd5b6100a762015180866102d3565b63ffffffff16156100cb5760405163223c7b3960e11b815260040160405180910390fd5b6001600160a01b0397881660a05295871660c05293861660e05263ffffffff9283166101005290821661012052811661014052908116610160521661018052166101a052610117610126565b50505050505050505050610306565b5f54610100900460ff16156101915760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff908116146101e0575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b03811681146101f6575f5ffd5b50565b805163ffffffff8116811461020c575f5ffd5b919050565b5f5f5f5f5f5f5f5f5f5f6101408b8d03121561022b575f5ffd5b8a51610236816101e2565b60208c0151909a50610247816101e2565b60408c0151909950610258816101e2565b60608c0151909850610269816101e2565b60808c015190975061027a816101e2565b955061028860a08c016101f9565b945061029660c08c016101f9565b93506102a460e08c016101f9565b92506102b36101008c016101f9565b91506102c26101208c016101f9565b90509295989b9194979a5092959850565b5f63ffffffff8316806102f457634e487b7160e01b5f52601260045260245ffd5b8063ffffffff84160691505092915050565b60805160a05160c05160e05161010051610120516101405161016051610180516101a051613f066103d05f395f81816105a601526129ee01525f818161045a0152612f2f01525f81816103bc015261233201525f81816105080152612eed01525f818161080c0152612dfd01525f818161076001528181612e4d0152612e9b01525f81816108600152611a2601525f818161052f0152612fca01525f81816108d3015261199601525f81816106f201528181610b62015281816111750152611dcb0152613f065ff3fe608060405234801561000f575f5ffd5b506004361061037c575f3560e01c8063886f1195116101d4578063dcbb03b311610109578063f2fde38b116100a9578063fabc1cbc11610079578063fabc1cbc14610981578063fbf1e2c114610994578063fce36c7d146109a7578063ff9f6cce146109ba575f5ffd5b8063f2fde38b14610935578063f6efbb5914610948578063f8cd84481461095b578063f96abf2e1461096e575f5ffd5b8063e810ce21116100e4578063e810ce21146108bb578063ea4d3c9b146108ce578063ed71e6a2146108f5578063f22cef8514610922575f5ffd5b8063dcbb03b314610882578063de02e50314610895578063e063f81f146108a8575f5ffd5b8063a50a1d9c11610174578063bb7e451f1161014f578063bb7e451f146107e8578063bf21a8aa14610807578063c46db6061461082e578063ca8aa7c71461085b575f5ffd5b8063a50a1d9c14610795578063aebd8bae146107a8578063b3dbb0e0146107d5575f5ffd5b80639be3d4e4116101af5780639be3d4e4146107405780639cb9a5fa146107485780639d45c2811461075b578063a0169ddd14610782575f5ffd5b8063886f1195146106ed5780638da5cb5b146107145780639104c31914610725575f5ffd5b80634596021c116102b55780635c975abb11610255578063715018a611610225578063715018a6146106a05780637b8f8b05146106a8578063863cb9a9146106b0578063865c6953146106c3575f5ffd5b80635c975abb146106435780635e9d83481461064b57806363f6a7981461065e5780636d21117e14610673575f5ffd5b80634d18cc35116102905780634d18cc35146105ee57806358baaa3e14610605578063595c6a67146106185780635ac86ab714610620575f5ffd5b80634596021c1461058e5780634657e26a146105a15780634b943960146105c8575f5ffd5b80632b9f64a41161032057806339b70e38116102fb57806339b70e381461052a5780633a8c0786146105515780633ccc861d146105685780633efe1db61461057b575f5ffd5b80632b9f64a4146104b057806336af41fa146104f057806337838ed014610503575f5ffd5b80630eb383451161035b5780630eb3834514610440578063131433b414610455578063136439dd1461047c578063149bc8721461048f575f5ffd5b806218572c1461038057806304a0c502146103b75780630e9a53cf146103f3575b5f5ffd5b6103a261038e3660046134e6565b60d16020525f908152604090205460ff1681565b60405190151581526020015b60405180910390f35b6103de7f000000000000000000000000000000000000000000000000000000000000000081565b60405163ffffffff90911681526020016103ae565b6103fb6109cd565b6040516103ae91905f6080820190508251825263ffffffff602084015116602083015263ffffffff604084015116604083015260608301511515606083015292915050565b61045361044e36600461350e565b610acd565b005b6103de7f000000000000000000000000000000000000000000000000000000000000000081565b61045361048a366004613545565b610b4d565b6104a261049d366004613572565b610c22565b6040519081526020016103ae565b6104d86104be3660046134e6565b60cc6020525f90815260409020546001600160a01b031681565b6040516001600160a01b0390911681526020016103ae565b6104536104fe3660046135d4565b610c97565b6103de7f000000000000000000000000000000000000000000000000000000000000000081565b6104d87f000000000000000000000000000000000000000000000000000000000000000081565b60cb546103de90600160a01b900463ffffffff1681565b610453610576366004613624565b610e37565b61045361058936600461367b565b610e7c565b61045361059c3660046136a5565b611070565b6104d87f000000000000000000000000000000000000000000000000000000000000000081565b6105db6105d63660046134e6565b6110f1565b60405161ffff90911681526020016103ae565b60cb546103de90600160c01b900463ffffffff1681565b6104536106133660046136f8565b61114c565b610453611160565b6103a261062e366004613711565b606654600160ff9092169190911b9081161490565b6066546104a2565b6103a2610659366004613731565b61120f565b60cb546105db90600160e01b900461ffff1681565b6103a2610681366004613763565b60cf60209081525f928352604080842090915290825290205460ff1681565b61045361129a565b60ca546104a2565b6104536106be3660046134e6565b6112ab565b6104a26106d136600461378d565b60cd60209081525f928352604080842090915290825290205481565b6104d87f000000000000000000000000000000000000000000000000000000000000000081565b6033546001600160a01b03166104d8565b6104d873beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac081565b6103fb6112bc565b6104536107563660046137b9565b611358565b6103de7f000000000000000000000000000000000000000000000000000000000000000081565b6104536107903660046134e6565b611503565b6104536107a336600461381b565b61150e565b6103a26107b6366004613763565b60d260209081525f928352604080842090915290825290205460ff1681565b6104536107e3366004613834565b61151f565b6104a26107f63660046134e6565b60ce6020525f908152604090205481565b6103de7f000000000000000000000000000000000000000000000000000000000000000081565b6103a261083c366004613763565b60d060209081525f928352604080842090915290825290205460ff1681565b6104d87f000000000000000000000000000000000000000000000000000000000000000081565b61045361089036600461385e565b611668565b6103fb6108a3366004613545565b6117d3565b6105db6108b636600461378d565b611863565b6103de6108c9366004613545565b6118cf565b6104d87f000000000000000000000000000000000000000000000000000000000000000081565b6103a2610903366004613763565b60d360209081525f928352604080842090915290825290205460ff1681565b61045361093036600461378d565b611950565b6104536109433660046134e6565b611aba565b6104536109563660046138a2565b611b35565b6104a2610969366004613572565b611c6a565b61045361097c3660046136f8565b611c7a565b61045361098f366004613545565b611dc9565b60cb546104d8906001600160a01b031681565b6104536109b53660046135d4565b611edf565b6104536109c83660046135d4565b61202e565b604080516080810182525f80825260208201819052918101829052606081019190915260ca545b8015610aa5575f60ca610a08600184613914565b81548110610a1857610a18613927565b5f91825260209182902060408051608081018252600293909302909101805483526001015463ffffffff80821694840194909452600160201b810490931690820152600160401b90910460ff161580156060830181905291925090610a875750806040015163ffffffff164210155b15610a925792915050565b5080610a9d8161393b565b9150506109f4565b5050604080516080810182525f80825260208201819052918101829052606081019190915290565b610ad56121ad565b6001600160a01b0382165f81815260d1602052604080822054905160ff9091169284151592841515927f4de6293e668df1398422e1def12118052c1539a03cbfedc145895d48d7685f1c9190a4506001600160a01b03919091165f90815260d160205260409020805460ff1916911515919091179055565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa158015610baf573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610bd39190613950565b610bf057604051631d77d47760e21b815260040160405180910390fd5b6066548181168114610c155760405163c61dca5d60e01b815260040160405180910390fd5b610c1e82612207565b5050565b5f80610c3160208401846134e6565b8360200135604051602001610c7a9392919060f89390931b6001600160f81b031916835260609190911b6bffffffffffffffffffffffff19166001830152601582015260350190565b604051602081830303815290604052805190602001209050919050565b606654600190600290811603610cc05760405163840a48d560e01b815260040160405180910390fd5b335f90815260d1602052604090205460ff16610cef57604051635c427cd960e01b815260040160405180910390fd5b610cf7612244565b5f5b82811015610e275736848483818110610d1457610d14613927565b9050602002810190610d26919061396b565b335f81815260ce60209081526040808320549051949550939192610d509290918591879101613ab9565b604051602081830303815290604052805190602001209050610d718361229d565b335f90815260d0602090815260408083208484529091529020805460ff19166001908117909155610da3908390613ae8565b335f81815260ce602052604090819020929092559051829184917f51088b8c89628df3a8174002c2a034d0152fce6af8415d651b2a4734bf27048290610dea908890613afb565b60405180910390a4610e1c333060408601803590610e0b90602089016134e6565b6001600160a01b031692919061238d565b505050600101610cf9565b50610e326001609755565b505050565b606654600290600490811603610e605760405163840a48d560e01b815260040160405180910390fd5b610e68612244565b610e7283836123f8565b610e326001609755565b606654600390600890811603610ea55760405163840a48d560e01b815260040160405180910390fd5b60cb546001600160a01b03163314610ed057604051635c427cd960e01b815260040160405180910390fd5b60cb5463ffffffff600160c01b909104811690831611610f0357604051631ca7e50b60e21b815260040160405180910390fd5b428263ffffffff1610610f29576040516306957c9160e11b815260040160405180910390fd5b60ca5460cb545f90610f4890600160a01b900463ffffffff1642613b0d565b6040805160808101825287815263ffffffff87811660208084018281528684168587018181525f6060880181815260ca8054600181018255925297517f42d72674974f694b5f5159593243114d38a5c39c89d6b62fee061ff523240ee160029092029182015592517f42d72674974f694b5f5159593243114d38a5c39c89d6b62fee061ff523240ee290930180549151975193871667ffffffffffffffff1990921691909117600160201b978716979097029690961760ff60401b1916600160401b921515929092029190911790945560cb805463ffffffff60c01b1916600160c01b840217905593519283529394508892908616917fecd866c3c158fa00bf34d803d5f6023000b57080bcb48af004c2b4b46b3afd08910160405180910390a45050505050565b6066546002906004908116036110995760405163840a48d560e01b815260040160405180910390fd5b6110a1612244565b5f5b838110156110e0576110d88585838181106110c0576110c0613927565b90506020028101906110d29190613b29565b846123f8565b6001016110a3565b506110eb6001609755565b50505050565b6001600160a01b0381165f90815260d5602090815260408083208151606081018352905461ffff80821683526201000082041693820193909352600160201b90920463ffffffff169082015261114690612680565b92915050565b6111546121ad565b61115d816126f0565b50565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa1580156111c2573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111e69190613950565b61120357604051631d77d47760e21b815260040160405180910390fd5b61120d5f19612207565b565b5f6112928260ca61122360208301836136f8565b63ffffffff168154811061123957611239613927565b5f91825260209182902060408051608081018252600293909302909101805483526001015463ffffffff80821694840194909452600160201b810490931690820152600160401b90910460ff1615156060820152612761565b506001919050565b6112a26121ad565b61120d5f612904565b6112b36121ad565b61115d81612955565b604080516080810182525f80825260208201819052918101829052606081019190915260ca80546112ef90600190613914565b815481106112ff576112ff613927565b5f91825260209182902060408051608081018252600293909302909101805483526001015463ffffffff80821694840194909452600160201b810490931690820152600160401b90910460ff1615156060820152919050565b6066546005906020908116036113815760405163840a48d560e01b815260040160405180910390fd5b8361138b816129b0565b6113a85760405163932d94f760e01b815260040160405180910390fd5b6113b0612244565b5f5b838110156114f157368585838181106113cd576113cd613927565b90506020028101906113df9190613b3d565b6001600160a01b0388165f90815260ce6020908152604080832054905193945092611410918b918591879101613cab565b6040516020818303038152906040528051906020012090505f61143284612a5a565b6001600160a01b038b165f90815260d3602090815260408083208684529091529020805460ff19166001908117909155909150611470908490613ae8565b6001600160a01b038b165f81815260ce60205260409081902092909255905183919033907ffc8888bffd711da60bc5092b33f677d81896fe80ecc677b84cfab8184462b6e0906114c39088908a90613cd1565b60405180910390a46114e1333083610e0b6040890160208a016134e6565b5050600190920191506113b29050565b506114fc6001609755565b5050505050565b33610c1e8183612c40565b6115166121ad565b61115d81612ca3565b6066546007906080908116036115485760405163840a48d560e01b815260040160405180910390fd5b82611552816129b0565b61156f5760405163932d94f760e01b815260040160405180910390fd5b60cb545f9061158b90600160a01b900463ffffffff1642613b0d565b6001600160a01b0386165f90815260d5602090815260408083208151606081018352905461ffff80821683526201000082041693820193909352600160201b90920463ffffffff1690820152919250906115e490612680565b6001600160a01b0387165f90815260d560205260409020909150611609908684612d0e565b6040805163ffffffff8416815261ffff838116602083015287168183015290516001600160a01b0388169133917fd1e028bd664486a46ad26040e999cd2d22e1e9a094ee6afe19fcf64678f16f749181900360600190a3505050505050565b6066546006906040908116036116915760405163840a48d560e01b815260040160405180910390fd5b8361169b816129b0565b6116b85760405163932d94f760e01b815260040160405180910390fd5b60cb545f906116d490600160a01b900463ffffffff1642613b0d565b6001600160a01b038781165f90815260d460209081526040808320938a1683529281528282208351606081018552905461ffff80821683526201000082041692820192909252600160201b90910463ffffffff169281019290925291925061173b90612680565b6001600160a01b038089165f90815260d460209081526040808320938b1683529290522090915061176d908684612d0e565b6040805163ffffffff8416815261ffff838116602083015287168183015290516001600160a01b0388811692908a169133917f48e198b6ae357e529204ee53a8e514c470ff77d9cc8e4f7207f8b5d490ae6934919081900360600190a450505050505050565b604080516080810182525f80825260208201819052918101829052606081019190915260ca828154811061180957611809613927565b5f91825260209182902060408051608081018252600293909302909101805483526001015463ffffffff80821694840194909452600160201b810490931690820152600160401b90910460ff161515606082015292915050565b6001600160a01b038281165f90815260d46020908152604080832093851683529281528282208351606081018552905461ffff80821683526201000082041692820192909252600160201b90910463ffffffff1692810192909252906118c890612680565b9392505050565b60ca545f905b63ffffffff811615611936578260ca6118ef600184613ce9565b63ffffffff168154811061190557611905613927565b905f5260205f2090600202015f015403611924576118c8600182613ce9565b8061192e81613d05565b9150506118d5565b5060405163504570e360e01b815260040160405180910390fd5b8161195a816129b0565b6119775760405163932d94f760e01b815260040160405180910390fd5b6040516336b87bd760e11b81526001600160a01b0384811660048301527f00000000000000000000000000000000000000000000000000000000000000001690636d70f7ae90602401602060405180830381865afa1580156119db573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906119ff9190613950565b80611a93575060405163ba1a84e560e01b81526001600160a01b0384811660048301525f917f00000000000000000000000000000000000000000000000000000000000000009091169063ba1a84e590602401602060405180830381865afa158015611a6d573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a919190613d23565b115b611ab05760405163fb494ea160e01b815260040160405180910390fd5b610e328383612c40565b611ac26121ad565b6001600160a01b038116611b2c5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084015b60405180910390fd5b61115d81612904565b5f54610100900460ff1615808015611b5357505f54600160ff909116105b80611b6c5750303b158015611b6c57505f5460ff166001145b611bcf5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401611b23565b5f805460ff191660011790558015611bf0575f805461ff0019166101001790555b611bf985612207565b611c0286612904565b611c0b84612955565b611c14836126f0565b611c1d82612ca3565b8015611c62575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050505050565b5f6001610c3160208401846134e6565b606654600390600890811603611ca35760405163840a48d560e01b815260040160405180910390fd5b60cb546001600160a01b03163314611cce57604051635c427cd960e01b815260040160405180910390fd5b60ca5463ffffffff831610611cf6576040516394a8d38960e01b815260040160405180910390fd5b5f60ca8363ffffffff1681548110611d1057611d10613927565b905f5260205f20906002020190508060010160089054906101000a900460ff1615611d4e57604051631b14174b60e01b815260040160405180910390fd5b6001810154600160201b900463ffffffff164210611d7f57604051630c36f66560e21b815260040160405180910390fd5b60018101805460ff60401b1916600160401b17905560405163ffffffff8416907fd850e6e5dfa497b72661fa73df2923464eaed9dc2ff1d3cb82bccbfeabe5c41e905f90a2505050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611e25573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611e499190613d3a565b6001600160a01b0316336001600160a01b031614611e7a5760405163794821ff60e01b815260040160405180910390fd5b60665480198219811614611ea15760405163c61dca5d60e01b815260040160405180910390fd5b606682905560405182815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c9060200160405180910390a25050565b6066545f90600190811603611f075760405163840a48d560e01b815260040160405180910390fd5b611f0f612244565b5f5b82811015610e275736848483818110611f2c57611f2c613927565b9050602002810190611f3e919061396b565b335f81815260ce60209081526040808320549051949550939192611f689290918591879101613ab9565b604051602081830303815290604052805190602001209050611f898361229d565b335f90815260cf602090815260408083208484529091529020805460ff19166001908117909155611fbb908390613ae8565b335f81815260ce602052604090819020929092559051829184917f450a367a380c4e339e5ae7340c8464ef27af7781ad9945cfe8abd828f89e628190612002908890613afb565b60405180910390a4612023333060408601803590610e0b90602089016134e6565b505050600101611f11565b6066546004906010908116036120575760405163840a48d560e01b815260040160405180910390fd5b335f90815260d1602052604090205460ff1661208657604051635c427cd960e01b815260040160405180910390fd5b61208e612244565b5f5b82811015610e2757368484838181106120ab576120ab613927565b90506020028101906120bd919061396b565b335f81815260ce602090815260408083205490519495509391926120e79290918591879101613ab9565b6040516020818303038152906040528051906020012090506121088361229d565b335f90815260d2602090815260408083208484529091529020805460ff1916600190811790915561213a908390613ae8565b335f81815260ce602052604090819020929092559051829184917f5251b6fdefcb5d81144e735f69ea4c695fd43b0289ca53dc075033f5fc80068b90612181908890613afb565b60405180910390a46121a2333060408601803590610e0b90602089016134e6565b505050600101612090565b6033546001600160a01b0316331461120d5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401611b23565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a250565b6002609754036122965760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401611b23565b6002609755565b6122cf6122aa8280613d55565b6122ba60808501606086016136f8565b6122ca60a08601608087016136f8565b612ddd565b5f8160400135116122f3576040516310eb483f60e21b815260040160405180910390fd5b6f4b3b4ca85a86c47a098a223fffffffff816040013511156123285760405163070b5a6f60e21b815260040160405180910390fd5b61235863ffffffff7f00000000000000000000000000000000000000000000000000000000000000001642613ae8565b61236860808301606084016136f8565b63ffffffff16111561115d57604051637ee2b44360e01b815260040160405180910390fd5b6040516001600160a01b03808516602483015283166044820152606481018290526110eb9085906323b872dd60e01b906084015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b0319909316929092179091526130b5565b5f60ca61240860208501856136f8565b63ffffffff168154811061241e5761241e613927565b5f91825260209182902060408051608081018252600293909302909101805483526001015463ffffffff80821694840194909452600160201b810490931690820152600160401b90910460ff1615156060820152905061247e8382612761565b5f61248f60808501606086016134e6565b6001600160a01b038082165f90815260cc602052604090205491925016806124b45750805b336001600160a01b038216146124dd57604051635c427cd960e01b815260040160405180910390fd5b5f5b6124ec60a0870187613d9b565b9050811015611c62573661250360e0880188613d55565b8381811061251357612513613927565b6001600160a01b0387165f90815260cd602090815260408083209302949094019450929091508290612547908501856134e6565b6001600160a01b03166001600160a01b031681526020019081526020015f205490508082602001351161258d5760405163aa385e8160e01b815260040160405180910390fd5b5f61259c826020850135613914565b6001600160a01b0387165f90815260cd602090815260408220929350850180359291906125c990876134e6565b6001600160a01b031681526020808201929092526040015f209190915561260a90899083906125fa908701876134e6565b6001600160a01b03169190613188565b86516001600160a01b03808a1691878216918916907f9543dbd55580842586a951f0386e24d68a5df99ae29e3b216588b45fd684ce319061264e60208901896134e6565b604080519283526001600160a01b039091166020830152810186905260600160405180910390a45050506001016124df565b5f816040015163ffffffff165f14806126b25750815161ffff9081161480156126b25750816040015163ffffffff1642105b156126ca57505060cb54600160e01b900461ffff1690565b816040015163ffffffff164210156126e3578151611146565b506020015190565b919050565b60cb546040805163ffffffff600160a01b9093048316815291831660208301527faf557c6c02c208794817a705609cfa935f827312a1adfdd26494b6b95dd2b4b3910160405180910390a160cb805463ffffffff909216600160a01b0263ffffffff60a01b19909216919091179055565b80606001511561278457604051631b14174b60e01b815260040160405180910390fd5b806040015163ffffffff164210156127af57604051631437a2bb60e31b815260040160405180910390fd5b6127bc60c0830183613d9b565b90506127cb60a0840184613d9b565b9050146127eb576040516343714afd60e01b815260040160405180910390fd5b6127f860e0830183613d55565b905061280760c0840184613d9b565b905014612827576040516343714afd60e01b815260040160405180910390fd5b80516128539061283d60408501602086016136f8565b61284a6040860186613de1565b866060016131b8565b5f5b61286260a0840184613d9b565b9050811015610e32576128fc608084013561288060a0860186613d9b565b8481811061289057612890613927565b90506020020160208101906128a591906136f8565b6128b260c0870187613d9b565b858181106128c2576128c2613927565b90506020028101906128d49190613de1565b6128e160e0890189613d55565b878181106128f1576128f1613927565b90506040020161325c565b600101612855565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b60cb546040516001600160a01b038084169216907f237b82f438d75fc568ebab484b75b01d9287b9e98b490b7c23221623b6705dbb905f90a360cb80546001600160a01b0319166001600160a01b0392909216919091179055565b604051631beb2b9760e31b81526001600160a01b0382811660048301523360248301523060448301525f80356001600160e01b0319166064840152917f00000000000000000000000000000000000000000000000000000000000000009091169063df595cb8906084016020604051808303815f875af1158015612a36573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111469190613950565b5f612a88612a688380613d55565b612a7860808601606087016136f8565b6122ca60a08701608088016136f8565b5f612a966040840184613d55565b905011612ab65760405163796cc52560e01b815260040160405180910390fd5b42612ac760a08401608085016136f8565b612ad760808501606086016136f8565b612ae19190613b0d565b63ffffffff1610612b055760405163150358a160e21b815260040160405180910390fd5b5f80805b612b166040860186613d55565b9050811015612c075736612b2d6040870187613d55565b83818110612b3d57612b3d613927565b6040029190910191505f9050612b5660208301836134e6565b6001600160a01b031603612b7d57604051630863a45360e11b815260040160405180910390fd5b612b8a60208201826134e6565b6001600160a01b0316836001600160a01b031610612bbb576040516310fb47f160e31b815260040160405180910390fd5b5f816020013511612bdf576040516310eb483f60e21b815260040160405180910390fd5b612bec60208201826134e6565b9250612bfc602082013585613ae8565b935050600101612b09565b506f4b3b4ca85a86c47a098a223fffffffff821115612c395760405163070b5a6f60e21b815260040160405180910390fd5b5092915050565b6001600160a01b038083165f81815260cc602052604080822080548686166001600160a01b0319821681179092559151919094169392849290917fbab947934d42e0ad206f25c9cab18b5bb6ae144acfb00f40b4e3aa59590ca3129190a4505050565b60cb546040805161ffff600160e01b9093048316815291831660208301527fe6cd4edfdcc1f6d130ab35f73d72378f3a642944fb4ee5bd84b7807a81ea1c4e910160405180910390a160cb805461ffff909216600160e01b0261ffff60e01b19909216919091179055565b61271061ffff83161115612d355760405163891c63df60e01b815260040160405180910390fd5b8254600160201b900463ffffffff164211612d6357604051637b1e25c560e01b815260040160405180910390fd5b8254600160201b900463ffffffff165f03612d8a57825461ffff191661ffff178355612da1565b825462010000810461ffff1661ffff199091161783555b825463ffffffff909116600160201b0267ffffffff000000001961ffff90931662010000029290921667ffffffffffff00001990911617179055565b82612dfb5760405163796cc52560e01b815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000063ffffffff168163ffffffff161115612e4857604051630dd0b9f560e21b815260040160405180910390fd5b612e727f000000000000000000000000000000000000000000000000000000000000000082613e38565b63ffffffff1615612e965760405163ee66470560e01b815260040160405180910390fd5b612ec07f000000000000000000000000000000000000000000000000000000000000000083613e38565b63ffffffff1615612ee457604051633c1a94f160e21b815260040160405180910390fd5b8163ffffffff167f000000000000000000000000000000000000000000000000000000000000000063ffffffff1642612f1d9190613914565b11158015612f5757508163ffffffff167f000000000000000000000000000000000000000000000000000000000000000063ffffffff1611155b612f745760405163041aa75760e11b815260040160405180910390fd5b5f805b84811015611c62575f868683818110612f9257612f92613927565b612fa892602060409092020190810191506134e6565b60405163198f077960e21b81526001600160a01b0380831660048301529192507f00000000000000000000000000000000000000000000000000000000000000009091169063663c1de490602401602060405180830381865afa158015613011573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906130359190613950565b8061305c57506001600160a01b03811673beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac0145b61307957604051632efd965160e11b815260040160405180910390fd5b806001600160a01b0316836001600160a01b0316106130ab5760405163dfad9ca160e01b815260040160405180910390fd5b9150600101612f77565b5f613109826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b031661329a9092919063ffffffff16565b905080515f14806131295750808060200190518101906131299190613950565b610e325760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401611b23565b6040516001600160a01b038316602482015260448101829052610e3290849063a9059cbb60e01b906064016123c1565b6131c3602083613e5f565b6001901b8463ffffffff16106131eb5760405162c6c39d60e71b815260040160405180910390fd5b5f6131f582610c22565b905061323f84848080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152508a92508591505063ffffffff89166132b0565b611c62576040516369ca16c960e01b815260040160405180910390fd5b613267602083613e5f565b6001901b8463ffffffff16106132905760405163054ff4df60e51b815260040160405180910390fd5b5f6131f582611c6a565b60606132a884845f856132c7565b949350505050565b5f836132bd86858561339e565b1495945050505050565b6060824710156133285760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401611b23565b5f5f866001600160a01b031685876040516133439190613e72565b5f6040518083038185875af1925050503d805f811461337d576040519150601f19603f3d011682016040523d82523d5f602084013e613382565b606091505b509150915061339387838387613435565b979650505050505050565b5f602084516133ad9190613e88565b156133cb576040516313717da960e21b815260040160405180910390fd5b8260205b8551811161342c576133e2600285613e88565b5f0361340357815f528086015160205260405f20915060028404935061341a565b808601515f528160205260405f2091506002840493505b613425602082613ae8565b90506133cf565b50949350505050565b606083156134a35782515f0361349c576001600160a01b0385163b61349c5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401611b23565b50816132a8565b6132a883838151156134b85781518083602001fd5b8060405162461bcd60e51b8152600401611b239190613e9b565b6001600160a01b038116811461115d575f5ffd5b5f602082840312156134f6575f5ffd5b81356118c8816134d2565b801515811461115d575f5ffd5b5f5f6040838503121561351f575f5ffd5b823561352a816134d2565b9150602083013561353a81613501565b809150509250929050565b5f60208284031215613555575f5ffd5b5035919050565b5f6040828403121561356c575f5ffd5b50919050565b5f60408284031215613582575f5ffd5b6118c8838361355c565b5f5f83601f84011261359c575f5ffd5b50813567ffffffffffffffff8111156135b3575f5ffd5b6020830191508360208260051b85010111156135cd575f5ffd5b9250929050565b5f5f602083850312156135e5575f5ffd5b823567ffffffffffffffff8111156135fb575f5ffd5b6136078582860161358c565b90969095509350505050565b5f610100828403121561356c575f5ffd5b5f5f60408385031215613635575f5ffd5b823567ffffffffffffffff81111561364b575f5ffd5b61365785828601613613565b925050602083013561353a816134d2565b803563ffffffff811681146126eb575f5ffd5b5f5f6040838503121561368c575f5ffd5b8235915061369c60208401613668565b90509250929050565b5f5f5f604084860312156136b7575f5ffd5b833567ffffffffffffffff8111156136cd575f5ffd5b6136d98682870161358c565b90945092505060208401356136ed816134d2565b809150509250925092565b5f60208284031215613708575f5ffd5b6118c882613668565b5f60208284031215613721575f5ffd5b813560ff811681146118c8575f5ffd5b5f60208284031215613741575f5ffd5b813567ffffffffffffffff811115613757575f5ffd5b6132a884828501613613565b5f5f60408385031215613774575f5ffd5b823561377f816134d2565b946020939093013593505050565b5f5f6040838503121561379e575f5ffd5b82356137a9816134d2565b9150602083013561353a816134d2565b5f5f5f604084860312156137cb575f5ffd5b83356137d6816134d2565b9250602084013567ffffffffffffffff8111156137f1575f5ffd5b6137fd8682870161358c565b9497909650939450505050565b803561ffff811681146126eb575f5ffd5b5f6020828403121561382b575f5ffd5b6118c88261380a565b5f5f60408385031215613845575f5ffd5b8235613850816134d2565b915061369c6020840161380a565b5f5f5f60608486031215613870575f5ffd5b833561387b816134d2565b9250602084013561388b816134d2565b91506138996040850161380a565b90509250925092565b5f5f5f5f5f60a086880312156138b6575f5ffd5b85356138c1816134d2565b94506020860135935060408601356138d8816134d2565b92506138e660608701613668565b91506138f46080870161380a565b90509295509295909350565b634e487b7160e01b5f52601160045260245ffd5b8181038181111561114657611146613900565b634e487b7160e01b5f52603260045260245ffd5b5f8161394957613949613900565b505f190190565b5f60208284031215613960575f5ffd5b81516118c881613501565b5f8235609e1983360301811261397f575f5ffd5b9190910192915050565b5f5f8335601e1984360301811261399e575f5ffd5b830160208101925035905067ffffffffffffffff8111156139bd575f5ffd5b8060061b36038213156135cd575f5ffd5b8183526020830192505f815f5b84811015613a315781356139ee816134d2565b6001600160a01b0316865260208201356bffffffffffffffffffffffff8116808214613a18575f5ffd5b60208801525060409586019591909101906001016139db565b5093949350505050565b5f613a468283613989565b60a08552613a5860a0860182846139ce565b9150506020830135613a69816134d2565b6001600160a01b031660208501526040838101359085015263ffffffff613a9260608501613668565b16606085015263ffffffff613aa960808501613668565b1660808501528091505092915050565b60018060a01b0384168152826020820152606060408201525f613adf6060830184613a3b565b95945050505050565b8082018082111561114657611146613900565b602081525f6118c86020830184613a3b565b63ffffffff818116838216019081111561114657611146613900565b5f823560fe1983360301811261397f575f5ffd5b5f823560be1983360301811261397f575f5ffd5b5f5f8335601e19843603018112613b66575f5ffd5b830160208101925035905067ffffffffffffffff811115613b85575f5ffd5b8036038213156135cd575f5ffd5b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b5f613bc68283613989565b60c08552613bd860c0860182846139ce565b9150506020830135613be9816134d2565b6001600160a01b03166020850152613c046040840184613989565b858303604087015280835290915f91906020015b81831015613c53578335613c2b816134d2565b6001600160a01b03168152602084810135908201526040938401936001939093019201613c18565b613c5f60608701613668565b63ffffffff811660608901529350613c7960808701613668565b63ffffffff811660808901529350613c9460a0870187613b51565b9450925086810360a0880152613393818585613b93565b60018060a01b0384168152826020820152606060408201525f613adf6060830184613bbb565b828152604060208201525f6132a86040830184613bbb565b63ffffffff828116828216039081111561114657611146613900565b5f63ffffffff821680613d1a57613d1a613900565b5f190192915050565b5f60208284031215613d33575f5ffd5b5051919050565b5f60208284031215613d4a575f5ffd5b81516118c8816134d2565b5f5f8335601e19843603018112613d6a575f5ffd5b83018035915067ffffffffffffffff821115613d84575f5ffd5b6020019150600681901b36038213156135cd575f5ffd5b5f5f8335601e19843603018112613db0575f5ffd5b83018035915067ffffffffffffffff821115613dca575f5ffd5b6020019150600581901b36038213156135cd575f5ffd5b5f5f8335601e19843603018112613df6575f5ffd5b83018035915067ffffffffffffffff821115613e10575f5ffd5b6020019150368190038213156135cd575f5ffd5b634e487b7160e01b5f52601260045260245ffd5b5f63ffffffff831680613e4d57613e4d613e24565b8063ffffffff84160691505092915050565b5f82613e6d57613e6d613e24565b500490565b5f82518060208501845e5f920191825250919050565b5f82613e9657613e96613e24565b500690565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f8301168401019150509291505056fea264697066735822122066af1d025e7df449cf3df2cce310aeeb67e5fcdbf154aaac2a03c9f01d9eebdd64736f6c634300081b0033", +>>>>>>> 0a38914f (feat: changing burnableShares to EnumerableMap (#1028)) } // RewardsCoordinatorABI is the input ABI used to generate the binding from. diff --git a/pkg/bindings/SlashingLib/binding.go b/pkg/bindings/SlashingLib/binding.go index 7d63923c31..50d5dc40de 100644 --- a/pkg/bindings/SlashingLib/binding.go +++ b/pkg/bindings/SlashingLib/binding.go @@ -32,7 +32,7 @@ var ( // SlashingLibMetaData contains all meta data concerning the SlashingLib contract. var SlashingLibMetaData = &bind.MetaData{ ABI: "[]", - Bin: "0x60556032600b8282823980515f1a607314602657634e487b7160e01b5f525f60045260245ffd5b305f52607381538281f3fe730000000000000000000000000000000000000000301460806040525f5ffdfea264697066735822122079d8acd82faee8c5e28651bbc1515549e1c13cf6bb3869d1f31aa11a796fa9f664736f6c634300081b0033", + Bin: "0x60556032600b8282823980515f1a607314602657634e487b7160e01b5f525f60045260245ffd5b305f52607381538281f3fe730000000000000000000000000000000000000000301460806040525f5ffdfea264697066735822122058e15e955a976861c65d02452e26cd3829c665a8a59b90392f5f7985280fe5d864736f6c634300081b0033", } // SlashingLibABI is the input ABI used to generate the binding from. diff --git a/pkg/bindings/Snapshots/binding.go b/pkg/bindings/Snapshots/binding.go index 2a6027eebf..d300db193e 100644 --- a/pkg/bindings/Snapshots/binding.go +++ b/pkg/bindings/Snapshots/binding.go @@ -32,7 +32,7 @@ var ( // SnapshotsMetaData contains all meta data concerning the Snapshots contract. var SnapshotsMetaData = &bind.MetaData{ ABI: "[{\"type\":\"error\",\"name\":\"InvalidSnapshotOrdering\",\"inputs\":[]}]", - Bin: "0x60556032600b8282823980515f1a607314602657634e487b7160e01b5f525f60045260245ffd5b305f52607381538281f3fe730000000000000000000000000000000000000000301460806040525f5ffdfea264697066735822122044bb5b18319bff57ed60efd0467beb2f05208fa5189c267bfd18f0a7f7417aa964736f6c634300081b0033", + Bin: "0x60556032600b8282823980515f1a607314602657634e487b7160e01b5f525f60045260245ffd5b305f52607381538281f3fe730000000000000000000000000000000000000000301460806040525f5ffdfea264697066735822122000b32b484185179f60b3b1528c5fcf3ab158742c3034b94518561b44ec7dd07564736f6c634300081b0033", } // SnapshotsABI is the input ABI used to generate the binding from. diff --git a/pkg/bindings/StrategyBase/binding.go b/pkg/bindings/StrategyBase/binding.go index 8d8ac72785..3286d6f529 100644 --- a/pkg/bindings/StrategyBase/binding.go +++ b/pkg/bindings/StrategyBase/binding.go @@ -32,7 +32,7 @@ var ( // StrategyBaseMetaData contains all meta data concerning the StrategyBase contract. var StrategyBaseMetaData = &bind.MetaData{ ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"_strategyManager\",\"type\":\"address\",\"internalType\":\"contractIStrategyManager\"},{\"name\":\"_pauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"deposit\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"newShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"explanation\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"_underlyingToken\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"pauseAll\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[{\"name\":\"index\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pauserRegistry\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"shares\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"sharesToUnderlying\",\"inputs\":[{\"name\":\"amountShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"sharesToUnderlyingView\",\"inputs\":[{\"name\":\"amountShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"strategyManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategyManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"totalShares\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"underlyingToShares\",\"inputs\":[{\"name\":\"amountUnderlying\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"underlyingToSharesView\",\"inputs\":[{\"name\":\"amountUnderlying\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"underlyingToken\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"userUnderlying\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"userUnderlyingView\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"withdraw\",\"inputs\":[{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amountShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"ExchangeRateEmitted\",\"inputs\":[{\"name\":\"rate\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StrategyTokenSet\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIERC20\"},{\"name\":\"decimals\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"BalanceExceedsMaxTotalDeposits\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"CurrentlyPaused\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InputAddressZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidNewPausedStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"MaxPerDepositExceedsMax\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NewSharesZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyPauser\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyStrategyManager\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyUnderlyingToken\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyUnpauser\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"TotalSharesExceedsMax\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"WithdrawalAmountExceedsTotalDeposits\",\"inputs\":[]}]", - Bin: "0x60c060405234801561000f575f5ffd5b506040516113a63803806113a683398101604081905261002e9161014b565b806001600160a01b038116610056576040516339b190bb60e11b815260040160405180910390fd5b6001600160a01b03908116608052821660a052610071610078565b5050610183565b5f54610100900460ff16156100e35760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff90811614610132575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b0381168114610148575f5ffd5b50565b5f5f6040838503121561015c575f5ffd5b825161016781610134565b602084015190925061017881610134565b809150509250929050565b60805160a0516111d86101ce5f395f81816101750152818161040201528181610796015261083301525f818161022b0152818161030f01528181610543015261096101526111d85ff3fe608060405234801561000f575f5ffd5b5060043610610127575f3560e01c8063886f1195116100a9578063ce7c2ac21161006e578063ce7c2ac21461029b578063d9caed12146102ae578063e3dae51c146102c1578063f3e73875146102d4578063fabc1cbc146102e7575f5ffd5b8063886f1195146102265780638c8710191461024d5780638f6a624014610260578063ab5921e114610273578063c4d66de814610288575f5ffd5b8063553ca5f8116100ef578063553ca5f8146101c1578063595c6a67146101d45780635ac86ab7146101dc5780635c975abb1461020b5780637a8b263714610213575f5ffd5b8063136439dd1461012b5780632495a5991461014057806339b70e38146101705780633a98ef391461019757806347e7ef24146101ae575b5f5ffd5b61013e610139366004610f4d565b6102fa565b005b603254610153906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b6101537f000000000000000000000000000000000000000000000000000000000000000081565b6101a060335481565b604051908152602001610167565b6101a06101bc366004610f7b565b6103cf565b6101a06101cf366004610fa5565b61051b565b61013e61052e565b6101fb6101ea366004610fd5565b6001805460ff9092161b9081161490565b6040519015158152602001610167565b6001546101a0565b6101a0610221366004610f4d565b6105dd565b6101537f000000000000000000000000000000000000000000000000000000000000000081565b6101a061025b366004610f4d565b610626565b6101a061026e366004610fa5565b610630565b61027b61063d565b6040516101679190610ff0565b61013e610296366004610fa5565b61065d565b6101a06102a9366004610fa5565b61076f565b61013e6102bc366004611025565b610801565b6101a06102cf366004610f4d565b61091e565b6101a06102e2366004610f4d565b610955565b61013e6102f5366004610f4d565b61095f565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa15801561035c573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103809190611063565b61039d57604051631d77d47760e21b815260040160405180910390fd5b60015481811681146103c25760405163c61dca5d60e01b815260040160405180910390fd5b6103cb82610a75565b5050565b600180545f9182918116036103f75760405163840a48d560e01b815260040160405180910390fd5b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610440576040516348da714f60e01b815260040160405180910390fd5b61044a8484610ab2565b6033545f61045a6103e883611096565b90505f6103e8610468610ae0565b6104729190611096565b90505f61047f87836110a9565b90508061048c84896110bc565b61049691906110d3565b9550855f036104b857604051630c392ed360e11b815260040160405180910390fd5b6104c28685611096565b60338190556f4b3b4ca85a86c47a098a223fffffffff10156104f757604051632f14e8a360e11b815260040160405180910390fd5b610510826103e860335461050b9190611096565b610b4f565b505050505092915050565b5f6105286102218361076f565b92915050565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa158015610590573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105b49190611063565b6105d157604051631d77d47760e21b815260040160405180910390fd5b6105db5f19610a75565b565b5f5f6103e86033546105ef9190611096565b90505f6103e86105fd610ae0565b6106079190611096565b90508161061485836110bc565b61061e91906110d3565b949350505050565b5f6105288261091e565b5f6105286102e28361076f565b60606040518060800160405280604d8152602001611156604d9139905090565b5f54610100900460ff161580801561067b57505f54600160ff909116105b806106945750303b15801561069457505f5460ff166001145b6106fc5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b5f805460ff19166001179055801561071d575f805461ff0019166101001790555b61072682610b9b565b80156103cb575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498906020015b60405180910390a15050565b60405163fe243a1760e01b81526001600160a01b0382811660048301523060248301525f917f00000000000000000000000000000000000000000000000000000000000000009091169063fe243a1790604401602060405180830381865afa1580156107dd573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061052891906110f2565b600180546002908116036108285760405163840a48d560e01b815260040160405180910390fd5b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610871576040516348da714f60e01b815260040160405180910390fd5b61087c848484610ce6565b603354808311156108a057604051630b469df360e41b815260040160405180910390fd5b5f6108ad6103e883611096565b90505f6103e86108bb610ae0565b6108c59190611096565b90505f826108d387846110bc565b6108dd91906110d3565b90506108e986856110a9565b6033556109096108f982846110a9565b6103e860335461050b9190611096565b610914888883610d19565b5050505050505050565b5f5f6103e86033546109309190611096565b90505f6103e861093e610ae0565b6109489190611096565b90508061061483866110bc565b5f610528826105dd565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156109bb573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109df9190611109565b6001600160a01b0316336001600160a01b031614610a105760405163794821ff60e01b815260040160405180910390fd5b60015480198219811614610a375760405163c61dca5d60e01b815260040160405180910390fd5b600182905560405182815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c9060200160405180910390a25050565b600181905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a250565b6032546001600160a01b038381169116146103cb57604051630312abdd60e61b815260040160405180910390fd5b6032546040516370a0823160e01b81523060048201525f916001600160a01b0316906370a0823190602401602060405180830381865afa158015610b26573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b4a91906110f2565b905090565b7fd2494f3479e5da49d386657c292c610b5b01df313d07c62eb0cfa49924a31be881610b8384670de0b6b3a76400006110bc565b610b8d91906110d3565b604051908152602001610763565b5f54610100900460ff16610c055760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b60648201526084016106f3565b603280546001600160a01b0319166001600160a01b038316179055610c295f610a75565b7f1c540707b00eb5427b6b774fc799d756516a54aee108b64b327acc55af55750760325f9054906101000a90046001600160a01b0316826001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015610c9b573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610cbf9190611124565b604080516001600160a01b03909316835260ff90911660208301520160405180910390a150565b6032546001600160a01b03838116911614610d1457604051630312abdd60e61b815260040160405180910390fd5b505050565b604080516001600160a01b03858116602483015260448083018590528351808403909101815260649092018352602080830180516001600160e01b031663a9059cbb60e01b17905283518085019094528084527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c656490840152610d1492908516918691859185918591905f90610db19084908490610e30565b905080515f1480610dd1575080806020019051810190610dd19190611063565b610d145760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016106f3565b606061061e84845f85855f5f866001600160a01b03168587604051610e55919061113f565b5f6040518083038185875af1925050503d805f8114610e8f576040519150601f19603f3d011682016040523d82523d5f602084013e610e94565b606091505b5091509150610ea587838387610eb0565b979650505050505050565b60608315610f1e5782515f03610f17576001600160a01b0385163b610f175760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016106f3565b508161061e565b61061e8383815115610f335781518083602001fd5b8060405162461bcd60e51b81526004016106f39190610ff0565b5f60208284031215610f5d575f5ffd5b5035919050565b6001600160a01b0381168114610f78575f5ffd5b50565b5f5f60408385031215610f8c575f5ffd5b8235610f9781610f64565b946020939093013593505050565b5f60208284031215610fb5575f5ffd5b8135610fc081610f64565b9392505050565b60ff81168114610f78575f5ffd5b5f60208284031215610fe5575f5ffd5b8135610fc081610fc7565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b5f5f5f60608486031215611037575f5ffd5b833561104281610f64565b9250602084013561105281610f64565b929592945050506040919091013590565b5f60208284031215611073575f5ffd5b81518015158114610fc0575f5ffd5b634e487b7160e01b5f52601160045260245ffd5b8082018082111561052857610528611082565b8181038181111561052857610528611082565b808202811582820484141761052857610528611082565b5f826110ed57634e487b7160e01b5f52601260045260245ffd5b500490565b5f60208284031215611102575f5ffd5b5051919050565b5f60208284031215611119575f5ffd5b8151610fc081610f64565b5f60208284031215611134575f5ffd5b8151610fc081610fc7565b5f82518060208501845e5f92019182525091905056fe4261736520537472617465677920696d706c656d656e746174696f6e20746f20696e68657269742066726f6d20666f72206d6f726520636f6d706c657820696d706c656d656e746174696f6e73a2646970667358221220f4652e29b9389ddb9bb3e165cbbc4a59be04a6b7c106abd876f5689aa6ae036464736f6c634300081b0033", + Bin: "0x60c060405234801561000f575f5ffd5b506040516113a63803806113a683398101604081905261002e9161014b565b806001600160a01b038116610056576040516339b190bb60e11b815260040160405180910390fd5b6001600160a01b03908116608052821660a052610071610078565b5050610183565b5f54610100900460ff16156100e35760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff90811614610132575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b0381168114610148575f5ffd5b50565b5f5f6040838503121561015c575f5ffd5b825161016781610134565b602084015190925061017881610134565b809150509250929050565b60805160a0516111d86101ce5f395f81816101750152818161040201528181610796015261083301525f818161022b0152818161030f01528181610543015261096101526111d85ff3fe608060405234801561000f575f5ffd5b5060043610610127575f3560e01c8063886f1195116100a9578063ce7c2ac21161006e578063ce7c2ac21461029b578063d9caed12146102ae578063e3dae51c146102c1578063f3e73875146102d4578063fabc1cbc146102e7575f5ffd5b8063886f1195146102265780638c8710191461024d5780638f6a624014610260578063ab5921e114610273578063c4d66de814610288575f5ffd5b8063553ca5f8116100ef578063553ca5f8146101c1578063595c6a67146101d45780635ac86ab7146101dc5780635c975abb1461020b5780637a8b263714610213575f5ffd5b8063136439dd1461012b5780632495a5991461014057806339b70e38146101705780633a98ef391461019757806347e7ef24146101ae575b5f5ffd5b61013e610139366004610f4d565b6102fa565b005b603254610153906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b6101537f000000000000000000000000000000000000000000000000000000000000000081565b6101a060335481565b604051908152602001610167565b6101a06101bc366004610f7b565b6103cf565b6101a06101cf366004610fa5565b61051b565b61013e61052e565b6101fb6101ea366004610fd5565b6001805460ff9092161b9081161490565b6040519015158152602001610167565b6001546101a0565b6101a0610221366004610f4d565b6105dd565b6101537f000000000000000000000000000000000000000000000000000000000000000081565b6101a061025b366004610f4d565b610626565b6101a061026e366004610fa5565b610630565b61027b61063d565b6040516101679190610ff0565b61013e610296366004610fa5565b61065d565b6101a06102a9366004610fa5565b61076f565b61013e6102bc366004611025565b610801565b6101a06102cf366004610f4d565b61091e565b6101a06102e2366004610f4d565b610955565b61013e6102f5366004610f4d565b61095f565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa15801561035c573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103809190611063565b61039d57604051631d77d47760e21b815260040160405180910390fd5b60015481811681146103c25760405163c61dca5d60e01b815260040160405180910390fd5b6103cb82610a75565b5050565b600180545f9182918116036103f75760405163840a48d560e01b815260040160405180910390fd5b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610440576040516348da714f60e01b815260040160405180910390fd5b61044a8484610ab2565b6033545f61045a6103e883611096565b90505f6103e8610468610ae0565b6104729190611096565b90505f61047f87836110a9565b90508061048c84896110bc565b61049691906110d3565b9550855f036104b857604051630c392ed360e11b815260040160405180910390fd5b6104c28685611096565b60338190556f4b3b4ca85a86c47a098a223fffffffff10156104f757604051632f14e8a360e11b815260040160405180910390fd5b610510826103e860335461050b9190611096565b610b4f565b505050505092915050565b5f6105286102218361076f565b92915050565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa158015610590573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105b49190611063565b6105d157604051631d77d47760e21b815260040160405180910390fd5b6105db5f19610a75565b565b5f5f6103e86033546105ef9190611096565b90505f6103e86105fd610ae0565b6106079190611096565b90508161061485836110bc565b61061e91906110d3565b949350505050565b5f6105288261091e565b5f6105286102e28361076f565b60606040518060800160405280604d8152602001611156604d9139905090565b5f54610100900460ff161580801561067b57505f54600160ff909116105b806106945750303b15801561069457505f5460ff166001145b6106fc5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b5f805460ff19166001179055801561071d575f805461ff0019166101001790555b61072682610b9b565b80156103cb575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498906020015b60405180910390a15050565b60405163fe243a1760e01b81526001600160a01b0382811660048301523060248301525f917f00000000000000000000000000000000000000000000000000000000000000009091169063fe243a1790604401602060405180830381865afa1580156107dd573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061052891906110f2565b600180546002908116036108285760405163840a48d560e01b815260040160405180910390fd5b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610871576040516348da714f60e01b815260040160405180910390fd5b61087c848484610ce6565b603354808311156108a057604051630b469df360e41b815260040160405180910390fd5b5f6108ad6103e883611096565b90505f6103e86108bb610ae0565b6108c59190611096565b90505f826108d387846110bc565b6108dd91906110d3565b90506108e986856110a9565b6033556109096108f982846110a9565b6103e860335461050b9190611096565b610914888883610d19565b5050505050505050565b5f5f6103e86033546109309190611096565b90505f6103e861093e610ae0565b6109489190611096565b90508061061483866110bc565b5f610528826105dd565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156109bb573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109df9190611109565b6001600160a01b0316336001600160a01b031614610a105760405163794821ff60e01b815260040160405180910390fd5b60015480198219811614610a375760405163c61dca5d60e01b815260040160405180910390fd5b600182905560405182815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c9060200160405180910390a25050565b600181905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a250565b6032546001600160a01b038381169116146103cb57604051630312abdd60e61b815260040160405180910390fd5b6032546040516370a0823160e01b81523060048201525f916001600160a01b0316906370a0823190602401602060405180830381865afa158015610b26573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b4a91906110f2565b905090565b7fd2494f3479e5da49d386657c292c610b5b01df313d07c62eb0cfa49924a31be881610b8384670de0b6b3a76400006110bc565b610b8d91906110d3565b604051908152602001610763565b5f54610100900460ff16610c055760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b60648201526084016106f3565b603280546001600160a01b0319166001600160a01b038316179055610c295f610a75565b7f1c540707b00eb5427b6b774fc799d756516a54aee108b64b327acc55af55750760325f9054906101000a90046001600160a01b0316826001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015610c9b573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610cbf9190611124565b604080516001600160a01b03909316835260ff90911660208301520160405180910390a150565b6032546001600160a01b03838116911614610d1457604051630312abdd60e61b815260040160405180910390fd5b505050565b604080516001600160a01b03858116602483015260448083018590528351808403909101815260649092018352602080830180516001600160e01b031663a9059cbb60e01b17905283518085019094528084527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c656490840152610d1492908516918691859185918591905f90610db19084908490610e30565b905080515f1480610dd1575080806020019051810190610dd19190611063565b610d145760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016106f3565b606061061e84845f85855f5f866001600160a01b03168587604051610e55919061113f565b5f6040518083038185875af1925050503d805f8114610e8f576040519150601f19603f3d011682016040523d82523d5f602084013e610e94565b606091505b5091509150610ea587838387610eb0565b979650505050505050565b60608315610f1e5782515f03610f17576001600160a01b0385163b610f175760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016106f3565b508161061e565b61061e8383815115610f335781518083602001fd5b8060405162461bcd60e51b81526004016106f39190610ff0565b5f60208284031215610f5d575f5ffd5b5035919050565b6001600160a01b0381168114610f78575f5ffd5b50565b5f5f60408385031215610f8c575f5ffd5b8235610f9781610f64565b946020939093013593505050565b5f60208284031215610fb5575f5ffd5b8135610fc081610f64565b9392505050565b60ff81168114610f78575f5ffd5b5f60208284031215610fe5575f5ffd5b8135610fc081610fc7565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b5f5f5f60608486031215611037575f5ffd5b833561104281610f64565b9250602084013561105281610f64565b929592945050506040919091013590565b5f60208284031215611073575f5ffd5b81518015158114610fc0575f5ffd5b634e487b7160e01b5f52601160045260245ffd5b8082018082111561052857610528611082565b8181038181111561052857610528611082565b808202811582820484141761052857610528611082565b5f826110ed57634e487b7160e01b5f52601260045260245ffd5b500490565b5f60208284031215611102575f5ffd5b5051919050565b5f60208284031215611119575f5ffd5b8151610fc081610f64565b5f60208284031215611134575f5ffd5b8151610fc081610fc7565b5f82518060208501845e5f92019182525091905056fe4261736520537472617465677920696d706c656d656e746174696f6e20746f20696e68657269742066726f6d20666f72206d6f726520636f6d706c657820696d706c656d656e746174696f6e73a264697066735822122051aebd204cadf78dd013bb624848f20df5d7f30cc5a724fd45127b53a808148b64736f6c634300081b0033", } // 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 fe3d17f8e5..de2a278236 100644 --- a/pkg/bindings/StrategyBaseTVLLimits/binding.go +++ b/pkg/bindings/StrategyBaseTVLLimits/binding.go @@ -32,7 +32,7 @@ var ( // StrategyBaseTVLLimitsMetaData contains all meta data concerning the StrategyBaseTVLLimits contract. var StrategyBaseTVLLimitsMetaData = &bind.MetaData{ ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"_strategyManager\",\"type\":\"address\",\"internalType\":\"contractIStrategyManager\"},{\"name\":\"_pauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"deposit\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"newShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"explanation\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"getTVLLimits\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"_maxPerDeposit\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_maxTotalDeposits\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_underlyingToken\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"_underlyingToken\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"maxPerDeposit\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"maxTotalDeposits\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"pauseAll\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[{\"name\":\"index\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pauserRegistry\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"setTVLLimits\",\"inputs\":[{\"name\":\"newMaxPerDeposit\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"newMaxTotalDeposits\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"shares\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"sharesToUnderlying\",\"inputs\":[{\"name\":\"amountShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"sharesToUnderlyingView\",\"inputs\":[{\"name\":\"amountShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"strategyManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategyManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"totalShares\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"underlyingToShares\",\"inputs\":[{\"name\":\"amountUnderlying\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"underlyingToSharesView\",\"inputs\":[{\"name\":\"amountUnderlying\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"underlyingToken\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"userUnderlying\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"userUnderlyingView\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"withdraw\",\"inputs\":[{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amountShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"ExchangeRateEmitted\",\"inputs\":[{\"name\":\"rate\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"MaxPerDepositUpdated\",\"inputs\":[{\"name\":\"previousValue\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"newValue\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"MaxTotalDepositsUpdated\",\"inputs\":[{\"name\":\"previousValue\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"newValue\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StrategyTokenSet\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIERC20\"},{\"name\":\"decimals\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"BalanceExceedsMaxTotalDeposits\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"CurrentlyPaused\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InputAddressZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidNewPausedStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"MaxPerDepositExceedsMax\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NewSharesZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyPauser\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyStrategyManager\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyUnderlyingToken\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyUnpauser\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"TotalSharesExceedsMax\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"WithdrawalAmountExceedsTotalDeposits\",\"inputs\":[]}]", - Bin: "0x60c060405234801561000f575f5ffd5b5060405161173e38038061173e83398101604081905261002e9161014f565b8181806001600160a01b038116610058576040516339b190bb60e11b815260040160405180910390fd5b6001600160a01b03908116608052821660a05261007361007c565b50505050610187565b5f54610100900460ff16156100e75760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff90811614610136575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b038116811461014c575f5ffd5b50565b5f5f60408385031215610160575f5ffd5b825161016b81610138565b602084015190925061017c81610138565b809150509250929050565b60805160a0516115656101d95f395f81816101ce01528181610556015281816109790152610a1601525f81816102960152818161039501528181610467015281816106970152610b4401526115655ff3fe608060405234801561000f575f5ffd5b506004361061016d575f3560e01c80637a8b2637116100d9578063c4d66de811610093578063df6fadc11161006e578063df6fadc11461033f578063e3dae51c1461035a578063f3e738751461036d578063fabc1cbc14610380575f5ffd5b8063c4d66de814610306578063ce7c2ac214610319578063d9caed121461032c575f5ffd5b80637a8b26371461027e578063886f1195146102915780638c871019146102b85780638f6a6240146102cb578063a6ab36f2146102de578063ab5921e1146102f1575f5ffd5b806347e7ef241161012a57806347e7ef2414610210578063553ca5f814610223578063595c6a67146102365780635ac86ab71461023e5780635c975abb1461026d57806361b01b5d14610275575f5ffd5b806311c70c9d14610171578063136439dd146101865780632495a5991461019957806339b70e38146101c95780633a98ef39146101f057806343fe08b014610207575b5f5ffd5b61018461017f366004611236565b610393565b005b610184610194366004611256565b610452565b6032546101ac906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b6101ac7f000000000000000000000000000000000000000000000000000000000000000081565b6101f960335481565b6040519081526020016101c0565b6101f960645481565b6101f961021e366004611284565b610523565b6101f96102313660046112ae565b61066f565b610184610682565b61025d61024c3660046112de565b6001805460ff9092161b9081161490565b60405190151581526020016101c0565b6001546101f9565b6101f960655481565b6101f961028c366004611256565b610731565b6101ac7f000000000000000000000000000000000000000000000000000000000000000081565b6101f96102c6366004611256565b61077a565b6101f96102d93660046112ae565b610784565b6101846102ec3660046112f9565b610791565b6102f961086c565b6040516101c0919061132f565b6101846103143660046112ae565b61088c565b6101f96103273660046112ae565b610952565b61018461033a366004611364565b6109e4565b606454606554604080519283526020830191909152016101c0565b6101f9610368366004611256565b610b01565b6101f961037b366004611256565b610b38565b61018461038e366004611256565b610b42565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156103ef573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061041391906113a2565b6001600160a01b0316336001600160a01b0316146104445760405163794821ff60e01b815260040160405180910390fd5b61044e8282610c58565b5050565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa1580156104b4573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104d891906113bd565b6104f557604051631d77d47760e21b815260040160405180910390fd5b600154818116811461051a5760405163c61dca5d60e01b815260040160405180910390fd5b61044e82610cfc565b600180545f91829181160361054b5760405163840a48d560e01b815260040160405180910390fd5b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610594576040516348da714f60e01b815260040160405180910390fd5b61059e8484610d39565b6033545f6105ae6103e8836113f0565b90505f6103e86105bc610d90565b6105c691906113f0565b90505f6105d38783611403565b9050806105e08489611416565b6105ea919061142d565b9550855f0361060c57604051630c392ed360e11b815260040160405180910390fd5b61061686856113f0565b60338190556f4b3b4ca85a86c47a098a223fffffffff101561064b57604051632f14e8a360e11b815260040160405180910390fd5b610664826103e860335461065f91906113f0565b610dff565b505050505092915050565b5f61067c61028c83610952565b92915050565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa1580156106e4573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061070891906113bd565b61072557604051631d77d47760e21b815260040160405180910390fd5b61072f5f19610cfc565b565b5f5f6103e860335461074391906113f0565b90505f6103e8610751610d90565b61075b91906113f0565b9050816107688583611416565b610772919061142d565b949350505050565b5f61067c82610b01565b5f61067c61037b83610952565b5f54610100900460ff16158080156107af57505f54600160ff909116105b806107c85750303b1580156107c857505f5460ff166001145b6107ed5760405162461bcd60e51b81526004016107e49061144c565b60405180910390fd5b5f805460ff19166001179055801561080e575f805461ff0019166101001790555b6108188484610c58565b61082182610e4b565b8015610866575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b60606040518060800160405280604d81526020016114e3604d9139905090565b5f54610100900460ff16158080156108aa57505f54600160ff909116105b806108c35750303b1580156108c357505f5460ff166001145b6108df5760405162461bcd60e51b81526004016107e49061144c565b5f805460ff191660011790558015610900575f805461ff0019166101001790555b61090982610e4b565b801561044e575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498906020015b60405180910390a15050565b60405163fe243a1760e01b81526001600160a01b0382811660048301523060248301525f917f00000000000000000000000000000000000000000000000000000000000000009091169063fe243a1790604401602060405180830381865afa1580156109c0573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061067c919061149a565b60018054600290811603610a0b5760405163840a48d560e01b815260040160405180910390fd5b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610a54576040516348da714f60e01b815260040160405180910390fd5b610a5f848484610f96565b60335480831115610a8357604051630b469df360e41b815260040160405180910390fd5b5f610a906103e8836113f0565b90505f6103e8610a9e610d90565b610aa891906113f0565b90505f82610ab68784611416565b610ac0919061142d565b9050610acc8685611403565b603355610aec610adc8284611403565b6103e860335461065f91906113f0565b610af7888883610fc9565b5050505050505050565b5f5f6103e8603354610b1391906113f0565b90505f6103e8610b21610d90565b610b2b91906113f0565b9050806107688386611416565b5f61067c82610731565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b9e573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610bc291906113a2565b6001600160a01b0316336001600160a01b031614610bf35760405163794821ff60e01b815260040160405180910390fd5b60015480198219811614610c1a5760405163c61dca5d60e01b815260040160405180910390fd5b600182905560405182815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c9060200160405180910390a25050565b60645460408051918252602082018490527ff97ed4e083acac67830025ecbc756d8fe847cdbdca4cee3fe1e128e98b54ecb5910160405180910390a160655460408051918252602082018390527f6ab181e0440bfbf4bacdf2e99674735ce6638005490688c5f994f5399353e452910160405180910390a180821115610cf15760405163052b07b760e21b815260040160405180910390fd5b606491909155606555565b600181905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a250565b606454811115610d5c5760405163052b07b760e21b815260040160405180910390fd5b606554610d67610d90565b1115610d865760405163d86bae6760e01b815260040160405180910390fd5b61044e8282610fdd565b6032546040516370a0823160e01b81523060048201525f916001600160a01b0316906370a0823190602401602060405180830381865afa158015610dd6573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610dfa919061149a565b905090565b7fd2494f3479e5da49d386657c292c610b5b01df313d07c62eb0cfa49924a31be881610e3384670de0b6b3a7640000611416565b610e3d919061142d565b604051908152602001610946565b5f54610100900460ff16610eb55760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b60648201526084016107e4565b603280546001600160a01b0319166001600160a01b038316179055610ed95f610cfc565b7f1c540707b00eb5427b6b774fc799d756516a54aee108b64b327acc55af55750760325f9054906101000a90046001600160a01b0316826001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f4b573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f6f91906114b1565b604080516001600160a01b03909316835260ff90911660208301520160405180910390a150565b6032546001600160a01b03838116911614610fc457604051630312abdd60e61b815260040160405180910390fd5b505050565b610fc46001600160a01b038316848361100b565b6032546001600160a01b0383811691161461044e57604051630312abdd60e61b815260040160405180910390fd5b604080516001600160a01b03848116602483015260448083018590528351808403909101815260649092018352602080830180516001600160e01b031663a9059cbb60e01b17905283518085019094528084527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c656490840152610fc4928692915f9161109a918516908490611119565b905080515f14806110ba5750808060200190518101906110ba91906113bd565b610fc45760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016107e4565b606061077284845f85855f5f866001600160a01b0316858760405161113e91906114cc565b5f6040518083038185875af1925050503d805f8114611178576040519150601f19603f3d011682016040523d82523d5f602084013e61117d565b606091505b509150915061118e87838387611199565b979650505050505050565b606083156112075782515f03611200576001600160a01b0385163b6112005760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016107e4565b5081610772565b610772838381511561121c5781518083602001fd5b8060405162461bcd60e51b81526004016107e4919061132f565b5f5f60408385031215611247575f5ffd5b50508035926020909101359150565b5f60208284031215611266575f5ffd5b5035919050565b6001600160a01b0381168114611281575f5ffd5b50565b5f5f60408385031215611295575f5ffd5b82356112a08161126d565b946020939093013593505050565b5f602082840312156112be575f5ffd5b81356112c98161126d565b9392505050565b60ff81168114611281575f5ffd5b5f602082840312156112ee575f5ffd5b81356112c9816112d0565b5f5f5f6060848603121561130b575f5ffd5b833592506020840135915060408401356113248161126d565b809150509250925092565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b5f5f5f60608486031215611376575f5ffd5b83356113818161126d565b925060208401356113918161126d565b929592945050506040919091013590565b5f602082840312156113b2575f5ffd5b81516112c98161126d565b5f602082840312156113cd575f5ffd5b815180151581146112c9575f5ffd5b634e487b7160e01b5f52601160045260245ffd5b8082018082111561067c5761067c6113dc565b8181038181111561067c5761067c6113dc565b808202811582820484141761067c5761067c6113dc565b5f8261144757634e487b7160e01b5f52601260045260245ffd5b500490565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b5f602082840312156114aa575f5ffd5b5051919050565b5f602082840312156114c1575f5ffd5b81516112c9816112d0565b5f82518060208501845e5f92019182525091905056fe4261736520537472617465677920696d706c656d656e746174696f6e20746f20696e68657269742066726f6d20666f72206d6f726520636f6d706c657820696d706c656d656e746174696f6e73a2646970667358221220e2d513e8e2d876b87d44574cd019e13e2cf2b613c6bc5ef7fe5d42e8fe87ac5464736f6c634300081b0033", + Bin: "0x60c060405234801561000f575f5ffd5b5060405161173e38038061173e83398101604081905261002e9161014f565b8181806001600160a01b038116610058576040516339b190bb60e11b815260040160405180910390fd5b6001600160a01b03908116608052821660a05261007361007c565b50505050610187565b5f54610100900460ff16156100e75760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff90811614610136575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b038116811461014c575f5ffd5b50565b5f5f60408385031215610160575f5ffd5b825161016b81610138565b602084015190925061017c81610138565b809150509250929050565b60805160a0516115656101d95f395f81816101ce01528181610556015281816109790152610a1601525f81816102960152818161039501528181610467015281816106970152610b4401526115655ff3fe608060405234801561000f575f5ffd5b506004361061016d575f3560e01c80637a8b2637116100d9578063c4d66de811610093578063df6fadc11161006e578063df6fadc11461033f578063e3dae51c1461035a578063f3e738751461036d578063fabc1cbc14610380575f5ffd5b8063c4d66de814610306578063ce7c2ac214610319578063d9caed121461032c575f5ffd5b80637a8b26371461027e578063886f1195146102915780638c871019146102b85780638f6a6240146102cb578063a6ab36f2146102de578063ab5921e1146102f1575f5ffd5b806347e7ef241161012a57806347e7ef2414610210578063553ca5f814610223578063595c6a67146102365780635ac86ab71461023e5780635c975abb1461026d57806361b01b5d14610275575f5ffd5b806311c70c9d14610171578063136439dd146101865780632495a5991461019957806339b70e38146101c95780633a98ef39146101f057806343fe08b014610207575b5f5ffd5b61018461017f366004611236565b610393565b005b610184610194366004611256565b610452565b6032546101ac906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b6101ac7f000000000000000000000000000000000000000000000000000000000000000081565b6101f960335481565b6040519081526020016101c0565b6101f960645481565b6101f961021e366004611284565b610523565b6101f96102313660046112ae565b61066f565b610184610682565b61025d61024c3660046112de565b6001805460ff9092161b9081161490565b60405190151581526020016101c0565b6001546101f9565b6101f960655481565b6101f961028c366004611256565b610731565b6101ac7f000000000000000000000000000000000000000000000000000000000000000081565b6101f96102c6366004611256565b61077a565b6101f96102d93660046112ae565b610784565b6101846102ec3660046112f9565b610791565b6102f961086c565b6040516101c0919061132f565b6101846103143660046112ae565b61088c565b6101f96103273660046112ae565b610952565b61018461033a366004611364565b6109e4565b606454606554604080519283526020830191909152016101c0565b6101f9610368366004611256565b610b01565b6101f961037b366004611256565b610b38565b61018461038e366004611256565b610b42565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156103ef573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061041391906113a2565b6001600160a01b0316336001600160a01b0316146104445760405163794821ff60e01b815260040160405180910390fd5b61044e8282610c58565b5050565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa1580156104b4573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104d891906113bd565b6104f557604051631d77d47760e21b815260040160405180910390fd5b600154818116811461051a5760405163c61dca5d60e01b815260040160405180910390fd5b61044e82610cfc565b600180545f91829181160361054b5760405163840a48d560e01b815260040160405180910390fd5b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610594576040516348da714f60e01b815260040160405180910390fd5b61059e8484610d39565b6033545f6105ae6103e8836113f0565b90505f6103e86105bc610d90565b6105c691906113f0565b90505f6105d38783611403565b9050806105e08489611416565b6105ea919061142d565b9550855f0361060c57604051630c392ed360e11b815260040160405180910390fd5b61061686856113f0565b60338190556f4b3b4ca85a86c47a098a223fffffffff101561064b57604051632f14e8a360e11b815260040160405180910390fd5b610664826103e860335461065f91906113f0565b610dff565b505050505092915050565b5f61067c61028c83610952565b92915050565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa1580156106e4573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061070891906113bd565b61072557604051631d77d47760e21b815260040160405180910390fd5b61072f5f19610cfc565b565b5f5f6103e860335461074391906113f0565b90505f6103e8610751610d90565b61075b91906113f0565b9050816107688583611416565b610772919061142d565b949350505050565b5f61067c82610b01565b5f61067c61037b83610952565b5f54610100900460ff16158080156107af57505f54600160ff909116105b806107c85750303b1580156107c857505f5460ff166001145b6107ed5760405162461bcd60e51b81526004016107e49061144c565b60405180910390fd5b5f805460ff19166001179055801561080e575f805461ff0019166101001790555b6108188484610c58565b61082182610e4b565b8015610866575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b60606040518060800160405280604d81526020016114e3604d9139905090565b5f54610100900460ff16158080156108aa57505f54600160ff909116105b806108c35750303b1580156108c357505f5460ff166001145b6108df5760405162461bcd60e51b81526004016107e49061144c565b5f805460ff191660011790558015610900575f805461ff0019166101001790555b61090982610e4b565b801561044e575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498906020015b60405180910390a15050565b60405163fe243a1760e01b81526001600160a01b0382811660048301523060248301525f917f00000000000000000000000000000000000000000000000000000000000000009091169063fe243a1790604401602060405180830381865afa1580156109c0573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061067c919061149a565b60018054600290811603610a0b5760405163840a48d560e01b815260040160405180910390fd5b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610a54576040516348da714f60e01b815260040160405180910390fd5b610a5f848484610f96565b60335480831115610a8357604051630b469df360e41b815260040160405180910390fd5b5f610a906103e8836113f0565b90505f6103e8610a9e610d90565b610aa891906113f0565b90505f82610ab68784611416565b610ac0919061142d565b9050610acc8685611403565b603355610aec610adc8284611403565b6103e860335461065f91906113f0565b610af7888883610fc9565b5050505050505050565b5f5f6103e8603354610b1391906113f0565b90505f6103e8610b21610d90565b610b2b91906113f0565b9050806107688386611416565b5f61067c82610731565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b9e573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610bc291906113a2565b6001600160a01b0316336001600160a01b031614610bf35760405163794821ff60e01b815260040160405180910390fd5b60015480198219811614610c1a5760405163c61dca5d60e01b815260040160405180910390fd5b600182905560405182815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c9060200160405180910390a25050565b60645460408051918252602082018490527ff97ed4e083acac67830025ecbc756d8fe847cdbdca4cee3fe1e128e98b54ecb5910160405180910390a160655460408051918252602082018390527f6ab181e0440bfbf4bacdf2e99674735ce6638005490688c5f994f5399353e452910160405180910390a180821115610cf15760405163052b07b760e21b815260040160405180910390fd5b606491909155606555565b600181905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a250565b606454811115610d5c5760405163052b07b760e21b815260040160405180910390fd5b606554610d67610d90565b1115610d865760405163d86bae6760e01b815260040160405180910390fd5b61044e8282610fdd565b6032546040516370a0823160e01b81523060048201525f916001600160a01b0316906370a0823190602401602060405180830381865afa158015610dd6573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610dfa919061149a565b905090565b7fd2494f3479e5da49d386657c292c610b5b01df313d07c62eb0cfa49924a31be881610e3384670de0b6b3a7640000611416565b610e3d919061142d565b604051908152602001610946565b5f54610100900460ff16610eb55760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b60648201526084016107e4565b603280546001600160a01b0319166001600160a01b038316179055610ed95f610cfc565b7f1c540707b00eb5427b6b774fc799d756516a54aee108b64b327acc55af55750760325f9054906101000a90046001600160a01b0316826001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f4b573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f6f91906114b1565b604080516001600160a01b03909316835260ff90911660208301520160405180910390a150565b6032546001600160a01b03838116911614610fc457604051630312abdd60e61b815260040160405180910390fd5b505050565b610fc46001600160a01b038316848361100b565b6032546001600160a01b0383811691161461044e57604051630312abdd60e61b815260040160405180910390fd5b604080516001600160a01b03848116602483015260448083018590528351808403909101815260649092018352602080830180516001600160e01b031663a9059cbb60e01b17905283518085019094528084527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c656490840152610fc4928692915f9161109a918516908490611119565b905080515f14806110ba5750808060200190518101906110ba91906113bd565b610fc45760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016107e4565b606061077284845f85855f5f866001600160a01b0316858760405161113e91906114cc565b5f6040518083038185875af1925050503d805f8114611178576040519150601f19603f3d011682016040523d82523d5f602084013e61117d565b606091505b509150915061118e87838387611199565b979650505050505050565b606083156112075782515f03611200576001600160a01b0385163b6112005760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016107e4565b5081610772565b610772838381511561121c5781518083602001fd5b8060405162461bcd60e51b81526004016107e4919061132f565b5f5f60408385031215611247575f5ffd5b50508035926020909101359150565b5f60208284031215611266575f5ffd5b5035919050565b6001600160a01b0381168114611281575f5ffd5b50565b5f5f60408385031215611295575f5ffd5b82356112a08161126d565b946020939093013593505050565b5f602082840312156112be575f5ffd5b81356112c98161126d565b9392505050565b60ff81168114611281575f5ffd5b5f602082840312156112ee575f5ffd5b81356112c9816112d0565b5f5f5f6060848603121561130b575f5ffd5b833592506020840135915060408401356113248161126d565b809150509250925092565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b5f5f5f60608486031215611376575f5ffd5b83356113818161126d565b925060208401356113918161126d565b929592945050506040919091013590565b5f602082840312156113b2575f5ffd5b81516112c98161126d565b5f602082840312156113cd575f5ffd5b815180151581146112c9575f5ffd5b634e487b7160e01b5f52601160045260245ffd5b8082018082111561067c5761067c6113dc565b8181038181111561067c5761067c6113dc565b808202811582820484141761067c5761067c6113dc565b5f8261144757634e487b7160e01b5f52601260045260245ffd5b500490565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b5f602082840312156114aa575f5ffd5b5051919050565b5f602082840312156114c1575f5ffd5b81516112c9816112d0565b5f82518060208501845e5f92019182525091905056fe4261736520537472617465677920696d706c656d656e746174696f6e20746f20696e68657269742066726f6d20666f72206d6f726520636f6d706c657820696d706c656d656e746174696f6e73a2646970667358221220f7549fe36abce1db431789495a45e0b7247b65b61a09934b09e0fdd4a52befc464736f6c634300081b0033", } // 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 75f6021477..468b4423e1 100644 --- a/pkg/bindings/StrategyFactory/binding.go +++ b/pkg/bindings/StrategyFactory/binding.go @@ -32,7 +32,7 @@ var ( // StrategyFactoryMetaData contains all meta data concerning the StrategyFactory contract. var StrategyFactoryMetaData = &bind.MetaData{ ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"_strategyManager\",\"type\":\"address\",\"internalType\":\"contractIStrategyManager\"},{\"name\":\"_pauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"blacklistTokens\",\"inputs\":[{\"name\":\"tokens\",\"type\":\"address[]\",\"internalType\":\"contractIERC20[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"deployNewStrategy\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"outputs\":[{\"name\":\"newStrategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"deployedStrategies\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"_initialOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_initialPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_strategyBeacon\",\"type\":\"address\",\"internalType\":\"contractIBeacon\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"isBlacklisted\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"pauseAll\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[{\"name\":\"index\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pauserRegistry\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"removeStrategiesFromWhitelist\",\"inputs\":[{\"name\":\"strategiesToRemoveFromWhitelist\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"strategyBeacon\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIBeacon\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"strategyManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategyManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"whitelistStrategies\",\"inputs\":[{\"name\":\"strategiesToWhitelist\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StrategyBeaconModified\",\"inputs\":[{\"name\":\"previousBeacon\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIBeacon\"},{\"name\":\"newBeacon\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIBeacon\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StrategySetForToken\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIERC20\"},{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TokenBlacklisted\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIERC20\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"AlreadyBlacklisted\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"BlacklistedToken\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"CurrentlyPaused\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InputAddressZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidNewPausedStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyPauser\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyUnpauser\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StrategyAlreadyExists\",\"inputs\":[]}]", - Bin: "0x60c060405234801561000f575f5ffd5b5060405161195e38038061195e83398101604081905261002e9161014e565b806001600160a01b038116610056576040516339b190bb60e11b815260040160405180910390fd5b6001600160a01b03908116608052821660a052610071610078565b5050610186565b603354610100900460ff16156100e45760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60335460ff90811614610135576033805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b038116811461014b575f5ffd5b50565b5f5f6040838503121561015f575f5ffd5b825161016a81610137565b602084015190925061017b81610137565b809150509250929050565b60805160a0516117866101d85f395f8181610142015281816105d501528181610869015281816109060152610c4701525f8181610215015281816102f0015281816106530152610b1401526117865ff3fe608060405234801561000f575f5ffd5b5060043610610111575f3560e01c8063886f11951161009e578063f0062d9a1161006e578063f0062d9a1461026e578063f2fde38b14610280578063fabc1cbc14610293578063fe38b32d146102a6578063fe575a87146102b9575f5ffd5b8063886f1195146102105780638da5cb5b14610237578063b768ebc914610248578063c350a1b51461025b575f5ffd5b8063595c6a67116100e4578063595c6a67146101a95780635ac86ab7146101b15780635c975abb146101e45780636b9b6229146101f5578063715018a614610208575f5ffd5b8063136439dd1461011557806323103c411461012a57806339b70e381461013d578063581dfd6514610181575b5f5ffd5b610128610123366004610e44565b6102db565b005b610128610138366004610ea3565b6103b0565b6101647f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020015b60405180910390f35b61016461018f366004610ef6565b60016020525f90815260409020546001600160a01b031681565b61012861063e565b6101d46101bf366004610f18565b609954600160ff9092169190911b9081161490565b6040519015158152602001610178565b609954604051908152602001610178565b610164610203366004610ef6565b6106ed565b6101286108d6565b6101647f000000000000000000000000000000000000000000000000000000000000000081565b6066546001600160a01b0316610164565b610128610256366004610ea3565b6108e7565b610128610269366004610f38565b61096e565b5f54610164906001600160a01b031681565b61012861028e366004610ef6565b610a99565b6101286102a1366004610e44565b610b12565b6101286102b4366004610ea3565b610c28565b6101d46102c7366004610ef6565b60026020525f908152604090205460ff1681565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa15801561033d573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103619190610f77565b61037e57604051631d77d47760e21b815260040160405180910390fd5b60995481811681146103a35760405163c61dca5d60e01b815260040160405180910390fd5b6103ac82610c7e565b5050565b6103b8610cbb565b5f8167ffffffffffffffff8111156103d2576103d2610f96565b6040519080825280602002602001820160405280156103fb578160200160208202803683370190505b5090505f805b838110156105b45760025f86868481811061041e5761041e610faa565b90506020020160208101906104339190610ef6565b6001600160a01b0316815260208101919091526040015f205460ff161561046d5760405163f53de75f60e01b815260040160405180910390fd5b600160025f87878581811061048457610484610faa565b90506020020160208101906104999190610ef6565b6001600160a01b0316815260208101919091526040015f20805460ff19169115159190911790557f75519c51f39873ec0e27dd3bbc09549e4865a113f505393fb9eab5898f6418b38585838181106104f3576104f3610faa565b90506020020160208101906105089190610ef6565b6040516001600160a01b03909116815260200160405180910390a15f60015f87878581811061053957610539610faa565b905060200201602081019061054e9190610ef6565b6001600160a01b03908116825260208201929092526040015f205416905080156105ab578084848151811061058557610585610faa565b6001600160a01b0390921660209283029190910190910152826105a781610fbe565b9350505b50600101610401565b508082528015610638576040516316bb16b760e31b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063b5d8b5b89061060a908590600401610fe2565b5f604051808303815f87803b158015610621575f5ffd5b505af1158015610633573d5f5f3e3d5ffd5b505050505b50505050565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa1580156106a0573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106c49190610f77565b6106e157604051631d77d47760e21b815260040160405180910390fd5b6106eb5f19610c7e565b565b6099545f9081906001908116036107175760405163840a48d560e01b815260040160405180910390fd5b6001600160a01b0383165f9081526002602052604090205460ff16156107505760405163091867bd60e11b815260040160405180910390fd5b6001600160a01b038381165f9081526001602052604090205416156107885760405163c45546f760e01b815260040160405180910390fd5b5f8054604080516001600160a01b0387811660248084019190915283518084039091018152604490920183526020820180516001600160e01b031663189acdbd60e31b17905291519190921691906107df90610e37565b6107ea92919061102d565b604051809103905ff080158015610803573d5f5f3e3d5ffd5b5090506108108482610d15565b6040805160018082528183019092525f916020808301908036833701905050905081815f8151811061084457610844610faa565b6001600160a01b039283166020918202929092010152604051632ef047f960e11b81527f000000000000000000000000000000000000000000000000000000000000000090911690635de08ff2906108a0908490600401610fe2565b5f604051808303815f87803b1580156108b7575f5ffd5b505af11580156108c9573d5f5f3e3d5ffd5b5093979650505050505050565b6108de610cbb565b6106eb5f610d7f565b6108ef610cbb565b604051632ef047f960e11b81526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690635de08ff29061093d9085908590600401611071565b5f604051808303815f87803b158015610954575f5ffd5b505af1158015610966573d5f5f3e3d5ffd5b505050505050565b603354610100900460ff161580801561098e5750603354600160ff909116105b806109a85750303b1580156109a8575060335460ff166001145b610a105760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b6033805460ff191660011790558015610a33576033805461ff0019166101001790555b610a3c84610d7f565b610a4583610c7e565b610a4e82610dd0565b8015610638576033805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a150505050565b610aa1610cbb565b6001600160a01b038116610b065760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610a07565b610b0f81610d7f565b50565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b6e573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b9291906110bd565b6001600160a01b0316336001600160a01b031614610bc35760405163794821ff60e01b815260040160405180910390fd5b60995480198219811614610bea5760405163c61dca5d60e01b815260040160405180910390fd5b609982905560405182815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c9060200160405180910390a25050565b610c30610cbb565b6040516316bb16b760e31b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063b5d8b5b89061093d9085908590600401611071565b609981905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a250565b6066546001600160a01b031633146106eb5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a07565b6001600160a01b038281165f8181526001602090815260409182902080546001600160a01b031916948616948517905581519283528201929092527f6852a55230ef089d785bce7ffbf757985de34026df90a87d7b4a6e56f95d251f910160405180910390a15050565b606680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b5f54604080516001600160a01b03928316815291831660208301527fe21755962a7d7e100b59b9c3e4d4b54085b146313719955efb6a7a25c5c7feee910160405180910390a15f80546001600160a01b0319166001600160a01b0392909216919091179055565b610678806110d983390190565b5f60208284031215610e54575f5ffd5b5035919050565b5f5f83601f840112610e6b575f5ffd5b50813567ffffffffffffffff811115610e82575f5ffd5b6020830191508360208260051b8501011115610e9c575f5ffd5b9250929050565b5f5f60208385031215610eb4575f5ffd5b823567ffffffffffffffff811115610eca575f5ffd5b610ed685828601610e5b565b90969095509350505050565b6001600160a01b0381168114610b0f575f5ffd5b5f60208284031215610f06575f5ffd5b8135610f1181610ee2565b9392505050565b5f60208284031215610f28575f5ffd5b813560ff81168114610f11575f5ffd5b5f5f5f60608486031215610f4a575f5ffd5b8335610f5581610ee2565b9250602084013591506040840135610f6c81610ee2565b809150509250925092565b5f60208284031215610f87575f5ffd5b81518015158114610f11575f5ffd5b634e487b7160e01b5f52604160045260245ffd5b634e487b7160e01b5f52603260045260245ffd5b5f60018201610fdb57634e487b7160e01b5f52601160045260245ffd5b5060010190565b602080825282518282018190525f918401906040840190835b818110156110225783516001600160a01b0316835260209384019390920191600101610ffb565b509095945050505050565b60018060a01b0383168152604060208201525f82518060408401528060208501606085015e5f606082850101526060601f19601f8301168401019150509392505050565b602080825281018290525f8360408301825b858110156110b357823561109681610ee2565b6001600160a01b0316825260209283019290910190600101611083565b5095945050505050565b5f602082840312156110cd575f5ffd5b8151610f1181610ee256fe6080604052604051610678380380610678833981016040819052610022916103ed565b61002d82825f610034565b5050610513565b61003d836100f1565b6040516001600160a01b038416907f1cf3b03a6cf19fa2baba4df148e9dcabedea7f8a5c07840e207e5c089be95d3e905f90a25f8251118061007c5750805b156100ec576100ea836001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156100c0573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906100e491906104af565b83610273565b505b505050565b6001600160a01b0381163b61015b5760405162461bcd60e51b815260206004820152602560248201527f455243313936373a206e657720626561636f6e206973206e6f74206120636f6e6044820152641d1c9858dd60da1b60648201526084015b60405180910390fd5b6101cd816001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561019a573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906101be91906104af565b6001600160a01b03163b151590565b6102325760405162461bcd60e51b815260206004820152603060248201527f455243313936373a20626561636f6e20696d706c656d656e746174696f6e206960448201526f1cc81b9bdd08184818dbdb9d1c9858dd60821b6064820152608401610152565b7fa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d5080546001600160a01b0319166001600160a01b0392909216919091179055565b606061029883836040518060600160405280602781526020016106516027913961029f565b9392505050565b60605f5f856001600160a01b0316856040516102bb91906104c8565b5f60405180830381855af49150503d805f81146102f3576040519150601f19603f3d011682016040523d82523d5f602084013e6102f8565b606091505b50909250905061030a86838387610314565b9695505050505050565b606083156103825782515f0361037b576001600160a01b0385163b61037b5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610152565b508161038c565b61038c8383610394565b949350505050565b8151156103a45781518083602001fd5b8060405162461bcd60e51b815260040161015291906104de565b80516001600160a01b03811681146103d4575f5ffd5b919050565b634e487b7160e01b5f52604160045260245ffd5b5f5f604083850312156103fe575f5ffd5b610407836103be565b60208401519092506001600160401b03811115610422575f5ffd5b8301601f81018513610432575f5ffd5b80516001600160401b0381111561044b5761044b6103d9565b604051601f8201601f19908116603f011681016001600160401b0381118282101715610479576104796103d9565b604052818152828201602001871015610490575f5ffd5b8160208401602083015e5f602083830101528093505050509250929050565b5f602082840312156104bf575f5ffd5b610298826103be565b5f82518060208501845e5f920191825250919050565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b610131806105205f395ff3fe608060405236601057600e6013565b005b600e5b601f601b6021565b60b3565b565b5f60527fa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50546001600160a01b031690565b6001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015608c573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019060ae919060d0565b905090565b365f5f375f5f365f845af43d5f5f3e80801560cc573d5ff35b3d5ffd5b5f6020828403121560df575f5ffd5b81516001600160a01b038116811460f4575f5ffd5b939250505056fea26469706673582212205e179e1700322d816f025eafa6283d01eb81392a9f5f438a46fb77683652459464736f6c634300081b0033416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220cd490f4fa8073ef9bbfecf650844d2934535ae132846c3b66b893f9373ce1aa364736f6c634300081b0033", + Bin: "0x60c060405234801561000f575f5ffd5b5060405161195e38038061195e83398101604081905261002e9161014e565b806001600160a01b038116610056576040516339b190bb60e11b815260040160405180910390fd5b6001600160a01b03908116608052821660a052610071610078565b5050610186565b603354610100900460ff16156100e45760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60335460ff90811614610135576033805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b038116811461014b575f5ffd5b50565b5f5f6040838503121561015f575f5ffd5b825161016a81610137565b602084015190925061017b81610137565b809150509250929050565b60805160a0516117866101d85f395f8181610142015281816105d501528181610869015281816109060152610c4701525f8181610215015281816102f0015281816106530152610b1401526117865ff3fe608060405234801561000f575f5ffd5b5060043610610111575f3560e01c8063886f11951161009e578063f0062d9a1161006e578063f0062d9a1461026e578063f2fde38b14610280578063fabc1cbc14610293578063fe38b32d146102a6578063fe575a87146102b9575f5ffd5b8063886f1195146102105780638da5cb5b14610237578063b768ebc914610248578063c350a1b51461025b575f5ffd5b8063595c6a67116100e4578063595c6a67146101a95780635ac86ab7146101b15780635c975abb146101e45780636b9b6229146101f5578063715018a614610208575f5ffd5b8063136439dd1461011557806323103c411461012a57806339b70e381461013d578063581dfd6514610181575b5f5ffd5b610128610123366004610e44565b6102db565b005b610128610138366004610ea3565b6103b0565b6101647f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020015b60405180910390f35b61016461018f366004610ef6565b60016020525f90815260409020546001600160a01b031681565b61012861063e565b6101d46101bf366004610f18565b609954600160ff9092169190911b9081161490565b6040519015158152602001610178565b609954604051908152602001610178565b610164610203366004610ef6565b6106ed565b6101286108d6565b6101647f000000000000000000000000000000000000000000000000000000000000000081565b6066546001600160a01b0316610164565b610128610256366004610ea3565b6108e7565b610128610269366004610f38565b61096e565b5f54610164906001600160a01b031681565b61012861028e366004610ef6565b610a99565b6101286102a1366004610e44565b610b12565b6101286102b4366004610ea3565b610c28565b6101d46102c7366004610ef6565b60026020525f908152604090205460ff1681565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa15801561033d573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103619190610f77565b61037e57604051631d77d47760e21b815260040160405180910390fd5b60995481811681146103a35760405163c61dca5d60e01b815260040160405180910390fd5b6103ac82610c7e565b5050565b6103b8610cbb565b5f8167ffffffffffffffff8111156103d2576103d2610f96565b6040519080825280602002602001820160405280156103fb578160200160208202803683370190505b5090505f805b838110156105b45760025f86868481811061041e5761041e610faa565b90506020020160208101906104339190610ef6565b6001600160a01b0316815260208101919091526040015f205460ff161561046d5760405163f53de75f60e01b815260040160405180910390fd5b600160025f87878581811061048457610484610faa565b90506020020160208101906104999190610ef6565b6001600160a01b0316815260208101919091526040015f20805460ff19169115159190911790557f75519c51f39873ec0e27dd3bbc09549e4865a113f505393fb9eab5898f6418b38585838181106104f3576104f3610faa565b90506020020160208101906105089190610ef6565b6040516001600160a01b03909116815260200160405180910390a15f60015f87878581811061053957610539610faa565b905060200201602081019061054e9190610ef6565b6001600160a01b03908116825260208201929092526040015f205416905080156105ab578084848151811061058557610585610faa565b6001600160a01b0390921660209283029190910190910152826105a781610fbe565b9350505b50600101610401565b508082528015610638576040516316bb16b760e31b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063b5d8b5b89061060a908590600401610fe2565b5f604051808303815f87803b158015610621575f5ffd5b505af1158015610633573d5f5f3e3d5ffd5b505050505b50505050565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa1580156106a0573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106c49190610f77565b6106e157604051631d77d47760e21b815260040160405180910390fd5b6106eb5f19610c7e565b565b6099545f9081906001908116036107175760405163840a48d560e01b815260040160405180910390fd5b6001600160a01b0383165f9081526002602052604090205460ff16156107505760405163091867bd60e11b815260040160405180910390fd5b6001600160a01b038381165f9081526001602052604090205416156107885760405163c45546f760e01b815260040160405180910390fd5b5f8054604080516001600160a01b0387811660248084019190915283518084039091018152604490920183526020820180516001600160e01b031663189acdbd60e31b17905291519190921691906107df90610e37565b6107ea92919061102d565b604051809103905ff080158015610803573d5f5f3e3d5ffd5b5090506108108482610d15565b6040805160018082528183019092525f916020808301908036833701905050905081815f8151811061084457610844610faa565b6001600160a01b039283166020918202929092010152604051632ef047f960e11b81527f000000000000000000000000000000000000000000000000000000000000000090911690635de08ff2906108a0908490600401610fe2565b5f604051808303815f87803b1580156108b7575f5ffd5b505af11580156108c9573d5f5f3e3d5ffd5b5093979650505050505050565b6108de610cbb565b6106eb5f610d7f565b6108ef610cbb565b604051632ef047f960e11b81526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690635de08ff29061093d9085908590600401611071565b5f604051808303815f87803b158015610954575f5ffd5b505af1158015610966573d5f5f3e3d5ffd5b505050505050565b603354610100900460ff161580801561098e5750603354600160ff909116105b806109a85750303b1580156109a8575060335460ff166001145b610a105760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b6033805460ff191660011790558015610a33576033805461ff0019166101001790555b610a3c84610d7f565b610a4583610c7e565b610a4e82610dd0565b8015610638576033805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a150505050565b610aa1610cbb565b6001600160a01b038116610b065760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610a07565b610b0f81610d7f565b50565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b6e573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b9291906110bd565b6001600160a01b0316336001600160a01b031614610bc35760405163794821ff60e01b815260040160405180910390fd5b60995480198219811614610bea5760405163c61dca5d60e01b815260040160405180910390fd5b609982905560405182815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c9060200160405180910390a25050565b610c30610cbb565b6040516316bb16b760e31b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063b5d8b5b89061093d9085908590600401611071565b609981905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a250565b6066546001600160a01b031633146106eb5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a07565b6001600160a01b038281165f8181526001602090815260409182902080546001600160a01b031916948616948517905581519283528201929092527f6852a55230ef089d785bce7ffbf757985de34026df90a87d7b4a6e56f95d251f910160405180910390a15050565b606680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b5f54604080516001600160a01b03928316815291831660208301527fe21755962a7d7e100b59b9c3e4d4b54085b146313719955efb6a7a25c5c7feee910160405180910390a15f80546001600160a01b0319166001600160a01b0392909216919091179055565b610678806110d983390190565b5f60208284031215610e54575f5ffd5b5035919050565b5f5f83601f840112610e6b575f5ffd5b50813567ffffffffffffffff811115610e82575f5ffd5b6020830191508360208260051b8501011115610e9c575f5ffd5b9250929050565b5f5f60208385031215610eb4575f5ffd5b823567ffffffffffffffff811115610eca575f5ffd5b610ed685828601610e5b565b90969095509350505050565b6001600160a01b0381168114610b0f575f5ffd5b5f60208284031215610f06575f5ffd5b8135610f1181610ee2565b9392505050565b5f60208284031215610f28575f5ffd5b813560ff81168114610f11575f5ffd5b5f5f5f60608486031215610f4a575f5ffd5b8335610f5581610ee2565b9250602084013591506040840135610f6c81610ee2565b809150509250925092565b5f60208284031215610f87575f5ffd5b81518015158114610f11575f5ffd5b634e487b7160e01b5f52604160045260245ffd5b634e487b7160e01b5f52603260045260245ffd5b5f60018201610fdb57634e487b7160e01b5f52601160045260245ffd5b5060010190565b602080825282518282018190525f918401906040840190835b818110156110225783516001600160a01b0316835260209384019390920191600101610ffb565b509095945050505050565b60018060a01b0383168152604060208201525f82518060408401528060208501606085015e5f606082850101526060601f19601f8301168401019150509392505050565b602080825281018290525f8360408301825b858110156110b357823561109681610ee2565b6001600160a01b0316825260209283019290910190600101611083565b5095945050505050565b5f602082840312156110cd575f5ffd5b8151610f1181610ee256fe6080604052604051610678380380610678833981016040819052610022916103ed565b61002d82825f610034565b5050610513565b61003d836100f1565b6040516001600160a01b038416907f1cf3b03a6cf19fa2baba4df148e9dcabedea7f8a5c07840e207e5c089be95d3e905f90a25f8251118061007c5750805b156100ec576100ea836001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156100c0573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906100e491906104af565b83610273565b505b505050565b6001600160a01b0381163b61015b5760405162461bcd60e51b815260206004820152602560248201527f455243313936373a206e657720626561636f6e206973206e6f74206120636f6e6044820152641d1c9858dd60da1b60648201526084015b60405180910390fd5b6101cd816001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561019a573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906101be91906104af565b6001600160a01b03163b151590565b6102325760405162461bcd60e51b815260206004820152603060248201527f455243313936373a20626561636f6e20696d706c656d656e746174696f6e206960448201526f1cc81b9bdd08184818dbdb9d1c9858dd60821b6064820152608401610152565b7fa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d5080546001600160a01b0319166001600160a01b0392909216919091179055565b606061029883836040518060600160405280602781526020016106516027913961029f565b9392505050565b60605f5f856001600160a01b0316856040516102bb91906104c8565b5f60405180830381855af49150503d805f81146102f3576040519150601f19603f3d011682016040523d82523d5f602084013e6102f8565b606091505b50909250905061030a86838387610314565b9695505050505050565b606083156103825782515f0361037b576001600160a01b0385163b61037b5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610152565b508161038c565b61038c8383610394565b949350505050565b8151156103a45781518083602001fd5b8060405162461bcd60e51b815260040161015291906104de565b80516001600160a01b03811681146103d4575f5ffd5b919050565b634e487b7160e01b5f52604160045260245ffd5b5f5f604083850312156103fe575f5ffd5b610407836103be565b60208401519092506001600160401b03811115610422575f5ffd5b8301601f81018513610432575f5ffd5b80516001600160401b0381111561044b5761044b6103d9565b604051601f8201601f19908116603f011681016001600160401b0381118282101715610479576104796103d9565b604052818152828201602001871015610490575f5ffd5b8160208401602083015e5f602083830101528093505050509250929050565b5f602082840312156104bf575f5ffd5b610298826103be565b5f82518060208501845e5f920191825250919050565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b610131806105205f395ff3fe608060405236601057600e6013565b005b600e5b601f601b6021565b60b3565b565b5f60527fa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50546001600160a01b031690565b6001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015608c573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019060ae919060d0565b905090565b365f5f375f5f365f845af43d5f5f3e80801560cc573d5ff35b3d5ffd5b5f6020828403121560df575f5ffd5b81516001600160a01b038116811460f4575f5ffd5b939250505056fea2646970667358221220f37d2ffd80ec7d14cc9a0f17394e9d97446c1f630de382043b1ed4ccacf6a7d464736f6c634300081b0033416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a26469706673582212201cd135a2da2f82c937c8f9e355639d7b1cfd44fe5720e906079e20ad40503c7364736f6c634300081b0033", } // StrategyFactoryABI 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 2347b25f61..552e009134 100644 --- a/pkg/bindings/StrategyManager/binding.go +++ b/pkg/bindings/StrategyManager/binding.go @@ -31,8 +31,8 @@ var ( // StrategyManagerMetaData contains all meta data concerning the StrategyManager contract. var StrategyManagerMetaData = &bind.MetaData{ - ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"_delegation\",\"type\":\"address\",\"internalType\":\"contractIDelegationManager\"},{\"name\":\"_pauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"DEFAULT_BURN_ADDRESS\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"DEPOSIT_TYPEHASH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"addShares\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"shares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"addStrategiesToDepositWhitelist\",\"inputs\":[{\"name\":\"strategiesToWhitelist\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"burnShares\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"burnableShares\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"calculateStrategyDepositDigestHash\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"nonce\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"delegation\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIDelegationManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"depositIntoStrategy\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"depositShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"depositIntoStrategyWithSignature\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"depositShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"domainSeparator\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getDeposits\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getStakerStrategyList\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"increaseBurnableShares\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"addedSharesToBurn\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"initialOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"initialStrategyWhitelister\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"initialPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"nonces\",\"inputs\":[{\"name\":\"signer\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"nonce\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"pauseAll\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[{\"name\":\"index\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pauserRegistry\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"removeDepositShares\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"depositSharesToRemove\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"removeStrategiesFromDepositWhitelist\",\"inputs\":[{\"name\":\"strategiesToRemoveFromWhitelist\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setStrategyWhitelister\",\"inputs\":[{\"name\":\"newStrategyWhitelister\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"stakerDepositShares\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"shares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"stakerStrategyList\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"strategies\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"stakerStrategyListLength\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"strategyIsWhitelistedForDeposit\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"whitelisted\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"strategyWhitelister\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"withdrawSharesAsTokens\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"shares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"BurnableSharesDecreased\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"shares\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BurnableSharesIncreased\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"shares\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Deposit\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"shares\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StrategyAddedToDepositWhitelist\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StrategyRemovedFromDepositWhitelist\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StrategyWhitelisterChanged\",\"inputs\":[{\"name\":\"previousAddress\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"newAddress\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"CurrentlyPaused\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InputAddressZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidNewPausedStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidSignature\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"MaxStrategiesExceeded\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyDelegationManager\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyPauser\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyStrategyWhitelister\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyUnpauser\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SharesAmountTooHigh\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SharesAmountZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SignatureExpired\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StakerAddressZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StrategyNotFound\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StrategyNotWhitelisted\",\"inputs\":[]}]", - Bin: "0x610100604052348015610010575f5ffd5b5060405161285338038061285383398101604081905261002f916101ed565b81816001600160a01b038116610058576040516339b190bb60e11b815260040160405180910390fd5b6001600160a01b039081166080521660a0524660c052610108604080518082018252600a81526922b4b3b2b72630bcb2b960b11b60209182015281517f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a866818301527f71b625cfad44bac63b13dba07f2e1d6084ee04b6f8752101ece6126d584ee6ea81840152466060820152306080808301919091528351808303909101815260a0909101909252815191012090565b60e05261011361011a565b5050610225565b5f54610100900460ff16156101855760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff908116146101d4575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b03811681146101ea575f5ffd5b50565b5f5f604083850312156101fe575f5ffd5b8251610209816101d6565b602084015190925061021a816101d6565b809150509250929050565b60805160a05160c05160e0516125c36102905f395f6112ce01525f61120e01525f81816104c501528181610762015281816109e001528181610c3f0152818161109301526116b101525f818161039a0152818161057101528181610a4a01526112f201526125c35ff3fe608060405234801561000f575f5ffd5b50600436106101fd575f3560e01c80638b8aac3c11610114578063de44acb6116100a9578063f2fde38b11610079578063f2fde38b146104fa578063f3b4a0001461050d578063f698da2514610517578063fabc1cbc1461051f578063fe243a1714610532575f5ffd5b8063de44acb61461048d578063debe1eab146104ad578063df5cf723146104c0578063e7a050aa146104e7575f5ffd5b80639ac01d61116100e45780639ac01d6114610441578063b5d8b5b814610454578063c665670214610467578063cbc2bd621461047a575f5ffd5b80638b8aac3c146103d45780638da5cb5b146103fc57806394f649dd1461040d578063967fc0d21461042e575f5ffd5b8063595c6a6711610195578063663c1de411610165578063663c1de414610339578063715018a61461035b578063724af423146103635780637ecebe0014610376578063886f119514610395575f5ffd5b8063595c6a67146102e35780635ac86ab7146102eb5780635c975abb1461031e5780635de08ff214610326575f5ffd5b806332e89ace116101d057806332e89ace1461026e57806348825e94146102815780634b6d5d6e146102a857806350ff7225146102bb575f5ffd5b8063136439dd146102015780631794bb3c146102165780631b3cbdc1146102295780632eae418c1461025b575b5f5ffd5b61021461020f36600461204d565b61055c565b005b610214610224366004612078565b610631565b6102486102373660046120b6565b60d46020525f908152604090205481565b6040519081526020015b60405180910390f35b6102146102693660046120d1565b610757565b61024861027c366004612133565b610803565b6102487f4337f82d142e41f2a8c10547cd8c859bddb92262a61058e77842e24d9dea922481565b6102146102b63660046120b6565b6108a7565b6102ce6102c9366004612078565b6109d3565b60408051928352602083019190915201610252565b610214610a35565b61030e6102f936600461222e565b609854600160ff9092169190911b9081161490565b6040519015158152602001610252565b609854610248565b61021461033436600461224e565b610ae4565b61030e6103473660046120b6565b60d16020525f908152604090205460ff1681565b610214610c23565b610214610371366004612078565b610c34565b6102486103843660046120b6565b60ca6020525f908152604090205481565b6103bc7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610252565b6102486103e23660046120b6565b6001600160a01b03165f90815260ce602052604090205490565b6033546001600160a01b03166103bc565b61042061041b3660046120b6565b610c88565b604051610252929190612302565b60cb546103bc906001600160a01b031681565b61024861044f36600461235a565b610e00565b61021461046236600461224e565b610e91565b6102146104753660046120b6565b610fd0565b6103bc6104883660046123bb565b610fe1565b6104a061049b3660046120b6565b611015565b60405161025291906123e5565b6102146104bb3660046123bb565b611088565b6103bc7f000000000000000000000000000000000000000000000000000000000000000081565b6102486104f5366004612078565b611143565b6102146105083660046120b6565b611195565b6103bc620e16e481565b61024861120b565b61021461052d36600461204d565b6112f0565b6102486105403660046123f7565b60cd60209081525f928352604080842090915290825290205481565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa1580156105be573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105e2919061242e565b6105ff57604051631d77d47760e21b815260040160405180910390fd5b60985481811681146106245760405163c61dca5d60e01b815260040160405180910390fd5b61062d82611406565b5050565b5f54610100900460ff161580801561064f57505f54600160ff909116105b806106685750303b15801561066857505f5460ff166001145b6106d05760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b5f805460ff1916600117905580156106f1575f805461ff0019166101001790555b6106fa82611406565b61070384611443565b61070c83611494565b8015610751575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146107a05760405163f739589b60e01b815260040160405180910390fd5b604051636ce5768960e11b81526001600160a01b0384169063d9caed12906107d09087908690869060040161244d565b5f604051808303815f87803b1580156107e7575f5ffd5b505af11580156107f9573d5f5f3e3d5ffd5b5050505050505050565b6098545f90819060019081160361082d5760405163840a48d560e01b815260040160405180910390fd5b6108356114fd565b6001600160a01b0385165f90815260ca60205260409020546108668661085f818c8c8c878c610e00565b8688611556565b6001600160a01b0386165f90815260ca6020526040902060018201905561088f868a8a8a6115a8565b92505061089c6001606555565b509695505050505050565b6108af6114fd565b6001600160a01b0381165f81815260d4602090815260408083208054939055805193845290830182905290917fd9d082c3ec4f3a3ffa55c324939a06407f5fbcb87d5e0ce3b9508c92c84ed839910160405180910390a1816001600160a01b031663d9caed12620e16e4846001600160a01b0316632495a5996040518163ffffffff1660e01b8152600401602060405180830381865afa158015610955573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109799190612471565b846040518463ffffffff1660e01b81526004016109989392919061244d565b5f604051808303815f87803b1580156109af575f5ffd5b505af11580156109c1573d5f5f3e3d5ffd5b50505050506109d06001606555565b50565b5f80336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610a1e5760405163f739589b60e01b815260040160405180910390fd5b610a29858585611715565b91509150935093915050565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa158015610a97573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610abb919061242e565b610ad857604051631d77d47760e21b815260040160405180910390fd5b610ae25f19611406565b565b60cb546001600160a01b03163314610b0f576040516320ba3ff960e21b815260040160405180910390fd5b805f5b818110156107515760d15f858584818110610b2f57610b2f61248c565b9050602002016020810190610b4491906120b6565b6001600160a01b0316815260208101919091526040015f205460ff16610c1b57600160d15f868685818110610b7b57610b7b61248c565b9050602002016020810190610b9091906120b6565b6001600160a01b0316815260208101919091526040015f20805460ff19169115159190911790557f0c35b17d91c96eb2751cd456e1252f42a386e524ef9ff26ecc9950859fdc04fe848483818110610bea57610bea61248c565b9050602002016020810190610bff91906120b6565b6040516001600160a01b03909116815260200160405180910390a15b600101610b12565b610c2b61187d565b610ae25f611443565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610c7d5760405163f739589b60e01b815260040160405180910390fd5b6107518383836118d7565b6001600160a01b0381165f90815260ce60205260408120546060918291908167ffffffffffffffff811115610cbf57610cbf61211f565b604051908082528060200260200182016040528015610ce8578160200160208202803683370190505b5090505f5b82811015610d76576001600160a01b0386165f90815260cd6020908152604080832060ce9092528220805491929184908110610d2b57610d2b61248c565b5f9182526020808320909101546001600160a01b031683528201929092526040019020548251839083908110610d6357610d6361248c565b6020908102919091010152600101610ced565b5060ce5f866001600160a01b03166001600160a01b031681526020019081526020015f208181805480602002602001604051908101604052809291908181526020018280548015610dee57602002820191905f5260205f20905b81546001600160a01b03168152600190910190602001808311610dd0575b50505050509150935093505050915091565b604080517f4337f82d142e41f2a8c10547cd8c859bddb92262a61058e77842e24d9dea922460208201526001600160a01b03808916928201929092528187166060820152908516608082015260a0810184905260c0810183905260e081018290525f90610e8690610100016040516020818303038152906040528051906020012061199b565b979650505050505050565b60cb546001600160a01b03163314610ebc576040516320ba3ff960e21b815260040160405180910390fd5b805f5b818110156107515760d15f858584818110610edc57610edc61248c565b9050602002016020810190610ef191906120b6565b6001600160a01b0316815260208101919091526040015f205460ff1615610fc8575f60d15f868685818110610f2857610f2861248c565b9050602002016020810190610f3d91906120b6565b6001600160a01b0316815260208101919091526040015f20805460ff19169115159190911790557f4074413b4b443e4e58019f2855a8765113358c7c72e39509c6af45fc0f5ba030848483818110610f9757610f9761248c565b9050602002016020810190610fac91906120b6565b6040516001600160a01b03909116815260200160405180910390a15b600101610ebf565b610fd861187d565b6109d081611494565b60ce602052815f5260405f208181548110610ffa575f80fd5b5f918252602090912001546001600160a01b03169150829050565b6001600160a01b0381165f90815260ce602090815260409182902080548351818402810184019094528084526060939283018282801561107c57602002820191905f5260205f20905b81546001600160a01b0316815260019091019060200180831161105e575b50505050509050919050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146110d15760405163f739589b60e01b815260040160405180910390fd5b6001600160a01b0382165f90815260d46020526040812080548392906110f89084906124b4565b9091555050604080516001600160a01b0384168152602081018390527fca3e02a4ab7ad3c47a8e36e5a624c30170791726ab720f1babfef21046d953ff910160405180910390a15050565b6098545f90819060019081160361116d5760405163840a48d560e01b815260040160405180910390fd5b6111756114fd565b611181338686866115a8565b915061118d6001606555565b509392505050565b61119d61187d565b6001600160a01b0381166112025760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016106c7565b6109d081611443565b5f7f000000000000000000000000000000000000000000000000000000000000000046146112cb5750604080518082018252600a81526922b4b3b2b72630bcb2b960b11b60209182015281517f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a866818301527f71b625cfad44bac63b13dba07f2e1d6084ee04b6f8752101ece6126d584ee6ea81840152466060820152306080808301919091528351808303909101815260a0909101909252815191012090565b507f000000000000000000000000000000000000000000000000000000000000000090565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561134c573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113709190612471565b6001600160a01b0316336001600160a01b0316146113a15760405163794821ff60e01b815260040160405180910390fd5b609854801982198116146113c85760405163c61dca5d60e01b815260040160405180910390fd5b609882905560405182815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c9060200160405180910390a25050565b609881905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a250565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b60cb54604080516001600160a01b03928316815291831660208301527f4264275e593955ff9d6146a51a4525f6ddace2e81db9391abcc9d1ca48047d29910160405180910390a160cb80546001600160a01b0319166001600160a01b0392909216919091179055565b60026065540361154f5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016106c7565b6002606555565b4281101561157757604051630819bdcd60e01b815260040160405180910390fd5b61158b6001600160a01b03851684846119e1565b61075157604051638baa579f60e01b815260040160405180910390fd5b6001600160a01b0383165f90815260d16020526040812054849060ff166115e257604051632efd965160e11b815260040160405180910390fd5b6115f76001600160a01b038516338786611a3f565b6040516311f9fbc960e21b81526001600160a01b038581166004830152602482018590528616906347e7ef24906044016020604051808303815f875af1158015611643573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061166791906124cd565b91505f5f611676888886611715565b604051631e328e7960e11b81526001600160a01b038b811660048301528a8116602483015260448201849052606482018390529294509092507f000000000000000000000000000000000000000000000000000000000000000090911690633c651cf2906084015f604051808303815f87803b1580156116f4575f5ffd5b505af1158015611706573d5f5f3e3d5ffd5b50505050505050949350505050565b5f806001600160a01b03851661173e576040516316f2ccc960e01b815260040160405180910390fd5b825f0361175e576040516342061b2560e11b815260040160405180910390fd5b6001600160a01b038086165f90815260cd6020908152604080832093881683529290529081205490819003611804576001600160a01b0386165f90815260ce6020908152604090912054106117c6576040516301a1443960e31b815260040160405180910390fd5b6001600160a01b038681165f90815260ce602090815260408220805460018101825590835291200180546001600160a01b0319169187169190911790555b61180e84826124b4565b6001600160a01b038088165f90815260cd60209081526040808320938a16835292905281902091909155517f5548c837ab068cf56a2c2479df0882a4922fd203edb7517321831d95078c5f629061186a9088908890889061244d565b60405180910390a1959294509192505050565b6033546001600160a01b03163314610ae25760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016106c7565b5f815f036118f8576040516342061b2560e11b815260040160405180910390fd5b6001600160a01b038085165f90815260cd60209081526040808320938716835292905220548083111561193e57604051634b18b19360e01b815260040160405180910390fd5b61194883826124e4565b6001600160a01b038087165f90815260cd60209081526040808320938916835292905290812082905590915081900361198f576119858585611a97565b6001915050611994565b5f9150505b9392505050565b5f6119a461120b565b60405161190160f01b6020820152602281019190915260428101839052606201604051602081830303815290604052805190602001209050919050565b5f5f5f6119ee8585611c15565b90925090505f816004811115611a0657611a066124f7565b148015611a245750856001600160a01b0316826001600160a01b0316145b80611a355750611a35868686611c57565b9695505050505050565b610751846323b872dd60e01b858585604051602401611a609392919061244d565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152611d3e565b6001600160a01b0382165f90815260ce6020526040812054905b81811015611ba9576001600160a01b038481165f90815260ce6020526040902080549185169183908110611ae757611ae761248c565b5f918252602090912001546001600160a01b031603611ba1576001600160a01b0384165f90815260ce602052604090208054611b25906001906124e4565b81548110611b3557611b3561248c565b5f9182526020808320909101546001600160a01b03878116845260ce9092526040909220805491909216919083908110611b7157611b7161248c565b905f5260205f20015f6101000a8154816001600160a01b0302191690836001600160a01b03160217905550611ba9565b600101611ab1565b818103611bc957604051632df15a4160e11b815260040160405180910390fd5b6001600160a01b0384165f90815260ce60205260409020805480611bef57611bef61250b565b5f8281526020902081015f1990810180546001600160a01b031916905501905550505050565b5f5f8251604103611c49576020830151604084015160608501515f1a611c3d87828585611e16565b94509450505050611c50565b505f905060025b9250929050565b5f5f5f856001600160a01b0316631626ba7e60e01b8686604051602401611c7f92919061254d565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b0319909416939093179092529051611cbd9190612565565b5f60405180830381855afa9150503d805f8114611cf5576040519150601f19603f3d011682016040523d82523d5f602084013e611cfa565b606091505b5091509150818015611d0e57506020815110155b8015611a3557508051630b135d3f60e11b90611d3390830160209081019084016124cd565b149695505050505050565b5f611d92826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316611ed39092919063ffffffff16565b905080515f1480611db2575080806020019051810190611db2919061242e565b611e115760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016106c7565b505050565b5f807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0831115611e4b57505f90506003611eca565b604080515f8082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015611e9c573d5f5f3e3d5ffd5b5050604051601f1901519150506001600160a01b038116611ec4575f60019250925050611eca565b91505f90505b94509492505050565b6060611ee184845f85611ee9565b949350505050565b606082471015611f4a5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b60648201526084016106c7565b5f5f866001600160a01b03168587604051611f659190612565565b5f6040518083038185875af1925050503d805f8114611f9f576040519150601f19603f3d011682016040523d82523d5f602084013e611fa4565b606091505b5091509150610e86878383876060831561201e5782515f03612017576001600160a01b0385163b6120175760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016106c7565b5081611ee1565b611ee183838151156120335781518083602001fd5b8060405162461bcd60e51b81526004016106c7919061257b565b5f6020828403121561205d575f5ffd5b5035919050565b6001600160a01b03811681146109d0575f5ffd5b5f5f5f6060848603121561208a575f5ffd5b833561209581612064565b925060208401356120a581612064565b929592945050506040919091013590565b5f602082840312156120c6575f5ffd5b813561199481612064565b5f5f5f5f608085870312156120e4575f5ffd5b84356120ef81612064565b935060208501356120ff81612064565b9250604085013561210f81612064565b9396929550929360600135925050565b634e487b7160e01b5f52604160045260245ffd5b5f5f5f5f5f5f60c08789031215612148575f5ffd5b863561215381612064565b9550602087013561216381612064565b945060408701359350606087013561217a81612064565b92506080870135915060a087013567ffffffffffffffff81111561219c575f5ffd5b8701601f810189136121ac575f5ffd5b803567ffffffffffffffff8111156121c6576121c661211f565b604051601f8201601f19908116603f0116810167ffffffffffffffff811182821017156121f5576121f561211f565b6040528181528282016020018b101561220c575f5ffd5b816020840160208301375f602083830101528093505050509295509295509295565b5f6020828403121561223e575f5ffd5b813560ff81168114611994575f5ffd5b5f5f6020838503121561225f575f5ffd5b823567ffffffffffffffff811115612275575f5ffd5b8301601f81018513612285575f5ffd5b803567ffffffffffffffff81111561229b575f5ffd5b8560208260051b84010111156122af575f5ffd5b6020919091019590945092505050565b5f8151808452602084019350602083015f5b828110156122f85781516001600160a01b03168652602095860195909101906001016122d1565b5093949350505050565b604081525f61231460408301856122bf565b82810360208401528084518083526020830191506020860192505f5b8181101561234e578351835260209384019390920191600101612330565b50909695505050505050565b5f5f5f5f5f5f60c0878903121561236f575f5ffd5b863561237a81612064565b9550602087013561238a81612064565b9450604087013561239a81612064565b959894975094956060810135955060808101359460a0909101359350915050565b5f5f604083850312156123cc575f5ffd5b82356123d781612064565b946020939093013593505050565b602081525f61199460208301846122bf565b5f5f60408385031215612408575f5ffd5b823561241381612064565b9150602083013561242381612064565b809150509250929050565b5f6020828403121561243e575f5ffd5b81518015158114611994575f5ffd5b6001600160a01b039384168152919092166020820152604081019190915260600190565b5f60208284031215612481575f5ffd5b815161199481612064565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b808201808211156124c7576124c76124a0565b92915050565b5f602082840312156124dd575f5ffd5b5051919050565b818103818111156124c7576124c76124a0565b634e487b7160e01b5f52602160045260245ffd5b634e487b7160e01b5f52603160045260245ffd5b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b828152604060208201525f611ee1604083018461251f565b5f82518060208501845e5f920191825250919050565b602081525f611994602083018461251f56fea26469706673582212204d8dc99318e4c22525994dff986dab3f95823a44c04e5ce2b2f7fd1c8dc4c47a64736f6c634300081b0033", + ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"_delegation\",\"type\":\"address\",\"internalType\":\"contractIDelegationManager\"},{\"name\":\"_pauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"DEFAULT_BURN_ADDRESS\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"DEPOSIT_TYPEHASH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"addShares\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"shares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"addStrategiesToDepositWhitelist\",\"inputs\":[{\"name\":\"strategiesToWhitelist\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"burnShares\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"calculateStrategyDepositDigestHash\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"nonce\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"delegation\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIDelegationManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"depositIntoStrategy\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"depositShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"depositIntoStrategyWithSignature\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"depositShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"domainSeparator\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getBurnableShares\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getDeposits\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getStakerStrategyList\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getStrategiesWithBurnableShares\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"increaseBurnableShares\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"addedSharesToBurn\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"initialOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"initialStrategyWhitelister\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"initialPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"nonces\",\"inputs\":[{\"name\":\"signer\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"nonce\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"pauseAll\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[{\"name\":\"index\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pauserRegistry\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"removeDepositShares\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"depositSharesToRemove\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"removeStrategiesFromDepositWhitelist\",\"inputs\":[{\"name\":\"strategiesToRemoveFromWhitelist\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setStrategyWhitelister\",\"inputs\":[{\"name\":\"newStrategyWhitelister\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"stakerDepositShares\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"shares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"stakerStrategyList\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"strategies\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"stakerStrategyListLength\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"strategyIsWhitelistedForDeposit\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"whitelisted\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"strategyWhitelister\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"withdrawSharesAsTokens\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"shares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"BurnableSharesDecreased\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"shares\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BurnableSharesIncreased\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"shares\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Deposit\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"shares\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StrategyAddedToDepositWhitelist\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StrategyRemovedFromDepositWhitelist\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StrategyWhitelisterChanged\",\"inputs\":[{\"name\":\"previousAddress\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"newAddress\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"CurrentlyPaused\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InputAddressZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidNewPausedStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidSignature\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"MaxStrategiesExceeded\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyDelegationManager\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyPauser\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyStrategyWhitelister\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyUnpauser\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SharesAmountTooHigh\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SharesAmountZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SignatureExpired\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StakerAddressZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StrategyNotFound\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StrategyNotWhitelisted\",\"inputs\":[]}]", + Bin: "0x610100604052348015610010575f5ffd5b50604051612c9b380380612c9b83398101604081905261002f916101ed565b81816001600160a01b038116610058576040516339b190bb60e11b815260040160405180910390fd5b6001600160a01b039081166080521660a0524660c052610108604080518082018252600a81526922b4b3b2b72630bcb2b960b11b60209182015281517f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a866818301527f71b625cfad44bac63b13dba07f2e1d6084ee04b6f8752101ece6126d584ee6ea81840152466060820152306080808301919091528351808303909101815260a0909101909252815191012090565b60e05261011361011a565b5050610225565b5f54610100900460ff16156101855760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff908116146101d4575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b03811681146101ea575f5ffd5b50565b5f5f604083850312156101fe575f5ffd5b8251610209816101d6565b602084015190925061021a816101d6565b809150509250929050565b60805160a05160c05160e051612a0b6102905f395f61140101525f61134101525f81816104c70152818161077701528181610b1801528181610d77015281816111cb01526117f901525f818161039c0152818161058601528181610b8201526114250152612a0b5ff3fe608060405234801561000f575f5ffd5b5060043610610208575f3560e01c80638b8aac3c1161011f578063debe1eab116100a9578063f3b4a00011610079578063f3b4a0001461050f578063f698da2514610519578063fabc1cbc14610521578063fd98042314610534578063fe243a1714610547575f5ffd5b8063debe1eab146104af578063df5cf723146104c2578063e7a050aa146104e9578063f2fde38b146104fc575f5ffd5b80639ac01d61116100ef5780639ac01d6114610443578063b5d8b5b814610456578063c665670214610469578063cbc2bd621461047c578063de44acb61461048f575f5ffd5b80638b8aac3c146103d65780638da5cb5b146103fe57806394f649dd1461040f578063967fc0d214610430575f5ffd5b8063595c6a67116101a0578063663c1de411610170578063663c1de41461033b578063715018a61461035d578063724af423146103655780637ecebe0014610378578063886f119514610397575f5ffd5b8063595c6a67146102e55780635ac86ab7146102ed5780635c975abb146103205780635de08ff214610328575f5ffd5b806336a8c500116101db57806336a8c5001461026d57806348825e94146102835780634b6d5d6e146102aa57806350ff7225146102bd575f5ffd5b8063136439dd1461020c5780631794bb3c146102215780632eae418c1461023457806332e89ace14610247575b5f5ffd5b61021f61021a366004612440565b610571565b005b61021f61022f36600461246b565b610646565b61021f6102423660046124a9565b61076c565b61025a61025536600461250b565b610818565b6040519081526020015b60405180910390f35b6102756108bc565b604051610264929190612640565b61025a7f4337f82d142e41f2a8c10547cd8c859bddb92262a61058e77842e24d9dea922481565b61021f6102b8366004612696565b6109d9565b6102d06102cb36600461246b565b610b0b565b60408051928352602083019190915201610264565b61021f610b6d565b6103106102fb3660046126b1565b609854600160ff9092169190911b9081161490565b6040519015158152602001610264565b60985461025a565b61021f6103363660046126d1565b610c1c565b610310610349366004612696565b60d16020525f908152604090205460ff1681565b61021f610d5b565b61021f61037336600461246b565b610d6c565b61025a610386366004612696565b60ca6020525f908152604090205481565b6103be7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610264565b61025a6103e4366004612696565b6001600160a01b03165f90815260ce602052604090205490565b6033546001600160a01b03166103be565b61042261041d366004612696565b610dc0565b60405161026492919061277b565b60cb546103be906001600160a01b031681565b61025a6104513660046127a8565b610f38565b61021f6104643660046126d1565b610fc9565b61021f610477366004612696565b611108565b6103be61048a366004612809565b611119565b6104a261049d366004612696565b61114d565b6040516102649190612833565b61021f6104bd366004612809565b6111c0565b6103be7f000000000000000000000000000000000000000000000000000000000000000081565b61025a6104f736600461246b565b611276565b61021f61050a366004612696565b6112c8565b6103be620e16e481565b61025a61133e565b61021f61052f366004612440565b611423565b61025a610542366004612696565b611539565b61025a610555366004612845565b60cd60209081525f928352604080842090915290825290205481565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa1580156105d3573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105f7919061287c565b61061457604051631d77d47760e21b815260040160405180910390fd5b60985481811681146106395760405163c61dca5d60e01b815260040160405180910390fd5b6106428261154e565b5050565b5f54610100900460ff161580801561066457505f54600160ff909116105b8061067d5750303b15801561067d57505f5460ff166001145b6106e55760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b5f805460ff191660011790558015610706575f805461ff0019166101001790555b61070f8261154e565b6107188461158b565b610721836115dc565b8015610766575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146107b55760405163f739589b60e01b815260040160405180910390fd5b604051636ce5768960e11b81526001600160a01b0384169063d9caed12906107e59087908690869060040161289b565b5f604051808303815f87803b1580156107fc575f5ffd5b505af115801561080e573d5f5f3e3d5ffd5b5050505050505050565b6098545f9081906001908116036108425760405163840a48d560e01b815260040160405180910390fd5b61084a611645565b6001600160a01b0385165f90815260ca602052604090205461087b86610874818c8c8c878c610f38565b868861169e565b6001600160a01b0386165f90815260ca602052604090206001820190556108a4868a8a8a6116f0565b9250506108b16001606555565b509695505050505050565b6060805f6108ca60d461185d565b90505f8167ffffffffffffffff8111156108e6576108e66124f7565b60405190808252806020026020018201604052801561090f578160200160208202803683370190505b5090505f8267ffffffffffffffff81111561092c5761092c6124f7565b604051908082528060200260200182016040528015610955578160200160208202803683370190505b5090505f5b838110156109ce575f5f61096f60d48461186d565b9150915081858481518110610986576109866128bf565b60200260200101906001600160a01b031690816001600160a01b031681525050808484815181106109b9576109b96128bf565b6020908102919091010152505060010161095a565b509094909350915050565b6109e1611645565b5f6109ed60d48361188a565b9150506109fb60d4836118a1565b50604080516001600160a01b0384168152602081018390527fd9d082c3ec4f3a3ffa55c324939a06407f5fbcb87d5e0ce3b9508c92c84ed839910160405180910390a1816001600160a01b031663d9caed12620e16e4846001600160a01b0316632495a5996040518163ffffffff1660e01b8152600401602060405180830381865afa158015610a8d573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ab191906128d3565b846040518463ffffffff1660e01b8152600401610ad09392919061289b565b5f604051808303815f87803b158015610ae7575f5ffd5b505af1158015610af9573d5f5f3e3d5ffd5b5050505050610b086001606555565b50565b5f80336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610b565760405163f739589b60e01b815260040160405180910390fd5b610b618585856118bc565b91509150935093915050565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa158015610bcf573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610bf3919061287c565b610c1057604051631d77d47760e21b815260040160405180910390fd5b610c1a5f1961154e565b565b60cb546001600160a01b03163314610c47576040516320ba3ff960e21b815260040160405180910390fd5b805f5b818110156107665760d15f858584818110610c6757610c676128bf565b9050602002016020810190610c7c9190612696565b6001600160a01b0316815260208101919091526040015f205460ff16610d5357600160d15f868685818110610cb357610cb36128bf565b9050602002016020810190610cc89190612696565b6001600160a01b0316815260208101919091526040015f20805460ff19169115159190911790557f0c35b17d91c96eb2751cd456e1252f42a386e524ef9ff26ecc9950859fdc04fe848483818110610d2257610d226128bf565b9050602002016020810190610d379190612696565b6040516001600160a01b03909116815260200160405180910390a15b600101610c4a565b610d63611a24565b610c1a5f61158b565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610db55760405163f739589b60e01b815260040160405180910390fd5b610766838383611a7e565b6001600160a01b0381165f90815260ce60205260408120546060918291908167ffffffffffffffff811115610df757610df76124f7565b604051908082528060200260200182016040528015610e20578160200160208202803683370190505b5090505f5b82811015610eae576001600160a01b0386165f90815260cd6020908152604080832060ce9092528220805491929184908110610e6357610e636128bf565b5f9182526020808320909101546001600160a01b031683528201929092526040019020548251839083908110610e9b57610e9b6128bf565b6020908102919091010152600101610e25565b5060ce5f866001600160a01b03166001600160a01b031681526020019081526020015f208181805480602002602001604051908101604052809291908181526020018280548015610f2657602002820191905f5260205f20905b81546001600160a01b03168152600190910190602001808311610f08575b50505050509150935093505050915091565b604080517f4337f82d142e41f2a8c10547cd8c859bddb92262a61058e77842e24d9dea922460208201526001600160a01b03808916928201929092528187166060820152908516608082015260a0810184905260c0810183905260e081018290525f90610fbe906101000160405160208183030381529060405280519060200120611b40565b979650505050505050565b60cb546001600160a01b03163314610ff4576040516320ba3ff960e21b815260040160405180910390fd5b805f5b818110156107665760d15f858584818110611014576110146128bf565b90506020020160208101906110299190612696565b6001600160a01b0316815260208101919091526040015f205460ff1615611100575f60d15f868685818110611060576110606128bf565b90506020020160208101906110759190612696565b6001600160a01b0316815260208101919091526040015f20805460ff19169115159190911790557f4074413b4b443e4e58019f2855a8765113358c7c72e39509c6af45fc0f5ba0308484838181106110cf576110cf6128bf565b90506020020160208101906110e49190612696565b6040516001600160a01b03909116815260200160405180910390a15b600101610ff7565b611110611a24565b610b08816115dc565b60ce602052815f5260405f208181548110611132575f80fd5b5f918252602090912001546001600160a01b03169150829050565b6001600160a01b0381165f90815260ce60209081526040918290208054835181840281018401909452808452606093928301828280156111b457602002820191905f5260205f20905b81546001600160a01b03168152600190910190602001808311611196575b50505050509050919050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146112095760405163f739589b60e01b815260040160405180910390fd5b5f61121560d48461188a565b915061122e905060d4846112298585612902565b611b86565b50604080516001600160a01b0385168152602081018490527fca3e02a4ab7ad3c47a8e36e5a624c30170791726ab720f1babfef21046d953ff910160405180910390a1505050565b6098545f9081906001908116036112a05760405163840a48d560e01b815260040160405180910390fd5b6112a8611645565b6112b4338686866116f0565b91506112c06001606555565b509392505050565b6112d0611a24565b6001600160a01b0381166113355760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016106dc565b610b088161158b565b5f7f000000000000000000000000000000000000000000000000000000000000000046146113fe5750604080518082018252600a81526922b4b3b2b72630bcb2b960b11b60209182015281517f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a866818301527f71b625cfad44bac63b13dba07f2e1d6084ee04b6f8752101ece6126d584ee6ea81840152466060820152306080808301919091528351808303909101815260a0909101909252815191012090565b507f000000000000000000000000000000000000000000000000000000000000000090565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561147f573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114a391906128d3565b6001600160a01b0316336001600160a01b0316146114d45760405163794821ff60e01b815260040160405180910390fd5b609854801982198116146114fb5760405163c61dca5d60e01b815260040160405180910390fd5b609882905560405182815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c9060200160405180910390a25050565b5f5f61154660d48461188a565b949350505050565b609881905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a250565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b60cb54604080516001600160a01b03928316815291831660208301527f4264275e593955ff9d6146a51a4525f6ddace2e81db9391abcc9d1ca48047d29910160405180910390a160cb80546001600160a01b0319166001600160a01b0392909216919091179055565b6002606554036116975760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016106dc565b6002606555565b428110156116bf57604051630819bdcd60e01b815260040160405180910390fd5b6116d36001600160a01b0385168484611b9b565b61076657604051638baa579f60e01b815260040160405180910390fd5b6001600160a01b0383165f90815260d16020526040812054849060ff1661172a57604051632efd965160e11b815260040160405180910390fd5b61173f6001600160a01b038516338786611bf9565b6040516311f9fbc960e21b81526001600160a01b038581166004830152602482018590528616906347e7ef24906044016020604051808303815f875af115801561178b573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906117af9190612915565b91505f5f6117be8888866118bc565b604051631e328e7960e11b81526001600160a01b038b811660048301528a8116602483015260448201849052606482018390529294509092507f000000000000000000000000000000000000000000000000000000000000000090911690633c651cf2906084015f604051808303815f87803b15801561183c575f5ffd5b505af115801561184e573d5f5f3e3d5ffd5b50505050505050949350505050565b5f61186782611c51565b92915050565b5f80808061187b8686611c5b565b909450925050505b9250929050565b5f80808061187b866001600160a01b038716611c84565b5f6118b5836001600160a01b038416611cbc565b9392505050565b5f806001600160a01b0385166118e5576040516316f2ccc960e01b815260040160405180910390fd5b825f03611905576040516342061b2560e11b815260040160405180910390fd5b6001600160a01b038086165f90815260cd60209081526040808320938816835292905290812054908190036119ab576001600160a01b0386165f90815260ce60209081526040909120541061196d576040516301a1443960e31b815260040160405180910390fd5b6001600160a01b038681165f90815260ce602090815260408220805460018101825590835291200180546001600160a01b0319169187169190911790555b6119b58482612902565b6001600160a01b038088165f90815260cd60209081526040808320938a16835292905281902091909155517f5548c837ab068cf56a2c2479df0882a4922fd203edb7517321831d95078c5f6290611a119088908890889061289b565b60405180910390a1959294509192505050565b6033546001600160a01b03163314610c1a5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016106dc565b5f815f03611a9f576040516342061b2560e11b815260040160405180910390fd5b6001600160a01b038085165f90815260cd602090815260408083209387168352929052205480831115611ae557604051634b18b19360e01b815260040160405180910390fd5b611aef838261292c565b6001600160a01b038087165f90815260cd602090815260408083209389168352929052908120829055909150819003611b3657611b2c8585611cd8565b60019150506118b5565b505f949350505050565b5f611b4961133e565b60405161190160f01b6020820152602281019190915260428101839052606201604051602081830303815290604052805190602001209050919050565b5f611546846001600160a01b03851684611e56565b5f5f5f611ba88585611e72565b90925090505f816004811115611bc057611bc061293f565b148015611bde5750856001600160a01b0316826001600160a01b0316145b80611bef5750611bef868686611eb1565b9695505050505050565b610766846323b872dd60e01b858585604051602401611c1a9392919061289b565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152611f98565b5f61186782612070565b5f8080611c688585612079565b5f81815260029690960160205260409095205494959350505050565b5f818152600283016020526040812054819080611cb157611ca58585612084565b92505f91506118839050565b600192509050611883565b5f81815260028301602052604081208190556118b5838361208f565b6001600160a01b0382165f90815260ce6020526040812054905b81811015611dea576001600160a01b038481165f90815260ce6020526040902080549185169183908110611d2857611d286128bf565b5f918252602090912001546001600160a01b031603611de2576001600160a01b0384165f90815260ce602052604090208054611d669060019061292c565b81548110611d7657611d766128bf565b5f9182526020808320909101546001600160a01b03878116845260ce9092526040909220805491909216919083908110611db257611db26128bf565b905f5260205f20015f6101000a8154816001600160a01b0302191690836001600160a01b03160217905550611dea565b600101611cf2565b818103611e0a57604051632df15a4160e11b815260040160405180910390fd5b6001600160a01b0384165f90815260ce60205260409020805480611e3057611e30612953565b5f8281526020902081015f1990810180546001600160a01b031916905501905550505050565b5f8281526002840160205260408120829055611546848461209a565b5f5f8251604103611ea6576020830151604084015160608501515f1a611e9a878285856120a5565b94509450505050611883565b505f90506002611883565b5f5f5f856001600160a01b0316631626ba7e60e01b8686604051602401611ed9929190612995565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b0319909416939093179092529051611f1791906129ad565b5f60405180830381855afa9150503d805f8114611f4f576040519150601f19603f3d011682016040523d82523d5f602084013e611f54565b606091505b5091509150818015611f6857506020815110155b8015611bef57508051630b135d3f60e11b90611f8d9083016020908101908401612915565b149695505050505050565b5f611fec826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166121629092919063ffffffff16565b905080515f148061200c57508080602001905181019061200c919061287c565b61206b5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016106dc565b505050565b5f611867825490565b5f6118b58383612170565b5f6118b58383612196565b5f6118b583836121ad565b5f6118b58383612290565b5f807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08311156120da57505f90506003612159565b604080515f8082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa15801561212b573d5f5f3e3d5ffd5b5050604051601f1901519150506001600160a01b038116612153575f60019250925050612159565b91505f90505b94509492505050565b606061154684845f856122dc565b5f825f018281548110612185576121856128bf565b905f5260205f200154905092915050565b5f81815260018301602052604081205415156118b5565b5f8181526001830160205260408120548015612287575f6121cf60018361292c565b85549091505f906121e29060019061292c565b9050818114612241575f865f018281548110612200576122006128bf565b905f5260205f200154905080875f018481548110612220576122206128bf565b5f918252602080832090910192909255918252600188019052604090208390555b855486908061225257612252612953565b600190038181905f5260205f20015f90559055856001015f8681526020019081526020015f205f905560019350505050611867565b5f915050611867565b5f8181526001830160205260408120546122d557508154600181810184555f848152602080822090930184905584548482528286019093526040902091909155611867565b505f611867565b60608247101561233d5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b60648201526084016106dc565b5f5f866001600160a01b0316858760405161235891906129ad565b5f6040518083038185875af1925050503d805f8114612392576040519150601f19603f3d011682016040523d82523d5f602084013e612397565b606091505b5091509150610fbe87838387606083156124115782515f0361240a576001600160a01b0385163b61240a5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016106dc565b5081611546565b61154683838151156124265781518083602001fd5b8060405162461bcd60e51b81526004016106dc91906129c3565b5f60208284031215612450575f5ffd5b5035919050565b6001600160a01b0381168114610b08575f5ffd5b5f5f5f6060848603121561247d575f5ffd5b833561248881612457565b9250602084013561249881612457565b929592945050506040919091013590565b5f5f5f5f608085870312156124bc575f5ffd5b84356124c781612457565b935060208501356124d781612457565b925060408501356124e781612457565b9396929550929360600135925050565b634e487b7160e01b5f52604160045260245ffd5b5f5f5f5f5f5f60c08789031215612520575f5ffd5b863561252b81612457565b9550602087013561253b81612457565b945060408701359350606087013561255281612457565b92506080870135915060a087013567ffffffffffffffff811115612574575f5ffd5b8701601f81018913612584575f5ffd5b803567ffffffffffffffff81111561259e5761259e6124f7565b604051601f8201601f19908116603f0116810167ffffffffffffffff811182821017156125cd576125cd6124f7565b6040528181528282016020018b10156125e4575f5ffd5b816020840160208301375f602083830101528093505050509295509295509295565b5f8151808452602084019350602083015f5b82811015612636578151865260209586019590910190600101612618565b5093949350505050565b604080825283519082018190525f9060208501906060840190835b818110156126825783516001600160a01b031683526020938401939092019160010161265b565b50508381036020850152611bef8186612606565b5f602082840312156126a6575f5ffd5b81356118b581612457565b5f602082840312156126c1575f5ffd5b813560ff811681146118b5575f5ffd5b5f5f602083850312156126e2575f5ffd5b823567ffffffffffffffff8111156126f8575f5ffd5b8301601f81018513612708575f5ffd5b803567ffffffffffffffff81111561271e575f5ffd5b8560208260051b8401011115612732575f5ffd5b6020919091019590945092505050565b5f8151808452602084019350602083015f5b828110156126365781516001600160a01b0316865260209586019590910190600101612754565b604081525f61278d6040830185612742565b828103602084015261279f8185612606565b95945050505050565b5f5f5f5f5f5f60c087890312156127bd575f5ffd5b86356127c881612457565b955060208701356127d881612457565b945060408701356127e881612457565b959894975094956060810135955060808101359460a0909101359350915050565b5f5f6040838503121561281a575f5ffd5b823561282581612457565b946020939093013593505050565b602081525f6118b56020830184612742565b5f5f60408385031215612856575f5ffd5b823561286181612457565b9150602083013561287181612457565b809150509250929050565b5f6020828403121561288c575f5ffd5b815180151581146118b5575f5ffd5b6001600160a01b039384168152919092166020820152604081019190915260600190565b634e487b7160e01b5f52603260045260245ffd5b5f602082840312156128e3575f5ffd5b81516118b581612457565b634e487b7160e01b5f52601160045260245ffd5b80820180821115611867576118676128ee565b5f60208284031215612925575f5ffd5b5051919050565b81810381811115611867576118676128ee565b634e487b7160e01b5f52602160045260245ffd5b634e487b7160e01b5f52603160045260245ffd5b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b828152604060208201525f6115466040830184612967565b5f82518060208501845e5f920191825250919050565b602081525f6118b5602083018461296756fea2646970667358221220cc7a838b889ebd0b67bb90d4ebf733e1b23b684c939f0e81770d642fe800aa8864736f6c634300081b0033", } // StrategyManagerABI is the input ABI used to generate the binding from. @@ -264,37 +264,6 @@ func (_StrategyManager *StrategyManagerCallerSession) DEPOSITTYPEHASH() ([32]byt return _StrategyManager.Contract.DEPOSITTYPEHASH(&_StrategyManager.CallOpts) } -// BurnableShares is a free data retrieval call binding the contract method 0x1b3cbdc1. -// -// Solidity: function burnableShares(address strategy) view returns(uint256) -func (_StrategyManager *StrategyManagerCaller) BurnableShares(opts *bind.CallOpts, strategy common.Address) (*big.Int, error) { - var out []interface{} - err := _StrategyManager.contract.Call(opts, &out, "burnableShares", strategy) - - if err != nil { - return *new(*big.Int), err - } - - out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) - - return out0, err - -} - -// BurnableShares is a free data retrieval call binding the contract method 0x1b3cbdc1. -// -// Solidity: function burnableShares(address strategy) view returns(uint256) -func (_StrategyManager *StrategyManagerSession) BurnableShares(strategy common.Address) (*big.Int, error) { - return _StrategyManager.Contract.BurnableShares(&_StrategyManager.CallOpts, strategy) -} - -// BurnableShares is a free data retrieval call binding the contract method 0x1b3cbdc1. -// -// Solidity: function burnableShares(address strategy) view returns(uint256) -func (_StrategyManager *StrategyManagerCallerSession) BurnableShares(strategy common.Address) (*big.Int, error) { - return _StrategyManager.Contract.BurnableShares(&_StrategyManager.CallOpts, strategy) -} - // CalculateStrategyDepositDigestHash is a free data retrieval call binding the contract method 0x9ac01d61. // // Solidity: function calculateStrategyDepositDigestHash(address staker, address strategy, address token, uint256 amount, uint256 nonce, uint256 expiry) view returns(bytes32) @@ -388,6 +357,37 @@ func (_StrategyManager *StrategyManagerCallerSession) DomainSeparator() ([32]byt return _StrategyManager.Contract.DomainSeparator(&_StrategyManager.CallOpts) } +// GetBurnableShares is a free data retrieval call binding the contract method 0xfd980423. +// +// Solidity: function getBurnableShares(address strategy) view returns(uint256) +func (_StrategyManager *StrategyManagerCaller) GetBurnableShares(opts *bind.CallOpts, strategy common.Address) (*big.Int, error) { + var out []interface{} + err := _StrategyManager.contract.Call(opts, &out, "getBurnableShares", strategy) + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// GetBurnableShares is a free data retrieval call binding the contract method 0xfd980423. +// +// Solidity: function getBurnableShares(address strategy) view returns(uint256) +func (_StrategyManager *StrategyManagerSession) GetBurnableShares(strategy common.Address) (*big.Int, error) { + return _StrategyManager.Contract.GetBurnableShares(&_StrategyManager.CallOpts, strategy) +} + +// GetBurnableShares is a free data retrieval call binding the contract method 0xfd980423. +// +// Solidity: function getBurnableShares(address strategy) view returns(uint256) +func (_StrategyManager *StrategyManagerCallerSession) GetBurnableShares(strategy common.Address) (*big.Int, error) { + return _StrategyManager.Contract.GetBurnableShares(&_StrategyManager.CallOpts, strategy) +} + // GetDeposits is a free data retrieval call binding the contract method 0x94f649dd. // // Solidity: function getDeposits(address staker) view returns(address[], uint256[]) @@ -451,6 +451,38 @@ func (_StrategyManager *StrategyManagerCallerSession) GetStakerStrategyList(stak return _StrategyManager.Contract.GetStakerStrategyList(&_StrategyManager.CallOpts, staker) } +// GetStrategiesWithBurnableShares is a free data retrieval call binding the contract method 0x36a8c500. +// +// Solidity: function getStrategiesWithBurnableShares() view returns(address[], uint256[]) +func (_StrategyManager *StrategyManagerCaller) GetStrategiesWithBurnableShares(opts *bind.CallOpts) ([]common.Address, []*big.Int, error) { + var out []interface{} + err := _StrategyManager.contract.Call(opts, &out, "getStrategiesWithBurnableShares") + + if err != nil { + return *new([]common.Address), *new([]*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new([]common.Address)).(*[]common.Address) + out1 := *abi.ConvertType(out[1], new([]*big.Int)).(*[]*big.Int) + + return out0, out1, err + +} + +// GetStrategiesWithBurnableShares is a free data retrieval call binding the contract method 0x36a8c500. +// +// Solidity: function getStrategiesWithBurnableShares() view returns(address[], uint256[]) +func (_StrategyManager *StrategyManagerSession) GetStrategiesWithBurnableShares() ([]common.Address, []*big.Int, error) { + return _StrategyManager.Contract.GetStrategiesWithBurnableShares(&_StrategyManager.CallOpts) +} + +// GetStrategiesWithBurnableShares is a free data retrieval call binding the contract method 0x36a8c500. +// +// Solidity: function getStrategiesWithBurnableShares() view returns(address[], uint256[]) +func (_StrategyManager *StrategyManagerCallerSession) GetStrategiesWithBurnableShares() ([]common.Address, []*big.Int, error) { + return _StrategyManager.Contract.GetStrategiesWithBurnableShares(&_StrategyManager.CallOpts) +} + // Nonces is a free data retrieval call binding the contract method 0x7ecebe00. // // Solidity: function nonces(address signer) view returns(uint256 nonce) diff --git a/pkg/bindings/StrategyManagerStorage/binding.go b/pkg/bindings/StrategyManagerStorage/binding.go index f6cc5469e6..3a3c588a46 100644 --- a/pkg/bindings/StrategyManagerStorage/binding.go +++ b/pkg/bindings/StrategyManagerStorage/binding.go @@ -31,7 +31,7 @@ var ( // StrategyManagerStorageMetaData contains all meta data concerning the StrategyManagerStorage contract. var StrategyManagerStorageMetaData = &bind.MetaData{ - ABI: "[{\"type\":\"function\",\"name\":\"DEFAULT_BURN_ADDRESS\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"DEPOSIT_TYPEHASH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"addShares\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"shares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"addStrategiesToDepositWhitelist\",\"inputs\":[{\"name\":\"strategiesToWhitelist\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"burnShares\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"burnableShares\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"calculateStrategyDepositDigestHash\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"nonce\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"delegation\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIDelegationManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"depositIntoStrategy\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"depositShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"depositIntoStrategyWithSignature\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"depositShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"getDeposits\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getStakerStrategyList\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"increaseBurnableShares\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"addedSharesToBurn\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"initialOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"initialStrategyWhitelister\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"initialPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"nonces\",\"inputs\":[{\"name\":\"signer\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"nonce\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"removeDepositShares\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"depositSharesToRemove\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"removeStrategiesFromDepositWhitelist\",\"inputs\":[{\"name\":\"strategiesToRemoveFromWhitelist\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setStrategyWhitelister\",\"inputs\":[{\"name\":\"newStrategyWhitelister\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"stakerDepositShares\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"shares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"stakerStrategyList\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"strategies\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"stakerStrategyListLength\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"strategyIsWhitelistedForDeposit\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"whitelisted\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"strategyWhitelister\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"withdrawSharesAsTokens\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"shares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"BurnableSharesDecreased\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"shares\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BurnableSharesIncreased\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"shares\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Deposit\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"shares\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StrategyAddedToDepositWhitelist\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StrategyRemovedFromDepositWhitelist\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StrategyWhitelisterChanged\",\"inputs\":[{\"name\":\"previousAddress\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"newAddress\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"MaxStrategiesExceeded\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyDelegationManager\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyStrategyWhitelister\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SharesAmountTooHigh\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SharesAmountZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StakerAddressZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StrategyNotFound\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StrategyNotWhitelisted\",\"inputs\":[]}]", + ABI: "[{\"type\":\"function\",\"name\":\"DEFAULT_BURN_ADDRESS\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"DEPOSIT_TYPEHASH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"addShares\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"shares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"addStrategiesToDepositWhitelist\",\"inputs\":[{\"name\":\"strategiesToWhitelist\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"burnShares\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"calculateStrategyDepositDigestHash\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"nonce\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"delegation\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIDelegationManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"depositIntoStrategy\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"depositShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"depositIntoStrategyWithSignature\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"depositShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"getBurnableShares\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getDeposits\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getStakerStrategyList\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getStrategiesWithBurnableShares\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"increaseBurnableShares\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"addedSharesToBurn\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"initialOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"initialStrategyWhitelister\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"initialPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"nonces\",\"inputs\":[{\"name\":\"signer\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"nonce\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"removeDepositShares\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"depositSharesToRemove\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"removeStrategiesFromDepositWhitelist\",\"inputs\":[{\"name\":\"strategiesToRemoveFromWhitelist\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setStrategyWhitelister\",\"inputs\":[{\"name\":\"newStrategyWhitelister\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"stakerDepositShares\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"shares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"stakerStrategyList\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"strategies\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"stakerStrategyListLength\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"strategyIsWhitelistedForDeposit\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"whitelisted\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"strategyWhitelister\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"withdrawSharesAsTokens\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"shares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"BurnableSharesDecreased\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"shares\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BurnableSharesIncreased\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"shares\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Deposit\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"shares\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StrategyAddedToDepositWhitelist\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StrategyRemovedFromDepositWhitelist\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StrategyWhitelisterChanged\",\"inputs\":[{\"name\":\"previousAddress\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"newAddress\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"MaxStrategiesExceeded\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyDelegationManager\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyStrategyWhitelister\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SharesAmountTooHigh\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SharesAmountZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StakerAddressZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StrategyNotFound\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StrategyNotWhitelisted\",\"inputs\":[]}]", } // StrategyManagerStorageABI is the input ABI used to generate the binding from. @@ -242,37 +242,6 @@ func (_StrategyManagerStorage *StrategyManagerStorageCallerSession) DEPOSITTYPEH return _StrategyManagerStorage.Contract.DEPOSITTYPEHASH(&_StrategyManagerStorage.CallOpts) } -// BurnableShares is a free data retrieval call binding the contract method 0x1b3cbdc1. -// -// Solidity: function burnableShares(address strategy) view returns(uint256) -func (_StrategyManagerStorage *StrategyManagerStorageCaller) BurnableShares(opts *bind.CallOpts, strategy common.Address) (*big.Int, error) { - var out []interface{} - err := _StrategyManagerStorage.contract.Call(opts, &out, "burnableShares", strategy) - - if err != nil { - return *new(*big.Int), err - } - - out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) - - return out0, err - -} - -// BurnableShares is a free data retrieval call binding the contract method 0x1b3cbdc1. -// -// Solidity: function burnableShares(address strategy) view returns(uint256) -func (_StrategyManagerStorage *StrategyManagerStorageSession) BurnableShares(strategy common.Address) (*big.Int, error) { - return _StrategyManagerStorage.Contract.BurnableShares(&_StrategyManagerStorage.CallOpts, strategy) -} - -// BurnableShares is a free data retrieval call binding the contract method 0x1b3cbdc1. -// -// Solidity: function burnableShares(address strategy) view returns(uint256) -func (_StrategyManagerStorage *StrategyManagerStorageCallerSession) BurnableShares(strategy common.Address) (*big.Int, error) { - return _StrategyManagerStorage.Contract.BurnableShares(&_StrategyManagerStorage.CallOpts, strategy) -} - // CalculateStrategyDepositDigestHash is a free data retrieval call binding the contract method 0x9ac01d61. // // Solidity: function calculateStrategyDepositDigestHash(address staker, address strategy, address token, uint256 amount, uint256 nonce, uint256 expiry) view returns(bytes32) @@ -335,6 +304,37 @@ func (_StrategyManagerStorage *StrategyManagerStorageCallerSession) Delegation() return _StrategyManagerStorage.Contract.Delegation(&_StrategyManagerStorage.CallOpts) } +// GetBurnableShares is a free data retrieval call binding the contract method 0xfd980423. +// +// Solidity: function getBurnableShares(address strategy) view returns(uint256) +func (_StrategyManagerStorage *StrategyManagerStorageCaller) GetBurnableShares(opts *bind.CallOpts, strategy common.Address) (*big.Int, error) { + var out []interface{} + err := _StrategyManagerStorage.contract.Call(opts, &out, "getBurnableShares", strategy) + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// GetBurnableShares is a free data retrieval call binding the contract method 0xfd980423. +// +// Solidity: function getBurnableShares(address strategy) view returns(uint256) +func (_StrategyManagerStorage *StrategyManagerStorageSession) GetBurnableShares(strategy common.Address) (*big.Int, error) { + return _StrategyManagerStorage.Contract.GetBurnableShares(&_StrategyManagerStorage.CallOpts, strategy) +} + +// GetBurnableShares is a free data retrieval call binding the contract method 0xfd980423. +// +// Solidity: function getBurnableShares(address strategy) view returns(uint256) +func (_StrategyManagerStorage *StrategyManagerStorageCallerSession) GetBurnableShares(strategy common.Address) (*big.Int, error) { + return _StrategyManagerStorage.Contract.GetBurnableShares(&_StrategyManagerStorage.CallOpts, strategy) +} + // GetDeposits is a free data retrieval call binding the contract method 0x94f649dd. // // Solidity: function getDeposits(address staker) view returns(address[], uint256[]) @@ -398,6 +398,38 @@ func (_StrategyManagerStorage *StrategyManagerStorageCallerSession) GetStakerStr return _StrategyManagerStorage.Contract.GetStakerStrategyList(&_StrategyManagerStorage.CallOpts, staker) } +// GetStrategiesWithBurnableShares is a free data retrieval call binding the contract method 0x36a8c500. +// +// Solidity: function getStrategiesWithBurnableShares() view returns(address[], uint256[]) +func (_StrategyManagerStorage *StrategyManagerStorageCaller) GetStrategiesWithBurnableShares(opts *bind.CallOpts) ([]common.Address, []*big.Int, error) { + var out []interface{} + err := _StrategyManagerStorage.contract.Call(opts, &out, "getStrategiesWithBurnableShares") + + if err != nil { + return *new([]common.Address), *new([]*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new([]common.Address)).(*[]common.Address) + out1 := *abi.ConvertType(out[1], new([]*big.Int)).(*[]*big.Int) + + return out0, out1, err + +} + +// GetStrategiesWithBurnableShares is a free data retrieval call binding the contract method 0x36a8c500. +// +// Solidity: function getStrategiesWithBurnableShares() view returns(address[], uint256[]) +func (_StrategyManagerStorage *StrategyManagerStorageSession) GetStrategiesWithBurnableShares() ([]common.Address, []*big.Int, error) { + return _StrategyManagerStorage.Contract.GetStrategiesWithBurnableShares(&_StrategyManagerStorage.CallOpts) +} + +// GetStrategiesWithBurnableShares is a free data retrieval call binding the contract method 0x36a8c500. +// +// Solidity: function getStrategiesWithBurnableShares() view returns(address[], uint256[]) +func (_StrategyManagerStorage *StrategyManagerStorageCallerSession) GetStrategiesWithBurnableShares() ([]common.Address, []*big.Int, error) { + return _StrategyManagerStorage.Contract.GetStrategiesWithBurnableShares(&_StrategyManagerStorage.CallOpts) +} + // Nonces is a free data retrieval call binding the contract method 0x7ecebe00. // // Solidity: function nonces(address signer) view returns(uint256 nonce) diff --git a/src/contracts/core/StrategyManager.sol b/src/contracts/core/StrategyManager.sol index 8ffcf3c344..42afaa99eb 100644 --- a/src/contracts/core/StrategyManager.sol +++ b/src/contracts/core/StrategyManager.sol @@ -141,7 +141,8 @@ contract StrategyManager is /// @inheritdoc IShareManager function increaseBurnableShares(IStrategy strategy, uint256 addedSharesToBurn) external onlyDelegationManager { - burnableShares[strategy] += addedSharesToBurn; + (, uint256 currentShares) = EnumerableMap.tryGet(burnableShares, address(strategy)); + EnumerableMap.set(burnableShares, address(strategy), currentShares + addedSharesToBurn); emit BurnableSharesIncreased(strategy, addedSharesToBurn); } @@ -149,8 +150,8 @@ contract StrategyManager is function burnShares( IStrategy strategy ) external nonReentrant { - uint256 sharesToBurn = burnableShares[strategy]; - burnableShares[strategy] = 0; + (, uint256 sharesToBurn) = EnumerableMap.tryGet(burnableShares, address(strategy)); + EnumerableMap.remove(burnableShares, address(strategy)); emit BurnableSharesDecreased(strategy, sharesToBurn); // burning shares is functionally the same as withdrawing but with different destination address strategy.withdraw(DEFAULT_BURN_ADDRESS, strategy.underlyingToken(), sharesToBurn); @@ -380,4 +381,28 @@ contract StrategyManager is ) ); } + + /// @inheritdoc IStrategyManager + function getBurnableShares( + IStrategy strategy + ) external view returns (uint256) { + (, uint256 shares) = EnumerableMap.tryGet(burnableShares, address(strategy)); + return shares; + } + + /// @inheritdoc IStrategyManager + function getStrategiesWithBurnableShares() external view returns (address[] memory, uint256[] memory) { + uint256 totalEntries = EnumerableMap.length(burnableShares); + + address[] memory strategies = new address[](totalEntries); + uint256[] memory shares = new uint256[](totalEntries); + + for (uint256 i = 0; i < totalEntries; i++) { + (address strategy, uint256 shareAmount) = EnumerableMap.at(burnableShares, i); + strategies[i] = strategy; + shares[i] = shareAmount; + } + + return (strategies, shares); + } } diff --git a/src/contracts/core/StrategyManagerStorage.sol b/src/contracts/core/StrategyManagerStorage.sol index 705dab4a44..61db02e792 100644 --- a/src/contracts/core/StrategyManagerStorage.sol +++ b/src/contracts/core/StrategyManagerStorage.sol @@ -1,6 +1,8 @@ // SPDX-License-Identifier: BUSL-1.1 pragma solidity ^0.8.27; +import "@openzeppelin/contracts/utils/structs/EnumerableMap.sol"; + import "../interfaces/IStrategyManager.sol"; import "../interfaces/IStrategy.sol"; import "../interfaces/IEigenPodManager.sol"; @@ -69,8 +71,8 @@ abstract contract StrategyManagerStorage is IStrategyManager { /// @dev Do not remove, deprecated storage. mapping(IStrategy strategy => bool) private __deprecated_thirdPartyTransfersForbidden; - /// @notice Returns the amount of `shares` that have been slashed on EigenLayer but not burned yet. - mapping(IStrategy strategy => uint256) public burnableShares; + /// @notice Returns the amount of `shares` that have been slashed on EigenLayer but not burned yet. Takes 3 storage slots. + EnumerableMap.AddressToUintMap internal burnableShares; // Construction @@ -88,5 +90,5 @@ abstract contract StrategyManagerStorage is IStrategyManager { * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ - uint256[38] private __gap; + uint256[36] private __gap; } diff --git a/src/contracts/interfaces/IStrategyManager.sol b/src/contracts/interfaces/IStrategyManager.sol index fd5360faab..eeac883c37 100644 --- a/src/contracts/interfaces/IStrategyManager.sol +++ b/src/contracts/interfaces/IStrategyManager.sol @@ -178,6 +178,21 @@ interface IStrategyManager is IStrategyManagerErrors, IStrategyManagerEvents, IS /// @notice Returns the address of the `strategyWhitelister` function strategyWhitelister() external view returns (address); + /// @notice Returns the burnable shares of a strategy + function getBurnableShares( + IStrategy strategy + ) external view returns (uint256); + + /** + * @notice Gets every strategy with burnable shares and the amount of burnable shares in each said strategy + * + * WARNING: This operation can copy the entire storage to memory, which can be quite expensive. This is designed + * to mostly be used by view accessors that are queried without any gas fees. Users should keep in mind that + * this function has an unbounded cost, and using it as part of a state-changing function may render the function + * uncallable if the map grows to a point where copying to memory consumes too much gas to fit in a block. + */ + function getStrategiesWithBurnableShares() external view returns (address[] memory, uint256[] memory); + /** * @param staker The address of the staker. * @param strategy The strategy to deposit into. diff --git a/src/test/unit/StrategyManagerUnit.t.sol b/src/test/unit/StrategyManagerUnit.t.sol index 1486ce0841..99e591dc5b 100644 --- a/src/test/unit/StrategyManagerUnit.t.sol +++ b/src/test/unit/StrategyManagerUnit.t.sol @@ -1466,7 +1466,7 @@ contract StrategyManagerUnitTests_increaseBurnableShares is StrategyManagerUnitT cheats.prank(address(delegationManagerMock)); strategyManager.increaseBurnableShares(strategy, addedSharesToBurn); assertEq( - strategyManager.burnableShares(strategy), + strategyManager.getBurnableShares(strategy), addedSharesToBurn, "strategyManager.burnableShares(strategy) != addedSharesToBurn" ); @@ -1487,7 +1487,7 @@ contract StrategyManagerUnitTests_increaseBurnableShares is StrategyManagerUnitT emit BurnableSharesIncreased(strategy, existingBurnableShares); strategyManager.increaseBurnableShares(strategy, existingBurnableShares); assertEq( - strategyManager.burnableShares(strategy), + strategyManager.getBurnableShares(strategy), existingBurnableShares, "strategyManager.burnableShares(strategy) != existingBurnableShares" ); @@ -1498,7 +1498,7 @@ contract StrategyManagerUnitTests_increaseBurnableShares is StrategyManagerUnitT strategyManager.increaseBurnableShares(strategy, addedSharesToBurn); assertEq( - strategyManager.burnableShares(strategy), + strategyManager.getBurnableShares(strategy), existingBurnableShares + addedSharesToBurn, "strategyManager.burnableShares(strategy) != existingBurnableShares + addedSharesToBurn" ); @@ -1543,6 +1543,11 @@ contract StrategyManagerUnitTests_burnShares is StrategyManagerUnitTests { burnAddressBalanceBefore + sharesToBurn, "balanceAfter != balanceBefore + sharesAmount" ); + + // Verify strategy was removed from burnable shares + (address[] memory strategiesAfterBurn, uint256[] memory sharesAfterBurn) = strategyManager.getStrategiesWithBurnableShares(); + assertEq(strategiesAfterBurn.length, 0, "Should have no strategies after burning"); + assertEq(strategyManager.getBurnableShares(strategy), 0, "getBurnableShares should return 0 after burning"); } /// @notice check that balances are unchanged with a reverting token but burnShares doesn't revert @@ -1572,7 +1577,7 @@ contract StrategyManagerUnitTests_burnShares is StrategyManagerUnitTests { strategyManager.burnShares(strategy); assertEq( - strategyManager.burnableShares(strategy), + strategyManager.getBurnableShares(strategy), sharesToBurn, "burnable shares should be unchanged" ); @@ -1751,4 +1756,78 @@ contract StrategyManagerUnitTests_removeStrategiesFromDepositWhitelist is Strate } } } +} + +contract StrategyManagerUnitTests_getStrategiesWithBurnableShares is StrategyManagerUnitTests { + + function test_getStrategiesWithBurnableShares_Empty() public { + (address[] memory strategies, uint256[] memory shares) = strategyManager.getStrategiesWithBurnableShares(); + assertEq(strategies.length, 0, "Should have no strategies when empty"); + assertEq(shares.length, 0, "Should have no shares when empty"); + } + + function testFuzz_getStrategiesWithBurnableShares_Single(uint256 sharesToAdd) public { + //ensure non-zero + cheats.assume(sharesToAdd > 0); + + // Add burnable shares + cheats.prank(address(delegationManagerMock)); + strategyManager.increaseBurnableShares(dummyStrat, sharesToAdd); + + // Get strategies with burnable shares + (address[] memory strategies, uint256[] memory shares) = strategyManager.getStrategiesWithBurnableShares(); + + // Verify results + assertEq(strategies.length, 1, "Should have one strategy"); + assertEq(shares.length, 1, "Should have one share amount"); + assertEq(strategies[0], address(dummyStrat), "Wrong strategy address"); + assertEq(shares[0], sharesToAdd, "Wrong shares amount"); + } + + function testFuzz_getStrategiesWithBurnableShares_Multiple( + uint256[3] calldata sharesToAdd + ) public { + IStrategy[] memory strategies = new IStrategy[](3); + strategies[0] = dummyStrat; + strategies[1] = dummyStrat2; + strategies[2] = dummyStrat3; + uint256[3] memory expectedShares; + uint256 expectedLength = 0; + + // Add non-zero shares to strategies + for (uint256 i = 0; i < 3; i++) { + expectedShares[i] = sharesToAdd[i]; + if (sharesToAdd[i] > 0) { + expectedLength++; + cheats.prank(address(delegationManagerMock)); + strategyManager.increaseBurnableShares(strategies[i], sharesToAdd[i]); + } + } + + // Get strategies with burnable shares + (address[] memory returnedStrategies, uint256[] memory returnedShares) = + strategyManager.getStrategiesWithBurnableShares(); + + // Verify lengths match + assertEq(returnedStrategies.length, expectedLength, "Wrong number of strategies returned"); + assertEq(returnedShares.length, expectedLength, "Wrong number of share amounts returned"); + + // For all strategies with non-zero shares, verify they are in the returned arrays + uint256 foundCount = 0; + for (uint256 i = 0; i < 3; i++) { + if (expectedShares[i] > 0) { + bool found = false; + for (uint256 j = 0; j < returnedStrategies.length; j++) { + if (returnedStrategies[j] == address(strategies[i])) { + assertEq(returnedShares[j], expectedShares[i], "Wrong share amount"); + found = true; + foundCount++; + break; + } + } + assertTrue(found, "Strategy with non-zero shares not found in returned array"); + } + } + assertEq(foundCount, expectedLength, "Number of found strategies doesn't match expected length"); + } } \ No newline at end of file From 41d19a00cc501ffa235cf067237f674809e2a039 Mon Sep 17 00:00:00 2001 From: Michael Sun <35479365+8sunyuan@users.noreply.github.com> Date: Wed, 22 Jan 2025 11:34:59 -0500 Subject: [PATCH 12/35] feat: add `getAllocatedStake` and update `getMinimumSlashableStake` (#1037) * chore: add view functions for isOperatorSlashable * feat: add `getAllocatedStake` func * test: getAllocatedStake * test: add getMinimumSlashableStake tests * chore: format * chore: fmt interface * chore: remove unnecessary test * chore: update comment * chore: bindings --------- Co-authored-by: Yash Patil <40046473+ypatil12@users.noreply.github.com> --- pkg/bindings/AVSDirectory/binding.go | 2 +- pkg/bindings/AllocationManager/binding.go | 66 ++++++- .../AllocationManagerStorage/binding.go | 64 +++++- pkg/bindings/BackingEigen/binding.go | 2 +- pkg/bindings/BeaconChainProofs/binding.go | 2 +- pkg/bindings/BytesLib/binding.go | 2 +- pkg/bindings/DelegationManager/binding.go | 2 +- pkg/bindings/Eigen/binding.go | 2 +- pkg/bindings/EigenPod/binding.go | 2 +- pkg/bindings/EigenPodManager/binding.go | 2 +- pkg/bindings/EigenStrategy/binding.go | 2 +- pkg/bindings/Endian/binding.go | 2 +- pkg/bindings/IAllocationManager/binding.go | 64 +++++- pkg/bindings/Merkle/binding.go | 2 +- pkg/bindings/OperatorSetLib/binding.go | 2 +- pkg/bindings/PauserRegistry/binding.go | 2 +- pkg/bindings/PermissionController/binding.go | 2 +- pkg/bindings/RewardsCoordinator/binding.go | 4 + pkg/bindings/SlashingLib/binding.go | 2 +- pkg/bindings/Snapshots/binding.go | 2 +- pkg/bindings/StrategyBase/binding.go | 2 +- pkg/bindings/StrategyBaseTVLLimits/binding.go | 2 +- pkg/bindings/StrategyFactory/binding.go | 2 +- pkg/bindings/StrategyManager/binding.go | 2 +- src/contracts/core/AllocationManager.sol | 118 +++++++---- .../interfaces/IAllocationManager.sol | 25 ++- src/test/unit/AllocationManagerUnit.t.sol | 187 ++++++++++++++++-- 27 files changed, 490 insertions(+), 78 deletions(-) diff --git a/pkg/bindings/AVSDirectory/binding.go b/pkg/bindings/AVSDirectory/binding.go index 3b4a092575..a37af907a5 100644 --- a/pkg/bindings/AVSDirectory/binding.go +++ b/pkg/bindings/AVSDirectory/binding.go @@ -39,7 +39,7 @@ type ISignatureUtilsSignatureWithSaltAndExpiry struct { // AVSDirectoryMetaData contains all meta data concerning the AVSDirectory contract. var AVSDirectoryMetaData = &bind.MetaData{ ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"_delegation\",\"type\":\"address\",\"internalType\":\"contractIDelegationManager\"},{\"name\":\"_pauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"OPERATOR_AVS_REGISTRATION_TYPEHASH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"OPERATOR_SET_FORCE_DEREGISTRATION_TYPEHASH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"OPERATOR_SET_REGISTRATION_TYPEHASH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"avsOperatorStatus\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"enumIAVSDirectoryTypes.OperatorAVSRegistrationStatus\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"calculateOperatorAVSRegistrationDigestHash\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"cancelSalt\",\"inputs\":[{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"delegation\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIDelegationManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"deregisterOperatorFromAVS\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"domainSeparator\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"initialOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"initialPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"operatorSaltIsSpent\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"isSpent\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"pauseAll\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[{\"name\":\"index\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pauserRegistry\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"registerOperatorToAVS\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSignature\",\"type\":\"tuple\",\"internalType\":\"structISignatureUtils.SignatureWithSaltAndExpiry\",\"components\":[{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"updateAVSMetadataURI\",\"inputs\":[{\"name\":\"metadataURI\",\"type\":\"string\",\"internalType\":\"string\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"AVSMetadataURIUpdated\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"metadataURI\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorAVSRegistrationStatusUpdated\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"avs\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"status\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"enumIAVSDirectoryTypes.OperatorAVSRegistrationStatus\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"CurrentlyPaused\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InputAddressZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidNewPausedStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidSignature\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyPauser\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyUnpauser\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OperatorAlreadyRegisteredToAVS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OperatorNotRegisteredToAVS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OperatorNotRegisteredToEigenLayer\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SaltSpent\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SignatureExpired\",\"inputs\":[]}]", - Bin: "0x610100604052348015610010575f5ffd5b5060405161170438038061170483398101604081905261002f916101ed565b81816001600160a01b038116610058576040516339b190bb60e11b815260040160405180910390fd5b6001600160a01b039081166080521660a0524660c052610108604080518082018252600a81526922b4b3b2b72630bcb2b960b11b60209182015281517f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a866818301527f71b625cfad44bac63b13dba07f2e1d6084ee04b6f8752101ece6126d584ee6ea81840152466060820152306080808301919091528351808303909101815260a0909101909252815191012090565b60e05261011361011a565b5050610225565b5f54610100900460ff16156101855760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff908116146101d4575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b03811681146101ea575f5ffd5b50565b5f5f604083850312156101fe575f5ffd5b8251610209816101d6565b602084015190925061021a816101d6565b809150509250929050565b60805160a05160c05160e0516114906102745f395f610b7a01525f610aba01525f8181610340015261063d01525f818161021c015281816103d8015281816104ad0152610b9e01526114905ff3fe608060405234801561000f575f5ffd5b506004361061013d575f3560e01c8063a364f4da116100b4578063dce974b911610079578063dce974b914610314578063df5cf7231461033b578063ec76f44214610362578063f2fde38b14610395578063f698da25146103a8578063fabc1cbc146103b0575f5ffd5b8063a364f4da1461028d578063a98fb355146102a0578063c825fe68146102b3578063cd6dc687146102da578063d79aceab146102ed575f5ffd5b80635c975abb116101055780635c975abb146101fd578063715018a61461020f578063886f1195146102175780638da5cb5b146102565780639926ee7d14610267578063a1060c881461027a575f5ffd5b8063136439dd14610141578063374823b51461015657806349075da314610198578063595c6a67146101d25780635ac86ab7146101da575b5f5ffd5b61015461014f366004611075565b6103c3565b005b6101836101643660046110a0565b609960209081525f928352604080842090915290825290205460ff1681565b60405190151581526020015b60405180910390f35b6101c56101a63660046110ca565b609860209081525f928352604080842090915290825290205460ff1681565b60405161018f9190611115565b610154610498565b6101836101e836600461113b565b606654600160ff9092169190911b9081161490565b6066545b60405190815260200161018f565b610154610547565b61023e7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200161018f565b6033546001600160a01b031661023e565b6101546102753660046111d0565b610558565b6102016102883660046112bd565b610777565b61015461029b366004611300565b6107f6565b6101546102ae36600461131b565b6108db565b6102017f809c5ac049c45b7a7f050a20f00c16cf63797efbf8b1eb8d749fdfa39ff8f92981565b6101546102e83660046110a0565b610922565b6102017fda2c89bafdd34776a2b8bb9c83c82f419e20cc8c67207f70edd58249b92661bd81565b6102017f4ee65f64218c67b68da66fd0db16560040a6b973290b9e71912d661ee53fe49581565b61023e7f000000000000000000000000000000000000000000000000000000000000000081565b610154610370366004611075565b335f90815260996020908152604080832093835292905220805460ff19166001179055565b6101546103a3366004611300565b610a3e565b610201610ab7565b6101546103be366004611075565b610b9c565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa158015610425573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104499190611389565b61046657604051631d77d47760e21b815260040160405180910390fd5b606654818116811461048b5760405163c61dca5d60e01b815260040160405180910390fd5b61049482610cab565b5050565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa1580156104fa573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061051e9190611389565b61053b57604051631d77d47760e21b815260040160405180910390fd5b6105455f19610cab565b565b61054f610ce8565b6105455f610d42565b6066545f906001908116036105805760405163840a48d560e01b815260040160405180910390fd5b6001335f9081526098602090815260408083206001600160a01b038816845290915290205460ff1660018111156105b9576105b9611101565b036105d757604051631aa528bb60e11b815260040160405180910390fd5b6001600160a01b0383165f90815260996020908152604080832085830151845290915290205460ff161561061e57604051630d4c4c9160e21b815260040160405180910390fd5b6040516336b87bd760e11b81526001600160a01b0384811660048301527f00000000000000000000000000000000000000000000000000000000000000001690636d70f7ae90602401602060405180830381865afa158015610682573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106a69190611389565b6106c357604051639f88c8af60e01b815260040160405180910390fd5b6106e7836106db853386602001518760400151610777565b84516040860151610d93565b6001600160a01b0383165f81815260996020908152604080832086830151845282528083208054600160ff19918216811790925533808652609885528386208787529094529382902080549094168117909355519092917ff0952b1c65271d819d39983d2abb044b9cace59bcc4d4dd389f586ebdcb15b419161076a9190611115565b60405180910390a3505050565b604080517fda2c89bafdd34776a2b8bb9c83c82f419e20cc8c67207f70edd58249b92661bd60208201526001600160a01b038087169282019290925290841660608201526080810183905260a081018290525f906107ed9060c00160405160208183030381529060405280519060200120610deb565b95945050505050565b6066545f9060019081160361081e5760405163840a48d560e01b815260040160405180910390fd5b6001335f9081526098602090815260408083206001600160a01b038716845290915290205460ff16600181111561085757610857611101565b14610875576040516352df45c960e01b815260040160405180910390fd5b335f8181526098602090815260408083206001600160a01b0387168085529252808320805460ff191690555190917ff0952b1c65271d819d39983d2abb044b9cace59bcc4d4dd389f586ebdcb15b41916108cf9190611115565b60405180910390a35050565b336001600160a01b03167fa89c1dc243d8908a96dd84944bcc97d6bc6ac00dd78e20621576be6a3c94371383836040516109169291906113a8565b60405180910390a25050565b5f54610100900460ff161580801561094057505f54600160ff909116105b806109595750303b15801561095957505f5460ff166001145b6109c15760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b5f805460ff1916600117905580156109e2575f805461ff0019166101001790555b6109eb82610cab565b6109f483610d42565b8015610a39575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050565b610a46610ce8565b6001600160a01b038116610aab5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016109b8565b610ab481610d42565b50565b5f7f00000000000000000000000000000000000000000000000000000000000000004614610b775750604080518082018252600a81526922b4b3b2b72630bcb2b960b11b60209182015281517f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a866818301527f71b625cfad44bac63b13dba07f2e1d6084ee04b6f8752101ece6126d584ee6ea81840152466060820152306080808301919091528351808303909101815260a0909101909252815191012090565b507f000000000000000000000000000000000000000000000000000000000000000090565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610bf8573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c1c91906113d6565b6001600160a01b0316336001600160a01b031614610c4d5760405163794821ff60e01b815260040160405180910390fd5b60665480198219811614610c745760405163c61dca5d60e01b815260040160405180910390fd5b606682905560405182815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c90602001610916565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a250565b6033546001600160a01b031633146105455760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016109b8565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b42811015610db457604051630819bdcd60e01b815260040160405180910390fd5b610dc86001600160a01b0385168484610e31565b610de557604051638baa579f60e01b815260040160405180910390fd5b50505050565b5f610df4610ab7565b60405161190160f01b6020820152602281019190915260428101839052606201604051602081830303815290604052805190602001209050919050565b5f5f5f610e3e8585610e8f565b90925090505f816004811115610e5657610e56611101565b148015610e745750856001600160a01b0316826001600160a01b0316145b80610e855750610e85868686610ed1565b9695505050505050565b5f5f8251604103610ec3576020830151604084015160608501515f1a610eb787828585610fb8565b94509450505050610eca565b505f905060025b9250929050565b5f5f5f856001600160a01b0316631626ba7e60e01b8686604051602401610ef99291906113f1565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b0319909416939093179092529051610f37919061142d565b5f60405180830381855afa9150503d805f8114610f6f576040519150601f19603f3d011682016040523d82523d5f602084013e610f74565b606091505b5091509150818015610f8857506020815110155b8015610e8557508051630b135d3f60e11b90610fad9083016020908101908401611443565b149695505050505050565b5f807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0831115610fed57505f9050600361106c565b604080515f8082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa15801561103e573d5f5f3e3d5ffd5b5050604051601f1901519150506001600160a01b038116611066575f6001925092505061106c565b91505f90505b94509492505050565b5f60208284031215611085575f5ffd5b5035919050565b6001600160a01b0381168114610ab4575f5ffd5b5f5f604083850312156110b1575f5ffd5b82356110bc8161108c565b946020939093013593505050565b5f5f604083850312156110db575f5ffd5b82356110e68161108c565b915060208301356110f68161108c565b809150509250929050565b634e487b7160e01b5f52602160045260245ffd5b602081016002831061113557634e487b7160e01b5f52602160045260245ffd5b91905290565b5f6020828403121561114b575f5ffd5b813560ff8116811461115b575f5ffd5b9392505050565b634e487b7160e01b5f52604160045260245ffd5b6040516060810167ffffffffffffffff8111828210171561119957611199611162565b60405290565b604051601f8201601f1916810167ffffffffffffffff811182821017156111c8576111c8611162565b604052919050565b5f5f604083850312156111e1575f5ffd5b82356111ec8161108c565b9150602083013567ffffffffffffffff811115611207575f5ffd5b830160608186031215611218575f5ffd5b611220611176565b813567ffffffffffffffff811115611236575f5ffd5b8201601f81018713611246575f5ffd5b803567ffffffffffffffff81111561126057611260611162565b611273601f8201601f191660200161119f565b818152886020838501011115611287575f5ffd5b816020840160208301375f6020928201830152835283810135908301525060409182013591810191909152919491935090915050565b5f5f5f5f608085870312156112d0575f5ffd5b84356112db8161108c565b935060208501356112eb8161108c565b93969395505050506040820135916060013590565b5f60208284031215611310575f5ffd5b813561115b8161108c565b5f5f6020838503121561132c575f5ffd5b823567ffffffffffffffff811115611342575f5ffd5b8301601f81018513611352575f5ffd5b803567ffffffffffffffff811115611368575f5ffd5b856020828401011115611379575f5ffd5b6020919091019590945092505050565b5f60208284031215611399575f5ffd5b8151801515811461115b575f5ffd5b60208152816020820152818360408301375f818301604090810191909152601f909201601f19160101919050565b5f602082840312156113e6575f5ffd5b815161115b8161108c565b828152604060208201525f82518060408401528060208501606085015e5f606082850101526060601f19601f8301168401019150509392505050565b5f82518060208501845e5f920191825250919050565b5f60208284031215611453575f5ffd5b505191905056fea264697066735822122055ff6492ef37c637eaf96a50c054a670c0eca33335f619eeb12ddfa4d6b8325b64736f6c634300081b0033", + Bin: "0x610100604052348015610010575f5ffd5b5060405161170438038061170483398101604081905261002f916101ed565b81816001600160a01b038116610058576040516339b190bb60e11b815260040160405180910390fd5b6001600160a01b039081166080521660a0524660c052610108604080518082018252600a81526922b4b3b2b72630bcb2b960b11b60209182015281517f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a866818301527f71b625cfad44bac63b13dba07f2e1d6084ee04b6f8752101ece6126d584ee6ea81840152466060820152306080808301919091528351808303909101815260a0909101909252815191012090565b60e05261011361011a565b5050610225565b5f54610100900460ff16156101855760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff908116146101d4575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b03811681146101ea575f5ffd5b50565b5f5f604083850312156101fe575f5ffd5b8251610209816101d6565b602084015190925061021a816101d6565b809150509250929050565b60805160a05160c05160e0516114906102745f395f610b7a01525f610aba01525f8181610340015261063d01525f818161021c015281816103d8015281816104ad0152610b9e01526114905ff3fe608060405234801561000f575f5ffd5b506004361061013d575f3560e01c8063a364f4da116100b4578063dce974b911610079578063dce974b914610314578063df5cf7231461033b578063ec76f44214610362578063f2fde38b14610395578063f698da25146103a8578063fabc1cbc146103b0575f5ffd5b8063a364f4da1461028d578063a98fb355146102a0578063c825fe68146102b3578063cd6dc687146102da578063d79aceab146102ed575f5ffd5b80635c975abb116101055780635c975abb146101fd578063715018a61461020f578063886f1195146102175780638da5cb5b146102565780639926ee7d14610267578063a1060c881461027a575f5ffd5b8063136439dd14610141578063374823b51461015657806349075da314610198578063595c6a67146101d25780635ac86ab7146101da575b5f5ffd5b61015461014f366004611075565b6103c3565b005b6101836101643660046110a0565b609960209081525f928352604080842090915290825290205460ff1681565b60405190151581526020015b60405180910390f35b6101c56101a63660046110ca565b609860209081525f928352604080842090915290825290205460ff1681565b60405161018f9190611115565b610154610498565b6101836101e836600461113b565b606654600160ff9092169190911b9081161490565b6066545b60405190815260200161018f565b610154610547565b61023e7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200161018f565b6033546001600160a01b031661023e565b6101546102753660046111d0565b610558565b6102016102883660046112bd565b610777565b61015461029b366004611300565b6107f6565b6101546102ae36600461131b565b6108db565b6102017f809c5ac049c45b7a7f050a20f00c16cf63797efbf8b1eb8d749fdfa39ff8f92981565b6101546102e83660046110a0565b610922565b6102017fda2c89bafdd34776a2b8bb9c83c82f419e20cc8c67207f70edd58249b92661bd81565b6102017f4ee65f64218c67b68da66fd0db16560040a6b973290b9e71912d661ee53fe49581565b61023e7f000000000000000000000000000000000000000000000000000000000000000081565b610154610370366004611075565b335f90815260996020908152604080832093835292905220805460ff19166001179055565b6101546103a3366004611300565b610a3e565b610201610ab7565b6101546103be366004611075565b610b9c565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa158015610425573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104499190611389565b61046657604051631d77d47760e21b815260040160405180910390fd5b606654818116811461048b5760405163c61dca5d60e01b815260040160405180910390fd5b61049482610cab565b5050565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa1580156104fa573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061051e9190611389565b61053b57604051631d77d47760e21b815260040160405180910390fd5b6105455f19610cab565b565b61054f610ce8565b6105455f610d42565b6066545f906001908116036105805760405163840a48d560e01b815260040160405180910390fd5b6001335f9081526098602090815260408083206001600160a01b038816845290915290205460ff1660018111156105b9576105b9611101565b036105d757604051631aa528bb60e11b815260040160405180910390fd5b6001600160a01b0383165f90815260996020908152604080832085830151845290915290205460ff161561061e57604051630d4c4c9160e21b815260040160405180910390fd5b6040516336b87bd760e11b81526001600160a01b0384811660048301527f00000000000000000000000000000000000000000000000000000000000000001690636d70f7ae90602401602060405180830381865afa158015610682573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106a69190611389565b6106c357604051639f88c8af60e01b815260040160405180910390fd5b6106e7836106db853386602001518760400151610777565b84516040860151610d93565b6001600160a01b0383165f81815260996020908152604080832086830151845282528083208054600160ff19918216811790925533808652609885528386208787529094529382902080549094168117909355519092917ff0952b1c65271d819d39983d2abb044b9cace59bcc4d4dd389f586ebdcb15b419161076a9190611115565b60405180910390a3505050565b604080517fda2c89bafdd34776a2b8bb9c83c82f419e20cc8c67207f70edd58249b92661bd60208201526001600160a01b038087169282019290925290841660608201526080810183905260a081018290525f906107ed9060c00160405160208183030381529060405280519060200120610deb565b95945050505050565b6066545f9060019081160361081e5760405163840a48d560e01b815260040160405180910390fd5b6001335f9081526098602090815260408083206001600160a01b038716845290915290205460ff16600181111561085757610857611101565b14610875576040516352df45c960e01b815260040160405180910390fd5b335f8181526098602090815260408083206001600160a01b0387168085529252808320805460ff191690555190917ff0952b1c65271d819d39983d2abb044b9cace59bcc4d4dd389f586ebdcb15b41916108cf9190611115565b60405180910390a35050565b336001600160a01b03167fa89c1dc243d8908a96dd84944bcc97d6bc6ac00dd78e20621576be6a3c94371383836040516109169291906113a8565b60405180910390a25050565b5f54610100900460ff161580801561094057505f54600160ff909116105b806109595750303b15801561095957505f5460ff166001145b6109c15760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b5f805460ff1916600117905580156109e2575f805461ff0019166101001790555b6109eb82610cab565b6109f483610d42565b8015610a39575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050565b610a46610ce8565b6001600160a01b038116610aab5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016109b8565b610ab481610d42565b50565b5f7f00000000000000000000000000000000000000000000000000000000000000004614610b775750604080518082018252600a81526922b4b3b2b72630bcb2b960b11b60209182015281517f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a866818301527f71b625cfad44bac63b13dba07f2e1d6084ee04b6f8752101ece6126d584ee6ea81840152466060820152306080808301919091528351808303909101815260a0909101909252815191012090565b507f000000000000000000000000000000000000000000000000000000000000000090565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610bf8573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c1c91906113d6565b6001600160a01b0316336001600160a01b031614610c4d5760405163794821ff60e01b815260040160405180910390fd5b60665480198219811614610c745760405163c61dca5d60e01b815260040160405180910390fd5b606682905560405182815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c90602001610916565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a250565b6033546001600160a01b031633146105455760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016109b8565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b42811015610db457604051630819bdcd60e01b815260040160405180910390fd5b610dc86001600160a01b0385168484610e31565b610de557604051638baa579f60e01b815260040160405180910390fd5b50505050565b5f610df4610ab7565b60405161190160f01b6020820152602281019190915260428101839052606201604051602081830303815290604052805190602001209050919050565b5f5f5f610e3e8585610e8f565b90925090505f816004811115610e5657610e56611101565b148015610e745750856001600160a01b0316826001600160a01b0316145b80610e855750610e85868686610ed1565b9695505050505050565b5f5f8251604103610ec3576020830151604084015160608501515f1a610eb787828585610fb8565b94509450505050610eca565b505f905060025b9250929050565b5f5f5f856001600160a01b0316631626ba7e60e01b8686604051602401610ef99291906113f1565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b0319909416939093179092529051610f37919061142d565b5f60405180830381855afa9150503d805f8114610f6f576040519150601f19603f3d011682016040523d82523d5f602084013e610f74565b606091505b5091509150818015610f8857506020815110155b8015610e8557508051630b135d3f60e11b90610fad9083016020908101908401611443565b149695505050505050565b5f807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0831115610fed57505f9050600361106c565b604080515f8082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa15801561103e573d5f5f3e3d5ffd5b5050604051601f1901519150506001600160a01b038116611066575f6001925092505061106c565b91505f90505b94509492505050565b5f60208284031215611085575f5ffd5b5035919050565b6001600160a01b0381168114610ab4575f5ffd5b5f5f604083850312156110b1575f5ffd5b82356110bc8161108c565b946020939093013593505050565b5f5f604083850312156110db575f5ffd5b82356110e68161108c565b915060208301356110f68161108c565b809150509250929050565b634e487b7160e01b5f52602160045260245ffd5b602081016002831061113557634e487b7160e01b5f52602160045260245ffd5b91905290565b5f6020828403121561114b575f5ffd5b813560ff8116811461115b575f5ffd5b9392505050565b634e487b7160e01b5f52604160045260245ffd5b6040516060810167ffffffffffffffff8111828210171561119957611199611162565b60405290565b604051601f8201601f1916810167ffffffffffffffff811182821017156111c8576111c8611162565b604052919050565b5f5f604083850312156111e1575f5ffd5b82356111ec8161108c565b9150602083013567ffffffffffffffff811115611207575f5ffd5b830160608186031215611218575f5ffd5b611220611176565b813567ffffffffffffffff811115611236575f5ffd5b8201601f81018713611246575f5ffd5b803567ffffffffffffffff81111561126057611260611162565b611273601f8201601f191660200161119f565b818152886020838501011115611287575f5ffd5b816020840160208301375f6020928201830152835283810135908301525060409182013591810191909152919491935090915050565b5f5f5f5f608085870312156112d0575f5ffd5b84356112db8161108c565b935060208501356112eb8161108c565b93969395505050506040820135916060013590565b5f60208284031215611310575f5ffd5b813561115b8161108c565b5f5f6020838503121561132c575f5ffd5b823567ffffffffffffffff811115611342575f5ffd5b8301601f81018513611352575f5ffd5b803567ffffffffffffffff811115611368575f5ffd5b856020828401011115611379575f5ffd5b6020919091019590945092505050565b5f60208284031215611399575f5ffd5b8151801515811461115b575f5ffd5b60208152816020820152818360408301375f818301604090810191909152601f909201601f19160101919050565b5f602082840312156113e6575f5ffd5b815161115b8161108c565b828152604060208201525f82518060408401528060208501606085015e5f606082850101526060601f19601f8301168401019150509392505050565b5f82518060208501845e5f920191825250919050565b5f60208284031215611453575f5ffd5b505191905056fea2646970667358221220dac23420e90e0bd5ba6e8cdf6633661ff54956fb8326b8a2b164dca48bbf756964736f6c634300081b0033", } // AVSDirectoryABI is the input ABI used to generate the binding from. diff --git a/pkg/bindings/AllocationManager/binding.go b/pkg/bindings/AllocationManager/binding.go index f186448155..626018f3ec 100644 --- a/pkg/bindings/AllocationManager/binding.go +++ b/pkg/bindings/AllocationManager/binding.go @@ -80,8 +80,8 @@ type OperatorSet struct { // AllocationManagerMetaData contains all meta data concerning the AllocationManager contract. var AllocationManagerMetaData = &bind.MetaData{ - ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"_delegation\",\"type\":\"address\",\"internalType\":\"contractIDelegationManager\"},{\"name\":\"_pauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"},{\"name\":\"_permissionController\",\"type\":\"address\",\"internalType\":\"contractIPermissionController\"},{\"name\":\"_DEALLOCATION_DELAY\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"_ALLOCATION_CONFIGURATION_DELAY\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"ALLOCATION_CONFIGURATION_DELAY\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"DEALLOCATION_DELAY\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"addStrategiesToOperatorSet\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetId\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"clearDeallocationQueue\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"numToClear\",\"type\":\"uint16[]\",\"internalType\":\"uint16[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"createOperatorSets\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"params\",\"type\":\"tuple[]\",\"internalType\":\"structIAllocationManagerTypes.CreateSetParams[]\",\"components\":[{\"name\":\"operatorSetId\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"delegation\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIDelegationManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"deregisterFromOperatorSets\",\"inputs\":[{\"name\":\"params\",\"type\":\"tuple\",\"internalType\":\"structIAllocationManagerTypes.DeregisterParams\",\"components\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetIds\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"getAVSRegistrar\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIAVSRegistrar\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAllocatableMagnitude\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAllocatedSets\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple[]\",\"internalType\":\"structOperatorSet[]\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAllocatedStrategies\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAllocation\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIAllocationManagerTypes.Allocation\",\"components\":[{\"name\":\"currentMagnitude\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"pendingDiff\",\"type\":\"int128\",\"internalType\":\"int128\"},{\"name\":\"effectBlock\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAllocationDelay\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAllocations\",\"inputs\":[{\"name\":\"operators\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple[]\",\"internalType\":\"structIAllocationManagerTypes.Allocation[]\",\"components\":[{\"name\":\"currentMagnitude\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"pendingDiff\",\"type\":\"int128\",\"internalType\":\"int128\"},{\"name\":\"effectBlock\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getEncumberedMagnitude\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getMaxMagnitude\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getMaxMagnitudes\",\"inputs\":[{\"name\":\"operators\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64[]\",\"internalType\":\"uint64[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getMaxMagnitudes\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64[]\",\"internalType\":\"uint64[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getMaxMagnitudesAtBlock\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"blockNumber\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64[]\",\"internalType\":\"uint64[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getMemberCount\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getMembers\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getMinimumSlashableStake\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"operators\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"futureBlock\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[{\"name\":\"slashableStake\",\"type\":\"uint256[][]\",\"internalType\":\"uint256[][]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getOperatorSetCount\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getRegisteredSets\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple[]\",\"internalType\":\"structOperatorSet[]\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getStrategiesInOperatorSet\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getStrategyAllocations\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple[]\",\"internalType\":\"structOperatorSet[]\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"\",\"type\":\"tuple[]\",\"internalType\":\"structIAllocationManagerTypes.Allocation[]\",\"components\":[{\"name\":\"currentMagnitude\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"pendingDiff\",\"type\":\"int128\",\"internalType\":\"int128\"},{\"name\":\"effectBlock\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"initialOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"initialPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"isMemberOfOperatorSet\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isOperatorSet\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"modifyAllocations\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"params\",\"type\":\"tuple[]\",\"internalType\":\"structIAllocationManagerTypes.AllocateParams[]\",\"components\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"newMagnitudes\",\"type\":\"uint64[]\",\"internalType\":\"uint64[]\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"pauseAll\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[{\"name\":\"index\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pauserRegistry\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"permissionController\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIPermissionController\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"registerForOperatorSets\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"params\",\"type\":\"tuple\",\"internalType\":\"structIAllocationManagerTypes.RegisterParams\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetIds\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"removeStrategiesFromOperatorSet\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetId\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setAVSRegistrar\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"registrar\",\"type\":\"address\",\"internalType\":\"contractIAVSRegistrar\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setAllocationDelay\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"delay\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"slashOperator\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"params\",\"type\":\"tuple\",\"internalType\":\"structIAllocationManagerTypes.SlashingParams\",\"components\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetId\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"wadsToSlash\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"},{\"name\":\"description\",\"type\":\"string\",\"internalType\":\"string\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"updateAVSMetadataURI\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"metadataURI\",\"type\":\"string\",\"internalType\":\"string\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"AVSMetadataURIUpdated\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"metadataURI\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"AVSRegistrarSet\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"registrar\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIAVSRegistrar\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"AllocationDelaySet\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"delay\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"},{\"name\":\"effectBlock\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"AllocationUpdated\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"magnitude\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"effectBlock\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"EncumberedMagnitudeUpdated\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"encumberedMagnitude\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"MaxMagnitudeUpdated\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"maxMagnitude\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorAddedToOperatorSet\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorRemovedFromOperatorSet\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorSetCreated\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorSlashed\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"strategies\",\"type\":\"address[]\",\"indexed\":false,\"internalType\":\"contractIStrategy[]\"},{\"name\":\"wadSlashed\",\"type\":\"uint256[]\",\"indexed\":false,\"internalType\":\"uint256[]\"},{\"name\":\"description\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StrategyAddedToOperatorSet\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StrategyRemovedFromOperatorSet\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"AlreadyMemberOfSet\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"CurrentlyPaused\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"Empty\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InputAddressZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InputArrayLengthMismatch\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InsufficientMagnitude\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidCaller\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidNewPausedStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidOperator\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidOperatorSet\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidPermissions\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidSnapshotOrdering\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidWadToSlash\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ModificationAlreadyPending\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotMemberOfSet\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyPauser\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyUnpauser\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OperatorNotSlashable\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OutOfBounds\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SameMagnitude\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StrategiesMustBeInAscendingOrder\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StrategyAlreadyInOperatorSet\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StrategyNotInOperatorSet\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"UninitializedAllocationDelay\",\"inputs\":[]}]", - Bin: "0x610120604052348015610010575f5ffd5b50604051615a79380380615a7983398101604081905261002f91610180565b82858383876001600160a01b03811661005b576040516339b190bb60e11b815260040160405180910390fd5b6001600160a01b0390811660805292831660a05263ffffffff91821660c0521660e052166101005261008b610095565b50505050506101e9565b5f54610100900460ff16156101005760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff9081161461014f575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b0381168114610165575f5ffd5b50565b805163ffffffff8116811461017b575f5ffd5b919050565b5f5f5f5f5f60a08688031215610194575f5ffd5b855161019f81610151565b60208701519095506101b081610151565b60408701519094506101c181610151565b92506101cf60608701610168565b91506101dd60808701610168565b90509295509295909350565b60805160a05160c05160e051610100516157ff61027a5f395f81816103f9015261359701525f81816105480152613b9701525f818161031e015281816120c601526127bd01525f81816106c701528181610c77015281816115fc01528181611c6301528181611ccd0152612a8401525f818161056f0152818161077201528181611d72015261320e01526157ff5ff3fe608060405234801561000f575f5ffd5b5060043610610281575f3560e01c80636e875dba11610156578063adc2e3d9116100ca578063cd6dc68711610084578063cd6dc6871461069c578063d3d96ff4146106af578063df5cf723146106c2578063f2fde38b146106e9578063f605ce08146106fc578063fabc1cbc1461070f575f5ffd5b8063adc2e3d91461060e578063b2447af714610621578063b66bd98914610634578063b9fbaed114610647578063ba1a84e514610676578063c221d8ae14610689575f5ffd5b80638ce648541161011b5780638ce64854146105915780638da5cb5b146105b157806394d7d00c146105c2578063952899ee146105d5578063a9333ec8146105e8578063a9821821146105fb575f5ffd5b80636e875dba14610515578063715018a61461052857806379ae50cd146105305780637bc1ef6114610543578063886f11951461056a575f5ffd5b80634657e26a116101f8578063595c6a67116101b2578063595c6a67146104875780635ac86ab71461048f5780635c975abb146104b2578063670d3ba2146104c45780636cfb4481146104d75780636e3492b514610502575f5ffd5b80634657e26a146103f45780634a10ffe51461041b5780634b5046ef1461043b57806350feea201461044e578063547afb871461046157806356c483e614610474575f5ffd5b80632981eb77116102495780632981eb77146103195780632bab2c4a14610355578063304c10cd1461037557806336352057146103a057806340120dab146103b35780634177a87c146103d4575f5ffd5b806310e1b9b814610285578063136439dd146102ae57806315fe5028146102c3578063260dc758146102e3578063261f84e014610306575b5f5ffd5b610298610293366004614736565b610722565b6040516102a5919061477d565b60405180910390f35b6102c16102bc3660046147b0565b61075d565b005b6102d66102d13660046147c7565b610832565b6040516102a59190614845565b6102f66102f1366004614857565b610949565b60405190151581526020016102a5565b6102c16103143660046148b1565b610980565b6103407f000000000000000000000000000000000000000000000000000000000000000081565b60405163ffffffff90911681526020016102a5565b610368610363366004614996565b610c23565b6040516102a59190614a4a565b6103886103833660046147c7565b610f10565b6040516001600160a01b0390911681526020016102a5565b6102c16103ae366004614aad565b610f3f565b6103c66103c1366004614aff565b611751565b6040516102a5929190614b8c565b6103e76103e2366004614857565b6118cc565b6040516102a59190614be9565b6103887f000000000000000000000000000000000000000000000000000000000000000081565b61042e610429366004614bfb565b6118f0565b6040516102a59190614c3e565b6102c1610449366004614c89565b611998565b6102c161045c366004614d09565b611a52565b61042e61046f366004614d67565b611bb0565b6102c1610482366004614da9565b611c58565b6102c1611d5d565b6102f661049d366004614ddc565b606654600160ff9092169190911b9081161490565b6066545b6040519081526020016102a5565b6102f66104d2366004614dfc565b611e0c565b6104ea6104e5366004614aff565b611e1d565b6040516001600160401b0390911681526020016102a5565b6102c1610510366004614e3d565b611e32565b6103e7610523366004614857565b612202565b6102c1612213565b6102d661053e3660046147c7565b612224565b6103407f000000000000000000000000000000000000000000000000000000000000000081565b6103887f000000000000000000000000000000000000000000000000000000000000000081565b6105a461059f366004614e6e565b6122fe565b6040516102a59190614eb1565b6033546001600160a01b0316610388565b61042e6105d0366004614ec3565b6123c3565b6102c16105e3366004614f1e565b6124af565b6104ea6105f6366004614aff565b612976565b6102c16106093660046150c7565b6129a5565b6102c161061c366004615145565b612a15565b6104b661062f366004614857565b612d64565b6102c1610642366004614d09565b612d86565b61065a6106553660046147c7565b612ee0565b60408051921515835263ffffffff9091166020830152016102a5565b6104b66106843660046147c7565b612f7a565b6103e7610697366004614dfc565b612f9a565b6102c16106aa366004615187565b612fcb565b6102c16106bd366004614aff565b6130e8565b6103887f000000000000000000000000000000000000000000000000000000000000000081565b6102c16106f73660046147c7565b613187565b6104ea61070a366004614aff565b613200565b6102c161071d3660046147b0565b61320c565b604080516060810182525f80825260208201819052918101829052906107518561074b86613322565b85613385565b925050505b9392505050565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa1580156107bf573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107e391906151b1565b61080057604051631d77d47760e21b815260040160405180910390fd5b60665481811681146108255760405163c61dca5d60e01b815260040160405180910390fd5b61082e826134f1565b5050565b6001600160a01b0381165f908152609d60205260408120606091906108569061352e565b90505f816001600160401b038111156108715761087161465a565b6040519080825280602002602001820160405280156108b557816020015b604080518082019091525f808252602082015281526020019060019003908161088f5790505b5090505f5b82811015610941576001600160a01b0385165f908152609d6020526040902061091c906108e79083613537565b604080518082019091525f80825260208201525060408051808201909152606082901c815263ffffffff909116602082015290565b82828151811061092e5761092e6151d0565b60209081029190910101526001016108ba565b509392505050565b60208082015182516001600160a01b03165f90815260989092526040822061097a9163ffffffff9081169061354216565b92915050565b8261098a81613559565b6109a75760405163932d94f760e01b815260040160405180910390fd5b5f5b82811015610c1c575f6040518060400160405280876001600160a01b031681526020018686858181106109de576109de6151d0565b90506020028101906109f091906151e4565b6109fe906020810190615202565b63ffffffff168152509050610a48816020015163ffffffff1660985f896001600160a01b03166001600160a01b031681526020019081526020015f2061360390919063ffffffff16565b610a6557604051631fb1705560e21b815260040160405180910390fd5b7f31629285ead2335ae0933f86ed2ae63321f7af77b4e6eaabc42c057880977e6c6040518060400160405280886001600160a01b03168152602001836020015163ffffffff16815250604051610abb919061521b565b60405180910390a15f610acd82613322565b90505f5b868685818110610ae357610ae36151d0565b9050602002810190610af591906151e4565b610b03906020810190615229565b9050811015610c1157610b79878786818110610b2157610b216151d0565b9050602002810190610b3391906151e4565b610b41906020810190615229565b83818110610b5157610b516151d0565b9050602002016020810190610b6691906147c7565b5f8481526099602052604090209061360e565b507f7ab260fe0af193db5f4986770d831bda4ea46099dc817e8b6716dcae8af8e88b83888887818110610bae57610bae6151d0565b9050602002810190610bc091906151e4565b610bce906020810190615229565b84818110610bde57610bde6151d0565b9050602002016020810190610bf391906147c7565b604051610c0192919061526e565b60405180910390a1600101610ad1565b5050506001016109a9565b5050505050565b606083516001600160401b03811115610c3e57610c3e61465a565b604051908082528060200260200182016040528015610c7157816020015b6060815260200190600190039081610c5c5790505b5090505f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663f0e0e67686866040518363ffffffff1660e01b8152600401610cc3929190615294565b5f60405180830381865afa158015610cdd573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610d0491908101906152b8565b90505f5b8551811015610f06575f868281518110610d2457610d246151d0565b6020026020010151905085516001600160401b03811115610d4757610d4761465a565b604051908082528060200260200182016040528015610d70578160200160208202803683370190505b50848381518110610d8357610d836151d0565b60209081029190910101525f5b8651811015610efc575f878281518110610dac57610dac6151d0565b6020908102919091018101516001600160a01b038086165f90815260a1845260408082209284168252919093528220909250610de790613622565b9050806001600160401b03165f03610e00575050610ef4565b5f610e0c858d85610722565b90508863ffffffff16816040015163ffffffff1611158015610e3457505f8160200151600f0b125b15610e5657610e4a815f01518260200151613635565b6001600160401b031681525b80515f90610e71906001600160401b03908116908516613649565b9050610eb881898981518110610e8957610e896151d0565b60200260200101518781518110610ea257610ea26151d0565b602002602001015161365d90919063ffffffff16565b898881518110610eca57610eca6151d0565b60200260200101518681518110610ee357610ee36151d0565b602002602001018181525050505050505b600101610d90565b5050600101610d08565b5050949350505050565b6001600160a01b038082165f908152609760205260408120549091168015610f385780610756565b5090919050565b606654600190600290811603610f685760405163840a48d560e01b815260040160405180910390fd5b82610f7281613559565b610f8f5760405163932d94f760e01b815260040160405180910390fd5b5f6040518060400160405280866001600160a01b03168152602001856020016020810190610fbd9190615202565b63ffffffff16905290505f610fde610fd860208701876147c7565b83613671565b9050610fed6060860186615229565b9050610ffc6040870187615229565b90501461101c576040516343714afd60e01b815260040160405180910390fd5b60208083015183516001600160a01b03165f9081526098909252604090912061104e9163ffffffff9081169061354216565b61106b57604051631fb1705560e21b815260040160405180910390fd5b806110895760405163ebbff49760e01b815260040160405180910390fd5b5f6110976040870187615229565b90506001600160401b038111156110b0576110b061465a565b6040519080825280602002602001820160405280156110d9578160200160208202803683370190505b5090505f5b6110eb6040880188615229565b90508110156116e25780158061117e57506111096040880188615229565b6111146001846153d8565b818110611123576111236151d0565b905060200201602081019061113891906147c7565b6001600160a01b031661114e6040890189615229565b8381811061115e5761115e6151d0565b905060200201602081019061117391906147c7565b6001600160a01b0316115b61119b57604051639f1c805360e01b815260040160405180910390fd5b6111a86060880188615229565b828181106111b8576111b86151d0565b905060200201355f1080156111f85750670de0b6b3a76400006111de6060890189615229565b838181106111ee576111ee6151d0565b9050602002013511155b61121557604051631353603160e01b815260040160405180910390fd5b6112716112256040890189615229565b83818110611235576112356151d0565b905060200201602081019061124a91906147c7565b60995f61125688613322565b81526020019081526020015f206136e790919063ffffffff16565b61128e576040516331bc342760e11b815260040160405180910390fd5b5f806112e06112a060208b018b6147c7565b6112a988613322565b6112b660408d018d615229565b878181106112c6576112c66151d0565b90506020020160208101906112db91906147c7565b613385565b805191935091506001600160401b03165f036112fd5750506116da565b5f61133861130e60608c018c615229565b8681811061131e5761131e6151d0565b85516001600160401b031692602090910201359050613708565b83519091506113536001600160401b03808416908316613649565b868681518110611365576113656151d0565b60200260200101818152505081835f0181815161138291906153eb565b6001600160401b031690525083518290859061139f9083906153eb565b6001600160401b03169052506020840180518391906113bf9083906153eb565b6001600160401b031690525060208301515f600f9190910b12156114da575f6114226113ee60608e018e615229565b888181106113fe576113fe6151d0565b9050602002013585602001516114139061540a565b6001600160801b031690613708565b9050806001600160401b03168460200181815161143f919061542e565b600f0b9052507f1487af5418c47ee5ea45ef4a93398668120890774a9e13487e61e9dc3baf76dd61147360208e018e6147c7565b8a8e80604001906114849190615229565b8a818110611494576114946151d0565b90506020020160208101906114a991906147c7565b6114ba885f01518960200151613635565b88604001516040516114d095949392919061545b565b60405180910390a1505b61152c6114ea60208d018d6147c7565b6114f38a613322565b61150060408f018f615229565b89818110611510576115106151d0565b905060200201602081019061152591906147c7565b878761371e565b7f1487af5418c47ee5ea45ef4a93398668120890774a9e13487e61e9dc3baf76dd61155a60208d018d6147c7565b8961156860408f018f615229565b89818110611578576115786151d0565b905060200201602081019061158d91906147c7565b86516040516115a19493929190439061545b565b60405180910390a16115f26115b960208d018d6147c7565b6115c660408e018e615229565b888181106115d6576115d66151d0565b90506020020160208101906115eb91906147c7565b865161395e565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001663601bb36f61162e60208e018e6147c7565b61163b60408f018f615229565b8981811061164b5761164b6151d0565b905060200201602081019061166091906147c7565b875160405160e085901b6001600160e01b03191681526001600160a01b0393841660048201529290911660248301526001600160401b0380861660448401521660648201526084015f604051808303815f87803b1580156116bf575f5ffd5b505af11580156116d1573d5f5f3e3d5ffd5b50505050505050505b6001016110de565b507f80969ad29428d6797ee7aad084f9e4a42a82fc506dcd2ca3b6fb431f85ccebe561171160208801886147c7565b8461171f60408a018a615229565b8561172d60808d018d6154ac565b6040516117409796959493929190615516565b60405180910390a150505050505050565b6001600160a01b0382165f908152609d6020526040812060609182916117769061352e565b90505f816001600160401b038111156117915761179161465a565b6040519080825280602002602001820160405280156117d557816020015b604080518082019091525f80825260208201528152602001906001900390816117af5790505b5090505f826001600160401b038111156117f1576117f161465a565b60405190808252806020026020018201604052801561183a57816020015b604080516060810182525f80825260208083018290529282015282525f1990920191018161180f5790505b5090505f5b838110156118bd576001600160a01b0388165f908152609d6020526040812061186c906108e79084613537565b905080848381518110611881576118816151d0565b602002602001018190525061189789828a610722565b8383815181106118a9576118a96151d0565b60209081029190910101525060010161183f565b509093509150505b9250929050565b60605f61075660995f6118de86613322565b81526020019081526020015f206139e0565b60605f83516001600160401b0381111561190c5761190c61465a565b604051908082528060200260200182016040528015611935578160200160208202803683370190505b5090505f5b845181101561094157611966858281518110611958576119586151d0565b602002602001015185612976565b828281518110611978576119786151d0565b6001600160401b039092166020928302919091019091015260010161193a565b6066545f906001908116036119c05760405163840a48d560e01b815260040160405180910390fd5b8382146119e0576040516343714afd60e01b815260040160405180910390fd5b5f5b84811015611a4957611a4187878784818110611a0057611a006151d0565b9050602002016020810190611a1591906147c7565b868685818110611a2757611a276151d0565b9050602002016020810190611a3c91906155ac565b6139ec565b6001016119e2565b50505050505050565b83611a5c81613559565b611a795760405163932d94f760e01b815260040160405180910390fd5b604080518082019091526001600160a01b038616815263ffffffff851660208201525f611aa582613322565b9050611ae6826020015163ffffffff1660985f8a6001600160a01b03166001600160a01b031681526020019081526020015f2061354290919063ffffffff16565b611b0357604051631fb1705560e21b815260040160405180910390fd5b5f5b84811015611ba657611b22868683818110610b5157610b516151d0565b611b3f5760405163585cfb2f60e01b815260040160405180910390fd5b7f7ab260fe0af193db5f4986770d831bda4ea46099dc817e8b6716dcae8af8e88b83878784818110611b7357611b736151d0565b9050602002016020810190611b8891906147c7565b604051611b9692919061526e565b60405180910390a1600101611b05565b5050505050505050565b60605f82516001600160401b03811115611bcc57611bcc61465a565b604051908082528060200260200182016040528015611bf5578160200160208202803683370190505b5090505f5b835181101561094157611c2685858381518110611c1957611c196151d0565b6020026020010151612976565b828281518110611c3857611c386151d0565b6001600160401b0390921660209283029190910190910152600101611bfa565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614611d5357611c9182613559565b611cae576040516348f5c3ed60e01b815260040160405180910390fd5b6040516336b87bd760e11b81526001600160a01b0383811660048301527f00000000000000000000000000000000000000000000000000000000000000001690636d70f7ae90602401602060405180830381865afa158015611d12573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611d3691906151b1565b611d535760405163ccea9e6f60e01b815260040160405180910390fd5b61082e8282613af0565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa158015611dbf573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611de391906151b1565b611e0057604051631d77d47760e21b815260040160405180910390fd5b611e0a5f196134f1565b565b5f61075683609a5f61125686613322565b5f5f611e298484613c9c565b95945050505050565b606654600290600490811603611e5b5760405163840a48d560e01b815260040160405180910390fd5b611e70611e6b60208401846147c7565b613559565b80611e895750611e89611e6b60408401602085016147c7565b611ea6576040516348f5c3ed60e01b815260040160405180910390fd5b5f5b611eb56040840184615229565b9050811015612177575f6040518060400160405280856020016020810190611edd91906147c7565b6001600160a01b03168152602001611ef86040870187615229565b85818110611f0857611f086151d0565b9050602002016020810190611f1d9190615202565b63ffffffff168152509050611f6a816020015163ffffffff1660985f876020016020810190611f4c91906147c7565b6001600160a01b0316815260208101919091526040015f2090613542565b611f8757604051631fb1705560e21b815260040160405180910390fd5b609e5f611f9760208701876147c7565b6001600160a01b03166001600160a01b031681526020019081526020015f205f611fc083613322565b815260208101919091526040015f205460ff16611ff0576040516325131d4f60e01b815260040160405180910390fd5b61202a611ffc82613322565b609c5f61200c60208901896147c7565b6001600160a01b0316815260208101919091526040015f2090613e0b565b5061206261203b60208601866147c7565b609a5f61204785613322565b81526020019081526020015f20613e1690919063ffffffff16565b5061207060208501856147c7565b6001600160a01b03167fad34c3070be1dffbcaa499d000ba2b8d9848aefcac3059df245dd95c4ece14fe826040516120a8919061521b565b60405180910390a2604080518082019091525f8152602081016120eb7f0000000000000000000000000000000000000000000000000000000000000000436155cd565b63ffffffff169052609e5f61210360208801886147c7565b6001600160a01b03166001600160a01b031681526020019081526020015f205f61212c84613322565b81526020808201929092526040015f2082518154939092015163ffffffff166101000264ffffffff00199215159290921664ffffffffff199093169290921717905550600101611ea8565b5061218b61038360408401602085016147c7565b6001600160a01b0316639d8e0c236121a660208501856147c7565b6121b36040860186615229565b6040518463ffffffff1660e01b81526004016121d193929190615622565b5f604051808303815f87803b1580156121e8575f5ffd5b505af19250505080156121f9575060015b1561082e575050565b606061097a609a5f6118de85613322565b61221b613e2a565b611e0a5f613e84565b6001600160a01b0381165f908152609c60205260408120606091906122489061352e565b90505f816001600160401b038111156122635761226361465a565b6040519080825280602002602001820160405280156122a757816020015b604080518082019091525f80825260208201528152602001906001900390816122815790505b5090505f5b82811015610941576001600160a01b0385165f908152609c602052604090206122d9906108e79083613537565b8282815181106122eb576122eb6151d0565b60209081029190910101526001016122ac565b60605f84516001600160401b0381111561231a5761231a61465a565b60405190808252806020026020018201604052801561236357816020015b604080516060810182525f80825260208083018290529282015282525f199092019101816123385790505b5090505f5b85518110156123ba57612395868281518110612386576123866151d0565b60200260200101518686610722565b8282815181106123a7576123a76151d0565b6020908102919091010152600101612368565b50949350505050565b60605f83516001600160401b038111156123df576123df61465a565b604051908082528060200260200182016040528015612408578160200160208202803683370190505b5090505f5b84518110156123ba576001600160a01b0386165f90815260a160205260408120865161247d92879291899086908110612448576124486151d0565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020015f20613ed590919063ffffffff16565b82828151811061248f5761248f6151d0565b6001600160401b039092166020928302919091019091015260010161240d565b6066545f906001908116036124d75760405163840a48d560e01b815260040160405180910390fd5b6124e083613559565b6124fd576040516348f5c3ed60e01b815260040160405180910390fd5b5f5f5f61250986612ee0565b915091508161252b5760405163fa55fc8160e01b815260040160405180910390fd5b91505f90505b8351811015610c1c5783818151811061254c5761254c6151d0565b6020026020010151604001515184828151811061256b5761256b6151d0565b6020026020010151602001515114612596576040516343714afd60e01b815260040160405180910390fd5b5f8482815181106125a9576125a96151d0565b602090810291909101810151518082015181516001600160a01b03165f908152609890935260409092209092506125e99163ffffffff9081169061354216565b61260657604051631fb1705560e21b815260040160405180910390fd5b5f6126118783613671565b90505f5b868481518110612627576126276151d0565b6020026020010151602001515181101561296b575f87858151811061264e5761264e6151d0565b602002602001015160200151828151811061266b5761266b6151d0565b60200260200101519050612682898261ffff6139ec565b5f5f6126918b61074b88613322565b915091508060200151600f0b5f146126bc57604051630d8fcbe360e41b815260040160405180910390fd5b5f6126c987858489613ee9565b905061270e825f01518c8a815181106126e4576126e46151d0565b6020026020010151604001518781518110612701576127016151d0565b6020026020010151613f1f565b600f0b602083018190525f0361273757604051634606179360e11b815260040160405180910390fd5b5f8260200151600f0b121561287b5780156127fd576127b861275888613322565b6001600160a01b03808f165f90815260a360209081526040808320938a16835292905220908154600160801b90819004600f0b5f818152600180860160205260409091209390935583546001600160801b03908116939091011602179055565b6127e27f0000000000000000000000000000000000000000000000000000000000000000436155cd565b6127ed9060016155cd565b63ffffffff1660408301526128e8565b61280f83602001518360200151613635565b6001600160401b031660208401528a518b9089908110612831576128316151d0565b602002602001015160400151858151811061284e5761284e6151d0565b6020908102919091018101516001600160401b031683525f9083015263ffffffff431660408301526128e8565b5f8260200151600f0b13156128e85761289c83602001518360200151613635565b6001600160401b0390811660208501819052845190911610156128d257604051636c9be0bf60e01b815260040160405180910390fd5b6128dc89436155cd565b63ffffffff1660408301525b6128fd8c6128f589613322565b86868661371e565b7f1487af5418c47ee5ea45ef4a93398668120890774a9e13487e61e9dc3baf76dd8c61292b6108e78a613322565b8661293d865f01518760200151613635565b866040015160405161295395949392919061545b565b60405180910390a15050600190920191506126159050565b505050600101612531565b6001600160a01b038083165f90815260a160209081526040808320938516835292905290812061075690613622565b826129af81613559565b6129cc5760405163932d94f760e01b815260040160405180910390fd5b836001600160a01b03167fa89c1dc243d8908a96dd84944bcc97d6bc6ac00dd78e20621576be6a3c9437138484604051612a07929190615646565b60405180910390a250505050565b606654600290600490811603612a3e5760405163840a48d560e01b815260040160405180910390fd5b82612a4881613559565b612a655760405163932d94f760e01b815260040160405180910390fd5b6040516336b87bd760e11b81526001600160a01b0385811660048301527f00000000000000000000000000000000000000000000000000000000000000001690636d70f7ae90602401602060405180830381865afa158015612ac9573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612aed91906151b1565b612b0a5760405163ccea9e6f60e01b815260040160405180910390fd5b5f5b612b196020850185615229565b9050811015612ce157604080518082019091525f9080612b3c60208801886147c7565b6001600160a01b03168152602001868060200190612b5a9190615229565b85818110612b6a57612b6a6151d0565b9050602002016020810190612b7f9190615202565b63ffffffff90811690915260208083015183516001600160a01b03165f90815260989092526040909120929350612bbb92919081169061354216565b612bd857604051631fb1705560e21b815260040160405180910390fd5b612be28682613671565b15612c0057604051636c6c6e2760e11b815260040160405180910390fd5b612c29612c0c82613322565b6001600160a01b0388165f908152609c6020526040902090613603565b50612c5586609a5f612c3a85613322565b81526020019081526020015f2061360e90919063ffffffff16565b50856001600160a01b03167f43232edf9071753d2321e5fa7e018363ee248e5f2142e6c08edd3265bfb4895e82604051612c8f919061521b565b60405180910390a26001600160a01b0386165f908152609e60205260408120600191612cba84613322565b815260208101919091526040015f20805460ff191691151591909117905550600101612b0c565b50612cf261038360208501856147c7565b6001600160a01b031663adcf73f785612d0e6020870187615229565b612d1b60408901896154ac565b6040518663ffffffff1660e01b8152600401612d3b959493929190615659565b5f604051808303815f87803b158015612d52575f5ffd5b505af1158015611ba6573d5f5f3e3d5ffd5b5f61097a609a5f612d7485613322565b81526020019081526020015f2061352e565b83612d9081613559565b612dad5760405163932d94f760e01b815260040160405180910390fd5b6040805180820182526001600160a01b03871680825263ffffffff80881660208085018290525f93845260989052939091209192612dec929161354216565b612e0957604051631fb1705560e21b815260040160405180910390fd5b5f612e1382613322565b90505f5b84811015611ba657612e5c868683818110612e3457612e346151d0565b9050602002016020810190612e4991906147c7565b5f84815260996020526040902090613e16565b612e79576040516331bc342760e11b815260040160405180910390fd5b7f7b4b073d80dcac55a11177d8459ad9f664ceeb91f71f27167bb14f8152a7eeee83878784818110612ead57612ead6151d0565b9050602002016020810190612ec291906147c7565b604051612ed092919061526e565b60405180910390a1600101612e17565b6001600160a01b0381165f908152609b602090815260408083208151608081018352905463ffffffff80821680845260ff600160201b8404161515958401869052650100000000008304821694840194909452600160481b909104166060820181905284939192919015801590612f615750826060015163ffffffff164310155b15612f70575050604081015160015b9590945092505050565b6001600160a01b0381165f90815260986020526040812061097a9061352e565b6001600160a01b0382165f908152609f6020526040812060609190612fc390826118de86613322565b949350505050565b5f54610100900460ff1615808015612fe957505f54600160ff909116105b806130025750303b15801561300257505f5460ff166001145b61306a5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b5f805460ff19166001179055801561308b575f805461ff0019166101001790555b613094826134f1565b61309d83613e84565b80156130e3575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498906020015b60405180910390a15b505050565b816130f281613559565b61310f5760405163932d94f760e01b815260040160405180910390fd5b6001600160a01b038381165f90815260976020526040902080546001600160a01b0319169184169190911790557f2ae945c40c44dc0ec263f95609c3fdc6952e0aefa22d6374e44f2c997acedf858361316781610f10565b604080516001600160a01b039384168152929091166020830152016130da565b61318f613e2a565b6001600160a01b0381166131f45760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401613061565b6131fd81613e84565b50565b5f5f6123ba8484613c9c565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015613268573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061328c919061569c565b6001600160a01b0316336001600160a01b0316146132bd5760405163794821ff60e01b815260040160405180910390fd5b606654801982198116146132e45760405163c61dca5d60e01b815260040160405180910390fd5b606682905560405182815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c9060200160405180910390a25050565b5f815f0151826020015163ffffffff1660405160200161336d92919060609290921b6bffffffffffffffffffffffff1916825260a01b6001600160a01b031916601482015260200190565b60405160208183030381529060405261097a906156b7565b6040805180820182525f80825260208083018290528351606081018552828152808201839052808501839052845180860186526001600160a01b03898116855260a18452868520908816855290925293822092939281906133e590613622565b6001600160401b0390811682526001600160a01b038981165f81815260a260209081526040808320948c168084529482528083205486169682019690965291815260a082528481208b8252825284812092815291815290839020835160608101855290549283168152600160401b8304600f0b91810191909152600160c01b90910463ffffffff169181018290529192504310156134875790925090506134e9565b613498815f01518260200151613635565b6001600160401b0316815260208101515f600f9190910b12156134d6576134c782602001518260200151613635565b6001600160401b031660208301525b5f60408201819052602082015290925090505b935093915050565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a250565b5f61097a825490565b5f6107568383613f36565b5f8181526001830160205260408120541515610756565b604051631beb2b9760e31b81526001600160a01b0382811660048301523360248301523060448301525f80356001600160e01b0319166064840152917f00000000000000000000000000000000000000000000000000000000000000009091169063df595cb8906084016020604051808303815f875af11580156135df573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061097a91906151b1565b5f6107568383613f5c565b5f610756836001600160a01b038416613f5c565b5f61097a82670de0b6b3a7640000613fa8565b5f610756826001600160401b03851661542e565b5f61075683670de0b6b3a764000084613fec565b5f6107568383670de0b6b3a7640000613fec565b6001600160a01b0382165f908152609e6020526040812081908161369485613322565b815260208082019290925260409081015f2081518083019092525460ff8116151580835261010090910463ffffffff1692820192909252915080612fc357506020015163ffffffff164311159392505050565b6001600160a01b0381165f9081526001830160205260408120541515610756565b5f6107568383670de0b6b3a764000060016140d1565b6020808301516001600160a01b038088165f90815260a284526040808220928816825291909352909120546001600160401b039081169116146137e457602082810180516001600160a01b038881165f81815260a286526040808220938a1680835293875290819020805467ffffffffffffffff19166001600160401b0395861617905593518451918252948101919091529216908201527facf9095feb3a370c9cf692421c69ef320d4db5c66e6a7d29c7694eb02364fc559060600160405180910390a15b6001600160a01b038086165f90815260a060209081526040808320888452825280832093871683529281529082902083518154928501519385015163ffffffff16600160c01b0263ffffffff60c01b196001600160801b038616600160401b026001600160c01b03199095166001600160401b03909316929092179390931716919091179055600f0b156138c6576001600160a01b0385165f908152609f60209081526040808320878452909152902061389e908461360e565b506001600160a01b0385165f908152609d602052604090206138c09085613603565b50610c1c565b80516001600160401b03165f03610c1c576001600160a01b0385165f908152609f6020908152604080832087845290915290206139039084613e16565b506001600160a01b0385165f908152609f60209081526040808320878452909152902061392f9061352e565b5f03610c1c576001600160a01b0385165f908152609d602052604090206139569085613e0b565b505050505050565b6001600160a01b038084165f90815260a16020908152604080832093861683529290522061398d90438361412a565b604080516001600160a01b038086168252841660208201526001600160401b038316918101919091527f1c6458079a41077d003c11faf9bf097e693bd67979e4e6500bac7b29db779b5c906060016130da565b60605f6107568361413e565b6001600160a01b038381165f90815260a360209081526040808320938616835292905290812054600f81810b600160801b909204900b035b5f81118015613a3657508261ffff1682105b15610c1c576001600160a01b038086165f90815260a3602090815260408083209388168352929052908120613a6a90614197565b90505f5f613a79888489613385565b91509150806040015163ffffffff16431015613a9757505050610c1c565b613aa4888489858561371e565b6001600160a01b038089165f90815260a360209081526040808320938b16835292905220613ad1906141e9565b50613adb856156da565b9450613ae6846156f2565b9350505050613a24565b6001600160a01b0382165f908152609b60209081526040918290208251608081018452905463ffffffff808216835260ff600160201b830416151593830193909352650100000000008104831693820193909352600160481b909204166060820181905215801590613b6c5750806060015163ffffffff164310155b15613b8657604081015163ffffffff168152600160208201525b63ffffffff82166040820152613bbc7f0000000000000000000000000000000000000000000000000000000000000000436155cd565b613bc79060016155cd565b63ffffffff90811660608381019182526001600160a01b0386165f818152609b602090815260409182902087518154838a0151858b01519851928a1664ffffffffff1990921691909117600160201b91151591909102176cffffffffffffffff0000000000191665010000000000978916979097026cffffffff000000000000000000191696909617600160481b968816968702179055815192835294871694820194909452928301919091527f4e85751d6331506c6c62335f207eb31f12a61e570f34f5c17640308785c6d4db91016130da565b6001600160a01b038281165f81815260a2602090815260408083209486168084529482528083205493835260a38252808320948352939052918220546001600160401b039091169190600f81810b600160801b909204900b03815b81811015613dc7576001600160a01b038087165f90815260a3602090815260408083209389168352929052908120613d2f9083614266565b6001600160a01b038881165f90815260a0602090815260408083208584528252808320938b16835292815290829020825160608101845290546001600160401b0381168252600160401b8104600f0b92820192909252600160c01b90910463ffffffff16918101829052919250431015613daa575050613dc7565b613db8868260200151613635565b95505050806001019050613cf7565b506001600160a01b038086165f90815260a1602090815260408083209388168352929052208390613df790613622565b613e0191906153eb565b9150509250929050565b5f61075683836142d5565b5f610756836001600160a01b0384166142d5565b6033546001600160a01b03163314611e0a5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401613061565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b5f6107568383670de0b6b3a76400006143b8565b5f613efa8460995f61125689613322565b8015613f035750815b8015611e2957505090516001600160401b031615159392505050565b5f6107566001600160401b03808516908416615707565b5f825f018281548110613f4b57613f4b6151d0565b905f5260205f200154905092915050565b5f818152600183016020526040812054613fa157508154600181810184555f84815260208082209093018490558454848252828601909352604090209190915561097a565b505f61097a565b81545f908015613fe457613fce84613fc16001846153d8565b5f91825260209091200190565b54600160201b90046001600160e01b0316612fc3565b509092915050565b5f80805f19858709858702925082811083820303915050805f036140235783828161401957614019615734565b0492505050610756565b80841161406a5760405162461bcd60e51b81526020600482015260156024820152744d6174683a206d756c446976206f766572666c6f7760581b6044820152606401613061565b5f8486880960026001871981018816978890046003810283188082028403028082028403028082028403028082028403028082028403029081029092039091025f889003889004909101858311909403939093029303949094049190911702949350505050565b5f5f6140de868686613fec565b905060018360028111156140f4576140f4615748565b14801561411057505f848061410b5761410b615734565b868809115b15611e295761412060018261575c565b9695505050505050565b6130e383836001600160401b038416614400565b6060815f0180548060200260200160405190810160405280929190818152602001828054801561418b57602002820191905f5260205f20905b815481526020019060010190808311614177575b50505050509050919050565b5f6141b18254600f81810b600160801b909204900b131590565b156141cf57604051631ed9509560e11b815260040160405180910390fd5b508054600f0b5f9081526001909101602052604090205490565b5f6142038254600f81810b600160801b909204900b131590565b1561422157604051631ed9509560e11b815260040160405180910390fd5b508054600f0b5f818152600180840160205260408220805492905583546fffffffffffffffffffffffffffffffff191692016001600160801b03169190911790915590565b5f5f61428861427484614503565b85546142839190600f0b61576f565b614570565b8454909150600160801b9004600f90810b9082900b126142bb57604051632d0483c560e21b815260040160405180910390fd5b600f0b5f9081526001939093016020525050604090205490565b5f81815260018301602052604081205480156143af575f6142f76001836153d8565b85549091505f9061430a906001906153d8565b9050818114614369575f865f018281548110614328576143286151d0565b905f5260205f200154905080875f018481548110614348576143486151d0565b5f918252602080832090910192909255918252600188019052604090208390555b855486908061437a5761437a615796565b600190038181905f5260205f20015f90559055856001015f8681526020019081526020015f205f90556001935050505061097a565b5f91505061097a565b82545f90816143c9868683856145d9565b905080156143f6576143e086613fc16001846153d8565b54600160201b90046001600160e01b0316610751565b5091949350505050565b825480156144b6575f61441885613fc16001856153d8565b60408051808201909152905463ffffffff808216808452600160201b9092046001600160e01b03166020840152919250908516101561446a5760405163151b8e3f60e11b815260040160405180910390fd5b805163ffffffff8086169116036144b4578261448b86613fc16001866153d8565b80546001600160e01b0392909216600160201b0263ffffffff9092169190911790555050505050565b505b506040805180820190915263ffffffff92831681526001600160e01b03918216602080830191825285546001810187555f968752952091519051909216600160201b029190921617910155565b5f6001600160ff1b0382111561456c5760405162461bcd60e51b815260206004820152602860248201527f53616665436173743a2076616c756520646f65736e27742066697420696e2061604482015267371034b73a191a9b60c11b6064820152608401613061565b5090565b80600f81900b81146145d45760405162461bcd60e51b815260206004820152602760248201527f53616665436173743a2076616c756520646f65736e27742066697420696e20316044820152663238206269747360c81b6064820152608401613061565b919050565b5f5b81831015610941575f6145ee848461462c565b5f8781526020902090915063ffffffff86169082015463ffffffff16111561461857809250614626565b61462381600161575c565b93505b506145db565b5f61463a60028484186157aa565b6107569084841661575c565b6001600160a01b03811681146131fd575f5ffd5b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b03811182821017156146905761469061465a565b60405290565b604051601f8201601f191681016001600160401b03811182821017156146be576146be61465a565b604052919050565b803563ffffffff811681146145d4575f5ffd5b5f604082840312156146e9575f5ffd5b604080519081016001600160401b038111828210171561470b5761470b61465a565b604052905080823561471c81614646565b815261472a602084016146c6565b60208201525092915050565b5f5f5f60808486031215614748575f5ffd5b833561475381614646565b925061476285602086016146d9565b9150606084013561477281614646565b809150509250925092565b81516001600160401b03168152602080830151600f0b9082015260408083015163ffffffff16908201526060810161097a565b5f602082840312156147c0575f5ffd5b5035919050565b5f602082840312156147d7575f5ffd5b813561075681614646565b80516001600160a01b0316825260209081015163ffffffff16910152565b5f8151808452602084019350602083015f5b8281101561483b576148258683516147e2565b6040959095019460209190910190600101614812565b5093949350505050565b602081525f6107566020830184614800565b5f60408284031215614867575f5ffd5b61075683836146d9565b5f5f83601f840112614881575f5ffd5b5081356001600160401b03811115614897575f5ffd5b6020830191508360208260051b85010111156118c5575f5ffd5b5f5f5f604084860312156148c3575f5ffd5b83356148ce81614646565b925060208401356001600160401b038111156148e8575f5ffd5b6148f486828701614871565b9497909650939450505050565b5f6001600160401b038211156149195761491961465a565b5060051b60200190565b5f82601f830112614932575f5ffd5b813561494561494082614901565b614696565b8082825260208201915060208360051b860101925085831115614966575f5ffd5b602085015b8381101561498c57803561497e81614646565b83526020928301920161496b565b5095945050505050565b5f5f5f5f60a085870312156149a9575f5ffd5b6149b386866146d9565b935060408501356001600160401b038111156149cd575f5ffd5b6149d987828801614923565b93505060608501356001600160401b038111156149f4575f5ffd5b614a0087828801614923565b925050614a0f608086016146c6565b905092959194509250565b5f8151808452602084019350602083015f5b8281101561483b578151865260209586019590910190600101614a2c565b5f602082016020835280845180835260408501915060408160051b8601019250602086015f5b82811015614aa157603f19878603018452614a8c858351614a1a565b94506020938401939190910190600101614a70565b50929695505050505050565b5f5f60408385031215614abe575f5ffd5b8235614ac981614646565b915060208301356001600160401b03811115614ae3575f5ffd5b830160a08186031215614af4575f5ffd5b809150509250929050565b5f5f60408385031215614b10575f5ffd5b8235614b1b81614646565b91506020830135614af481614646565b5f8151808452602084019350602083015f5b8281101561483b57614b7686835180516001600160401b03168252602080820151600f0b9083015260409081015163ffffffff16910152565b6060959095019460209190910190600101614b3d565b604081525f614b9e6040830185614800565b8281036020840152611e298185614b2b565b5f8151808452602084019350602083015f5b8281101561483b5781516001600160a01b0316865260209586019590910190600101614bc2565b602081525f6107566020830184614bb0565b5f5f60408385031215614c0c575f5ffd5b82356001600160401b03811115614c21575f5ffd5b614c2d85828601614923565b9250506020830135614af481614646565b602080825282518282018190525f918401906040840190835b81811015614c7e5783516001600160401b0316835260209384019390920191600101614c57565b509095945050505050565b5f5f5f5f5f60608688031215614c9d575f5ffd5b8535614ca881614646565b945060208601356001600160401b03811115614cc2575f5ffd5b614cce88828901614871565b90955093505060408601356001600160401b03811115614cec575f5ffd5b614cf888828901614871565b969995985093965092949392505050565b5f5f5f5f60608587031215614d1c575f5ffd5b8435614d2781614646565b9350614d35602086016146c6565b925060408501356001600160401b03811115614d4f575f5ffd5b614d5b87828801614871565b95989497509550505050565b5f5f60408385031215614d78575f5ffd5b8235614d8381614646565b915060208301356001600160401b03811115614d9d575f5ffd5b613e0185828601614923565b5f5f60408385031215614dba575f5ffd5b8235614dc581614646565b9150614dd3602084016146c6565b90509250929050565b5f60208284031215614dec575f5ffd5b813560ff81168114610756575f5ffd5b5f5f60608385031215614e0d575f5ffd5b8235614e1881614646565b9150614dd384602085016146d9565b5f60608284031215614e37575f5ffd5b50919050565b5f60208284031215614e4d575f5ffd5b81356001600160401b03811115614e62575f5ffd5b612fc384828501614e27565b5f5f5f60808486031215614e80575f5ffd5b83356001600160401b03811115614e95575f5ffd5b614ea186828701614923565b93505061476285602086016146d9565b602081525f6107566020830184614b2b565b5f5f5f60608486031215614ed5575f5ffd5b8335614ee081614646565b925060208401356001600160401b03811115614efa575f5ffd5b614f0686828701614923565b925050614f15604085016146c6565b90509250925092565b5f5f60408385031215614f2f575f5ffd5b8235614f3a81614646565b915060208301356001600160401b03811115614f54575f5ffd5b8301601f81018513614f64575f5ffd5b8035614f7261494082614901565b8082825260208201915060208360051b850101925087831115614f93575f5ffd5b602084015b838110156150b85780356001600160401b03811115614fb5575f5ffd5b85016080818b03601f19011215614fca575f5ffd5b614fd261466e565b614fdf8b602084016146d9565b815260608201356001600160401b03811115614ff9575f5ffd5b6150088c602083860101614923565b60208301525060808201356001600160401b03811115615026575f5ffd5b6020818401019250508a601f83011261503d575f5ffd5b813561504b61494082614901565b8082825260208201915060208360051b86010192508d83111561506c575f5ffd5b6020850194505b828510156150a25784356001600160401b0381168114615091575f5ffd5b825260209485019490910190615073565b6040840152505084525060209283019201614f98565b50809450505050509250929050565b5f5f5f604084860312156150d9575f5ffd5b83356150e481614646565b925060208401356001600160401b038111156150fe575f5ffd5b8401601f8101861361510e575f5ffd5b80356001600160401b03811115615123575f5ffd5b866020828401011115615134575f5ffd5b939660209190910195509293505050565b5f5f60408385031215615156575f5ffd5b823561516181614646565b915060208301356001600160401b0381111561517b575f5ffd5b613e0185828601614e27565b5f5f60408385031215615198575f5ffd5b82356151a381614646565b946020939093013593505050565b5f602082840312156151c1575f5ffd5b81518015158114610756575f5ffd5b634e487b7160e01b5f52603260045260245ffd5b5f8235603e198336030181126151f8575f5ffd5b9190910192915050565b5f60208284031215615212575f5ffd5b610756826146c6565b6040810161097a82846147e2565b5f5f8335601e1984360301811261523e575f5ffd5b8301803591506001600160401b03821115615257575f5ffd5b6020019150600581901b36038213156118c5575f5ffd5b6060810161527c82856147e2565b6001600160a01b039290921660409190910152919050565b604081525f6152a66040830185614bb0565b8281036020840152611e298185614bb0565b5f602082840312156152c8575f5ffd5b81516001600160401b038111156152dd575f5ffd5b8201601f810184136152ed575f5ffd5b80516152fb61494082614901565b8082825260208201915060208360051b85010192508683111561531c575f5ffd5b602084015b838110156153b95780516001600160401b0381111561533e575f5ffd5b8501603f8101891361534e575f5ffd5b602081015161535f61494082614901565b808282526020820191506020808460051b8601010192508b831115615382575f5ffd5b6040840193505b828410156153a4578351825260209384019390910190615389565b86525050602093840193919091019050615321565b509695505050505050565b634e487b7160e01b5f52601160045260245ffd5b8181038181111561097a5761097a6153c4565b6001600160401b03828116828216039081111561097a5761097a6153c4565b5f81600f0b60016001607f1b03198103615426576154266153c4565b5f0392915050565b600f81810b9083900b0160016001607f1b03811360016001607f1b03198212171561097a5761097a6153c4565b6001600160a01b038616815260c0810161547860208301876147e2565b6001600160a01b039490941660608201526001600160401b0392909216608083015263ffffffff1660a09091015292915050565b5f5f8335601e198436030181126154c1575f5ffd5b8301803591506001600160401b038211156154da575f5ffd5b6020019150368190038213156118c5575f5ffd5b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b6001600160a01b03881681525f60c08201615534602084018a6147e2565b60c060608401528690528660e083015f5b8881101561557557823561555881614646565b6001600160a01b0316825260209283019290910190600101615545565b5083810360808501526155888188614a1a565b91505082810360a084015261559e8185876154ee565b9a9950505050505050505050565b5f602082840312156155bc575f5ffd5b813561ffff81168114610756575f5ffd5b63ffffffff818116838216019081111561097a5761097a6153c4565b8183526020830192505f815f5b8481101561483b5763ffffffff61560c836146c6565b16865260209586019591909101906001016155f6565b6001600160a01b03841681526040602082018190525f90611e2990830184866155e9565b602081525f612fc36020830184866154ee565b6001600160a01b03861681526060602082018190525f9061567d90830186886155e9565b82810360408401526156908185876154ee565b98975050505050505050565b5f602082840312156156ac575f5ffd5b815161075681614646565b80516020808301519190811015614e37575f1960209190910360031b1b16919050565b5f600182016156eb576156eb6153c4565b5060010190565b5f81615700576157006153c4565b505f190190565b600f82810b9082900b0360016001607f1b0319811260016001607f1b038213171561097a5761097a6153c4565b634e487b7160e01b5f52601260045260245ffd5b634e487b7160e01b5f52602160045260245ffd5b8082018082111561097a5761097a6153c4565b8082018281125f83128015821682158216171561578e5761578e6153c4565b505092915050565b634e487b7160e01b5f52603160045260245ffd5b5f826157c457634e487b7160e01b5f52601260045260245ffd5b50049056fea2646970667358221220bf2c2a135f852605c736e114c992eb283845849273282d707e128f09f189664c64736f6c634300081b0033", + ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"_delegation\",\"type\":\"address\",\"internalType\":\"contractIDelegationManager\"},{\"name\":\"_pauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"},{\"name\":\"_permissionController\",\"type\":\"address\",\"internalType\":\"contractIPermissionController\"},{\"name\":\"_DEALLOCATION_DELAY\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"_ALLOCATION_CONFIGURATION_DELAY\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"ALLOCATION_CONFIGURATION_DELAY\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"DEALLOCATION_DELAY\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"addStrategiesToOperatorSet\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetId\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"clearDeallocationQueue\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"numToClear\",\"type\":\"uint16[]\",\"internalType\":\"uint16[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"createOperatorSets\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"params\",\"type\":\"tuple[]\",\"internalType\":\"structIAllocationManagerTypes.CreateSetParams[]\",\"components\":[{\"name\":\"operatorSetId\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"delegation\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIDelegationManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"deregisterFromOperatorSets\",\"inputs\":[{\"name\":\"params\",\"type\":\"tuple\",\"internalType\":\"structIAllocationManagerTypes.DeregisterParams\",\"components\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetIds\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"getAVSRegistrar\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIAVSRegistrar\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAllocatableMagnitude\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAllocatedSets\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple[]\",\"internalType\":\"structOperatorSet[]\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAllocatedStake\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"operators\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256[][]\",\"internalType\":\"uint256[][]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAllocatedStrategies\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAllocation\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIAllocationManagerTypes.Allocation\",\"components\":[{\"name\":\"currentMagnitude\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"pendingDiff\",\"type\":\"int128\",\"internalType\":\"int128\"},{\"name\":\"effectBlock\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAllocationDelay\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAllocations\",\"inputs\":[{\"name\":\"operators\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple[]\",\"internalType\":\"structIAllocationManagerTypes.Allocation[]\",\"components\":[{\"name\":\"currentMagnitude\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"pendingDiff\",\"type\":\"int128\",\"internalType\":\"int128\"},{\"name\":\"effectBlock\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getEncumberedMagnitude\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getMaxMagnitude\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getMaxMagnitudes\",\"inputs\":[{\"name\":\"operators\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64[]\",\"internalType\":\"uint64[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getMaxMagnitudes\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64[]\",\"internalType\":\"uint64[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getMaxMagnitudesAtBlock\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"blockNumber\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64[]\",\"internalType\":\"uint64[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getMemberCount\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getMembers\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getMinimumSlashableStake\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"operators\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"futureBlock\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[{\"name\":\"slashableStake\",\"type\":\"uint256[][]\",\"internalType\":\"uint256[][]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getOperatorSetCount\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getRegisteredSets\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple[]\",\"internalType\":\"structOperatorSet[]\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getStrategiesInOperatorSet\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getStrategyAllocations\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple[]\",\"internalType\":\"structOperatorSet[]\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"\",\"type\":\"tuple[]\",\"internalType\":\"structIAllocationManagerTypes.Allocation[]\",\"components\":[{\"name\":\"currentMagnitude\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"pendingDiff\",\"type\":\"int128\",\"internalType\":\"int128\"},{\"name\":\"effectBlock\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"initialOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"initialPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"isMemberOfOperatorSet\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isOperatorSet\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isOperatorSlashable\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"modifyAllocations\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"params\",\"type\":\"tuple[]\",\"internalType\":\"structIAllocationManagerTypes.AllocateParams[]\",\"components\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"newMagnitudes\",\"type\":\"uint64[]\",\"internalType\":\"uint64[]\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"pauseAll\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[{\"name\":\"index\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pauserRegistry\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"permissionController\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIPermissionController\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"registerForOperatorSets\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"params\",\"type\":\"tuple\",\"internalType\":\"structIAllocationManagerTypes.RegisterParams\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetIds\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"removeStrategiesFromOperatorSet\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetId\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setAVSRegistrar\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"registrar\",\"type\":\"address\",\"internalType\":\"contractIAVSRegistrar\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setAllocationDelay\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"delay\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"slashOperator\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"params\",\"type\":\"tuple\",\"internalType\":\"structIAllocationManagerTypes.SlashingParams\",\"components\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetId\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"wadsToSlash\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"},{\"name\":\"description\",\"type\":\"string\",\"internalType\":\"string\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"updateAVSMetadataURI\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"metadataURI\",\"type\":\"string\",\"internalType\":\"string\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"AVSMetadataURIUpdated\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"metadataURI\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"AVSRegistrarSet\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"registrar\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIAVSRegistrar\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"AllocationDelaySet\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"delay\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"},{\"name\":\"effectBlock\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"AllocationUpdated\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"magnitude\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"effectBlock\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"EncumberedMagnitudeUpdated\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"encumberedMagnitude\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"MaxMagnitudeUpdated\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"maxMagnitude\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorAddedToOperatorSet\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorRemovedFromOperatorSet\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorSetCreated\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorSlashed\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"strategies\",\"type\":\"address[]\",\"indexed\":false,\"internalType\":\"contractIStrategy[]\"},{\"name\":\"wadSlashed\",\"type\":\"uint256[]\",\"indexed\":false,\"internalType\":\"uint256[]\"},{\"name\":\"description\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StrategyAddedToOperatorSet\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StrategyRemovedFromOperatorSet\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"AlreadyMemberOfSet\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"CurrentlyPaused\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"Empty\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InputAddressZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InputArrayLengthMismatch\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InsufficientMagnitude\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidCaller\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidNewPausedStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidOperator\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidOperatorSet\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidPermissions\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidSnapshotOrdering\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidWadToSlash\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ModificationAlreadyPending\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotMemberOfSet\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyPauser\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyUnpauser\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OperatorNotSlashable\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OutOfBounds\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SameMagnitude\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StrategiesMustBeInAscendingOrder\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StrategyAlreadyInOperatorSet\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StrategyNotInOperatorSet\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"UninitializedAllocationDelay\",\"inputs\":[]}]", + Bin: "0x610120604052348015610010575f5ffd5b50604051615bc3380380615bc383398101604081905261002f91610180565b82858383876001600160a01b03811661005b576040516339b190bb60e11b815260040160405180910390fd5b6001600160a01b0390811660805292831660a05263ffffffff91821660c0521660e052166101005261008b610095565b50505050506101e9565b5f54610100900460ff16156101005760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff9081161461014f575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b0381168114610165575f5ffd5b50565b805163ffffffff8116811461017b575f5ffd5b919050565b5f5f5f5f5f60a08688031215610194575f5ffd5b855161019f81610151565b60208701519095506101b081610151565b60408701519094506101c181610151565b92506101cf60608701610168565b91506101dd60808701610168565b90509295509295909350565b60805160a05160c05160e0516101005161594961027a5f395f818161043501526133f701525f81816105840152613c4701525f818161034701528181611f37015261262501525f81816107030152818161146e01528181611ad401528181611b3e015281816128ec01526134d601525f81816105ab0152818161082901528181611be3015261306e01526159495ff3fe608060405234801561000f575f5ffd5b5060043610610297575f3560e01c80636e3492b511610161578063adc2e3d9116100ca578063cd6dc68711610084578063cd6dc687146106d8578063d3d96ff4146106eb578063df5cf723146106fe578063f2fde38b14610725578063f605ce0814610738578063fabc1cbc1461074b575f5ffd5b8063adc2e3d91461064a578063b2447af71461065d578063b66bd98914610670578063b9fbaed114610683578063ba1a84e5146106b2578063c221d8ae146106c5575f5ffd5b80638ce648541161011b5780638ce64854146105cd5780638da5cb5b146105ed57806394d7d00c146105fe578063952899ee14610611578063a9333ec814610624578063a982182114610637575f5ffd5b80636e3492b51461053e5780636e875dba14610551578063715018a61461056457806379ae50cd1461056c5780637bc1ef611461057f578063886f1195146105a6575f5ffd5b80634177a87c1161020357806356c483e6116101bd57806356c483e6146104b0578063595c6a67146104c35780635ac86ab7146104cb5780635c975abb146104ee578063670d3ba2146105005780636cfb448114610513575f5ffd5b80634177a87c146104105780634657e26a146104305780634a10ffe5146104575780634b5046ef1461047757806350feea201461048a578063547afb871461049d575f5ffd5b80632981eb77116102545780632981eb77146103425780632b453a9a1461037e5780632bab2c4a1461039e578063304c10cd146103b157806336352057146103dc57806340120dab146103ef575f5ffd5b806310e1b9b81461029b5780631352c3e6146102c4578063136439dd146102e757806315fe5028146102fc578063260dc7581461031c578063261f84e01461032f575b5f5ffd5b6102ae6102a936600461480d565b61075e565b6040516102bb9190614854565b60405180910390f35b6102d76102d2366004614887565b610799565b60405190151581526020016102bb565b6102fa6102f53660046148bb565b610814565b005b61030f61030a3660046148d2565b6108e9565b6040516102bb9190614950565b6102d761032a366004614962565b610a00565b6102fa61033d3660046149bc565b610a31565b6103697f000000000000000000000000000000000000000000000000000000000000000081565b60405163ffffffff90911681526020016102bb565b61039161038c366004614aa1565b610cd4565b6040516102bb9190614b44565b6103916103ac366004614ba7565b610cea565b6103c46103bf3660046148d2565b610d89565b6040516001600160a01b0390911681526020016102bb565b6102fa6103ea366004614c2b565b610db8565b6104026103fd366004614c7d565b6115c2565b6040516102bb929190614d0a565b61042361041e366004614962565b61173d565b6040516102bb9190614d67565b6103c47f000000000000000000000000000000000000000000000000000000000000000081565b61046a610465366004614d79565b611761565b6040516102bb9190614dbc565b6102fa610485366004614e07565b611809565b6102fa610498366004614e87565b6118c3565b61046a6104ab366004614ee5565b611a21565b6102fa6104be366004614f27565b611ac9565b6102fa611bce565b6102d76104d9366004614f51565b606654600160ff9092169190911b9081161490565b6066545b6040519081526020016102bb565b6102d761050e366004614887565b611c7d565b610526610521366004614c7d565b611c8e565b6040516001600160401b0390911681526020016102bb565b6102fa61054c366004614f87565b611ca3565b61042361055f366004614962565b612073565b6102fa612084565b61030f61057a3660046148d2565b612095565b6103697f000000000000000000000000000000000000000000000000000000000000000081565b6103c47f000000000000000000000000000000000000000000000000000000000000000081565b6105e06105db366004614fb8565b61216f565b6040516102bb9190614ffb565b6033546001600160a01b03166103c4565b61046a61060c36600461500d565b61222b565b6102fa61061f366004615068565b612317565b610526610632366004614c7d565b6127de565b6102fa610645366004615211565b61280d565b6102fa61065836600461528f565b61287d565b6104f261066b366004614962565b612bcc565b6102fa61067e366004614e87565b612bee565b6106966106913660046148d2565b612d48565b60408051921515835263ffffffff9091166020830152016102bb565b6104f26106c03660046148d2565b612de2565b6104236106d3366004614887565b612e02565b6102fa6106e63660046152d1565b612e2b565b6102fa6106f9366004614c7d565b612f48565b6103c47f000000000000000000000000000000000000000000000000000000000000000081565b6102fa6107333660046148d2565b612fe7565b610526610746366004614c7d565b613060565b6102fa6107593660046148bb565b61306c565b604080516060810182525f808252602082018190529181018290529061078d8561078786613182565b856131e5565b925050505b9392505050565b6001600160a01b0382165f908152609e602052604081208190816107bc85613182565b815260208082019290925260409081015f2081518083019092525460ff8116151580835261010090910463ffffffff169282019290925291508061080a5750806020015163ffffffff164311155b9150505b92915050565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa158015610876573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061089a91906152fb565b6108b757604051631d77d47760e21b815260040160405180910390fd5b60665481811681146108dc5760405163c61dca5d60e01b815260040160405180910390fd5b6108e582613351565b5050565b6001600160a01b0381165f908152609d602052604081206060919061090d9061338e565b90505f816001600160401b0381111561092857610928614731565b60405190808252806020026020018201604052801561096c57816020015b604080518082019091525f80825260208201528152602001906001900390816109465790505b5090505f5b828110156109f8576001600160a01b0385165f908152609d602052604090206109d39061099e9083613397565b604080518082019091525f80825260208201525060408051808201909152606082901c815263ffffffff909116602082015290565b8282815181106109e5576109e561531a565b6020908102919091010152600101610971565b509392505050565b60208082015182516001600160a01b03165f90815260989092526040822061080e9163ffffffff908116906133a216565b82610a3b816133b9565b610a585760405163932d94f760e01b815260040160405180910390fd5b5f5b82811015610ccd575f6040518060400160405280876001600160a01b03168152602001868685818110610a8f57610a8f61531a565b9050602002810190610aa1919061532e565b610aaf90602081019061534c565b63ffffffff168152509050610af9816020015163ffffffff1660985f896001600160a01b03166001600160a01b031681526020019081526020015f2061346390919063ffffffff16565b610b1657604051631fb1705560e21b815260040160405180910390fd5b7f31629285ead2335ae0933f86ed2ae63321f7af77b4e6eaabc42c057880977e6c6040518060400160405280886001600160a01b03168152602001836020015163ffffffff16815250604051610b6c9190615365565b60405180910390a15f610b7e82613182565b90505f5b868685818110610b9457610b9461531a565b9050602002810190610ba6919061532e565b610bb4906020810190615373565b9050811015610cc257610c2a878786818110610bd257610bd261531a565b9050602002810190610be4919061532e565b610bf2906020810190615373565b83818110610c0257610c0261531a565b9050602002016020810190610c1791906148d2565b5f8481526099602052604090209061346e565b507f7ab260fe0af193db5f4986770d831bda4ea46099dc817e8b6716dcae8af8e88b83888887818110610c5f57610c5f61531a565b9050602002810190610c71919061532e565b610c7f906020810190615373565b84818110610c8f57610c8f61531a565b9050602002016020810190610ca491906148d2565b604051610cb29291906153b8565b60405180910390a1600101610b82565b505050600101610a5a565b5050505050565b6060610ce284848443613482565b949350505050565b6060610cf885858585613482565b90505f5b8451811015610d8057610d28858281518110610d1a57610d1a61531a565b602002602001015187610799565b610d78575f5b8451811015610d76575f838381518110610d4a57610d4a61531a565b60200260200101518281518110610d6357610d6361531a565b6020908102919091010152600101610d2e565b505b600101610cfc565b50949350505050565b6001600160a01b038082165f908152609760205260408120549091168015610db15780610792565b5090919050565b606654600190600290811603610de15760405163840a48d560e01b815260040160405180910390fd5b82610deb816133b9565b610e085760405163932d94f760e01b815260040160405180910390fd5b5f6040518060400160405280866001600160a01b03168152602001856020016020810190610e36919061534c565b63ffffffff1690529050610e4d6060850185615373565b9050610e5c6040860186615373565b905014610e7c576040516343714afd60e01b815260040160405180910390fd5b60208082015182516001600160a01b03165f90815260989092526040909120610eae9163ffffffff908116906133a216565b610ecb57604051631fb1705560e21b815260040160405180910390fd5b610ee1610edb60208601866148d2565b82610799565b610efe5760405163ebbff49760e01b815260040160405180910390fd5b5f610f0c6040860186615373565b90506001600160401b03811115610f2557610f25614731565b604051908082528060200260200182016040528015610f4e578160200160208202803683370190505b5090505f5b610f606040870187615373565b905081101561155457801580610ff35750610f7e6040870187615373565b610f896001846153f2565b818110610f9857610f9861531a565b9050602002016020810190610fad91906148d2565b6001600160a01b0316610fc36040880188615373565b83818110610fd357610fd361531a565b9050602002016020810190610fe891906148d2565b6001600160a01b0316115b61101057604051639f1c805360e01b815260040160405180910390fd5b61101d6060870187615373565b8281811061102d5761102d61531a565b905060200201355f10801561106d5750670de0b6b3a76400006110536060880188615373565b838181106110635761106361531a565b9050602002013511155b61108a57604051631353603160e01b815260040160405180910390fd5b6110e661109a6040880188615373565b838181106110aa576110aa61531a565b90506020020160208101906110bf91906148d2565b60995f6110cb87613182565b81526020019081526020015f2061376f90919063ffffffff16565b611103576040516331bc342760e11b815260040160405180910390fd5b5f8061115561111560208a018a6148d2565b61111e87613182565b61112b60408c018c615373565b8781811061113b5761113b61531a565b905060200201602081019061115091906148d2565b6131e5565b805191935091506001600160401b03165f0361117257505061154c565b5f6111ad61118360608b018b615373565b868181106111935761119361531a565b85516001600160401b031692602090910201359050613790565b83519091506111c86001600160401b038084169083166137a6565b8686815181106111da576111da61531a565b60200260200101818152505081835f018181516111f79190615405565b6001600160401b0316905250835182908590611214908390615405565b6001600160401b0316905250602084018051839190611234908390615405565b6001600160401b031690525060208301515f600f9190910b121561134c575f61129761126360608d018d615373565b888181106112735761127361531a565b90506020020135856020015161128890615424565b6001600160801b031690613790565b9050806001600160401b0316846020018181516112b49190615448565b600f0b9052507f1487af5418c47ee5ea45ef4a93398668120890774a9e13487e61e9dc3baf76dd6112e860208d018d6148d2565b896112f660408f018f615373565b8a8181106113065761130661531a565b905060200201602081019061131b91906148d2565b61132c885f015189602001516137ba565b8860400151604051611342959493929190615475565b60405180910390a1505b61139e61135c60208c018c6148d2565b61136589613182565b61137260408e018e615373565b898181106113825761138261531a565b905060200201602081019061139791906148d2565b87876137ce565b7f1487af5418c47ee5ea45ef4a93398668120890774a9e13487e61e9dc3baf76dd6113cc60208c018c6148d2565b886113da60408e018e615373565b898181106113ea576113ea61531a565b90506020020160208101906113ff91906148d2565b865160405161141394939291904390615475565b60405180910390a161146461142b60208c018c6148d2565b61143860408d018d615373565b888181106114485761144861531a565b905060200201602081019061145d91906148d2565b8651613a0e565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001663601bb36f6114a060208d018d6148d2565b6114ad60408e018e615373565b898181106114bd576114bd61531a565b90506020020160208101906114d291906148d2565b875160405160e085901b6001600160e01b03191681526001600160a01b0393841660048201529290911660248301526001600160401b0380861660448401521660648201526084015f604051808303815f87803b158015611531575f5ffd5b505af1158015611543573d5f5f3e3d5ffd5b50505050505050505b600101610f53565b507f80969ad29428d6797ee7aad084f9e4a42a82fc506dcd2ca3b6fb431f85ccebe561158360208701876148d2565b836115916040890189615373565b8561159f60808c018c6154c6565b6040516115b29796959493929190615530565b60405180910390a1505050505050565b6001600160a01b0382165f908152609d6020526040812060609182916115e79061338e565b90505f816001600160401b0381111561160257611602614731565b60405190808252806020026020018201604052801561164657816020015b604080518082019091525f80825260208201528152602001906001900390816116205790505b5090505f826001600160401b0381111561166257611662614731565b6040519080825280602002602001820160405280156116ab57816020015b604080516060810182525f80825260208083018290529282015282525f199092019101816116805790505b5090505f5b8381101561172e576001600160a01b0388165f908152609d602052604081206116dd9061099e9084613397565b9050808483815181106116f2576116f261531a565b602002602001018190525061170889828a61075e565b83838151811061171a5761171a61531a565b6020908102919091010152506001016116b0565b509093509150505b9250929050565b60605f61079260995f61174f86613182565b81526020019081526020015f20613a90565b60605f83516001600160401b0381111561177d5761177d614731565b6040519080825280602002602001820160405280156117a6578160200160208202803683370190505b5090505f5b84518110156109f8576117d78582815181106117c9576117c961531a565b6020026020010151856127de565b8282815181106117e9576117e961531a565b6001600160401b03909216602092830291909101909101526001016117ab565b6066545f906001908116036118315760405163840a48d560e01b815260040160405180910390fd5b838214611851576040516343714afd60e01b815260040160405180910390fd5b5f5b848110156118ba576118b2878787848181106118715761187161531a565b905060200201602081019061188691906148d2565b8686858181106118985761189861531a565b90506020020160208101906118ad91906155c6565b613a9c565b600101611853565b50505050505050565b836118cd816133b9565b6118ea5760405163932d94f760e01b815260040160405180910390fd5b604080518082019091526001600160a01b038616815263ffffffff851660208201525f61191682613182565b9050611957826020015163ffffffff1660985f8a6001600160a01b03166001600160a01b031681526020019081526020015f206133a290919063ffffffff16565b61197457604051631fb1705560e21b815260040160405180910390fd5b5f5b84811015611a1757611993868683818110610c0257610c0261531a565b6119b05760405163585cfb2f60e01b815260040160405180910390fd5b7f7ab260fe0af193db5f4986770d831bda4ea46099dc817e8b6716dcae8af8e88b838787848181106119e4576119e461531a565b90506020020160208101906119f991906148d2565b604051611a079291906153b8565b60405180910390a1600101611976565b5050505050505050565b60605f82516001600160401b03811115611a3d57611a3d614731565b604051908082528060200260200182016040528015611a66578160200160208202803683370190505b5090505f5b83518110156109f857611a9785858381518110611a8a57611a8a61531a565b60200260200101516127de565b828281518110611aa957611aa961531a565b6001600160401b0390921660209283029190910190910152600101611a6b565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614611bc457611b02826133b9565b611b1f576040516348f5c3ed60e01b815260040160405180910390fd5b6040516336b87bd760e11b81526001600160a01b0383811660048301527f00000000000000000000000000000000000000000000000000000000000000001690636d70f7ae90602401602060405180830381865afa158015611b83573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611ba791906152fb565b611bc45760405163ccea9e6f60e01b815260040160405180910390fd5b6108e58282613ba0565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa158015611c30573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611c5491906152fb565b611c7157604051631d77d47760e21b815260040160405180910390fd5b611c7b5f19613351565b565b5f61079283609a5f6110cb86613182565b5f5f611c9a8484613d4c565b95945050505050565b606654600290600490811603611ccc5760405163840a48d560e01b815260040160405180910390fd5b611ce1611cdc60208401846148d2565b6133b9565b80611cfa5750611cfa611cdc60408401602085016148d2565b611d17576040516348f5c3ed60e01b815260040160405180910390fd5b5f5b611d266040840184615373565b9050811015611fe8575f6040518060400160405280856020016020810190611d4e91906148d2565b6001600160a01b03168152602001611d696040870187615373565b85818110611d7957611d7961531a565b9050602002016020810190611d8e919061534c565b63ffffffff168152509050611ddb816020015163ffffffff1660985f876020016020810190611dbd91906148d2565b6001600160a01b0316815260208101919091526040015f20906133a2565b611df857604051631fb1705560e21b815260040160405180910390fd5b609e5f611e0860208701876148d2565b6001600160a01b03166001600160a01b031681526020019081526020015f205f611e3183613182565b815260208101919091526040015f205460ff16611e61576040516325131d4f60e01b815260040160405180910390fd5b611e9b611e6d82613182565b609c5f611e7d60208901896148d2565b6001600160a01b0316815260208101919091526040015f2090613ebb565b50611ed3611eac60208601866148d2565b609a5f611eb885613182565b81526020019081526020015f20613ec690919063ffffffff16565b50611ee160208501856148d2565b6001600160a01b03167fad34c3070be1dffbcaa499d000ba2b8d9848aefcac3059df245dd95c4ece14fe82604051611f199190615365565b60405180910390a2604080518082019091525f815260208101611f5c7f0000000000000000000000000000000000000000000000000000000000000000436155e7565b63ffffffff169052609e5f611f7460208801886148d2565b6001600160a01b03166001600160a01b031681526020019081526020015f205f611f9d84613182565b81526020808201929092526040015f2082518154939092015163ffffffff166101000264ffffffff00199215159290921664ffffffffff199093169290921717905550600101611d19565b50611ffc6103bf60408401602085016148d2565b6001600160a01b0316639d8e0c2361201760208501856148d2565b6120246040860186615373565b6040518463ffffffff1660e01b81526004016120429392919061563c565b5f604051808303815f87803b158015612059575f5ffd5b505af192505050801561206a575060015b156108e5575050565b606061080e609a5f61174f85613182565b61208c613eda565b611c7b5f613f34565b6001600160a01b0381165f908152609c60205260408120606091906120b99061338e565b90505f816001600160401b038111156120d4576120d4614731565b60405190808252806020026020018201604052801561211857816020015b604080518082019091525f80825260208201528152602001906001900390816120f25790505b5090505f5b828110156109f8576001600160a01b0385165f908152609c6020526040902061214a9061099e9083613397565b82828151811061215c5761215c61531a565b602090810291909101015260010161211d565b60605f84516001600160401b0381111561218b5761218b614731565b6040519080825280602002602001820160405280156121d457816020015b604080516060810182525f80825260208083018290529282015282525f199092019101816121a95790505b5090505f5b8551811015610d80576122068682815181106121f7576121f761531a565b6020026020010151868661075e565b8282815181106122185761221861531a565b60209081029190910101526001016121d9565b60605f83516001600160401b0381111561224757612247614731565b604051908082528060200260200182016040528015612270578160200160208202803683370190505b5090505f5b8451811015610d80576001600160a01b0386165f90815260a16020526040812086516122e5928792918990869081106122b0576122b061531a565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020015f20613f8590919063ffffffff16565b8282815181106122f7576122f761531a565b6001600160401b0390921660209283029190910190910152600101612275565b6066545f9060019081160361233f5760405163840a48d560e01b815260040160405180910390fd5b612348836133b9565b612365576040516348f5c3ed60e01b815260040160405180910390fd5b5f5f5f61237186612d48565b91509150816123935760405163fa55fc8160e01b815260040160405180910390fd5b91505f90505b8351811015610ccd578381815181106123b4576123b461531a565b602002602001015160400151518482815181106123d3576123d361531a565b60200260200101516020015151146123fe576040516343714afd60e01b815260040160405180910390fd5b5f8482815181106124115761241161531a565b602090810291909101810151518082015181516001600160a01b03165f908152609890935260409092209092506124519163ffffffff908116906133a216565b61246e57604051631fb1705560e21b815260040160405180910390fd5b5f6124798783610799565b90505f5b86848151811061248f5761248f61531a565b602002602001015160200151518110156127d3575f8785815181106124b6576124b661531a565b60200260200101516020015182815181106124d3576124d361531a565b602002602001015190506124ea898261ffff613a9c565b5f5f6124f98b61078788613182565b915091508060200151600f0b5f1461252457604051630d8fcbe360e41b815260040160405180910390fd5b5f61253187858489613f99565b9050612576825f01518c8a8151811061254c5761254c61531a565b60200260200101516040015187815181106125695761256961531a565b6020026020010151613fcf565b600f0b602083018190525f0361259f57604051634606179360e11b815260040160405180910390fd5b5f8260200151600f0b12156126e3578015612665576126206125c088613182565b6001600160a01b03808f165f90815260a360209081526040808320938a16835292905220908154600160801b90819004600f0b5f818152600180860160205260409091209390935583546001600160801b03908116939091011602179055565b61264a7f0000000000000000000000000000000000000000000000000000000000000000436155e7565b6126559060016155e7565b63ffffffff166040830152612750565b612677836020015183602001516137ba565b6001600160401b031660208401528a518b90899081106126995761269961531a565b60200260200101516040015185815181106126b6576126b661531a565b6020908102919091018101516001600160401b031683525f9083015263ffffffff43166040830152612750565b5f8260200151600f0b131561275057612704836020015183602001516137ba565b6001600160401b03908116602085018190528451909116101561273a57604051636c9be0bf60e01b815260040160405180910390fd5b61274489436155e7565b63ffffffff1660408301525b6127658c61275d89613182565b8686866137ce565b7f1487af5418c47ee5ea45ef4a93398668120890774a9e13487e61e9dc3baf76dd8c61279361099e8a613182565b866127a5865f015187602001516137ba565b86604001516040516127bb959493929190615475565b60405180910390a150506001909201915061247d9050565b505050600101612399565b6001600160a01b038083165f90815260a160209081526040808320938516835292905290812061079290613fe6565b82612817816133b9565b6128345760405163932d94f760e01b815260040160405180910390fd5b836001600160a01b03167fa89c1dc243d8908a96dd84944bcc97d6bc6ac00dd78e20621576be6a3c943713848460405161286f929190615660565b60405180910390a250505050565b6066546002906004908116036128a65760405163840a48d560e01b815260040160405180910390fd5b826128b0816133b9565b6128cd5760405163932d94f760e01b815260040160405180910390fd5b6040516336b87bd760e11b81526001600160a01b0385811660048301527f00000000000000000000000000000000000000000000000000000000000000001690636d70f7ae90602401602060405180830381865afa158015612931573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061295591906152fb565b6129725760405163ccea9e6f60e01b815260040160405180910390fd5b5f5b6129816020850185615373565b9050811015612b4957604080518082019091525f90806129a460208801886148d2565b6001600160a01b031681526020018680602001906129c29190615373565b858181106129d2576129d261531a565b90506020020160208101906129e7919061534c565b63ffffffff90811690915260208083015183516001600160a01b03165f90815260989092526040909120929350612a239291908116906133a216565b612a4057604051631fb1705560e21b815260040160405180910390fd5b612a4a8682610799565b15612a6857604051636c6c6e2760e11b815260040160405180910390fd5b612a91612a7482613182565b6001600160a01b0388165f908152609c6020526040902090613463565b50612abd86609a5f612aa285613182565b81526020019081526020015f2061346e90919063ffffffff16565b50856001600160a01b03167f43232edf9071753d2321e5fa7e018363ee248e5f2142e6c08edd3265bfb4895e82604051612af79190615365565b60405180910390a26001600160a01b0386165f908152609e60205260408120600191612b2284613182565b815260208101919091526040015f20805460ff191691151591909117905550600101612974565b50612b5a6103bf60208501856148d2565b6001600160a01b031663adcf73f785612b766020870187615373565b612b8360408901896154c6565b6040518663ffffffff1660e01b8152600401612ba3959493929190615673565b5f604051808303815f87803b158015612bba575f5ffd5b505af1158015611a17573d5f5f3e3d5ffd5b5f61080e609a5f612bdc85613182565b81526020019081526020015f2061338e565b83612bf8816133b9565b612c155760405163932d94f760e01b815260040160405180910390fd5b6040805180820182526001600160a01b03871680825263ffffffff80881660208085018290525f93845260989052939091209192612c5492916133a216565b612c7157604051631fb1705560e21b815260040160405180910390fd5b5f612c7b82613182565b90505f5b84811015611a1757612cc4868683818110612c9c57612c9c61531a565b9050602002016020810190612cb191906148d2565b5f84815260996020526040902090613ec6565b612ce1576040516331bc342760e11b815260040160405180910390fd5b7f7b4b073d80dcac55a11177d8459ad9f664ceeb91f71f27167bb14f8152a7eeee83878784818110612d1557612d1561531a565b9050602002016020810190612d2a91906148d2565b604051612d389291906153b8565b60405180910390a1600101612c7f565b6001600160a01b0381165f908152609b602090815260408083208151608081018352905463ffffffff80821680845260ff600160201b8404161515958401869052650100000000008304821694840194909452600160481b909104166060820181905284939192919015801590612dc95750826060015163ffffffff164310155b15612dd8575050604081015160015b9590945092505050565b6001600160a01b0381165f90815260986020526040812061080e9061338e565b6001600160a01b0382165f908152609f602052604081206060919061080a908261174f86613182565b5f54610100900460ff1615808015612e4957505f54600160ff909116105b80612e625750303b158015612e6257505f5460ff166001145b612eca5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b5f805460ff191660011790558015612eeb575f805461ff0019166101001790555b612ef482613351565b612efd83613f34565b8015612f43575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498906020015b60405180910390a15b505050565b81612f52816133b9565b612f6f5760405163932d94f760e01b815260040160405180910390fd5b6001600160a01b038381165f90815260976020526040902080546001600160a01b0319169184169190911790557f2ae945c40c44dc0ec263f95609c3fdc6952e0aefa22d6374e44f2c997acedf8583612fc781610d89565b604080516001600160a01b03938416815292909116602083015201612f3a565b612fef613eda565b6001600160a01b0381166130545760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401612ec1565b61305d81613f34565b50565b5f5f610d808484613d4c565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156130c8573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906130ec91906156b6565b6001600160a01b0316336001600160a01b03161461311d5760405163794821ff60e01b815260040160405180910390fd5b606654801982198116146131445760405163c61dca5d60e01b815260040160405180910390fd5b606682905560405182815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c9060200160405180910390a25050565b5f815f0151826020015163ffffffff166040516020016131cd92919060609290921b6bffffffffffffffffffffffff1916825260a01b6001600160a01b031916601482015260200190565b60405160208183030381529060405261080e906156d1565b6040805180820182525f80825260208083018290528351606081018552828152808201839052808501839052845180860186526001600160a01b03898116855260a184528685209088168552909252938220929392819061324590613fe6565b6001600160401b0390811682526001600160a01b038981165f81815260a260209081526040808320948c168084529482528083205486169682019690965291815260a082528481208b8252825284812092815291815290839020835160608101855290549283168152600160401b8304600f0b91810191909152600160c01b90910463ffffffff169181018290529192504310156132e7579092509050613349565b6132f8815f015182602001516137ba565b6001600160401b0316815260208101515f600f9190910b121561333657613327826020015182602001516137ba565b6001600160401b031660208301525b5f60408201819052602082015290925090505b935093915050565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a250565b5f61080e825490565b5f6107928383613ff9565b5f8181526001830160205260408120541515610792565b604051631beb2b9760e31b81526001600160a01b0382811660048301523360248301523060448301525f80356001600160e01b0319166064840152917f00000000000000000000000000000000000000000000000000000000000000009091169063df595cb8906084016020604051808303815f875af115801561343f573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061080e91906152fb565b5f610792838361401f565b5f610792836001600160a01b03841661401f565b606083516001600160401b0381111561349d5761349d614731565b6040519080825280602002602001820160405280156134d057816020015b60608152602001906001900390816134bb5790505b5090505f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663f0e0e67686866040518363ffffffff1660e01b81526004016135229291906156f4565b5f60405180830381865afa15801561353c573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526135639190810190615718565b90505f5b8551811015613765575f8682815181106135835761358361531a565b6020026020010151905085516001600160401b038111156135a6576135a6614731565b6040519080825280602002602001820160405280156135cf578160200160208202803683370190505b508483815181106135e2576135e261531a565b60209081029190910101525f5b865181101561375b575f87828151811061360b5761360b61531a565b6020908102919091018101516001600160a01b038086165f90815260a184526040808220928416825291909352822090925061364690613fe6565b9050806001600160401b03165f0361365f575050613753565b5f61366b858d8561075e565b90508863ffffffff16816040015163ffffffff161115801561369357505f8160200151600f0b125b156136b5576136a9815f015182602001516137ba565b6001600160401b031681525b80515f906136d0906001600160401b039081169085166137a6565b9050613717818989815181106136e8576136e861531a565b602002602001015187815181106137015761370161531a565b602002602001015161406b90919063ffffffff16565b8988815181106137295761372961531a565b602002602001015186815181106137425761374261531a565b602002602001018181525050505050505b6001016135ef565b5050600101613567565b5050949350505050565b6001600160a01b0381165f9081526001830160205260408120541515610792565b5f6107928383670de0b6b3a7640000600161407f565b5f61079283670de0b6b3a7640000846140d8565b5f610792826001600160401b038516615448565b6020808301516001600160a01b038088165f90815260a284526040808220928816825291909352909120546001600160401b0390811691161461389457602082810180516001600160a01b038881165f81815260a286526040808220938a1680835293875290819020805467ffffffffffffffff19166001600160401b0395861617905593518451918252948101919091529216908201527facf9095feb3a370c9cf692421c69ef320d4db5c66e6a7d29c7694eb02364fc559060600160405180910390a15b6001600160a01b038086165f90815260a060209081526040808320888452825280832093871683529281529082902083518154928501519385015163ffffffff16600160c01b0263ffffffff60c01b196001600160801b038616600160401b026001600160c01b03199095166001600160401b03909316929092179390931716919091179055600f0b15613976576001600160a01b0385165f908152609f60209081526040808320878452909152902061394e908461346e565b506001600160a01b0385165f908152609d602052604090206139709085613463565b50610ccd565b80516001600160401b03165f03610ccd576001600160a01b0385165f908152609f6020908152604080832087845290915290206139b39084613ec6565b506001600160a01b0385165f908152609f6020908152604080832087845290915290206139df9061338e565b5f03610ccd576001600160a01b0385165f908152609d60205260409020613a069085613ebb565b505050505050565b6001600160a01b038084165f90815260a160209081526040808320938616835292905220613a3d9043836141bd565b604080516001600160a01b038086168252841660208201526001600160401b038316918101919091527f1c6458079a41077d003c11faf9bf097e693bd67979e4e6500bac7b29db779b5c90606001612f3a565b60605f610792836141d1565b6001600160a01b038381165f90815260a360209081526040808320938616835292905290812054600f81810b600160801b909204900b035b5f81118015613ae657508261ffff1682105b15610ccd576001600160a01b038086165f90815260a3602090815260408083209388168352929052908120613b1a9061422a565b90505f5f613b298884896131e5565b91509150806040015163ffffffff16431015613b4757505050610ccd565b613b5488848985856137ce565b6001600160a01b038089165f90815260a360209081526040808320938b16835292905220613b819061427c565b50613b8b85615824565b9450613b968461583c565b9350505050613ad4565b6001600160a01b0382165f908152609b60209081526040918290208251608081018452905463ffffffff808216835260ff600160201b830416151593830193909352650100000000008104831693820193909352600160481b909204166060820181905215801590613c1c5750806060015163ffffffff164310155b15613c3657604081015163ffffffff168152600160208201525b63ffffffff82166040820152613c6c7f0000000000000000000000000000000000000000000000000000000000000000436155e7565b613c779060016155e7565b63ffffffff90811660608381019182526001600160a01b0386165f818152609b602090815260409182902087518154838a0151858b01519851928a1664ffffffffff1990921691909117600160201b91151591909102176cffffffffffffffff0000000000191665010000000000978916979097026cffffffff000000000000000000191696909617600160481b968816968702179055815192835294871694820194909452928301919091527f4e85751d6331506c6c62335f207eb31f12a61e570f34f5c17640308785c6d4db9101612f3a565b6001600160a01b038281165f81815260a2602090815260408083209486168084529482528083205493835260a38252808320948352939052918220546001600160401b039091169190600f81810b600160801b909204900b03815b81811015613e77576001600160a01b038087165f90815260a3602090815260408083209389168352929052908120613ddf90836142f9565b6001600160a01b038881165f90815260a0602090815260408083208584528252808320938b16835292815290829020825160608101845290546001600160401b0381168252600160401b8104600f0b92820192909252600160c01b90910463ffffffff16918101829052919250431015613e5a575050613e77565b613e688682602001516137ba565b95505050806001019050613da7565b506001600160a01b038086165f90815260a1602090815260408083209388168352929052208390613ea790613fe6565b613eb19190615405565b9150509250929050565b5f6107928383614368565b5f610792836001600160a01b038416614368565b6033546001600160a01b03163314611c7b5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401612ec1565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b5f6107928383670de0b6b3a764000061444b565b5f613faa8460995f6110cb89613182565b8015613fb35750815b8015611c9a57505090516001600160401b031615159392505050565b5f6107926001600160401b03808516908416615851565b5f61080e82670de0b6b3a76400006144a0565b5f825f01828154811061400e5761400e61531a565b905f5260205f200154905092915050565b5f81815260018301602052604081205461406457508154600181810184555f84815260208082209093018490558454848252828601909352604090209190915561080e565b505f61080e565b5f6107928383670de0b6b3a76400006140d8565b5f5f61408c8686866140d8565b905060018360028111156140a2576140a261587e565b1480156140be57505f84806140b9576140b9615892565b868809115b15611c9a576140ce6001826158a6565b9695505050505050565b5f80805f19858709858702925082811083820303915050805f0361410f5783828161410557614105615892565b0492505050610792565b8084116141565760405162461bcd60e51b81526020600482015260156024820152744d6174683a206d756c446976206f766572666c6f7760581b6044820152606401612ec1565b5f8486880960026001871981018816978890046003810283188082028403028082028403028082028403028082028403028082028403029081029092039091025f889003889004909101858311909403939093029303949094049190911702949350505050565b612f4383836001600160401b0384166144d7565b6060815f0180548060200260200160405190810160405280929190818152602001828054801561421e57602002820191905f5260205f20905b81548152602001906001019080831161420a575b50505050509050919050565b5f6142448254600f81810b600160801b909204900b131590565b1561426257604051631ed9509560e11b815260040160405180910390fd5b508054600f0b5f9081526001909101602052604090205490565b5f6142968254600f81810b600160801b909204900b131590565b156142b457604051631ed9509560e11b815260040160405180910390fd5b508054600f0b5f818152600180840160205260408220805492905583546fffffffffffffffffffffffffffffffff191692016001600160801b03169190911790915590565b5f5f61431b614307846145da565b85546143169190600f0b6158b9565b614647565b8454909150600160801b9004600f90810b9082900b1261434e57604051632d0483c560e21b815260040160405180910390fd5b600f0b5f9081526001939093016020525050604090205490565b5f8181526001830160205260408120548015614442575f61438a6001836153f2565b85549091505f9061439d906001906153f2565b90508181146143fc575f865f0182815481106143bb576143bb61531a565b905f5260205f200154905080875f0184815481106143db576143db61531a565b5f918252602080832090910192909255918252600188019052604090208390555b855486908061440d5761440d6158e0565b600190038181905f5260205f20015f90559055856001015f8681526020019081526020015f205f90556001935050505061080e565b5f91505061080e565b82545f908161445c868683856146b0565b9050801561449657614480866144736001846153f2565b5f91825260209091200190565b54600160201b90046001600160e01b031661078d565b5091949350505050565b81545f9080156144cf576144b9846144736001846153f2565b54600160201b90046001600160e01b031661080a565b509092915050565b8254801561458d575f6144ef856144736001856153f2565b60408051808201909152905463ffffffff808216808452600160201b9092046001600160e01b0316602084015291925090851610156145415760405163151b8e3f60e11b815260040160405180910390fd5b805163ffffffff80861691160361458b5782614562866144736001866153f2565b80546001600160e01b0392909216600160201b0263ffffffff9092169190911790555050505050565b505b506040805180820190915263ffffffff92831681526001600160e01b03918216602080830191825285546001810187555f968752952091519051909216600160201b029190921617910155565b5f6001600160ff1b038211156146435760405162461bcd60e51b815260206004820152602860248201527f53616665436173743a2076616c756520646f65736e27742066697420696e2061604482015267371034b73a191a9b60c11b6064820152608401612ec1565b5090565b80600f81900b81146146ab5760405162461bcd60e51b815260206004820152602760248201527f53616665436173743a2076616c756520646f65736e27742066697420696e20316044820152663238206269747360c81b6064820152608401612ec1565b919050565b5f5b818310156109f8575f6146c58484614703565b5f8781526020902090915063ffffffff86169082015463ffffffff1611156146ef578092506146fd565b6146fa8160016158a6565b93505b506146b2565b5f61471160028484186158f4565b610792908484166158a6565b6001600160a01b038116811461305d575f5ffd5b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b038111828210171561476757614767614731565b60405290565b604051601f8201601f191681016001600160401b038111828210171561479557614795614731565b604052919050565b803563ffffffff811681146146ab575f5ffd5b5f604082840312156147c0575f5ffd5b604080519081016001600160401b03811182821017156147e2576147e2614731565b60405290508082356147f38161471d565b81526148016020840161479d565b60208201525092915050565b5f5f5f6080848603121561481f575f5ffd5b833561482a8161471d565b925061483985602086016147b0565b915060608401356148498161471d565b809150509250925092565b81516001600160401b03168152602080830151600f0b9082015260408083015163ffffffff16908201526060810161080e565b5f5f60608385031215614898575f5ffd5b82356148a38161471d565b91506148b284602085016147b0565b90509250929050565b5f602082840312156148cb575f5ffd5b5035919050565b5f602082840312156148e2575f5ffd5b81356107928161471d565b80516001600160a01b0316825260209081015163ffffffff16910152565b5f8151808452602084019350602083015f5b82811015614946576149308683516148ed565b604095909501946020919091019060010161491d565b5093949350505050565b602081525f610792602083018461490b565b5f60408284031215614972575f5ffd5b61079283836147b0565b5f5f83601f84011261498c575f5ffd5b5081356001600160401b038111156149a2575f5ffd5b6020830191508360208260051b8501011115611736575f5ffd5b5f5f5f604084860312156149ce575f5ffd5b83356149d98161471d565b925060208401356001600160401b038111156149f3575f5ffd5b6149ff8682870161497c565b9497909650939450505050565b5f6001600160401b03821115614a2457614a24614731565b5060051b60200190565b5f82601f830112614a3d575f5ffd5b8135614a50614a4b82614a0c565b61476d565b8082825260208201915060208360051b860101925085831115614a71575f5ffd5b602085015b83811015614a97578035614a898161471d565b835260209283019201614a76565b5095945050505050565b5f5f5f60808486031215614ab3575f5ffd5b614abd85856147b0565b925060408401356001600160401b03811115614ad7575f5ffd5b614ae386828701614a2e565b92505060608401356001600160401b03811115614afe575f5ffd5b614b0a86828701614a2e565b9150509250925092565b5f8151808452602084019350602083015f5b82811015614946578151865260209586019590910190600101614b26565b5f602082016020835280845180835260408501915060408160051b8601019250602086015f5b82811015614b9b57603f19878603018452614b86858351614b14565b94506020938401939190910190600101614b6a565b50929695505050505050565b5f5f5f5f60a08587031215614bba575f5ffd5b614bc486866147b0565b935060408501356001600160401b03811115614bde575f5ffd5b614bea87828801614a2e565b93505060608501356001600160401b03811115614c05575f5ffd5b614c1187828801614a2e565b925050614c206080860161479d565b905092959194509250565b5f5f60408385031215614c3c575f5ffd5b8235614c478161471d565b915060208301356001600160401b03811115614c61575f5ffd5b830160a08186031215614c72575f5ffd5b809150509250929050565b5f5f60408385031215614c8e575f5ffd5b8235614c998161471d565b91506020830135614c728161471d565b5f8151808452602084019350602083015f5b8281101561494657614cf486835180516001600160401b03168252602080820151600f0b9083015260409081015163ffffffff16910152565b6060959095019460209190910190600101614cbb565b604081525f614d1c604083018561490b565b8281036020840152611c9a8185614ca9565b5f8151808452602084019350602083015f5b828110156149465781516001600160a01b0316865260209586019590910190600101614d40565b602081525f6107926020830184614d2e565b5f5f60408385031215614d8a575f5ffd5b82356001600160401b03811115614d9f575f5ffd5b614dab85828601614a2e565b9250506020830135614c728161471d565b602080825282518282018190525f918401906040840190835b81811015614dfc5783516001600160401b0316835260209384019390920191600101614dd5565b509095945050505050565b5f5f5f5f5f60608688031215614e1b575f5ffd5b8535614e268161471d565b945060208601356001600160401b03811115614e40575f5ffd5b614e4c8882890161497c565b90955093505060408601356001600160401b03811115614e6a575f5ffd5b614e768882890161497c565b969995985093965092949392505050565b5f5f5f5f60608587031215614e9a575f5ffd5b8435614ea58161471d565b9350614eb36020860161479d565b925060408501356001600160401b03811115614ecd575f5ffd5b614ed98782880161497c565b95989497509550505050565b5f5f60408385031215614ef6575f5ffd5b8235614f018161471d565b915060208301356001600160401b03811115614f1b575f5ffd5b613eb185828601614a2e565b5f5f60408385031215614f38575f5ffd5b8235614f438161471d565b91506148b26020840161479d565b5f60208284031215614f61575f5ffd5b813560ff81168114610792575f5ffd5b5f60608284031215614f81575f5ffd5b50919050565b5f60208284031215614f97575f5ffd5b81356001600160401b03811115614fac575f5ffd5b61080a84828501614f71565b5f5f5f60808486031215614fca575f5ffd5b83356001600160401b03811115614fdf575f5ffd5b614feb86828701614a2e565b93505061483985602086016147b0565b602081525f6107926020830184614ca9565b5f5f5f6060848603121561501f575f5ffd5b833561502a8161471d565b925060208401356001600160401b03811115615044575f5ffd5b61505086828701614a2e565b92505061505f6040850161479d565b90509250925092565b5f5f60408385031215615079575f5ffd5b82356150848161471d565b915060208301356001600160401b0381111561509e575f5ffd5b8301601f810185136150ae575f5ffd5b80356150bc614a4b82614a0c565b8082825260208201915060208360051b8501019250878311156150dd575f5ffd5b602084015b838110156152025780356001600160401b038111156150ff575f5ffd5b85016080818b03601f19011215615114575f5ffd5b61511c614745565b6151298b602084016147b0565b815260608201356001600160401b03811115615143575f5ffd5b6151528c602083860101614a2e565b60208301525060808201356001600160401b03811115615170575f5ffd5b6020818401019250508a601f830112615187575f5ffd5b8135615195614a4b82614a0c565b8082825260208201915060208360051b86010192508d8311156151b6575f5ffd5b6020850194505b828510156151ec5784356001600160401b03811681146151db575f5ffd5b8252602094850194909101906151bd565b60408401525050845250602092830192016150e2565b50809450505050509250929050565b5f5f5f60408486031215615223575f5ffd5b833561522e8161471d565b925060208401356001600160401b03811115615248575f5ffd5b8401601f81018613615258575f5ffd5b80356001600160401b0381111561526d575f5ffd5b86602082840101111561527e575f5ffd5b939660209190910195509293505050565b5f5f604083850312156152a0575f5ffd5b82356152ab8161471d565b915060208301356001600160401b038111156152c5575f5ffd5b613eb185828601614f71565b5f5f604083850312156152e2575f5ffd5b82356152ed8161471d565b946020939093013593505050565b5f6020828403121561530b575f5ffd5b81518015158114610792575f5ffd5b634e487b7160e01b5f52603260045260245ffd5b5f8235603e19833603018112615342575f5ffd5b9190910192915050565b5f6020828403121561535c575f5ffd5b6107928261479d565b6040810161080e82846148ed565b5f5f8335601e19843603018112615388575f5ffd5b8301803591506001600160401b038211156153a1575f5ffd5b6020019150600581901b3603821315611736575f5ffd5b606081016153c682856148ed565b6001600160a01b039290921660409190910152919050565b634e487b7160e01b5f52601160045260245ffd5b8181038181111561080e5761080e6153de565b6001600160401b03828116828216039081111561080e5761080e6153de565b5f81600f0b60016001607f1b03198103615440576154406153de565b5f0392915050565b600f81810b9083900b0160016001607f1b03811360016001607f1b03198212171561080e5761080e6153de565b6001600160a01b038616815260c0810161549260208301876148ed565b6001600160a01b039490941660608201526001600160401b0392909216608083015263ffffffff1660a09091015292915050565b5f5f8335601e198436030181126154db575f5ffd5b8301803591506001600160401b038211156154f4575f5ffd5b602001915036819003821315611736575f5ffd5b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b6001600160a01b03881681525f60c0820161554e602084018a6148ed565b60c060608401528690528660e083015f5b8881101561558f5782356155728161471d565b6001600160a01b031682526020928301929091019060010161555f565b5083810360808501526155a28188614b14565b91505082810360a08401526155b8818587615508565b9a9950505050505050505050565b5f602082840312156155d6575f5ffd5b813561ffff81168114610792575f5ffd5b63ffffffff818116838216019081111561080e5761080e6153de565b8183526020830192505f815f5b848110156149465763ffffffff6156268361479d565b1686526020958601959190910190600101615610565b6001600160a01b03841681526040602082018190525f90611c9a9083018486615603565b602081525f610ce2602083018486615508565b6001600160a01b03861681526060602082018190525f906156979083018688615603565b82810360408401526156aa818587615508565b98975050505050505050565b5f602082840312156156c6575f5ffd5b81516107928161471d565b80516020808301519190811015614f81575f1960209190910360031b1b16919050565b604081525f6157066040830185614d2e565b8281036020840152611c9a8185614d2e565b5f60208284031215615728575f5ffd5b81516001600160401b0381111561573d575f5ffd5b8201601f8101841361574d575f5ffd5b805161575b614a4b82614a0c565b8082825260208201915060208360051b85010192508683111561577c575f5ffd5b602084015b838110156158195780516001600160401b0381111561579e575f5ffd5b8501603f810189136157ae575f5ffd5b60208101516157bf614a4b82614a0c565b808282526020820191506020808460051b8601010192508b8311156157e2575f5ffd5b6040840193505b828410156158045783518252602093840193909101906157e9565b86525050602093840193919091019050615781565b509695505050505050565b5f60018201615835576158356153de565b5060010190565b5f8161584a5761584a6153de565b505f190190565b600f82810b9082900b0360016001607f1b0319811260016001607f1b038213171561080e5761080e6153de565b634e487b7160e01b5f52602160045260245ffd5b634e487b7160e01b5f52601260045260245ffd5b8082018082111561080e5761080e6153de565b8082018281125f8312801582168215821617156158d8576158d86153de565b505092915050565b634e487b7160e01b5f52603160045260245ffd5b5f8261590e57634e487b7160e01b5f52601260045260245ffd5b50049056fea2646970667358221220e8ca7d40cd0cf27e53eb080873f06137efd0ae4dfd7443d78e87c38cd40c571d64736f6c634300081b0033", } // AllocationManagerABI is the input ABI used to generate the binding from. @@ -437,6 +437,37 @@ func (_AllocationManager *AllocationManagerCallerSession) GetAllocatedSets(opera return _AllocationManager.Contract.GetAllocatedSets(&_AllocationManager.CallOpts, operator) } +// GetAllocatedStake is a free data retrieval call binding the contract method 0x2b453a9a. +// +// Solidity: function getAllocatedStake((address,uint32) operatorSet, address[] operators, address[] strategies) view returns(uint256[][]) +func (_AllocationManager *AllocationManagerCaller) GetAllocatedStake(opts *bind.CallOpts, operatorSet OperatorSet, operators []common.Address, strategies []common.Address) ([][]*big.Int, error) { + var out []interface{} + err := _AllocationManager.contract.Call(opts, &out, "getAllocatedStake", operatorSet, operators, strategies) + + if err != nil { + return *new([][]*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new([][]*big.Int)).(*[][]*big.Int) + + return out0, err + +} + +// GetAllocatedStake is a free data retrieval call binding the contract method 0x2b453a9a. +// +// Solidity: function getAllocatedStake((address,uint32) operatorSet, address[] operators, address[] strategies) view returns(uint256[][]) +func (_AllocationManager *AllocationManagerSession) GetAllocatedStake(operatorSet OperatorSet, operators []common.Address, strategies []common.Address) ([][]*big.Int, error) { + return _AllocationManager.Contract.GetAllocatedStake(&_AllocationManager.CallOpts, operatorSet, operators, strategies) +} + +// GetAllocatedStake is a free data retrieval call binding the contract method 0x2b453a9a. +// +// Solidity: function getAllocatedStake((address,uint32) operatorSet, address[] operators, address[] strategies) view returns(uint256[][]) +func (_AllocationManager *AllocationManagerCallerSession) GetAllocatedStake(operatorSet OperatorSet, operators []common.Address, strategies []common.Address) ([][]*big.Int, error) { + return _AllocationManager.Contract.GetAllocatedStake(&_AllocationManager.CallOpts, operatorSet, operators, strategies) +} + // GetAllocatedStrategies is a free data retrieval call binding the contract method 0xc221d8ae. // // Solidity: function getAllocatedStrategies(address operator, (address,uint32) operatorSet) view returns(address[]) @@ -997,6 +1028,37 @@ func (_AllocationManager *AllocationManagerCallerSession) IsOperatorSet(operator return _AllocationManager.Contract.IsOperatorSet(&_AllocationManager.CallOpts, operatorSet) } +// IsOperatorSlashable is a free data retrieval call binding the contract method 0x1352c3e6. +// +// Solidity: function isOperatorSlashable(address operator, (address,uint32) operatorSet) view returns(bool) +func (_AllocationManager *AllocationManagerCaller) IsOperatorSlashable(opts *bind.CallOpts, operator common.Address, operatorSet OperatorSet) (bool, error) { + var out []interface{} + err := _AllocationManager.contract.Call(opts, &out, "isOperatorSlashable", operator, operatorSet) + + if err != nil { + return *new(bool), err + } + + out0 := *abi.ConvertType(out[0], new(bool)).(*bool) + + return out0, err + +} + +// IsOperatorSlashable is a free data retrieval call binding the contract method 0x1352c3e6. +// +// Solidity: function isOperatorSlashable(address operator, (address,uint32) operatorSet) view returns(bool) +func (_AllocationManager *AllocationManagerSession) IsOperatorSlashable(operator common.Address, operatorSet OperatorSet) (bool, error) { + return _AllocationManager.Contract.IsOperatorSlashable(&_AllocationManager.CallOpts, operator, operatorSet) +} + +// IsOperatorSlashable is a free data retrieval call binding the contract method 0x1352c3e6. +// +// Solidity: function isOperatorSlashable(address operator, (address,uint32) operatorSet) view returns(bool) +func (_AllocationManager *AllocationManagerCallerSession) IsOperatorSlashable(operator common.Address, operatorSet OperatorSet) (bool, error) { + return _AllocationManager.Contract.IsOperatorSlashable(&_AllocationManager.CallOpts, operator, operatorSet) +} + // Owner is a free data retrieval call binding the contract method 0x8da5cb5b. // // Solidity: function owner() view returns(address) diff --git a/pkg/bindings/AllocationManagerStorage/binding.go b/pkg/bindings/AllocationManagerStorage/binding.go index e48b70e4bc..d7168bcaa5 100644 --- a/pkg/bindings/AllocationManagerStorage/binding.go +++ b/pkg/bindings/AllocationManagerStorage/binding.go @@ -80,7 +80,7 @@ type OperatorSet struct { // AllocationManagerStorageMetaData contains all meta data concerning the AllocationManagerStorage contract. var AllocationManagerStorageMetaData = &bind.MetaData{ - ABI: "[{\"type\":\"function\",\"name\":\"ALLOCATION_CONFIGURATION_DELAY\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"DEALLOCATION_DELAY\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"addStrategiesToOperatorSet\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetId\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"clearDeallocationQueue\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"numToClear\",\"type\":\"uint16[]\",\"internalType\":\"uint16[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"createOperatorSets\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"params\",\"type\":\"tuple[]\",\"internalType\":\"structIAllocationManagerTypes.CreateSetParams[]\",\"components\":[{\"name\":\"operatorSetId\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"delegation\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIDelegationManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"deregisterFromOperatorSets\",\"inputs\":[{\"name\":\"params\",\"type\":\"tuple\",\"internalType\":\"structIAllocationManagerTypes.DeregisterParams\",\"components\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetIds\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"getAVSRegistrar\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIAVSRegistrar\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAllocatableMagnitude\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAllocatedSets\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple[]\",\"internalType\":\"structOperatorSet[]\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAllocatedStrategies\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAllocation\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIAllocationManagerTypes.Allocation\",\"components\":[{\"name\":\"currentMagnitude\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"pendingDiff\",\"type\":\"int128\",\"internalType\":\"int128\"},{\"name\":\"effectBlock\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAllocationDelay\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"isSet\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"delay\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAllocations\",\"inputs\":[{\"name\":\"operators\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple[]\",\"internalType\":\"structIAllocationManagerTypes.Allocation[]\",\"components\":[{\"name\":\"currentMagnitude\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"pendingDiff\",\"type\":\"int128\",\"internalType\":\"int128\"},{\"name\":\"effectBlock\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getEncumberedMagnitude\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getMaxMagnitude\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getMaxMagnitudes\",\"inputs\":[{\"name\":\"operators\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64[]\",\"internalType\":\"uint64[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getMaxMagnitudes\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64[]\",\"internalType\":\"uint64[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getMaxMagnitudesAtBlock\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"blockNumber\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64[]\",\"internalType\":\"uint64[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getMemberCount\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getMembers\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[{\"name\":\"operators\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getMinimumSlashableStake\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"operators\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"futureBlock\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[{\"name\":\"slashableStake\",\"type\":\"uint256[][]\",\"internalType\":\"uint256[][]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getOperatorSetCount\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getRegisteredSets\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"operatorSets\",\"type\":\"tuple[]\",\"internalType\":\"structOperatorSet[]\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getStrategiesInOperatorSet\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getStrategyAllocations\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple[]\",\"internalType\":\"structOperatorSet[]\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"\",\"type\":\"tuple[]\",\"internalType\":\"structIAllocationManagerTypes.Allocation[]\",\"components\":[{\"name\":\"currentMagnitude\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"pendingDiff\",\"type\":\"int128\",\"internalType\":\"int128\"},{\"name\":\"effectBlock\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"initialOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"initialPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"isMemberOfOperatorSet\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isOperatorSet\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"modifyAllocations\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"params\",\"type\":\"tuple[]\",\"internalType\":\"structIAllocationManagerTypes.AllocateParams[]\",\"components\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"newMagnitudes\",\"type\":\"uint64[]\",\"internalType\":\"uint64[]\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"registerForOperatorSets\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"params\",\"type\":\"tuple\",\"internalType\":\"structIAllocationManagerTypes.RegisterParams\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetIds\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"removeStrategiesFromOperatorSet\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetId\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setAVSRegistrar\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"registrar\",\"type\":\"address\",\"internalType\":\"contractIAVSRegistrar\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setAllocationDelay\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"delay\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"slashOperator\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"params\",\"type\":\"tuple\",\"internalType\":\"structIAllocationManagerTypes.SlashingParams\",\"components\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetId\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"wadsToSlash\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"},{\"name\":\"description\",\"type\":\"string\",\"internalType\":\"string\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"updateAVSMetadataURI\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"metadataURI\",\"type\":\"string\",\"internalType\":\"string\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"AVSMetadataURIUpdated\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"metadataURI\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"AVSRegistrarSet\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"registrar\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIAVSRegistrar\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"AllocationDelaySet\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"delay\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"},{\"name\":\"effectBlock\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"AllocationUpdated\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"magnitude\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"effectBlock\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"EncumberedMagnitudeUpdated\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"encumberedMagnitude\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"MaxMagnitudeUpdated\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"maxMagnitude\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorAddedToOperatorSet\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorRemovedFromOperatorSet\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorSetCreated\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorSlashed\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"strategies\",\"type\":\"address[]\",\"indexed\":false,\"internalType\":\"contractIStrategy[]\"},{\"name\":\"wadSlashed\",\"type\":\"uint256[]\",\"indexed\":false,\"internalType\":\"uint256[]\"},{\"name\":\"description\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StrategyAddedToOperatorSet\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StrategyRemovedFromOperatorSet\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"AlreadyMemberOfSet\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InputArrayLengthMismatch\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InsufficientMagnitude\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidCaller\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidOperator\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidOperatorSet\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidWadToSlash\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ModificationAlreadyPending\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotMemberOfSet\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OperatorNotSlashable\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SameMagnitude\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StrategiesMustBeInAscendingOrder\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StrategyAlreadyInOperatorSet\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StrategyNotInOperatorSet\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"UninitializedAllocationDelay\",\"inputs\":[]}]", + ABI: "[{\"type\":\"function\",\"name\":\"ALLOCATION_CONFIGURATION_DELAY\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"DEALLOCATION_DELAY\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"addStrategiesToOperatorSet\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetId\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"clearDeallocationQueue\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"numToClear\",\"type\":\"uint16[]\",\"internalType\":\"uint16[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"createOperatorSets\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"params\",\"type\":\"tuple[]\",\"internalType\":\"structIAllocationManagerTypes.CreateSetParams[]\",\"components\":[{\"name\":\"operatorSetId\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"delegation\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIDelegationManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"deregisterFromOperatorSets\",\"inputs\":[{\"name\":\"params\",\"type\":\"tuple\",\"internalType\":\"structIAllocationManagerTypes.DeregisterParams\",\"components\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetIds\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"getAVSRegistrar\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIAVSRegistrar\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAllocatableMagnitude\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAllocatedSets\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple[]\",\"internalType\":\"structOperatorSet[]\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAllocatedStake\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"operators\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"outputs\":[{\"name\":\"slashableStake\",\"type\":\"uint256[][]\",\"internalType\":\"uint256[][]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAllocatedStrategies\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAllocation\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIAllocationManagerTypes.Allocation\",\"components\":[{\"name\":\"currentMagnitude\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"pendingDiff\",\"type\":\"int128\",\"internalType\":\"int128\"},{\"name\":\"effectBlock\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAllocationDelay\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"isSet\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"delay\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAllocations\",\"inputs\":[{\"name\":\"operators\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple[]\",\"internalType\":\"structIAllocationManagerTypes.Allocation[]\",\"components\":[{\"name\":\"currentMagnitude\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"pendingDiff\",\"type\":\"int128\",\"internalType\":\"int128\"},{\"name\":\"effectBlock\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getEncumberedMagnitude\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getMaxMagnitude\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getMaxMagnitudes\",\"inputs\":[{\"name\":\"operators\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64[]\",\"internalType\":\"uint64[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getMaxMagnitudes\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64[]\",\"internalType\":\"uint64[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getMaxMagnitudesAtBlock\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"blockNumber\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64[]\",\"internalType\":\"uint64[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getMemberCount\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getMembers\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[{\"name\":\"operators\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getMinimumSlashableStake\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"operators\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"futureBlock\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[{\"name\":\"slashableStake\",\"type\":\"uint256[][]\",\"internalType\":\"uint256[][]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getOperatorSetCount\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getRegisteredSets\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"operatorSets\",\"type\":\"tuple[]\",\"internalType\":\"structOperatorSet[]\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getStrategiesInOperatorSet\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getStrategyAllocations\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple[]\",\"internalType\":\"structOperatorSet[]\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"\",\"type\":\"tuple[]\",\"internalType\":\"structIAllocationManagerTypes.Allocation[]\",\"components\":[{\"name\":\"currentMagnitude\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"pendingDiff\",\"type\":\"int128\",\"internalType\":\"int128\"},{\"name\":\"effectBlock\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"initialOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"initialPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"isMemberOfOperatorSet\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isOperatorSet\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isOperatorSlashable\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"modifyAllocations\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"params\",\"type\":\"tuple[]\",\"internalType\":\"structIAllocationManagerTypes.AllocateParams[]\",\"components\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"newMagnitudes\",\"type\":\"uint64[]\",\"internalType\":\"uint64[]\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"registerForOperatorSets\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"params\",\"type\":\"tuple\",\"internalType\":\"structIAllocationManagerTypes.RegisterParams\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetIds\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"removeStrategiesFromOperatorSet\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetId\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setAVSRegistrar\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"registrar\",\"type\":\"address\",\"internalType\":\"contractIAVSRegistrar\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setAllocationDelay\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"delay\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"slashOperator\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"params\",\"type\":\"tuple\",\"internalType\":\"structIAllocationManagerTypes.SlashingParams\",\"components\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetId\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"wadsToSlash\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"},{\"name\":\"description\",\"type\":\"string\",\"internalType\":\"string\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"updateAVSMetadataURI\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"metadataURI\",\"type\":\"string\",\"internalType\":\"string\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"AVSMetadataURIUpdated\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"metadataURI\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"AVSRegistrarSet\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"registrar\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIAVSRegistrar\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"AllocationDelaySet\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"delay\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"},{\"name\":\"effectBlock\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"AllocationUpdated\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"magnitude\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"effectBlock\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"EncumberedMagnitudeUpdated\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"encumberedMagnitude\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"MaxMagnitudeUpdated\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"maxMagnitude\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorAddedToOperatorSet\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorRemovedFromOperatorSet\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorSetCreated\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorSlashed\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"strategies\",\"type\":\"address[]\",\"indexed\":false,\"internalType\":\"contractIStrategy[]\"},{\"name\":\"wadSlashed\",\"type\":\"uint256[]\",\"indexed\":false,\"internalType\":\"uint256[]\"},{\"name\":\"description\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StrategyAddedToOperatorSet\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StrategyRemovedFromOperatorSet\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"AlreadyMemberOfSet\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InputArrayLengthMismatch\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InsufficientMagnitude\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidCaller\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidOperator\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidOperatorSet\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidWadToSlash\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ModificationAlreadyPending\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotMemberOfSet\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OperatorNotSlashable\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SameMagnitude\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StrategiesMustBeInAscendingOrder\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StrategyAlreadyInOperatorSet\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StrategyNotInOperatorSet\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"UninitializedAllocationDelay\",\"inputs\":[]}]", } // AllocationManagerStorageABI is the input ABI used to generate the binding from. @@ -415,6 +415,37 @@ func (_AllocationManagerStorage *AllocationManagerStorageCallerSession) GetAlloc return _AllocationManagerStorage.Contract.GetAllocatedSets(&_AllocationManagerStorage.CallOpts, operator) } +// GetAllocatedStake is a free data retrieval call binding the contract method 0x2b453a9a. +// +// Solidity: function getAllocatedStake((address,uint32) operatorSet, address[] operators, address[] strategies) view returns(uint256[][] slashableStake) +func (_AllocationManagerStorage *AllocationManagerStorageCaller) GetAllocatedStake(opts *bind.CallOpts, operatorSet OperatorSet, operators []common.Address, strategies []common.Address) ([][]*big.Int, error) { + var out []interface{} + err := _AllocationManagerStorage.contract.Call(opts, &out, "getAllocatedStake", operatorSet, operators, strategies) + + if err != nil { + return *new([][]*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new([][]*big.Int)).(*[][]*big.Int) + + return out0, err + +} + +// GetAllocatedStake is a free data retrieval call binding the contract method 0x2b453a9a. +// +// Solidity: function getAllocatedStake((address,uint32) operatorSet, address[] operators, address[] strategies) view returns(uint256[][] slashableStake) +func (_AllocationManagerStorage *AllocationManagerStorageSession) GetAllocatedStake(operatorSet OperatorSet, operators []common.Address, strategies []common.Address) ([][]*big.Int, error) { + return _AllocationManagerStorage.Contract.GetAllocatedStake(&_AllocationManagerStorage.CallOpts, operatorSet, operators, strategies) +} + +// GetAllocatedStake is a free data retrieval call binding the contract method 0x2b453a9a. +// +// Solidity: function getAllocatedStake((address,uint32) operatorSet, address[] operators, address[] strategies) view returns(uint256[][] slashableStake) +func (_AllocationManagerStorage *AllocationManagerStorageCallerSession) GetAllocatedStake(operatorSet OperatorSet, operators []common.Address, strategies []common.Address) ([][]*big.Int, error) { + return _AllocationManagerStorage.Contract.GetAllocatedStake(&_AllocationManagerStorage.CallOpts, operatorSet, operators, strategies) +} + // GetAllocatedStrategies is a free data retrieval call binding the contract method 0xc221d8ae. // // Solidity: function getAllocatedStrategies(address operator, (address,uint32) operatorSet) view returns(address[]) @@ -988,6 +1019,37 @@ func (_AllocationManagerStorage *AllocationManagerStorageCallerSession) IsOperat return _AllocationManagerStorage.Contract.IsOperatorSet(&_AllocationManagerStorage.CallOpts, operatorSet) } +// IsOperatorSlashable is a free data retrieval call binding the contract method 0x1352c3e6. +// +// Solidity: function isOperatorSlashable(address operator, (address,uint32) operatorSet) view returns(bool) +func (_AllocationManagerStorage *AllocationManagerStorageCaller) IsOperatorSlashable(opts *bind.CallOpts, operator common.Address, operatorSet OperatorSet) (bool, error) { + var out []interface{} + err := _AllocationManagerStorage.contract.Call(opts, &out, "isOperatorSlashable", operator, operatorSet) + + if err != nil { + return *new(bool), err + } + + out0 := *abi.ConvertType(out[0], new(bool)).(*bool) + + return out0, err + +} + +// IsOperatorSlashable is a free data retrieval call binding the contract method 0x1352c3e6. +// +// Solidity: function isOperatorSlashable(address operator, (address,uint32) operatorSet) view returns(bool) +func (_AllocationManagerStorage *AllocationManagerStorageSession) IsOperatorSlashable(operator common.Address, operatorSet OperatorSet) (bool, error) { + return _AllocationManagerStorage.Contract.IsOperatorSlashable(&_AllocationManagerStorage.CallOpts, operator, operatorSet) +} + +// IsOperatorSlashable is a free data retrieval call binding the contract method 0x1352c3e6. +// +// Solidity: function isOperatorSlashable(address operator, (address,uint32) operatorSet) view returns(bool) +func (_AllocationManagerStorage *AllocationManagerStorageCallerSession) IsOperatorSlashable(operator common.Address, operatorSet OperatorSet) (bool, error) { + return _AllocationManagerStorage.Contract.IsOperatorSlashable(&_AllocationManagerStorage.CallOpts, operator, operatorSet) +} + // AddStrategiesToOperatorSet is a paid mutator transaction binding the contract method 0x50feea20. // // Solidity: function addStrategiesToOperatorSet(address avs, uint32 operatorSetId, address[] strategies) returns() diff --git a/pkg/bindings/BackingEigen/binding.go b/pkg/bindings/BackingEigen/binding.go index 773e13f221..5367ed4b91 100644 --- a/pkg/bindings/BackingEigen/binding.go +++ b/pkg/bindings/BackingEigen/binding.go @@ -38,7 +38,7 @@ type ERC20VotesUpgradeableCheckpoint struct { // BackingEigenMetaData contains all meta data concerning the BackingEigen contract. var BackingEigenMetaData = &bind.MetaData{ ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"_EIGEN\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"CLOCK_MODE\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"DOMAIN_SEPARATOR\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"EIGEN\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"allowance\",\"inputs\":[{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"spender\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"allowedFrom\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"allowedTo\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"approve\",\"inputs\":[{\"name\":\"spender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"balanceOf\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"burn\",\"inputs\":[{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"checkpoints\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"pos\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structERC20VotesUpgradeable.Checkpoint\",\"components\":[{\"name\":\"fromBlock\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"votes\",\"type\":\"uint224\",\"internalType\":\"uint224\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"clock\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint48\",\"internalType\":\"uint48\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"decimals\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"decreaseAllowance\",\"inputs\":[{\"name\":\"spender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"subtractedValue\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"delegate\",\"inputs\":[{\"name\":\"delegatee\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"delegateBySig\",\"inputs\":[{\"name\":\"delegatee\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"nonce\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"v\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"r\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"s\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"delegates\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"disableTransferRestrictions\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"eip712Domain\",\"inputs\":[],\"outputs\":[{\"name\":\"fields\",\"type\":\"bytes1\",\"internalType\":\"bytes1\"},{\"name\":\"name\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"version\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"chainId\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"verifyingContract\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"extensions\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getPastTotalSupply\",\"inputs\":[{\"name\":\"timepoint\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getPastVotes\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"timepoint\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getVotes\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"increaseAllowance\",\"inputs\":[{\"name\":\"spender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"addedValue\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"initialOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"isMinter\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"mint\",\"inputs\":[{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"name\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"nonces\",\"inputs\":[{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"numCheckpoints\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"permit\",\"inputs\":[{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"spender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"deadline\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"v\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"r\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"s\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setAllowedFrom\",\"inputs\":[{\"name\":\"from\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"isAllowedFrom\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setAllowedTo\",\"inputs\":[{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"isAllowedTo\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setIsMinter\",\"inputs\":[{\"name\":\"minterAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"newStatus\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"symbol\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"totalSupply\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"transfer\",\"inputs\":[{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"transferFrom\",\"inputs\":[{\"name\":\"from\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"transferRestrictionsDisabledAfter\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"event\",\"name\":\"Approval\",\"inputs\":[{\"name\":\"owner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"spender\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Backed\",\"inputs\":[],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegateChanged\",\"inputs\":[{\"name\":\"delegator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"fromDelegate\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"toDelegate\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegateVotesChanged\",\"inputs\":[{\"name\":\"delegate\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"previousBalance\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"newBalance\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"EIP712DomainChanged\",\"inputs\":[],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"IsMinterModified\",\"inputs\":[{\"name\":\"minterAddress\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newStatus\",\"type\":\"bool\",\"indexed\":false,\"internalType\":\"bool\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"SetAllowedFrom\",\"inputs\":[{\"name\":\"from\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"isAllowedFrom\",\"type\":\"bool\",\"indexed\":false,\"internalType\":\"bool\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"SetAllowedTo\",\"inputs\":[{\"name\":\"to\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"isAllowedTo\",\"type\":\"bool\",\"indexed\":false,\"internalType\":\"bool\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Transfer\",\"inputs\":[{\"name\":\"from\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TransferRestrictionsDisabled\",\"inputs\":[],\"anonymous\":false}]", - Bin: "0x60a060405234801561000f575f5ffd5b50604051612d11380380612d1183398101604081905261002e91610105565b6001600160a01b038116608052610043610049565b50610132565b5f54610100900460ff16156100b45760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff90811614610103575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b5f60208284031215610115575f5ffd5b81516001600160a01b038116811461012b575f5ffd5b9392505050565b608051612bb261015f5f395f81816105e901528181610dae01528181610dd90152610e040152612bb25ff3fe608060405234801561000f575f5ffd5b506004361061023f575f3560e01c80637ecebe0011610135578063aa271e1a116100b4578063dd62ed3e11610079578063dd62ed3e14610579578063eb415f451461058c578063f1127ed814610594578063f2fde38b146105d1578063fdc371ce146105e4575f5ffd5b8063aa271e1a1461050a578063b8c255941461052d578063c3cda52014610540578063c4d66de814610553578063d505accf14610566575f5ffd5b806395d89b41116100fa57806395d89b41146104bf5780639ab24eb0146104c75780639aec4bae146104da578063a457c2d7146104e4578063a9059cbb146104f7575f5ffd5b80637ecebe001461044e57806384b0196e146104615780638da5cb5b1461047c5780638e539e8c1461048d57806391ddadf4146104a0575f5ffd5b806340c10f19116101c157806366eb399f1161018657806366eb399f146103c05780636fcfff45146103d357806370a08231146103fb578063715018a61461042357806378aa33ba1461042b575f5ffd5b806340c10f191461031a57806342966c681461032d5780634bf5d7e914610340578063587cde1e1461036a5780635c19a95c146103ad575f5ffd5b806323b872dd1161020757806323b872dd146102ca578063313ce567146102dd5780633644e515146102ec57806339509351146102f45780633a46b1a814610307575f5ffd5b80630455e6941461024357806306fdde031461027b578063095ea7b31461029057806318160ddd146102a35780631ffacdef146102b5575b5f5ffd5b610266610251366004612682565b6101316020525f908152604090205460ff1681565b60405190151581526020015b60405180910390f35b61028361060b565b60405161027291906126c9565b61026661029e3660046126db565b61069b565b6067545b604051908152602001610272565b6102c86102c3366004612703565b6106b4565b005b6102666102d836600461273c565b6106ca565b60405160128152602001610272565b6102a76106ed565b6102666103023660046126db565b6106fb565b6102a76103153660046126db565b61071c565b6102c86103283660046126db565b6107a4565b6102c861033b366004612776565b61081f565b60408051808201909152600e81526d06d6f64653d74696d657374616d760941b6020820152610283565b610395610378366004612682565b6001600160a01b039081165f90815260fe60205260409020541690565b6040516001600160a01b039091168152602001610272565b6102c86103bb366004612682565b61082c565b6102c86103ce366004612703565b610836565b6103e66103e1366004612682565b6108ae565b60405163ffffffff9091168152602001610272565b6102a7610409366004612682565b6001600160a01b03165f9081526065602052604090205490565b6102c86108cf565b610266610439366004612682565b6101326020525f908152604090205460ff1681565b6102a761045c366004612682565b6108e2565b6104696108ff565b604051610272979695949392919061278d565b6033546001600160a01b0316610395565b6102a761049b366004612776565b610998565b6104a86109ff565b60405165ffffffffffff9091168152602001610272565b610283610a09565b6102a76104d5366004612682565b610a18565b6102a76101305481565b6102666104f23660046126db565b610a95565b6102666105053660046126db565b610b0f565b610266610518366004612682565b6101336020525f908152604090205460ff1681565b6102c861053b366004612703565b610b1c565b6102c861054e366004612833565b610b2e565b6102c8610561366004612682565b610c63565b6102c8610574366004612887565b610ea5565b6102a76105873660046128ed565b611006565b6102c8611030565b6105a76105a236600461291e565b6110fe565b60408051825163ffffffff1681526020928301516001600160e01b03169281019290925201610272565b6102c86105df366004612682565b61117f565b6103957f000000000000000000000000000000000000000000000000000000000000000081565b60606068805461061a90612950565b80601f016020809104026020016040519081016040528092919081815260200182805461064690612950565b80156106915780601f1061066857610100808354040283529160200191610691565b820191905f5260205f20905b81548152906001019060200180831161067457829003601f168201915b5050505050905090565b5f336106a88185856111f5565b60019150505b92915050565b6106bc611318565b6106c68282611372565b5050565b5f336106d78582856113d2565b6106e285858561144a565b506001949350505050565b5f6106f6611604565b905090565b5f336106a881858561070d8383611006565b6107179190612996565b6111f5565b5f6107256109ff565b65ffffffffffff16821061077c5760405162461bcd60e51b815260206004820152601960248201527804552433230566f7465733a20667574757265206c6f6f6b757603c1b60448201526064015b60405180910390fd5b6001600160a01b0383165f90815260ff6020526040902061079d908361160d565b9392505050565b335f908152610133602052604090205460ff166108155760405162461bcd60e51b815260206004820152602960248201527f4261636b696e67456967656e2e6d696e743a2063616c6c6572206973206e6f7460448201526810309036b4b73a32b960b91b6064820152608401610773565b6106c682826116ee565b6108293382611779565b50565b6108293382611792565b61083e611318565b816001600160a01b03167f0124b12503bddc2616c0f3f54fd23ed283f5ef0c1483a75409e42612176b8bde8260405161087b911515815260200190565b60405180910390a26001600160a01b03919091165f90815261013360205260409020805460ff1916911515919091179055565b6001600160a01b0381165f90815260ff60205260408120546106ae9061180b565b6108d7611318565b6108e05f611873565b565b6001600160a01b0381165f90815260cb60205260408120546106ae565b5f6060805f5f5f60606097545f5f1b14801561091b5750609854155b61095f5760405162461bcd60e51b81526020600482015260156024820152741152540dcc4c8e88155b9a5b9a5d1a585b1a5e9959605a1b6044820152606401610773565b6109676118c4565b61096f6118d3565b604080515f80825260208201909252600f60f81b9b939a50919850469750309650945092509050565b5f6109a16109ff565b65ffffffffffff1682106109f35760405162461bcd60e51b815260206004820152601960248201527804552433230566f7465733a20667574757265206c6f6f6b757603c1b6044820152606401610773565b6106ae6101008361160d565b5f6106f6426118e2565b60606069805461061a90612950565b6001600160a01b0381165f90815260ff60205260408120548015610a83576001600160a01b0383165f90815260ff6020526040902080545f198301908110610a6257610a626129bd565b5f9182526020909120015464010000000090046001600160e01b0316610a85565b5f5b6001600160e01b03169392505050565b5f3381610aa28286611006565b905083811015610b025760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610773565b6106e282868684036111f5565b5f336106a881858561144a565b610b24611318565b6106c68282611948565b83421115610b7e5760405162461bcd60e51b815260206004820152601d60248201527f4552433230566f7465733a207369676e617475726520657870697265640000006044820152606401610773565b604080517fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf60208201526001600160a01b0388169181019190915260608101869052608081018590525f90610bf790610bef9060a001604051602081830303815290604052805190602001206119a0565b8585856119cc565b9050610c02816119f2565b8614610c505760405162461bcd60e51b815260206004820152601960248201527f4552433230566f7465733a20696e76616c6964206e6f6e6365000000000000006044820152606401610773565b610c5a8188611792565b50505050505050565b5f54610100900460ff1615808015610c8157505f54600160ff909116105b80610c9a5750303b158015610c9a57505f5460ff166001145b610cfd5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610773565b5f805460ff191660011790558015610d1e575f805461ff0019166101001790555b610d26611a19565b610d736040518060400160405280600d81526020016c2130b1b5b4b7339022b4b3b2b760991b815250604051806040016040528060068152602001653122a4a3a2a760d11b815250611a47565b610d7c82611873565b610da3604051806040016040528060068152602001653122a4a3a2a760d11b815250611a77565b5f1961013055610dd47f00000000000000000000000000000000000000000000000000000000000000006001611372565b610dff7f00000000000000000000000000000000000000000000000000000000000000006001611948565b610e357f00000000000000000000000000000000000000000000000000000000000000006b05686877afb5cbccbf7340006116ee565b6040517fb7c23c1e2e36f298e9879a88ecfcd07e28fbb439bcfa9c78ca1363ca14370d26905f90a180156106c6575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15050565b83421115610ef55760405162461bcd60e51b815260206004820152601d60248201527f45524332305065726d69743a206578706972656420646561646c696e650000006044820152606401610773565b5f7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9888888610f238c6119f2565b6040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090505f610f7d826119a0565b90505f610f8c828787876119cc565b9050896001600160a01b0316816001600160a01b031614610fef5760405162461bcd60e51b815260206004820152601e60248201527f45524332305065726d69743a20696e76616c6964207369676e617475726500006044820152606401610773565b610ffa8a8a8a6111f5565b50505050505050505050565b6001600160a01b039182165f90815260666020908152604080832093909416825291909152205490565b611038611318565b5f1961013054146110ce5760405162461bcd60e51b815260206004820152605460248201527f4261636b696e67456967656e2e64697361626c655472616e736665725265737460448201527f72696374696f6e733a207472616e73666572207265737472696374696f6e7320606482015273185c9948185b1c9958591e48191a5cd8589b195960621b608482015260a401610773565b5f6101308190556040517f2b18986d3ba809db2f13a5d7bf17f60d357b37d9cbb55dd71cbbac8dc4060f649190a1565b604080518082019091525f80825260208201526001600160a01b0383165f90815260ff60205260409020805463ffffffff8416908110611140576111406129bd565b5f9182526020918290206040805180820190915291015463ffffffff8116825264010000000090046001600160e01b0316918101919091529392505050565b611187611318565b6001600160a01b0381166111ec5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610773565b61082981611873565b6001600160a01b0383166112575760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610773565b6001600160a01b0382166112b85760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610773565b6001600160a01b038381165f8181526066602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6033546001600160a01b031633146108e05760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610773565b6001600160a01b0382165f8181526101316020908152604091829020805460ff191685151590811790915591519182527fcf20b1ecb604b0e8888d579c64e8a3b10e590d45c1c2dddb393bed284362227191015b60405180910390a25050565b5f6113dd8484611006565b90505f19811461144457818110156114375760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610773565b61144484848484036111f5565b50505050565b6001600160a01b0383166114ae5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610773565b6001600160a01b0382166115105760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610773565b61151b838383611ac0565b6001600160a01b0383165f90815260656020526040902054818110156115925760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610773565b6001600160a01b038085165f8181526065602052604080822086860390559286168082529083902080548601905591517fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906115f19086815260200190565b60405180910390a3611444848484611b9c565b5f6106f6611bcd565b81545f9081816005811115611664575f61162684611c40565b61163090856129d1565b5f88815260209020909150869082015463ffffffff16111561165457809150611662565b61165f816001612996565b92505b505b808210156116af575f6116778383611d24565b5f88815260209020909150869082015463ffffffff16111561169b578091506116a9565b6116a6816001612996565b92505b50611664565b80156116d9575f8681526020902081015f19015464010000000090046001600160e01b03166116db565b5f5b6001600160e01b03169695505050505050565b6116f88282611d3e565b6067546001600160e01b03101561176a5760405162461bcd60e51b815260206004820152603060248201527f4552433230566f7465733a20746f74616c20737570706c79207269736b73206f60448201526f766572666c6f77696e6720766f74657360801b6064820152608401610773565b611444610100611e0f83611e1a565b6117838282611f86565b6114446101006120c983611e1a565b6001600160a01b038281165f81815260fe6020818152604080842080546065845282862054949093528787166001600160a01b03198416811790915590519190951694919391928592917f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f9190a46114448284836120d4565b5f63ffffffff82111561186f5760405162461bcd60e51b815260206004820152602660248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203360448201526532206269747360d01b6064820152608401610773565b5090565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b60606099805461061a90612950565b6060609a805461061a90612950565b5f65ffffffffffff82111561186f5760405162461bcd60e51b815260206004820152602660248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203460448201526538206269747360d01b6064820152608401610773565b6001600160a01b0382165f8181526101326020908152604091829020805460ff191685151590811790915591519182527f72a561d1af7409467dae4f1e9fc52590a9335a1dda17727e2b6aa8c4db35109b91016113c6565b5f6106ae6119ac611604565b8360405161190160f01b8152600281019290925260228201526042902090565b5f5f5f6119db8787878761220e565b915091506119e8816122cb565b5095945050505050565b6001600160a01b0381165f90815260cb602052604090208054600181018255905b50919050565b5f54610100900460ff16611a3f5760405162461bcd60e51b8152600401610773906129e4565b6108e0612414565b5f54610100900460ff16611a6d5760405162461bcd60e51b8152600401610773906129e4565b6106c68282612443565b5f54610100900460ff16611a9d5760405162461bcd60e51b8152600401610773906129e4565b61082981604051806040016040528060018152602001603160f81b815250612482565b610130544211611b97576001600160a01b0383165f908152610131602052604090205460ff1680611b0957506001600160a01b0382165f908152610132602052604090205460ff165b80611b1b57506001600160a01b038316155b611b975760405162461bcd60e51b815260206004820152604160248201527f4261636b696e67456967656e2e5f6265666f7265546f6b656e5472616e73666560448201527f723a2066726f6d206f7220746f206d7573742062652077686974656c697374656064820152601960fa1b608482015260a401610773565b505050565b6001600160a01b038381165f90815260fe6020526040808220548584168352912054611b97929182169116836120d4565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f611bf76124cf565b611bff612527565b60408051602081019490945283019190915260608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b5f815f03611c4f57505f919050565b5f6001611c5b84612557565b901c6001901b90506001818481611c7457611c74612a2f565b048201901c90506001818481611c8c57611c8c612a2f565b048201901c90506001818481611ca457611ca4612a2f565b048201901c90506001818481611cbc57611cbc612a2f565b048201901c90506001818481611cd457611cd4612a2f565b048201901c90506001818481611cec57611cec612a2f565b048201901c90506001818481611d0457611d04612a2f565b048201901c905061079d81828581611d1e57611d1e612a2f565b046125ea565b5f611d326002848418612a43565b61079d90848416612996565b6001600160a01b038216611d945760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610773565b611d9f5f8383611ac0565b8060675f828254611db09190612996565b90915550506001600160a01b0382165f818152606560209081526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a36106c65f8383611b9c565b5f61079d8284612996565b82545f908190818115611e64575f8781526020902082015f190160408051808201909152905463ffffffff8116825264010000000090046001600160e01b03166020820152611e78565b604080518082019091525f80825260208201525b905080602001516001600160e01b03169350611e9884868863ffffffff16565b92505f82118015611ec05750611eac6109ff565b65ffffffffffff16815f015163ffffffff16145b15611f0357611ece836125ff565b5f8881526020902083015f190180546001600160e01b03929092166401000000000263ffffffff909216919091179055611f7c565b866040518060400160405280611f27611f1a6109ff565b65ffffffffffff1661180b565b63ffffffff168152602001611f3b866125ff565b6001600160e01b0390811690915282546001810184555f938452602093849020835194909301519091166401000000000263ffffffff909316929092179101555b5050935093915050565b6001600160a01b038216611fe65760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401610773565b611ff1825f83611ac0565b6001600160a01b0382165f90815260656020526040902054818110156120645760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b6064820152608401610773565b6001600160a01b0383165f8181526065602090815260408083208686039055606780548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3611b97835f84611b9c565b5f61079d82846129d1565b816001600160a01b0316836001600160a01b0316141580156120f557505f81115b15611b97576001600160a01b03831615612182576001600160a01b0383165f90815260ff60205260408120819061212f906120c985611e1a565b91509150846001600160a01b03167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a7248383604051612177929190918252602082015260400190565b60405180910390a250505b6001600160a01b03821615611b97576001600160a01b0382165f90815260ff6020526040812081906121b790611e0f85611e1a565b91509150836001600160a01b03167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a72483836040516121ff929190918252602082015260400190565b60405180910390a25050505050565b5f807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a083111561224357505f905060036122c2565b604080515f8082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015612294573d5f5f3e3d5ffd5b5050604051601f1901519150506001600160a01b0381166122bc575f600192509250506122c2565b91505f90505b94509492505050565b5f8160048111156122de576122de612a62565b036122e65750565b60018160048111156122fa576122fa612a62565b036123475760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610773565b600281600481111561235b5761235b612a62565b036123a85760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610773565b60038160048111156123bc576123bc612a62565b036108295760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401610773565b5f54610100900460ff1661243a5760405162461bcd60e51b8152600401610773906129e4565b6108e033611873565b5f54610100900460ff166124695760405162461bcd60e51b8152600401610773906129e4565b60686124758382612ac1565b506069611b978282612ac1565b5f54610100900460ff166124a85760405162461bcd60e51b8152600401610773906129e4565b60996124b48382612ac1565b50609a6124c18282612ac1565b50505f609781905560985550565b5f5f6124d96118c4565b8051909150156124f0578051602090910120919050565b60975480156124ff5792915050565b7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4709250505090565b5f5f6125316118d3565b805190915015612548578051602090910120919050565b60985480156124ff5792915050565b5f80608083901c1561256b57608092831c92015b604083901c1561257d57604092831c92015b602083901c1561258f57602092831c92015b601083901c156125a157601092831c92015b600883901c156125b357600892831c92015b600483901c156125c557600492831c92015b600283901c156125d757600292831c92015b600183901c156106ae5760010192915050565b5f8183106125f8578161079d565b5090919050565b5f6001600160e01b0382111561186f5760405162461bcd60e51b815260206004820152602760248201527f53616665436173743a2076616c756520646f65736e27742066697420696e20326044820152663234206269747360c81b6064820152608401610773565b80356001600160a01b038116811461267d575f5ffd5b919050565b5f60208284031215612692575f5ffd5b61079d82612667565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f61079d602083018461269b565b5f5f604083850312156126ec575f5ffd5b6126f583612667565b946020939093013593505050565b5f5f60408385031215612714575f5ffd5b61271d83612667565b915060208301358015158114612731575f5ffd5b809150509250929050565b5f5f5f6060848603121561274e575f5ffd5b61275784612667565b925061276560208501612667565b929592945050506040919091013590565b5f60208284031215612786575f5ffd5b5035919050565b60ff60f81b8816815260e060208201525f6127ab60e083018961269b565b82810360408401526127bd818961269b565b606084018890526001600160a01b038716608085015260a0840186905283810360c0850152845180825260208087019350909101905f5b818110156128125783518352602093840193909201916001016127f4565b50909b9a5050505050505050505050565b803560ff8116811461267d575f5ffd5b5f5f5f5f5f5f60c08789031215612848575f5ffd5b61285187612667565b9550602087013594506040870135935061286d60608801612823565b9598949750929560808101359460a0909101359350915050565b5f5f5f5f5f5f5f60e0888a03121561289d575f5ffd5b6128a688612667565b96506128b460208901612667565b955060408801359450606088013593506128d060808901612823565b9699959850939692959460a0840135945060c09093013592915050565b5f5f604083850312156128fe575f5ffd5b61290783612667565b915061291560208401612667565b90509250929050565b5f5f6040838503121561292f575f5ffd5b61293883612667565b9150602083013563ffffffff81168114612731575f5ffd5b600181811c9082168061296457607f821691505b602082108103611a1357634e487b7160e01b5f52602260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b808201808211156106ae576106ae612982565b634e487b7160e01b5f52604160045260245ffd5b634e487b7160e01b5f52603260045260245ffd5b818103818111156106ae576106ae612982565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b634e487b7160e01b5f52601260045260245ffd5b5f82612a5d57634e487b7160e01b5f52601260045260245ffd5b500490565b634e487b7160e01b5f52602160045260245ffd5b601f821115611b9757805f5260205f20601f840160051c81016020851015612a9b5750805b601f840160051c820191505b81811015612aba575f8155600101612aa7565b5050505050565b815167ffffffffffffffff811115612adb57612adb6129a9565b612aef81612ae98454612950565b84612a76565b6020601f821160018114612b21575f8315612b0a5750848201515b5f19600385901b1c1916600184901b178455612aba565b5f84815260208120601f198516915b82811015612b505787850151825560209485019460019092019101612b30565b5084821015612b6d57868401515f19600387901b60f8161c191681555b50505050600190811b0190555056fea2646970667358221220e867b134dc261d7025b320d04b24d156f209a884537e24f3f733872669a3444264736f6c634300081b0033", + Bin: "0x60a060405234801561000f575f5ffd5b50604051612d11380380612d1183398101604081905261002e91610105565b6001600160a01b038116608052610043610049565b50610132565b5f54610100900460ff16156100b45760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff90811614610103575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b5f60208284031215610115575f5ffd5b81516001600160a01b038116811461012b575f5ffd5b9392505050565b608051612bb261015f5f395f81816105e901528181610dae01528181610dd90152610e040152612bb25ff3fe608060405234801561000f575f5ffd5b506004361061023f575f3560e01c80637ecebe0011610135578063aa271e1a116100b4578063dd62ed3e11610079578063dd62ed3e14610579578063eb415f451461058c578063f1127ed814610594578063f2fde38b146105d1578063fdc371ce146105e4575f5ffd5b8063aa271e1a1461050a578063b8c255941461052d578063c3cda52014610540578063c4d66de814610553578063d505accf14610566575f5ffd5b806395d89b41116100fa57806395d89b41146104bf5780639ab24eb0146104c75780639aec4bae146104da578063a457c2d7146104e4578063a9059cbb146104f7575f5ffd5b80637ecebe001461044e57806384b0196e146104615780638da5cb5b1461047c5780638e539e8c1461048d57806391ddadf4146104a0575f5ffd5b806340c10f19116101c157806366eb399f1161018657806366eb399f146103c05780636fcfff45146103d357806370a08231146103fb578063715018a61461042357806378aa33ba1461042b575f5ffd5b806340c10f191461031a57806342966c681461032d5780634bf5d7e914610340578063587cde1e1461036a5780635c19a95c146103ad575f5ffd5b806323b872dd1161020757806323b872dd146102ca578063313ce567146102dd5780633644e515146102ec57806339509351146102f45780633a46b1a814610307575f5ffd5b80630455e6941461024357806306fdde031461027b578063095ea7b31461029057806318160ddd146102a35780631ffacdef146102b5575b5f5ffd5b610266610251366004612682565b6101316020525f908152604090205460ff1681565b60405190151581526020015b60405180910390f35b61028361060b565b60405161027291906126c9565b61026661029e3660046126db565b61069b565b6067545b604051908152602001610272565b6102c86102c3366004612703565b6106b4565b005b6102666102d836600461273c565b6106ca565b60405160128152602001610272565b6102a76106ed565b6102666103023660046126db565b6106fb565b6102a76103153660046126db565b61071c565b6102c86103283660046126db565b6107a4565b6102c861033b366004612776565b61081f565b60408051808201909152600e81526d06d6f64653d74696d657374616d760941b6020820152610283565b610395610378366004612682565b6001600160a01b039081165f90815260fe60205260409020541690565b6040516001600160a01b039091168152602001610272565b6102c86103bb366004612682565b61082c565b6102c86103ce366004612703565b610836565b6103e66103e1366004612682565b6108ae565b60405163ffffffff9091168152602001610272565b6102a7610409366004612682565b6001600160a01b03165f9081526065602052604090205490565b6102c86108cf565b610266610439366004612682565b6101326020525f908152604090205460ff1681565b6102a761045c366004612682565b6108e2565b6104696108ff565b604051610272979695949392919061278d565b6033546001600160a01b0316610395565b6102a761049b366004612776565b610998565b6104a86109ff565b60405165ffffffffffff9091168152602001610272565b610283610a09565b6102a76104d5366004612682565b610a18565b6102a76101305481565b6102666104f23660046126db565b610a95565b6102666105053660046126db565b610b0f565b610266610518366004612682565b6101336020525f908152604090205460ff1681565b6102c861053b366004612703565b610b1c565b6102c861054e366004612833565b610b2e565b6102c8610561366004612682565b610c63565b6102c8610574366004612887565b610ea5565b6102a76105873660046128ed565b611006565b6102c8611030565b6105a76105a236600461291e565b6110fe565b60408051825163ffffffff1681526020928301516001600160e01b03169281019290925201610272565b6102c86105df366004612682565b61117f565b6103957f000000000000000000000000000000000000000000000000000000000000000081565b60606068805461061a90612950565b80601f016020809104026020016040519081016040528092919081815260200182805461064690612950565b80156106915780601f1061066857610100808354040283529160200191610691565b820191905f5260205f20905b81548152906001019060200180831161067457829003601f168201915b5050505050905090565b5f336106a88185856111f5565b60019150505b92915050565b6106bc611318565b6106c68282611372565b5050565b5f336106d78582856113d2565b6106e285858561144a565b506001949350505050565b5f6106f6611604565b905090565b5f336106a881858561070d8383611006565b6107179190612996565b6111f5565b5f6107256109ff565b65ffffffffffff16821061077c5760405162461bcd60e51b815260206004820152601960248201527804552433230566f7465733a20667574757265206c6f6f6b757603c1b60448201526064015b60405180910390fd5b6001600160a01b0383165f90815260ff6020526040902061079d908361160d565b9392505050565b335f908152610133602052604090205460ff166108155760405162461bcd60e51b815260206004820152602960248201527f4261636b696e67456967656e2e6d696e743a2063616c6c6572206973206e6f7460448201526810309036b4b73a32b960b91b6064820152608401610773565b6106c682826116ee565b6108293382611779565b50565b6108293382611792565b61083e611318565b816001600160a01b03167f0124b12503bddc2616c0f3f54fd23ed283f5ef0c1483a75409e42612176b8bde8260405161087b911515815260200190565b60405180910390a26001600160a01b03919091165f90815261013360205260409020805460ff1916911515919091179055565b6001600160a01b0381165f90815260ff60205260408120546106ae9061180b565b6108d7611318565b6108e05f611873565b565b6001600160a01b0381165f90815260cb60205260408120546106ae565b5f6060805f5f5f60606097545f5f1b14801561091b5750609854155b61095f5760405162461bcd60e51b81526020600482015260156024820152741152540dcc4c8e88155b9a5b9a5d1a585b1a5e9959605a1b6044820152606401610773565b6109676118c4565b61096f6118d3565b604080515f80825260208201909252600f60f81b9b939a50919850469750309650945092509050565b5f6109a16109ff565b65ffffffffffff1682106109f35760405162461bcd60e51b815260206004820152601960248201527804552433230566f7465733a20667574757265206c6f6f6b757603c1b6044820152606401610773565b6106ae6101008361160d565b5f6106f6426118e2565b60606069805461061a90612950565b6001600160a01b0381165f90815260ff60205260408120548015610a83576001600160a01b0383165f90815260ff6020526040902080545f198301908110610a6257610a626129bd565b5f9182526020909120015464010000000090046001600160e01b0316610a85565b5f5b6001600160e01b03169392505050565b5f3381610aa28286611006565b905083811015610b025760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610773565b6106e282868684036111f5565b5f336106a881858561144a565b610b24611318565b6106c68282611948565b83421115610b7e5760405162461bcd60e51b815260206004820152601d60248201527f4552433230566f7465733a207369676e617475726520657870697265640000006044820152606401610773565b604080517fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf60208201526001600160a01b0388169181019190915260608101869052608081018590525f90610bf790610bef9060a001604051602081830303815290604052805190602001206119a0565b8585856119cc565b9050610c02816119f2565b8614610c505760405162461bcd60e51b815260206004820152601960248201527f4552433230566f7465733a20696e76616c6964206e6f6e6365000000000000006044820152606401610773565b610c5a8188611792565b50505050505050565b5f54610100900460ff1615808015610c8157505f54600160ff909116105b80610c9a5750303b158015610c9a57505f5460ff166001145b610cfd5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610773565b5f805460ff191660011790558015610d1e575f805461ff0019166101001790555b610d26611a19565b610d736040518060400160405280600d81526020016c2130b1b5b4b7339022b4b3b2b760991b815250604051806040016040528060068152602001653122a4a3a2a760d11b815250611a47565b610d7c82611873565b610da3604051806040016040528060068152602001653122a4a3a2a760d11b815250611a77565b5f1961013055610dd47f00000000000000000000000000000000000000000000000000000000000000006001611372565b610dff7f00000000000000000000000000000000000000000000000000000000000000006001611948565b610e357f00000000000000000000000000000000000000000000000000000000000000006b05686877afb5cbccbf7340006116ee565b6040517fb7c23c1e2e36f298e9879a88ecfcd07e28fbb439bcfa9c78ca1363ca14370d26905f90a180156106c6575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15050565b83421115610ef55760405162461bcd60e51b815260206004820152601d60248201527f45524332305065726d69743a206578706972656420646561646c696e650000006044820152606401610773565b5f7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9888888610f238c6119f2565b6040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090505f610f7d826119a0565b90505f610f8c828787876119cc565b9050896001600160a01b0316816001600160a01b031614610fef5760405162461bcd60e51b815260206004820152601e60248201527f45524332305065726d69743a20696e76616c6964207369676e617475726500006044820152606401610773565b610ffa8a8a8a6111f5565b50505050505050505050565b6001600160a01b039182165f90815260666020908152604080832093909416825291909152205490565b611038611318565b5f1961013054146110ce5760405162461bcd60e51b815260206004820152605460248201527f4261636b696e67456967656e2e64697361626c655472616e736665725265737460448201527f72696374696f6e733a207472616e73666572207265737472696374696f6e7320606482015273185c9948185b1c9958591e48191a5cd8589b195960621b608482015260a401610773565b5f6101308190556040517f2b18986d3ba809db2f13a5d7bf17f60d357b37d9cbb55dd71cbbac8dc4060f649190a1565b604080518082019091525f80825260208201526001600160a01b0383165f90815260ff60205260409020805463ffffffff8416908110611140576111406129bd565b5f9182526020918290206040805180820190915291015463ffffffff8116825264010000000090046001600160e01b0316918101919091529392505050565b611187611318565b6001600160a01b0381166111ec5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610773565b61082981611873565b6001600160a01b0383166112575760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610773565b6001600160a01b0382166112b85760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610773565b6001600160a01b038381165f8181526066602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6033546001600160a01b031633146108e05760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610773565b6001600160a01b0382165f8181526101316020908152604091829020805460ff191685151590811790915591519182527fcf20b1ecb604b0e8888d579c64e8a3b10e590d45c1c2dddb393bed284362227191015b60405180910390a25050565b5f6113dd8484611006565b90505f19811461144457818110156114375760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610773565b61144484848484036111f5565b50505050565b6001600160a01b0383166114ae5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610773565b6001600160a01b0382166115105760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610773565b61151b838383611ac0565b6001600160a01b0383165f90815260656020526040902054818110156115925760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610773565b6001600160a01b038085165f8181526065602052604080822086860390559286168082529083902080548601905591517fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906115f19086815260200190565b60405180910390a3611444848484611b9c565b5f6106f6611bcd565b81545f9081816005811115611664575f61162684611c40565b61163090856129d1565b5f88815260209020909150869082015463ffffffff16111561165457809150611662565b61165f816001612996565b92505b505b808210156116af575f6116778383611d24565b5f88815260209020909150869082015463ffffffff16111561169b578091506116a9565b6116a6816001612996565b92505b50611664565b80156116d9575f8681526020902081015f19015464010000000090046001600160e01b03166116db565b5f5b6001600160e01b03169695505050505050565b6116f88282611d3e565b6067546001600160e01b03101561176a5760405162461bcd60e51b815260206004820152603060248201527f4552433230566f7465733a20746f74616c20737570706c79207269736b73206f60448201526f766572666c6f77696e6720766f74657360801b6064820152608401610773565b611444610100611e0f83611e1a565b6117838282611f86565b6114446101006120c983611e1a565b6001600160a01b038281165f81815260fe6020818152604080842080546065845282862054949093528787166001600160a01b03198416811790915590519190951694919391928592917f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f9190a46114448284836120d4565b5f63ffffffff82111561186f5760405162461bcd60e51b815260206004820152602660248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203360448201526532206269747360d01b6064820152608401610773565b5090565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b60606099805461061a90612950565b6060609a805461061a90612950565b5f65ffffffffffff82111561186f5760405162461bcd60e51b815260206004820152602660248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203460448201526538206269747360d01b6064820152608401610773565b6001600160a01b0382165f8181526101326020908152604091829020805460ff191685151590811790915591519182527f72a561d1af7409467dae4f1e9fc52590a9335a1dda17727e2b6aa8c4db35109b91016113c6565b5f6106ae6119ac611604565b8360405161190160f01b8152600281019290925260228201526042902090565b5f5f5f6119db8787878761220e565b915091506119e8816122cb565b5095945050505050565b6001600160a01b0381165f90815260cb602052604090208054600181018255905b50919050565b5f54610100900460ff16611a3f5760405162461bcd60e51b8152600401610773906129e4565b6108e0612414565b5f54610100900460ff16611a6d5760405162461bcd60e51b8152600401610773906129e4565b6106c68282612443565b5f54610100900460ff16611a9d5760405162461bcd60e51b8152600401610773906129e4565b61082981604051806040016040528060018152602001603160f81b815250612482565b610130544211611b97576001600160a01b0383165f908152610131602052604090205460ff1680611b0957506001600160a01b0382165f908152610132602052604090205460ff165b80611b1b57506001600160a01b038316155b611b975760405162461bcd60e51b815260206004820152604160248201527f4261636b696e67456967656e2e5f6265666f7265546f6b656e5472616e73666560448201527f723a2066726f6d206f7220746f206d7573742062652077686974656c697374656064820152601960fa1b608482015260a401610773565b505050565b6001600160a01b038381165f90815260fe6020526040808220548584168352912054611b97929182169116836120d4565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f611bf76124cf565b611bff612527565b60408051602081019490945283019190915260608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b5f815f03611c4f57505f919050565b5f6001611c5b84612557565b901c6001901b90506001818481611c7457611c74612a2f565b048201901c90506001818481611c8c57611c8c612a2f565b048201901c90506001818481611ca457611ca4612a2f565b048201901c90506001818481611cbc57611cbc612a2f565b048201901c90506001818481611cd457611cd4612a2f565b048201901c90506001818481611cec57611cec612a2f565b048201901c90506001818481611d0457611d04612a2f565b048201901c905061079d81828581611d1e57611d1e612a2f565b046125ea565b5f611d326002848418612a43565b61079d90848416612996565b6001600160a01b038216611d945760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610773565b611d9f5f8383611ac0565b8060675f828254611db09190612996565b90915550506001600160a01b0382165f818152606560209081526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a36106c65f8383611b9c565b5f61079d8284612996565b82545f908190818115611e64575f8781526020902082015f190160408051808201909152905463ffffffff8116825264010000000090046001600160e01b03166020820152611e78565b604080518082019091525f80825260208201525b905080602001516001600160e01b03169350611e9884868863ffffffff16565b92505f82118015611ec05750611eac6109ff565b65ffffffffffff16815f015163ffffffff16145b15611f0357611ece836125ff565b5f8881526020902083015f190180546001600160e01b03929092166401000000000263ffffffff909216919091179055611f7c565b866040518060400160405280611f27611f1a6109ff565b65ffffffffffff1661180b565b63ffffffff168152602001611f3b866125ff565b6001600160e01b0390811690915282546001810184555f938452602093849020835194909301519091166401000000000263ffffffff909316929092179101555b5050935093915050565b6001600160a01b038216611fe65760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401610773565b611ff1825f83611ac0565b6001600160a01b0382165f90815260656020526040902054818110156120645760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b6064820152608401610773565b6001600160a01b0383165f8181526065602090815260408083208686039055606780548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3611b97835f84611b9c565b5f61079d82846129d1565b816001600160a01b0316836001600160a01b0316141580156120f557505f81115b15611b97576001600160a01b03831615612182576001600160a01b0383165f90815260ff60205260408120819061212f906120c985611e1a565b91509150846001600160a01b03167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a7248383604051612177929190918252602082015260400190565b60405180910390a250505b6001600160a01b03821615611b97576001600160a01b0382165f90815260ff6020526040812081906121b790611e0f85611e1a565b91509150836001600160a01b03167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a72483836040516121ff929190918252602082015260400190565b60405180910390a25050505050565b5f807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a083111561224357505f905060036122c2565b604080515f8082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015612294573d5f5f3e3d5ffd5b5050604051601f1901519150506001600160a01b0381166122bc575f600192509250506122c2565b91505f90505b94509492505050565b5f8160048111156122de576122de612a62565b036122e65750565b60018160048111156122fa576122fa612a62565b036123475760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610773565b600281600481111561235b5761235b612a62565b036123a85760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610773565b60038160048111156123bc576123bc612a62565b036108295760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401610773565b5f54610100900460ff1661243a5760405162461bcd60e51b8152600401610773906129e4565b6108e033611873565b5f54610100900460ff166124695760405162461bcd60e51b8152600401610773906129e4565b60686124758382612ac1565b506069611b978282612ac1565b5f54610100900460ff166124a85760405162461bcd60e51b8152600401610773906129e4565b60996124b48382612ac1565b50609a6124c18282612ac1565b50505f609781905560985550565b5f5f6124d96118c4565b8051909150156124f0578051602090910120919050565b60975480156124ff5792915050565b7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4709250505090565b5f5f6125316118d3565b805190915015612548578051602090910120919050565b60985480156124ff5792915050565b5f80608083901c1561256b57608092831c92015b604083901c1561257d57604092831c92015b602083901c1561258f57602092831c92015b601083901c156125a157601092831c92015b600883901c156125b357600892831c92015b600483901c156125c557600492831c92015b600283901c156125d757600292831c92015b600183901c156106ae5760010192915050565b5f8183106125f8578161079d565b5090919050565b5f6001600160e01b0382111561186f5760405162461bcd60e51b815260206004820152602760248201527f53616665436173743a2076616c756520646f65736e27742066697420696e20326044820152663234206269747360c81b6064820152608401610773565b80356001600160a01b038116811461267d575f5ffd5b919050565b5f60208284031215612692575f5ffd5b61079d82612667565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f61079d602083018461269b565b5f5f604083850312156126ec575f5ffd5b6126f583612667565b946020939093013593505050565b5f5f60408385031215612714575f5ffd5b61271d83612667565b915060208301358015158114612731575f5ffd5b809150509250929050565b5f5f5f6060848603121561274e575f5ffd5b61275784612667565b925061276560208501612667565b929592945050506040919091013590565b5f60208284031215612786575f5ffd5b5035919050565b60ff60f81b8816815260e060208201525f6127ab60e083018961269b565b82810360408401526127bd818961269b565b606084018890526001600160a01b038716608085015260a0840186905283810360c0850152845180825260208087019350909101905f5b818110156128125783518352602093840193909201916001016127f4565b50909b9a5050505050505050505050565b803560ff8116811461267d575f5ffd5b5f5f5f5f5f5f60c08789031215612848575f5ffd5b61285187612667565b9550602087013594506040870135935061286d60608801612823565b9598949750929560808101359460a0909101359350915050565b5f5f5f5f5f5f5f60e0888a03121561289d575f5ffd5b6128a688612667565b96506128b460208901612667565b955060408801359450606088013593506128d060808901612823565b9699959850939692959460a0840135945060c09093013592915050565b5f5f604083850312156128fe575f5ffd5b61290783612667565b915061291560208401612667565b90509250929050565b5f5f6040838503121561292f575f5ffd5b61293883612667565b9150602083013563ffffffff81168114612731575f5ffd5b600181811c9082168061296457607f821691505b602082108103611a1357634e487b7160e01b5f52602260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b808201808211156106ae576106ae612982565b634e487b7160e01b5f52604160045260245ffd5b634e487b7160e01b5f52603260045260245ffd5b818103818111156106ae576106ae612982565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b634e487b7160e01b5f52601260045260245ffd5b5f82612a5d57634e487b7160e01b5f52601260045260245ffd5b500490565b634e487b7160e01b5f52602160045260245ffd5b601f821115611b9757805f5260205f20601f840160051c81016020851015612a9b5750805b601f840160051c820191505b81811015612aba575f8155600101612aa7565b5050505050565b815167ffffffffffffffff811115612adb57612adb6129a9565b612aef81612ae98454612950565b84612a76565b6020601f821160018114612b21575f8315612b0a5750848201515b5f19600385901b1c1916600184901b178455612aba565b5f84815260208120601f198516915b82811015612b505787850151825560209485019460019092019101612b30565b5084821015612b6d57868401515f19600387901b60f8161c191681555b50505050600190811b0190555056fea2646970667358221220bc65aa22c82ea1986fef941c8ffca5d6f9991e3fb75b2eefff53e26501e45f9064736f6c634300081b0033", } // BackingEigenABI is the input ABI used to generate the binding from. diff --git a/pkg/bindings/BeaconChainProofs/binding.go b/pkg/bindings/BeaconChainProofs/binding.go index bca107b999..3e48868c16 100644 --- a/pkg/bindings/BeaconChainProofs/binding.go +++ b/pkg/bindings/BeaconChainProofs/binding.go @@ -32,7 +32,7 @@ var ( // BeaconChainProofsMetaData contains all meta data concerning the BeaconChainProofs contract. var BeaconChainProofsMetaData = &bind.MetaData{ ABI: "[{\"type\":\"error\",\"name\":\"InvalidProof\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidProofLength\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidValidatorFieldsLength\",\"inputs\":[]}]", - Bin: "0x60556032600b8282823980515f1a607314602657634e487b7160e01b5f525f60045260245ffd5b305f52607381538281f3fe730000000000000000000000000000000000000000301460806040525f5ffdfea264697066735822122008cce030eef89bfa5bdc495fd3132a80b290f7c5211b5ff5314d2604022ce60764736f6c634300081b0033", + Bin: "0x60556032600b8282823980515f1a607314602657634e487b7160e01b5f525f60045260245ffd5b305f52607381538281f3fe730000000000000000000000000000000000000000301460806040525f5ffdfea2646970667358221220b786d81c68c50488570935b357a548005dc46a3e40dcde8c9c3cfe80240891a564736f6c634300081b0033", } // BeaconChainProofsABI is the input ABI used to generate the binding from. diff --git a/pkg/bindings/BytesLib/binding.go b/pkg/bindings/BytesLib/binding.go index 23d7c38887..80d08fb9da 100644 --- a/pkg/bindings/BytesLib/binding.go +++ b/pkg/bindings/BytesLib/binding.go @@ -32,7 +32,7 @@ var ( // BytesLibMetaData contains all meta data concerning the BytesLib contract. var BytesLibMetaData = &bind.MetaData{ ABI: "[{\"type\":\"error\",\"name\":\"OutOfBounds\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"Overflow\",\"inputs\":[]}]", - Bin: "0x60556032600b8282823980515f1a607314602657634e487b7160e01b5f525f60045260245ffd5b305f52607381538281f3fe730000000000000000000000000000000000000000301460806040525f5ffdfea26469706673582212201c49718c32c7b9955558fe081b9edb8db636f523f0b3ec1bfeea2696a9f7424464736f6c634300081b0033", + Bin: "0x60556032600b8282823980515f1a607314602657634e487b7160e01b5f525f60045260245ffd5b305f52607381538281f3fe730000000000000000000000000000000000000000301460806040525f5ffdfea2646970667358221220517c792f82001a69d55f8c03043251e3baff982c0b3c945ebf5259c111341b5664736f6c634300081b0033", } // BytesLibABI is the input ABI used to generate the binding from. diff --git a/pkg/bindings/DelegationManager/binding.go b/pkg/bindings/DelegationManager/binding.go index a8f2a6e2da..a43057d2bb 100644 --- a/pkg/bindings/DelegationManager/binding.go +++ b/pkg/bindings/DelegationManager/binding.go @@ -56,7 +56,7 @@ 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\":\"_eigenPodManager\",\"type\":\"address\",\"internalType\":\"contractIEigenPodManager\"},{\"name\":\"_allocationManager\",\"type\":\"address\",\"internalType\":\"contractIAllocationManager\"},{\"name\":\"_pauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"},{\"name\":\"_permissionController\",\"type\":\"address\",\"internalType\":\"contractIPermissionController\"},{\"name\":\"_MIN_WITHDRAWAL_DELAY\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"DELEGATION_APPROVAL_TYPEHASH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"allocationManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIAllocationManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"beaconChainETHStrategy\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"calculateDelegationApprovalDigestHash\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"approver\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"approverSalt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"calculateWithdrawalRoot\",\"inputs\":[{\"name\":\"withdrawal\",\"type\":\"tuple\",\"internalType\":\"structIDelegationManagerTypes.Withdrawal\",\"components\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"delegatedTo\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"withdrawer\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"nonce\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startBlock\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"scaledShares\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"completeQueuedWithdrawal\",\"inputs\":[{\"name\":\"withdrawal\",\"type\":\"tuple\",\"internalType\":\"structIDelegationManagerTypes.Withdrawal\",\"components\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"delegatedTo\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"withdrawer\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"nonce\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startBlock\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"scaledShares\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}]},{\"name\":\"tokens\",\"type\":\"address[]\",\"internalType\":\"contractIERC20[]\"},{\"name\":\"receiveAsTokens\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeQueuedWithdrawals\",\"inputs\":[{\"name\":\"withdrawals\",\"type\":\"tuple[]\",\"internalType\":\"structIDelegationManagerTypes.Withdrawal[]\",\"components\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"delegatedTo\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"withdrawer\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"nonce\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startBlock\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"scaledShares\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}]},{\"name\":\"tokens\",\"type\":\"address[][]\",\"internalType\":\"contractIERC20[][]\"},{\"name\":\"receiveAsTokens\",\"type\":\"bool[]\",\"internalType\":\"bool[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"convertToDepositShares\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"withdrawableShares\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"cumulativeWithdrawalsQueued\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"totalQueued\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"decreaseDelegatedShares\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"curDepositShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"beaconChainSlashingFactorDecrease\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"delegateTo\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"approverSignatureAndExpiry\",\"type\":\"tuple\",\"internalType\":\"structISignatureUtils.SignatureWithExpiry\",\"components\":[{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"approverSalt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"delegatedTo\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"delegationApprover\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"delegationApproverSaltIsSpent\",\"inputs\":[{\"name\":\"delegationApprover\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"spent\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"depositScalingFactor\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"domainSeparator\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"eigenPodManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIEigenPodManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getDepositedShares\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getOperatorShares\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getOperatorsShares\",\"inputs\":[{\"name\":\"operators\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256[][]\",\"internalType\":\"uint256[][]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getQueuedWithdrawal\",\"inputs\":[{\"name\":\"withdrawalRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIDelegationManagerTypes.Withdrawal\",\"components\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"delegatedTo\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"withdrawer\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"nonce\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startBlock\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"scaledShares\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getQueuedWithdrawalRoots\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32[]\",\"internalType\":\"bytes32[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getQueuedWithdrawals\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"withdrawals\",\"type\":\"tuple[]\",\"internalType\":\"structIDelegationManagerTypes.Withdrawal[]\",\"components\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"delegatedTo\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"withdrawer\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"nonce\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startBlock\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"scaledShares\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}]},{\"name\":\"shares\",\"type\":\"uint256[][]\",\"internalType\":\"uint256[][]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getSlashableSharesInQueue\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getWithdrawableShares\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"outputs\":[{\"name\":\"withdrawableShares\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"},{\"name\":\"depositShares\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"increaseDelegatedShares\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"prevDepositShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"addedShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"initialOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"initialPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"isDelegated\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isOperator\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"minWithdrawalDelayBlocks\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"modifyOperatorDetails\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"newDelegationApprover\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"operatorShares\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"shares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"pauseAll\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[{\"name\":\"index\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pauserRegistry\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pendingWithdrawals\",\"inputs\":[{\"name\":\"withdrawalRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"pending\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"permissionController\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIPermissionController\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"queueWithdrawals\",\"inputs\":[{\"name\":\"params\",\"type\":\"tuple[]\",\"internalType\":\"structIDelegationManagerTypes.QueuedWithdrawalParams[]\",\"components\":[{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"depositShares\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"},{\"name\":\"__deprecated_withdrawer\",\"type\":\"address\",\"internalType\":\"address\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32[]\",\"internalType\":\"bytes32[]\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"redelegate\",\"inputs\":[{\"name\":\"newOperator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"newOperatorApproverSig\",\"type\":\"tuple\",\"internalType\":\"structISignatureUtils.SignatureWithExpiry\",\"components\":[{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"approverSalt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"withdrawalRoots\",\"type\":\"bytes32[]\",\"internalType\":\"bytes32[]\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"registerAsOperator\",\"inputs\":[{\"name\":\"initDelegationApprover\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"allocationDelay\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"metadataURI\",\"type\":\"string\",\"internalType\":\"string\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"slashOperatorShares\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"prevMaxMagnitude\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"newMaxMagnitude\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"strategyManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategyManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"undelegate\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"withdrawalRoots\",\"type\":\"bytes32[]\",\"internalType\":\"bytes32[]\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"updateOperatorMetadataURI\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"metadataURI\",\"type\":\"string\",\"internalType\":\"string\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"DelegationApproverUpdated\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newDelegationApprover\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DepositScalingFactorUpdated\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"newDepositScalingFactor\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorMetadataURIUpdated\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"metadataURI\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorRegistered\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"delegationApprover\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorSharesDecreased\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"staker\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"shares\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorSharesIncreased\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"staker\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"shares\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"SlashingWithdrawalCompleted\",\"inputs\":[{\"name\":\"withdrawalRoot\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"SlashingWithdrawalQueued\",\"inputs\":[{\"name\":\"withdrawalRoot\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"},{\"name\":\"withdrawal\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIDelegationManagerTypes.Withdrawal\",\"components\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"delegatedTo\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"withdrawer\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"nonce\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startBlock\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"scaledShares\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}]},{\"name\":\"sharesToWithdraw\",\"type\":\"uint256[]\",\"indexed\":false,\"internalType\":\"uint256[]\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StakerDelegated\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StakerForceUndelegated\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StakerUndelegated\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"ActivelyDelegated\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"CallerCannotUndelegate\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"CurrentlyPaused\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"FullySlashed\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InputAddressZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InputArrayLengthMismatch\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InputArrayLengthZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidNewPausedStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidPermissions\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidSignature\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidSnapshotOrdering\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotActivelyDelegated\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyAllocationManager\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyEigenPodManager\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyPauser\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyStrategyManagerOrEigenPodManager\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyUnpauser\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OperatorNotRegistered\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OperatorsCannotUndelegate\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SaltSpent\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SignatureExpired\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"WithdrawalDelayNotElapsed\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"WithdrawalNotQueued\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"WithdrawerNotCaller\",\"inputs\":[]}]", - Bin: "0x610180604052348015610010575f5ffd5b50604051615dd6380380615dd683398101604081905261002f9161021c565b8186868684876001600160a01b03811661005c576040516339b190bb60e11b815260040160405180910390fd5b6001600160a01b0390811660805293841660a05291831660c05290911660e05263ffffffff16610100524661012052610125604080518082018252600a81526922b4b3b2b72630bcb2b960b11b60209182015281517f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a866818301527f71b625cfad44bac63b13dba07f2e1d6084ee04b6f8752101ece6126d584ee6ea81840152466060820152306080808301919091528351808303909101815260a0909101909252815191012090565b610140526001600160a01b03166101605261013e610149565b5050505050506102a7565b5f54610100900460ff16156101b45760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff90811614610203575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b0381168114610219575f5ffd5b50565b5f5f5f5f5f5f60c08789031215610231575f5ffd5b865161023c81610205565b602088015190965061024d81610205565b604088015190955061025e81610205565b606088015190945061026f81610205565b608088015190935061028081610205565b60a088015190925063ffffffff81168114610299575f5ffd5b809150509295509295509295565b60805160a05160c05160e05161010051610120516101405161016051615a3a61039c5f395f818161042c01526132fa01525f61271601525f61265601525f818161070001528181611504015281816134f5015261383101525f818161075001528181610da901528181610f5a0152818161169f0152818161185e01528181611cb2015281816128eb01526133b101525f818161045301528181610ee0015281816117c501528181611a23015281816130e3015261363b01525f818161038901528181610eae01528181611977015261361501525f81816105ee01528181610b410152818161107a015261273a0152615a3a5ff3fe608060405234801561000f575f5ffd5b50600436106102cb575f3560e01c8063715018a61161017b578063bfae3fd2116100e4578063e4cc3f901161009e578063f2fde38b11610079578063f2fde38b146107de578063f698da25146107f1578063fabc1cbc146107f9578063fd8aa88d1461080c575f5ffd5b8063e4cc3f9014610798578063eea9064b146107ab578063f0e0e676146107be575f5ffd5b8063bfae3fd2146106e3578063c448feb8146106f6578063c978f7ac1461072a578063ca8aa7c71461074b578063cd6dc68714610772578063da8be86414610785575f5ffd5b80639104c319116101355780639104c319146106345780639435bb431461064f578063a178848414610662578063a33a343314610681578063b7f06ebe14610694578063bb45fef2146106b6575f5ffd5b8063715018a6146105a4578063778e55f3146105ac57806378296ec5146105d6578063886f1195146105e95780638da5cb5b146106105780639004134714610621575f5ffd5b806354b7c96c116102375780635dd68579116101f157806365da1264116101cc57806365da12641461053557806366d5ba931461055d5780636d70f7ae1461057e5780636e17444814610591575f5ffd5b80635dd68579146104ee578063601bb36f1461050f57806360a0d1ce14610522575f5ffd5b806354b7c96c14610475578063595c6a6714610488578063597b36da146104905780635ac86ab7146104a35780635c975abb146104c65780635d975e88146104ce575f5ffd5b806339b70e381161028857806339b70e38146103845780633c651cf2146103c35780633cdeb5e0146103d65780633e28391d146104045780634657e26a146104275780634665bcda1461044e575f5ffd5b806304a4f979146102cf5780630b9f487a146103095780630dd8dd021461031c578063136439dd1461033c57806325df922e146103515780632aa6d88814610371575b5f5ffd5b6102f67f14bde674c9f64b2ad00eaaee4a8bed1fabef35c7507e3c5b9cfc9436909a2dad81565b6040519081526020015b60405180910390f35b6102f6610317366004614957565b61081f565b61032f61032a3660046149ee565b6108a7565b6040516103009190614a2c565b61034f61034a366004614a63565b610b2c565b005b61036461035f366004614bf8565b610c01565b6040516103009190614ca6565b61034f61037f366004614d08565b610d61565b6103ab7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610300565b61034f6103d1366004614d66565b610ea3565b6103ab6103e4366004614da9565b6001600160a01b039081165f908152609960205260409020600101541690565b610417610412366004614da9565b610fea565b6040519015158152602001610300565b6103ab7f000000000000000000000000000000000000000000000000000000000000000081565b6103ab7f000000000000000000000000000000000000000000000000000000000000000081565b61034f610483366004614dc4565b611009565b61034f611065565b6102f661049e366004614eb7565b611114565b6104176104b1366004614ee8565b606654600160ff9092169190911b9081161490565b6066546102f6565b6104e16104dc366004614a63565b611143565b6040516103009190614fbf565b6105016104fc366004614da9565b61125f565b60405161030092919061501f565b61034f61051d3660046150a0565b611694565b61034f6105303660046150f9565b6117ba565b6103ab610543366004614da9565b609a6020525f90815260409020546001600160a01b031681565b61057061056b366004614da9565b61194f565b604051610300929190615138565b61041761058c366004614da9565b611c4f565b6102f661059f366004614dc4565b611c87565b61034f611d31565b6102f66105ba366004614dc4565b609860209081525f928352604080842090915290825290205481565b61034f6105e436600461515c565b611d42565b6103ab7f000000000000000000000000000000000000000000000000000000000000000081565b6033546001600160a01b03166103ab565b61036461062f3660046151ac565b611dca565b6103ab73beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac081565b61034f61065d3660046151f8565b611ea0565b6102f6610670366004614da9565b609f6020525f908152604090205481565b61032f61068f366004615294565b611f70565b6104176106a2366004614a63565b609e6020525f908152604090205460ff1681565b6104176106c436600461537b565b609c60209081525f928352604080842090915290825290205460ff1681565b6102f66106f1366004614dc4565b611f88565b60405163ffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152602001610300565b61073d6107383660046151ac565b611fc4565b6040516103009291906153a5565b6103ab7f000000000000000000000000000000000000000000000000000000000000000081565b61034f61078036600461537b565b612251565b61032f610793366004614da9565b61236c565b61034f6107a63660046153c4565b61247c565b61034f6107b9366004615294565b6124d2565b6107d16107cc366004615437565b612535565b60405161030091906154e4565b61034f6107ec366004614da9565b6125da565b6102f6612653565b61034f610807366004614a63565b612738565b61032f61081a366004614da9565b61284f565b604080517f14bde674c9f64b2ad00eaaee4a8bed1fabef35c7507e3c5b9cfc9436909a2dad60208201526001600160a01b03808616928201929092528187166060820152908516608082015260a0810183905260c081018290525f9061089d9060e00160405160208183030381529060405280519060200120612872565b9695505050505050565b6066546060906001906002908116036108d35760405163840a48d560e01b815260040160405180910390fd5b5f836001600160401b038111156108ec576108ec614a7a565b604051908082528060200260200182016040528015610915578160200160208202803683370190505b50335f908152609a60205260408120549192506001600160a01b03909116905b85811015610b215786868281811061094f5761094f6154f6565b9050602002810190610961919061550a565b61096f906020810190615528565b9050878783818110610983576109836154f6565b9050602002810190610995919061550a565b61099f9080615528565b9050146109bf576040516343714afd60e01b815260040160405180910390fd5b5f610a2933848a8a868181106109d7576109d76154f6565b90506020028101906109e9919061550a565b6109f39080615528565b808060200260200160405190810160405280939291908181526020018383602002808284375f920191909152506128a092505050565b9050610afb33848a8a86818110610a4257610a426154f6565b9050602002810190610a54919061550a565b610a5e9080615528565b808060200260200160405190810160405280939291908181526020018383602002808284375f920191909152508e92508d9150889050818110610aa357610aa36154f6565b9050602002810190610ab5919061550a565b610ac3906020810190615528565b808060200260200160405190810160405280939291908181526020018383602002808284375f920191909152508892506129e7915050565b848381518110610b0d57610b0d6154f6565b602090810291909101015250600101610935565b509095945050505050565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa158015610b8e573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610bb2919061556d565b610bcf57604051631d77d47760e21b815260040160405180910390fd5b6066548181168114610bf45760405163c61dca5d60e01b815260040160405180910390fd5b610bfd82612edc565b5050565b6001600160a01b038084165f908152609a60205260408120546060921690610c2a8683876128a0565b90505f85516001600160401b03811115610c4657610c46614a7a565b604051908082528060200260200182016040528015610c6f578160200160208202803683370190505b5090505f5b8651811015610d54576001600160a01b0388165f90815260a260205260408120885182908a9085908110610caa57610caa6154f6565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020015f206040518060200160405290815f820154815250509050610d2e878381518110610cfc57610cfc6154f6565b6020026020010151858481518110610d1657610d166154f6565b602002602001015183612f199092919063ffffffff16565b838381518110610d4057610d406154f6565b602090810291909101015250600101610c74565b50925050505b9392505050565b610d6a33610fea565b15610d8857604051633bf2b50360e11b815260040160405180910390fd5b604051632b6241f360e11b815233600482015263ffffffff841660248201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906356c483e6906044015f604051808303815f87803b158015610df2575f5ffd5b505af1158015610e04573d5f5f3e3d5ffd5b50505050610e123385612f37565b610e1c3333612f99565b6040516001600160a01b038516815233907fa453db612af59e5521d6ab9284dc3e2d06af286eb1b1b7b771fce4716c19f2c19060200160405180910390a2336001600160a01b03167f02a919ed0e2acad1dd90f17ef2fa4ae5462ee1339170034a8531cca4b67080908383604051610e95929190615588565b60405180910390a250505050565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161480610f025750336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016145b610f1f5760405163045206a560e21b815260040160405180910390fd5b6001600160a01b038481165f908152609a602052604080822054905163152667d960e31b8152908316600482018190528684166024830152927f0000000000000000000000000000000000000000000000000000000000000000169063a9333ec890604401602060405180830381865afa158015610f9f573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610fc391906155b6565b90505f610fd187878461309c565b9050610fe183888888888661317e565b50505050505050565b6001600160a01b039081165f908152609a602052604090205416151590565b81611013816132bc565b6110305760405163932d94f760e01b815260040160405180910390fd5b61103983611c4f565b611056576040516325ec6c1f60e01b815260040160405180910390fd5b6110608383612f37565b505050565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa1580156110c7573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110eb919061556d565b61110857604051631d77d47760e21b815260040160405180910390fd5b6111125f19612edc565b565b5f816040516020016111269190614fbf565b604051602081830303815290604052805190602001209050919050565b61114b614813565b5f82815260a46020908152604091829020825160e08101845281546001600160a01b03908116825260018301548116828501526002830154168185015260038201546060820152600482015463ffffffff1660808201526005820180548551818602810186019096528086529194929360a086019392908301828280156111f957602002820191905f5260205f20905b81546001600160a01b031681526001909101906020018083116111db575b505050505081526020016006820180548060200260200160405190810160405280929190818152602001828054801561124f57602002820191905f5260205f20905b81548152602001906001019080831161123b575b5050505050815250509050919050565b6060805f61126c8461284f565b8051909150806001600160401b0381111561128957611289614a7a565b6040519080825280602002602001820160405280156112c257816020015b6112af614813565b8152602001906001900390816112a75790505b509350806001600160401b038111156112dd576112dd614a7a565b60405190808252806020026020018201604052801561131057816020015b60608152602001906001900390816112fb5790505b506001600160a01b038087165f908152609a60205260408120549295509116905b8281101561168b5760a45f85838151811061134e5761134e6154f6565b60209081029190910181015182528181019290925260409081015f20815160e08101835281546001600160a01b03908116825260018301548116828601526002830154168184015260038201546060820152600482015463ffffffff1660808201526005820180548451818702810187019095528085529194929360a086019390929083018282801561140857602002820191905f5260205f20905b81546001600160a01b031681526001909101906020018083116113ea575b505050505081526020016006820180548060200260200160405190810160405280929190818152602001828054801561145e57602002820191905f5260205f20905b81548152602001906001019080831161144a575b505050505081525050868281518110611479576114796154f6565b6020026020010181905250858181518110611496576114966154f6565b602002602001015160a00151516001600160401b038111156114ba576114ba614a7a565b6040519080825280602002602001820160405280156114e3578160200160208202803683370190505b508582815181106114f6576114f66154f6565b60200260200101819052505f7f0000000000000000000000000000000000000000000000000000000000000000878381518110611535576115356154f6565b60200260200101516080015161154b91906155e5565b905060604363ffffffff168263ffffffff1610156115935761158c89858a868151811061157a5761157a6154f6565b602002602001015160a0015185613366565b90506115be565b6115bb89858a86815181106115aa576115aa6154f6565b602002602001015160a001516128a0565b90505b5f5b8884815181106115d2576115d26154f6565b602002602001015160a001515181101561167d5761163f8985815181106115fb576115fb6154f6565b602002602001015160c001518281518110611618576116186154f6565b6020026020010151838381518110611632576116326154f6565b6020026020010151613494565b888581518110611651576116516154f6565b6020026020010151828151811061166a5761166a6154f6565b60209081029190910101526001016115c0565b505050806001019050611331565b50505050915091565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146116dd576040516323d871a560e01b815260040160405180910390fd5b6001600160a01b038085165f90815260986020908152604080832093871683529290529081205461171b906001600160401b0380861690851661349f565b90505f61172a868686866134b7565b90505f6117378284615601565b9050611745875f8886613574565b5f61174f876135ee565b60405163debe1eab60e01b81526001600160a01b038981166004830152602482018590529192509082169063debe1eab906044015f604051808303815f87803b15801561179a575f5ffd5b505af11580156117ac573d5f5f3e3d5ffd5b505050505050505050505050565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461180357604051633213a66160e21b815260040160405180910390fd5b61180c83610fea565b15611060576001600160a01b038381165f908152609a602052604080822054905163152667d960e31b81529083166004820181905273beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac06024830152927f0000000000000000000000000000000000000000000000000000000000000000169063a9333ec890604401602060405180830381865afa1580156118a3573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906118c791906155b6565b6001600160a01b0386165f90815260a26020908152604080832073beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac084528252808320815192830190915254815291925061192d866119256001600160401b03808716908916613660565b849190613674565b9050610fe1848873beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac084613574565b6040516394f649dd60e01b81526001600160a01b03828116600483015260609182915f9182917f000000000000000000000000000000000000000000000000000000000000000016906394f649dd906024015f60405180830381865afa1580156119bb573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526119e2919081019061566f565b60405163fe243a1760e01b81526001600160a01b03888116600483015273beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac060248301529294509092505f917f0000000000000000000000000000000000000000000000000000000000000000169063fe243a1790604401602060405180830381865afa158015611a68573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a8c919061572a565b9050805f03611aa057509094909350915050565b5f83516001611aaf9190615601565b6001600160401b03811115611ac657611ac6614a7a565b604051908082528060200260200182016040528015611aef578160200160208202803683370190505b5090505f84516001611b019190615601565b6001600160401b03811115611b1857611b18614a7a565b604051908082528060200260200182016040528015611b41578160200160208202803683370190505b50905073beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac082865181518110611b6c57611b6c6154f6565b60200260200101906001600160a01b031690816001600160a01b0316815250508281865181518110611ba057611ba06154f6565b60209081029190910101525f5b8551811015611c4157858181518110611bc857611bc86154f6565b6020026020010151838281518110611be257611be26154f6565b60200260200101906001600160a01b031690816001600160a01b031681525050848181518110611c1457611c146154f6565b6020026020010151828281518110611c2e57611c2e6154f6565b6020908102919091010152600101611bad565b509097909650945050505050565b5f6001600160a01b03821615801590611c8157506001600160a01b038083165f818152609a6020526040902054909116145b92915050565b60405163152667d960e31b81526001600160a01b03838116600483015282811660248301525f9182917f0000000000000000000000000000000000000000000000000000000000000000169063a9333ec890604401602060405180830381865afa158015611cf7573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611d1b91906155b6565b9050611d298484835f6134b7565b949350505050565b611d39613692565b6111125f6136ec565b82611d4c816132bc565b611d695760405163932d94f760e01b815260040160405180910390fd5b611d7284611c4f565b611d8f576040516325ec6c1f60e01b815260040160405180910390fd5b836001600160a01b03167f02a919ed0e2acad1dd90f17ef2fa4ae5462ee1339170034a8531cca4b67080908484604051610e95929190615588565b60605f82516001600160401b03811115611de657611de6614a7a565b604051908082528060200260200182016040528015611e0f578160200160208202803683370190505b5090505f5b8351811015611e98576001600160a01b0385165f9081526098602052604081208551909190869084908110611e4b57611e4b6154f6565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020015f2054828281518110611e8557611e856154f6565b6020908102919091010152600101611e14565b509392505050565b606654600290600490811603611ec95760405163840a48d560e01b815260040160405180910390fd5b611ed161373d565b855f5b81811015611f6457611f5c898983818110611ef157611ef16154f6565b9050602002810190611f039190615741565b611f0c90615755565b888884818110611f1e57611f1e6154f6565b9050602002810190611f309190615528565b888886818110611f4257611f426154f6565b9050602002016020810190611f579190615760565b613796565b600101611ed4565b5050610fe1600160c955565b6060611f7b3361236c565b9050610d5a8484846124d2565b6001600160a01b038083165f90815260a260209081526040808320938516835292815282822083519182019093529154825290610d5a90613bd8565b60608082516001600160401b03811115611fe057611fe0614a7a565b604051908082528060200260200182016040528015612009578160200160208202803683370190505b50915082516001600160401b0381111561202557612025614a7a565b60405190808252806020026020018201604052801561204e578160200160208202803683370190505b506001600160a01b038086165f908152609a60205260408120549293509116906120798683876128a0565b90505f5b8551811015612246575f6120a987838151811061209c5761209c6154f6565b60200260200101516135ee565b9050806001600160a01b031663fe243a17898985815181106120cd576120cd6154f6565b60200260200101516040518363ffffffff1660e01b81526004016121079291906001600160a01b0392831681529116602082015260400190565b602060405180830381865afa158015612122573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612146919061572a565b858381518110612158576121586154f6565b6020026020010181815250505f60a25f8a6001600160a01b03166001600160a01b031681526020019081526020015f205f89858151811061219b5761219b6154f6565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020015f206040518060200160405290815f82015481525050905061221f8684815181106121ed576121ed6154f6565b6020026020010151858581518110612207576122076154f6565b6020026020010151836136749092919063ffffffff16565b878481518110612231576122316154f6565b6020908102919091010152505060010161207d565b5050505b9250929050565b5f54610100900460ff161580801561226f57505f54600160ff909116105b806122885750303b15801561228857505f5460ff166001145b6122f05760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b5f805460ff191660011790558015612311575f805461ff0019166101001790555b61231a82612edc565b612323836136ec565b8015611060575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a1505050565b606061237782610fea565b6123945760405163a5c7c44560e01b815260040160405180910390fd5b61239d82611c4f565b156123bb576040516311ca333560e31b815260040160405180910390fd5b336001600160a01b03831614612473576001600160a01b038083165f908152609a6020526040902054166123ee816132bc565b8061241457506001600160a01b038181165f908152609960205260409020600101541633145b61243157604051631e499a2360e11b815260040160405180910390fd5b806001600160a01b0316836001600160a01b03167ff0eddf07e6ea14f388b47e1e94a0f464ecbd9eed4171130e0fc0e99fb4030a8a60405160405180910390a3505b611c8182613bf7565b6066546002906004908116036124a55760405163840a48d560e01b815260040160405180910390fd5b6124ad61373d565b6124c16124b986615755565b858585613796565b6124cb600160c955565b5050505050565b6124db33610fea565b156124f957604051633bf2b50360e11b815260040160405180910390fd5b61250283611c4f565b61251f576040516325ec6c1f60e01b815260040160405180910390fd5b61252b33848484613e56565b6110603384612f99565b60605f83516001600160401b0381111561255157612551614a7a565b60405190808252806020026020018201604052801561258457816020015b606081526020019060019003908161256f5790505b5090505f5b8451811015611e98576125b58582815181106125a7576125a76154f6565b602002602001015185611dca565b8282815181106125c7576125c76154f6565b6020908102919091010152600101612589565b6125e2613692565b6001600160a01b0381166126475760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016122e7565b612650816136ec565b50565b5f7f000000000000000000000000000000000000000000000000000000000000000046146127135750604080518082018252600a81526922b4b3b2b72630bcb2b960b11b60209182015281517f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a866818301527f71b625cfad44bac63b13dba07f2e1d6084ee04b6f8752101ece6126d584ee6ea81840152466060820152306080808301919091528351808303909101815260a0909101909252815191012090565b507f000000000000000000000000000000000000000000000000000000000000000090565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612794573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906127b8919061577b565b6001600160a01b0316336001600160a01b0316146127e95760405163794821ff60e01b815260040160405180910390fd5b606654801982198116146128105760405163c61dca5d60e01b815260040160405180910390fd5b606682905560405182815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c906020015b60405180910390a25050565b6001600160a01b0381165f90815260a360205260409020606090611c8190613f1b565b5f61287b612653565b60405161190160f01b6020820152602281019190915260428101839052606201611126565b60605f82516001600160401b038111156128bc576128bc614a7a565b6040519080825280602002602001820160405280156128e5578160200160208202803683370190505b5090505f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663547afb8786866040518363ffffffff1660e01b8152600401612937929190615796565b5f60405180830381865afa158015612951573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261297891908101906157b9565b90505f5b8451811015610b21576129c28786838151811061299b5761299b6154f6565b60200260200101518484815181106129b5576129b56154f6565b602002602001015161309c565b8382815181106129d4576129d46154f6565b602090810291909101015260010161297c565b5f6001600160a01b038616612a0f576040516339b190bb60e11b815260040160405180910390fd5b83515f03612a305760405163796cc52560e01b815260040160405180910390fd5b5f84516001600160401b03811115612a4a57612a4a614a7a565b604051908082528060200260200182016040528015612a73578160200160208202803683370190505b5090505f85516001600160401b03811115612a9057612a90614a7a565b604051908082528060200260200182016040528015612ab9578160200160208202803683370190505b5090505f5b8651811015612d0f575f612add88838151811061209c5761209c6154f6565b90505f60a25f8c6001600160a01b03166001600160a01b031681526020019081526020015f205f8a8581518110612b1657612b166154f6565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020015f206040518060200160405290815f820154815250509050612b82888481518110612b6857612b686154f6565b6020026020010151888581518110612207576122076154f6565b848481518110612b9457612b946154f6565b602002602001018181525050612bcc888481518110612bb557612bb56154f6565b602002602001015182613f2790919063ffffffff16565b858481518110612bde57612bde6154f6565b60209081029190910101526001600160a01b038a1615612c7357612c358a8a8581518110612c0e57612c0e6154f6565b6020026020010151878681518110612c2857612c286154f6565b6020026020010151613f3b565b612c738a8c8b8681518110612c4c57612c4c6154f6565b6020026020010151878781518110612c6657612c666154f6565b6020026020010151613574565b816001600160a01b031663724af4238c8b8681518110612c9557612c956154f6565b60200260200101518b8781518110612caf57612caf6154f6565b60200260200101516040518463ffffffff1660e01b8152600401612cd593929190615848565b5f604051808303815f87803b158015612cec575f5ffd5b505af1158015612cfe573d5f5f3e3d5ffd5b505050505050806001019050612abe565b506001600160a01b0388165f908152609f60205260408120805491829190612d368361586c565b91905055505f6040518060e001604052808b6001600160a01b031681526020018a6001600160a01b031681526020018b6001600160a01b031681526020018381526020014363ffffffff1681526020018981526020018581525090505f612d9c82611114565b5f818152609e602090815260408083208054600160ff19909116811790915560a4835292819020865181546001600160a01b03199081166001600160a01b039283161783558885015195830180548216968316969096179095559187015160028201805490951692169190911790925560608501516003830155608085015160048301805463ffffffff191663ffffffff90921691909117905560a085015180519394508593612e52926005850192019061486c565b5060c08201518051612e6e9160068401916020909101906148cf565b5050506001600160a01b038b165f90815260a360205260409020612e929082613fc9565b507f26b2aae26516e8719ef50ea2f6831a2efbd4e37dccdf0f6936b27bc08e793e30818386604051612ec693929190615884565b60405180910390a19a9950505050505050505050565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a250565b5f611d2982612f31612f2a87613bd8565b8690613fd4565b90613fd4565b6001600160a01b038281165f8181526099602090815260409182902060010180546001600160a01b0319169486169485179055905192835290917f773b54c04d756fcc5e678111f7d730de3be98192000799eee3d63716055a87c69101612843565b6066545f90600190811603612fc15760405163840a48d560e01b815260040160405180910390fd5b6001600160a01b038381165f818152609a602052604080822080546001600160a01b0319169487169485179055517fc3ee9f2e5fda98e8066a1f745b2df9285f416fe98cf2559cd21484b3d87433049190a35f5f61301e8561194f565b915091505f61302e8686856128a0565b90505f5b8351811015610fe1576130948688868481518110613052576130526154f6565b60200260200101515f87868151811061306d5761306d6154f6565b6020026020010151878781518110613087576130876154f6565b602002602001015161317e565b600101613032565b5f73beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeabf196001600160a01b0384160161316e5760405163a3d75e0960e01b81526001600160a01b0385811660048301525f917f00000000000000000000000000000000000000000000000000000000000000009091169063a3d75e0990602401602060405180830381865afa15801561312a573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061314e91906155b6565b90506131666001600160401b03848116908316613660565b915050610d5a565b506001600160401b031692915050565b805f0361319e57604051630a33bc6960e21b815260040160405180910390fd5b6001600160a01b038086165f90815260a2602090815260408083209388168352929052206131ce81858585613fe8565b6040805160208101909152815481527f8be932bac54561f27260f95463d9b8ab37e06b2842e5ee2404157cc13df6eb8f908790879061320c90613bd8565b60405161321b93929190615848565b60405180910390a161322c86610fea565b15610fe1576001600160a01b038088165f90815260986020908152604080832093891683529290529081208054859290613267908490615601565b92505081905550866001600160a01b03167f1ec042c965e2edd7107b51188ee0f383e22e76179041ab3a9d18ff151405166c8787866040516132ab93929190615848565b60405180910390a250505050505050565b604051631beb2b9760e31b81526001600160a01b0382811660048301523360248301523060448301525f80356001600160e01b0319166064840152917f00000000000000000000000000000000000000000000000000000000000000009091169063df595cb8906084016020604051808303815f875af1158015613342573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611c81919061556d565b60605f83516001600160401b0381111561338257613382614a7a565b6040519080825280602002602001820160405280156133ab578160200160208202803683370190505b5090505f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166394d7d00c8787876040518463ffffffff1660e01b81526004016133ff939291906158ae565b5f60405180830381865afa158015613419573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261344091908101906157b9565b90505f5b8551811015613488576134638887838151811061299b5761299b6154f6565b838281518110613475576134756154f6565b6020908102919091010152600101613444565b50909695505050505050565b5f610d5a8383613660565b5f6134ad8483856001614057565b611d2990856158e7565b6001600160a01b038085165f90815260a560209081526040808320938716835292905290812081906134e8906140b2565b90505f61354e600161351a7f0000000000000000000000000000000000000000000000000000000000000000436158fa565b61352491906158fa565b6001600160a01b03808a165f90815260a560209081526040808320938c16835292905220906140cc565b90505f61355b82846158e7565b90506135688187876140e8565b98975050505050505050565b6001600160a01b038085165f908152609860209081526040808320938616835292905290812080548392906135aa9084906158e7565b92505081905550836001600160a01b03167f6909600037b75d7b4733aedd815442b5ec018a827751c832aaff64eba5d6d2dd848484604051610e9593929190615848565b5f6001600160a01b03821673beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac014613639577f0000000000000000000000000000000000000000000000000000000000000000611c81565b7f000000000000000000000000000000000000000000000000000000000000000092915050565b5f610d5a8383670de0b6b3a7640000614106565b5f611d298261368c61368587613bd8565b8690613660565b90613660565b6033546001600160a01b031633146111125760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016122e7565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b600260c9540361378f5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016122e7565b600260c955565b60a08401515182146137bb576040516343714afd60e01b815260040160405180910390fd5b83604001516001600160a01b0316336001600160a01b0316146137f1576040516316110d3560e21b815260040160405180910390fd5b5f6137fb85611114565b5f818152609e602052604090205490915060ff1661382c576040516387c9d21960e01b815260040160405180910390fd5b60605f7f0000000000000000000000000000000000000000000000000000000000000000876080015161385f91906155e5565b90508063ffffffff164363ffffffff161161388d576040516378f67ae160e11b815260040160405180910390fd5b6138a4875f015188602001518960a0015184613366565b87516001600160a01b03165f90815260a3602052604090209092506138ca9150836141eb565b505f82815260a46020526040812080546001600160a01b031990811682556001820180548216905560028201805490911690556003810182905560048101805463ffffffff19169055906139216005830182614908565b61392e600683015f614908565b50505f828152609e602052604090819020805460ff19169055517f1f40400889274ed07b24845e5054a87a0cab969eb1277aafe61ae352e7c32a00906139779084815260200190565b60405180910390a185516001600160a01b039081165f908152609a6020526040812054885160a08a015191909316926139b19184906128a0565b90505f5b8860a0015151811015613bcd575f6139dc8a60a00151838151811061209c5761209c6154f6565b90505f613a128b60c0015184815181106139f8576139f86154f6565b6020026020010151878581518110611632576116326154f6565b9050805f03613a22575050613bc5565b8715613af057816001600160a01b0316632eae418c8c5f01518d60a001518681518110613a5157613a516154f6565b60200260200101518d8d88818110613a6b57613a6b6154f6565b9050602002016020810190613a809190614da9565b60405160e085901b6001600160e01b03191681526001600160a01b03938416600482015291831660248301529091166044820152606481018490526084015f604051808303815f87803b158015613ad5575f5ffd5b505af1158015613ae7573d5f5f3e3d5ffd5b50505050613bc2565b5f5f836001600160a01b03166350ff72258e5f01518f60a001518881518110613b1b57613b1b6154f6565b6020026020010151866040518463ffffffff1660e01b8152600401613b4293929190615848565b60408051808303815f875af1158015613b5d573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613b819190615916565b91509150613bbf878e5f01518f60a001518881518110613ba357613ba36154f6565b602002602001015185858b8b81518110613087576130876154f6565b50505b50505b6001016139b5565b505050505050505050565b80515f9015613be8578151611c81565b670de0b6b3a764000092915050565b606654606090600190600290811603613c235760405163840a48d560e01b815260040160405180910390fd5b6001600160a01b038084165f818152609a602052604080822080546001600160a01b0319811690915590519316928392917ffee30966a256b71e14bc0ebfc94315e28ef4a97a7131a9e2b7a310a73af4467691a35f5f613c828661194f565b9150915081515f03613c9657505050613e50565b81516001600160401b03811115613caf57613caf614a7a565b604051908082528060200260200182016040528015613cd8578160200160208202803683370190505b5094505f613ce78785856128a0565b90505f5b8351811015613e4a576040805160018082528183019092525f916020808301908036833750506040805160018082528183019092529293505f9291506020808301908036833750506040805160018082528183019092529293505f92915060208083019080368337019050509050868481518110613d6b57613d6b6154f6565b6020026020010151835f81518110613d8557613d856154f6565b60200260200101906001600160a01b031690816001600160a01b031681525050858481518110613db757613db76154f6565b6020026020010151825f81518110613dd157613dd16154f6565b602002602001018181525050848481518110613def57613def6154f6565b6020026020010151815f81518110613e0957613e096154f6565b602002602001018181525050613e228b898585856129e7565b8a8581518110613e3457613e346154f6565b6020908102919091010152505050600101613ceb565b50505050505b50919050565b6001600160a01b038084165f908152609960205260409020600101541680613e7e5750613f15565b6001600160a01b0381165f908152609c6020908152604080832085845290915290205460ff1615613ec257604051630d4c4c9160e21b815260040160405180910390fd5b6001600160a01b0381165f908152609c602090815260408083208584528252909120805460ff191660011790558301516124cb908290613f0990889088908490889061081f565b855160208701516141f6565b50505050565b60605f610d5a83614248565b5f610d5a613f3484613bd8565b8390613660565b6001600160a01b03821673beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac014611060576001600160a01b038084165f90815260a5602090815260408083209386168352929052908120613f8e906140b2565b9050613f1543613f9e8484615601565b6001600160a01b038088165f90815260a560209081526040808320938a1683529290522091906142a1565b5f610d5a83836142ac565b5f610d5a83670de0b6b3a764000084614106565b825f0361400857614001670de0b6b3a764000082613fd4565b8455613f15565b6040805160208101909152845481525f90614024908584613674565b90505f6140318483615601565b90505f61404c84612f31614045888a615601565b8590613fd4565b875550505050505050565b5f5f614064868686614106565b9050600183600281111561407a5761407a615938565b14801561409657505f84806140915761409161594c565b868809115b156140a9576140a6600182615601565b90505b95945050505050565b5f6140bd82826142f8565b6001600160e01b031692915050565b5f6140d883838361433d565b6001600160e01b03169392505050565b5f611d296140f68385615960565b85906001600160401b0316613660565b5f80805f19858709858702925082811083820303915050805f0361413d578382816141335761413361594c565b0492505050610d5a565b8084116141845760405162461bcd60e51b81526020600482015260156024820152744d6174683a206d756c446976206f766572666c6f7760581b60448201526064016122e7565b5f8486880960026001871981018816978890046003810283188082028403028082028403028082028403028082028403028082028403029081029092039091025f889003889004909101858311909403939093029303949094049190911702949350505050565b5f610d5a8383614386565b4281101561421757604051630819bdcd60e01b815260040160405180910390fd5b61422b6001600160a01b0385168484614469565b613f1557604051638baa579f60e01b815260040160405180910390fd5b6060815f0180548060200260200160405190810160405280929190818152602001828054801561429557602002820191905f5260205f20905b815481526020019060010190808311614281575b50505050509050919050565b6110608383836144bd565b5f8181526001830160205260408120546142f157508154600181810184555f848152602080822090930184905584548482528286019093526040902091909155611c81565b505f611c81565b81545f9080156143355761431e846143116001846158e7565b5f91825260209091200190565b5464010000000090046001600160e01b0316611d29565b509092915050565b82545f908161434e868683856145c3565b9050801561437c57614365866143116001846158e7565b5464010000000090046001600160e01b031661089d565b5091949350505050565b5f8181526001830160205260408120548015614460575f6143a86001836158e7565b85549091505f906143bb906001906158e7565b905081811461441a575f865f0182815481106143d9576143d96154f6565b905f5260205f200154905080875f0184815481106143f9576143f96154f6565b5f918252602080832090910192909255918252600188019052604090208390555b855486908061442b5761442b61597f565b600190038181905f5260205f20015f90559055856001015f8681526020019081526020015f205f905560019350505050611c81565b5f915050611c81565b5f5f5f6144768585614616565b90925090505f81600481111561448e5761448e615938565b1480156144ac5750856001600160a01b0316826001600160a01b0316145b8061089d575061089d868686614655565b82548015614575575f6144d5856143116001856158e7565b60408051808201909152905463ffffffff8082168084526401000000009092046001600160e01b0316602084015291925090851610156145285760405163151b8e3f60e11b815260040160405180910390fd5b805163ffffffff8086169116036145735782614549866143116001866158e7565b80546001600160e01b03929092166401000000000263ffffffff9092169190911790555050505050565b505b506040805180820190915263ffffffff92831681526001600160e01b03918216602080830191825285546001810187555f968752952091519051909216640100000000029190921617910155565b5f5b81831015611e98575f6145d8848461473c565b5f8781526020902090915063ffffffff86169082015463ffffffff16111561460257809250614610565b61460d816001615601565b93505b506145c5565b5f5f825160410361464a576020830151604084015160608501515f1a61463e87828585614756565b9450945050505061224a565b505f9050600261224a565b5f5f5f856001600160a01b0316631626ba7e60e01b868660405160240161467d929190615993565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b03199094169390931790925290516146bb91906159cf565b5f60405180830381855afa9150503d805f81146146f3576040519150601f19603f3d011682016040523d82523d5f602084013e6146f8565b606091505b509150915081801561470c57506020815110155b801561089d57508051630b135d3f60e11b90614731908301602090810190840161572a565b149695505050505050565b5f61474a60028484186159e5565b610d5a90848416615601565b5f807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a083111561478b57505f9050600361480a565b604080515f8082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa1580156147dc573d5f5f3e3d5ffd5b5050604051601f1901519150506001600160a01b038116614804575f6001925092505061480a565b91505f90505b94509492505050565b6040518060e001604052805f6001600160a01b031681526020015f6001600160a01b031681526020015f6001600160a01b031681526020015f81526020015f63ffffffff16815260200160608152602001606081525090565b828054828255905f5260205f209081019282156148bf579160200282015b828111156148bf57825182546001600160a01b0319166001600160a01b0390911617825560209092019160019091019061488a565b506148cb92915061491f565b5090565b828054828255905f5260205f209081019282156148bf579160200282015b828111156148bf5782518255916020019190600101906148ed565b5080545f8255905f5260205f209081019061265091905b5b808211156148cb575f8155600101614920565b6001600160a01b0381168114612650575f5ffd5b803561495281614933565b919050565b5f5f5f5f5f60a0868803121561496b575f5ffd5b853561497681614933565b9450602086013561498681614933565b9350604086013561499681614933565b94979396509394606081013594506080013592915050565b5f5f83601f8401126149be575f5ffd5b5081356001600160401b038111156149d4575f5ffd5b6020830191508360208260051b850101111561224a575f5ffd5b5f5f602083850312156149ff575f5ffd5b82356001600160401b03811115614a14575f5ffd5b614a20858286016149ae565b90969095509350505050565b602080825282518282018190525f918401906040840190835b81811015610b21578351835260209384019390920191600101614a45565b5f60208284031215614a73575f5ffd5b5035919050565b634e487b7160e01b5f52604160045260245ffd5b60405160e081016001600160401b0381118282101715614ab057614ab0614a7a565b60405290565b604080519081016001600160401b0381118282101715614ab057614ab0614a7a565b604051601f8201601f191681016001600160401b0381118282101715614b0057614b00614a7a565b604052919050565b5f6001600160401b03821115614b2057614b20614a7a565b5060051b60200190565b5f82601f830112614b39575f5ffd5b8135614b4c614b4782614b08565b614ad8565b8082825260208201915060208360051b860101925085831115614b6d575f5ffd5b602085015b83811015614b93578035614b8581614933565b835260209283019201614b72565b5095945050505050565b5f82601f830112614bac575f5ffd5b8135614bba614b4782614b08565b8082825260208201915060208360051b860101925085831115614bdb575f5ffd5b602085015b83811015614b93578035835260209283019201614be0565b5f5f5f60608486031215614c0a575f5ffd5b8335614c1581614933565b925060208401356001600160401b03811115614c2f575f5ffd5b614c3b86828701614b2a565b92505060408401356001600160401b03811115614c56575f5ffd5b614c6286828701614b9d565b9150509250925092565b5f8151808452602084019350602083015f5b82811015614c9c578151865260209586019590910190600101614c7e565b5093949350505050565b602081525f610d5a6020830184614c6c565b803563ffffffff81168114614952575f5ffd5b5f5f83601f840112614cdb575f5ffd5b5081356001600160401b03811115614cf1575f5ffd5b60208301915083602082850101111561224a575f5ffd5b5f5f5f5f60608587031215614d1b575f5ffd5b8435614d2681614933565b9350614d3460208601614cb8565b925060408501356001600160401b03811115614d4e575f5ffd5b614d5a87828801614ccb565b95989497509550505050565b5f5f5f5f60808587031215614d79575f5ffd5b8435614d8481614933565b93506020850135614d9481614933565b93969395505050506040820135916060013590565b5f60208284031215614db9575f5ffd5b8135610d5a81614933565b5f5f60408385031215614dd5575f5ffd5b8235614de081614933565b91506020830135614df081614933565b809150509250929050565b5f60e08284031215614e0b575f5ffd5b614e13614a8e565b9050614e1e82614947565b8152614e2c60208301614947565b6020820152614e3d60408301614947565b604082015260608281013590820152614e5860808301614cb8565b608082015260a08201356001600160401b03811115614e75575f5ffd5b614e8184828501614b2a565b60a08301525060c08201356001600160401b03811115614e9f575f5ffd5b614eab84828501614b9d565b60c08301525092915050565b5f60208284031215614ec7575f5ffd5b81356001600160401b03811115614edc575f5ffd5b611d2984828501614dfb565b5f60208284031215614ef8575f5ffd5b813560ff81168114610d5a575f5ffd5b5f8151808452602084019350602083015f5b82811015614c9c5781516001600160a01b0316865260209586019590910190600101614f1a565b80516001600160a01b03908116835260208083015182169084015260408083015190911690830152606080820151908301526080808201515f91614f8c9085018263ffffffff169052565b5060a082015160e060a0850152614fa660e0850182614f08565b905060c083015184820360c08601526140a98282614c6c565b602081525f610d5a6020830184614f41565b5f82825180855260208501945060208160051b830101602085015f5b8381101561348857601f19858403018852615009838351614c6c565b6020988901989093509190910190600101614fed565b5f604082016040835280855180835260608501915060608160051b8601019250602087015f5b8281101561507657605f19878603018452615061858351614f41565b94506020938401939190910190600101615045565b5050505082810360208401526140a98185614fd1565b6001600160401b0381168114612650575f5ffd5b5f5f5f5f608085870312156150b3575f5ffd5b84356150be81614933565b935060208501356150ce81614933565b925060408501356150de8161508c565b915060608501356150ee8161508c565b939692955090935050565b5f5f5f6060848603121561510b575f5ffd5b833561511681614933565b925060208401359150604084013561512d8161508c565b809150509250925092565b604081525f61514a6040830185614f08565b82810360208401526140a98185614c6c565b5f5f5f6040848603121561516e575f5ffd5b833561517981614933565b925060208401356001600160401b03811115615193575f5ffd5b61519f86828701614ccb565b9497909650939450505050565b5f5f604083850312156151bd575f5ffd5b82356151c881614933565b915060208301356001600160401b038111156151e2575f5ffd5b6151ee85828601614b2a565b9150509250929050565b5f5f5f5f5f5f6060878903121561520d575f5ffd5b86356001600160401b03811115615222575f5ffd5b61522e89828a016149ae565b90975095505060208701356001600160401b0381111561524c575f5ffd5b61525889828a016149ae565b90955093505060408701356001600160401b03811115615276575f5ffd5b61528289828a016149ae565b979a9699509497509295939492505050565b5f5f5f606084860312156152a6575f5ffd5b83356152b181614933565b925060208401356001600160401b038111156152cb575f5ffd5b8401604081870312156152dc575f5ffd5b6152e4614ab6565b81356001600160401b038111156152f9575f5ffd5b8201601f81018813615309575f5ffd5b80356001600160401b0381111561532257615322614a7a565b615335601f8201601f1916602001614ad8565b818152896020838501011115615349575f5ffd5b816020840160208301375f60209282018301528352928301359282019290925293969395505050506040919091013590565b5f5f6040838503121561538c575f5ffd5b823561539781614933565b946020939093013593505050565b604081525f61514a6040830185614c6c565b8015158114612650575f5ffd5b5f5f5f5f606085870312156153d7575f5ffd5b84356001600160401b038111156153ec575f5ffd5b850160e081880312156153fd575f5ffd5b935060208501356001600160401b03811115615417575f5ffd5b615423878288016149ae565b90945092505060408501356150ee816153b7565b5f5f60408385031215615448575f5ffd5b82356001600160401b0381111561545d575f5ffd5b8301601f8101851361546d575f5ffd5b803561547b614b4782614b08565b8082825260208201915060208360051b85010192508783111561549c575f5ffd5b6020840193505b828410156154c75783356154b681614933565b8252602093840193909101906154a3565b945050505060208301356001600160401b038111156151e2575f5ffd5b602081525f610d5a6020830184614fd1565b634e487b7160e01b5f52603260045260245ffd5b5f8235605e1983360301811261551e575f5ffd5b9190910192915050565b5f5f8335601e1984360301811261553d575f5ffd5b8301803591506001600160401b03821115615556575f5ffd5b6020019150600581901b360382131561224a575f5ffd5b5f6020828403121561557d575f5ffd5b8151610d5a816153b7565b60208152816020820152818360408301375f818301604090810191909152601f909201601f19160101919050565b5f602082840312156155c6575f5ffd5b8151610d5a8161508c565b634e487b7160e01b5f52601160045260245ffd5b63ffffffff8181168382160190811115611c8157611c816155d1565b80820180821115611c8157611c816155d1565b5f82601f830112615623575f5ffd5b8151615631614b4782614b08565b8082825260208201915060208360051b860101925085831115615652575f5ffd5b602085015b83811015614b93578051835260209283019201615657565b5f5f60408385031215615680575f5ffd5b82516001600160401b03811115615695575f5ffd5b8301601f810185136156a5575f5ffd5b80516156b3614b4782614b08565b8082825260208201915060208360051b8501019250878311156156d4575f5ffd5b6020840193505b828410156156ff5783516156ee81614933565b8252602093840193909101906156db565b8095505050505060208301516001600160401b0381111561571e575f5ffd5b6151ee85828601615614565b5f6020828403121561573a575f5ffd5b5051919050565b5f823560de1983360301811261551e575f5ffd5b5f611c813683614dfb565b5f60208284031215615770575f5ffd5b8135610d5a816153b7565b5f6020828403121561578b575f5ffd5b8151610d5a81614933565b6001600160a01b03831681526040602082018190525f90611d2990830184614f08565b5f602082840312156157c9575f5ffd5b81516001600160401b038111156157de575f5ffd5b8201601f810184136157ee575f5ffd5b80516157fc614b4782614b08565b8082825260208201915060208360051b85010192508683111561581d575f5ffd5b6020840193505b8284101561089d5783516158378161508c565b825260209384019390910190615824565b6001600160a01b039384168152919092166020820152604081019190915260600190565b5f6001820161587d5761587d6155d1565b5060010190565b838152606060208201525f61589c6060830185614f41565b828103604084015261089d8185614c6c565b6001600160a01b03841681526060602082018190525f906158d190830185614f08565b905063ffffffff83166040830152949350505050565b81810381811115611c8157611c816155d1565b63ffffffff8281168282160390811115611c8157611c816155d1565b5f5f60408385031215615927575f5ffd5b505080516020909101519092909150565b634e487b7160e01b5f52602160045260245ffd5b634e487b7160e01b5f52601260045260245ffd5b6001600160401b038281168282160390811115611c8157611c816155d1565b634e487b7160e01b5f52603160045260245ffd5b828152604060208201525f82518060408401528060208501606085015e5f606082850101526060601f19601f8301168401019150509392505050565b5f82518060208501845e5f920191825250919050565b5f826159ff57634e487b7160e01b5f52601260045260245ffd5b50049056fea26469706673582212208b259668ef4236859230dcc42d032e50151a07b76513431816695b7c6e7ceef264736f6c634300081b0033", + Bin: "0x610180604052348015610010575f5ffd5b50604051615dd6380380615dd683398101604081905261002f9161021c565b8186868684876001600160a01b03811661005c576040516339b190bb60e11b815260040160405180910390fd5b6001600160a01b0390811660805293841660a05291831660c05290911660e05263ffffffff16610100524661012052610125604080518082018252600a81526922b4b3b2b72630bcb2b960b11b60209182015281517f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a866818301527f71b625cfad44bac63b13dba07f2e1d6084ee04b6f8752101ece6126d584ee6ea81840152466060820152306080808301919091528351808303909101815260a0909101909252815191012090565b610140526001600160a01b03166101605261013e610149565b5050505050506102a7565b5f54610100900460ff16156101b45760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff90811614610203575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b0381168114610219575f5ffd5b50565b5f5f5f5f5f5f60c08789031215610231575f5ffd5b865161023c81610205565b602088015190965061024d81610205565b604088015190955061025e81610205565b606088015190945061026f81610205565b608088015190935061028081610205565b60a088015190925063ffffffff81168114610299575f5ffd5b809150509295509295509295565b60805160a05160c05160e05161010051610120516101405161016051615a3a61039c5f395f818161042c01526132fa01525f61271601525f61265601525f818161070001528181611504015281816134f5015261383101525f818161075001528181610da901528181610f5a0152818161169f0152818161185e01528181611cb2015281816128eb01526133b101525f818161045301528181610ee0015281816117c501528181611a23015281816130e3015261363b01525f818161038901528181610eae01528181611977015261361501525f81816105ee01528181610b410152818161107a015261273a0152615a3a5ff3fe608060405234801561000f575f5ffd5b50600436106102cb575f3560e01c8063715018a61161017b578063bfae3fd2116100e4578063e4cc3f901161009e578063f2fde38b11610079578063f2fde38b146107de578063f698da25146107f1578063fabc1cbc146107f9578063fd8aa88d1461080c575f5ffd5b8063e4cc3f9014610798578063eea9064b146107ab578063f0e0e676146107be575f5ffd5b8063bfae3fd2146106e3578063c448feb8146106f6578063c978f7ac1461072a578063ca8aa7c71461074b578063cd6dc68714610772578063da8be86414610785575f5ffd5b80639104c319116101355780639104c319146106345780639435bb431461064f578063a178848414610662578063a33a343314610681578063b7f06ebe14610694578063bb45fef2146106b6575f5ffd5b8063715018a6146105a4578063778e55f3146105ac57806378296ec5146105d6578063886f1195146105e95780638da5cb5b146106105780639004134714610621575f5ffd5b806354b7c96c116102375780635dd68579116101f157806365da1264116101cc57806365da12641461053557806366d5ba931461055d5780636d70f7ae1461057e5780636e17444814610591575f5ffd5b80635dd68579146104ee578063601bb36f1461050f57806360a0d1ce14610522575f5ffd5b806354b7c96c14610475578063595c6a6714610488578063597b36da146104905780635ac86ab7146104a35780635c975abb146104c65780635d975e88146104ce575f5ffd5b806339b70e381161028857806339b70e38146103845780633c651cf2146103c35780633cdeb5e0146103d65780633e28391d146104045780634657e26a146104275780634665bcda1461044e575f5ffd5b806304a4f979146102cf5780630b9f487a146103095780630dd8dd021461031c578063136439dd1461033c57806325df922e146103515780632aa6d88814610371575b5f5ffd5b6102f67f14bde674c9f64b2ad00eaaee4a8bed1fabef35c7507e3c5b9cfc9436909a2dad81565b6040519081526020015b60405180910390f35b6102f6610317366004614957565b61081f565b61032f61032a3660046149ee565b6108a7565b6040516103009190614a2c565b61034f61034a366004614a63565b610b2c565b005b61036461035f366004614bf8565b610c01565b6040516103009190614ca6565b61034f61037f366004614d08565b610d61565b6103ab7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610300565b61034f6103d1366004614d66565b610ea3565b6103ab6103e4366004614da9565b6001600160a01b039081165f908152609960205260409020600101541690565b610417610412366004614da9565b610fea565b6040519015158152602001610300565b6103ab7f000000000000000000000000000000000000000000000000000000000000000081565b6103ab7f000000000000000000000000000000000000000000000000000000000000000081565b61034f610483366004614dc4565b611009565b61034f611065565b6102f661049e366004614eb7565b611114565b6104176104b1366004614ee8565b606654600160ff9092169190911b9081161490565b6066546102f6565b6104e16104dc366004614a63565b611143565b6040516103009190614fbf565b6105016104fc366004614da9565b61125f565b60405161030092919061501f565b61034f61051d3660046150a0565b611694565b61034f6105303660046150f9565b6117ba565b6103ab610543366004614da9565b609a6020525f90815260409020546001600160a01b031681565b61057061056b366004614da9565b61194f565b604051610300929190615138565b61041761058c366004614da9565b611c4f565b6102f661059f366004614dc4565b611c87565b61034f611d31565b6102f66105ba366004614dc4565b609860209081525f928352604080842090915290825290205481565b61034f6105e436600461515c565b611d42565b6103ab7f000000000000000000000000000000000000000000000000000000000000000081565b6033546001600160a01b03166103ab565b61036461062f3660046151ac565b611dca565b6103ab73beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac081565b61034f61065d3660046151f8565b611ea0565b6102f6610670366004614da9565b609f6020525f908152604090205481565b61032f61068f366004615294565b611f70565b6104176106a2366004614a63565b609e6020525f908152604090205460ff1681565b6104176106c436600461537b565b609c60209081525f928352604080842090915290825290205460ff1681565b6102f66106f1366004614dc4565b611f88565b60405163ffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152602001610300565b61073d6107383660046151ac565b611fc4565b6040516103009291906153a5565b6103ab7f000000000000000000000000000000000000000000000000000000000000000081565b61034f61078036600461537b565b612251565b61032f610793366004614da9565b61236c565b61034f6107a63660046153c4565b61247c565b61034f6107b9366004615294565b6124d2565b6107d16107cc366004615437565b612535565b60405161030091906154e4565b61034f6107ec366004614da9565b6125da565b6102f6612653565b61034f610807366004614a63565b612738565b61032f61081a366004614da9565b61284f565b604080517f14bde674c9f64b2ad00eaaee4a8bed1fabef35c7507e3c5b9cfc9436909a2dad60208201526001600160a01b03808616928201929092528187166060820152908516608082015260a0810183905260c081018290525f9061089d9060e00160405160208183030381529060405280519060200120612872565b9695505050505050565b6066546060906001906002908116036108d35760405163840a48d560e01b815260040160405180910390fd5b5f836001600160401b038111156108ec576108ec614a7a565b604051908082528060200260200182016040528015610915578160200160208202803683370190505b50335f908152609a60205260408120549192506001600160a01b03909116905b85811015610b215786868281811061094f5761094f6154f6565b9050602002810190610961919061550a565b61096f906020810190615528565b9050878783818110610983576109836154f6565b9050602002810190610995919061550a565b61099f9080615528565b9050146109bf576040516343714afd60e01b815260040160405180910390fd5b5f610a2933848a8a868181106109d7576109d76154f6565b90506020028101906109e9919061550a565b6109f39080615528565b808060200260200160405190810160405280939291908181526020018383602002808284375f920191909152506128a092505050565b9050610afb33848a8a86818110610a4257610a426154f6565b9050602002810190610a54919061550a565b610a5e9080615528565b808060200260200160405190810160405280939291908181526020018383602002808284375f920191909152508e92508d9150889050818110610aa357610aa36154f6565b9050602002810190610ab5919061550a565b610ac3906020810190615528565b808060200260200160405190810160405280939291908181526020018383602002808284375f920191909152508892506129e7915050565b848381518110610b0d57610b0d6154f6565b602090810291909101015250600101610935565b509095945050505050565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa158015610b8e573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610bb2919061556d565b610bcf57604051631d77d47760e21b815260040160405180910390fd5b6066548181168114610bf45760405163c61dca5d60e01b815260040160405180910390fd5b610bfd82612edc565b5050565b6001600160a01b038084165f908152609a60205260408120546060921690610c2a8683876128a0565b90505f85516001600160401b03811115610c4657610c46614a7a565b604051908082528060200260200182016040528015610c6f578160200160208202803683370190505b5090505f5b8651811015610d54576001600160a01b0388165f90815260a260205260408120885182908a9085908110610caa57610caa6154f6565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020015f206040518060200160405290815f820154815250509050610d2e878381518110610cfc57610cfc6154f6565b6020026020010151858481518110610d1657610d166154f6565b602002602001015183612f199092919063ffffffff16565b838381518110610d4057610d406154f6565b602090810291909101015250600101610c74565b50925050505b9392505050565b610d6a33610fea565b15610d8857604051633bf2b50360e11b815260040160405180910390fd5b604051632b6241f360e11b815233600482015263ffffffff841660248201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906356c483e6906044015f604051808303815f87803b158015610df2575f5ffd5b505af1158015610e04573d5f5f3e3d5ffd5b50505050610e123385612f37565b610e1c3333612f99565b6040516001600160a01b038516815233907fa453db612af59e5521d6ab9284dc3e2d06af286eb1b1b7b771fce4716c19f2c19060200160405180910390a2336001600160a01b03167f02a919ed0e2acad1dd90f17ef2fa4ae5462ee1339170034a8531cca4b67080908383604051610e95929190615588565b60405180910390a250505050565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161480610f025750336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016145b610f1f5760405163045206a560e21b815260040160405180910390fd5b6001600160a01b038481165f908152609a602052604080822054905163152667d960e31b8152908316600482018190528684166024830152927f0000000000000000000000000000000000000000000000000000000000000000169063a9333ec890604401602060405180830381865afa158015610f9f573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610fc391906155b6565b90505f610fd187878461309c565b9050610fe183888888888661317e565b50505050505050565b6001600160a01b039081165f908152609a602052604090205416151590565b81611013816132bc565b6110305760405163932d94f760e01b815260040160405180910390fd5b61103983611c4f565b611056576040516325ec6c1f60e01b815260040160405180910390fd5b6110608383612f37565b505050565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa1580156110c7573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110eb919061556d565b61110857604051631d77d47760e21b815260040160405180910390fd5b6111125f19612edc565b565b5f816040516020016111269190614fbf565b604051602081830303815290604052805190602001209050919050565b61114b614813565b5f82815260a46020908152604091829020825160e08101845281546001600160a01b03908116825260018301548116828501526002830154168185015260038201546060820152600482015463ffffffff1660808201526005820180548551818602810186019096528086529194929360a086019392908301828280156111f957602002820191905f5260205f20905b81546001600160a01b031681526001909101906020018083116111db575b505050505081526020016006820180548060200260200160405190810160405280929190818152602001828054801561124f57602002820191905f5260205f20905b81548152602001906001019080831161123b575b5050505050815250509050919050565b6060805f61126c8461284f565b8051909150806001600160401b0381111561128957611289614a7a565b6040519080825280602002602001820160405280156112c257816020015b6112af614813565b8152602001906001900390816112a75790505b509350806001600160401b038111156112dd576112dd614a7a565b60405190808252806020026020018201604052801561131057816020015b60608152602001906001900390816112fb5790505b506001600160a01b038087165f908152609a60205260408120549295509116905b8281101561168b5760a45f85838151811061134e5761134e6154f6565b60209081029190910181015182528181019290925260409081015f20815160e08101835281546001600160a01b03908116825260018301548116828601526002830154168184015260038201546060820152600482015463ffffffff1660808201526005820180548451818702810187019095528085529194929360a086019390929083018282801561140857602002820191905f5260205f20905b81546001600160a01b031681526001909101906020018083116113ea575b505050505081526020016006820180548060200260200160405190810160405280929190818152602001828054801561145e57602002820191905f5260205f20905b81548152602001906001019080831161144a575b505050505081525050868281518110611479576114796154f6565b6020026020010181905250858181518110611496576114966154f6565b602002602001015160a00151516001600160401b038111156114ba576114ba614a7a565b6040519080825280602002602001820160405280156114e3578160200160208202803683370190505b508582815181106114f6576114f66154f6565b60200260200101819052505f7f0000000000000000000000000000000000000000000000000000000000000000878381518110611535576115356154f6565b60200260200101516080015161154b91906155e5565b905060604363ffffffff168263ffffffff1610156115935761158c89858a868151811061157a5761157a6154f6565b602002602001015160a0015185613366565b90506115be565b6115bb89858a86815181106115aa576115aa6154f6565b602002602001015160a001516128a0565b90505b5f5b8884815181106115d2576115d26154f6565b602002602001015160a001515181101561167d5761163f8985815181106115fb576115fb6154f6565b602002602001015160c001518281518110611618576116186154f6565b6020026020010151838381518110611632576116326154f6565b6020026020010151613494565b888581518110611651576116516154f6565b6020026020010151828151811061166a5761166a6154f6565b60209081029190910101526001016115c0565b505050806001019050611331565b50505050915091565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146116dd576040516323d871a560e01b815260040160405180910390fd5b6001600160a01b038085165f90815260986020908152604080832093871683529290529081205461171b906001600160401b0380861690851661349f565b90505f61172a868686866134b7565b90505f6117378284615601565b9050611745875f8886613574565b5f61174f876135ee565b60405163debe1eab60e01b81526001600160a01b038981166004830152602482018590529192509082169063debe1eab906044015f604051808303815f87803b15801561179a575f5ffd5b505af11580156117ac573d5f5f3e3d5ffd5b505050505050505050505050565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461180357604051633213a66160e21b815260040160405180910390fd5b61180c83610fea565b15611060576001600160a01b038381165f908152609a602052604080822054905163152667d960e31b81529083166004820181905273beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac06024830152927f0000000000000000000000000000000000000000000000000000000000000000169063a9333ec890604401602060405180830381865afa1580156118a3573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906118c791906155b6565b6001600160a01b0386165f90815260a26020908152604080832073beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac084528252808320815192830190915254815291925061192d866119256001600160401b03808716908916613660565b849190613674565b9050610fe1848873beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac084613574565b6040516394f649dd60e01b81526001600160a01b03828116600483015260609182915f9182917f000000000000000000000000000000000000000000000000000000000000000016906394f649dd906024015f60405180830381865afa1580156119bb573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526119e2919081019061566f565b60405163fe243a1760e01b81526001600160a01b03888116600483015273beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac060248301529294509092505f917f0000000000000000000000000000000000000000000000000000000000000000169063fe243a1790604401602060405180830381865afa158015611a68573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a8c919061572a565b9050805f03611aa057509094909350915050565b5f83516001611aaf9190615601565b6001600160401b03811115611ac657611ac6614a7a565b604051908082528060200260200182016040528015611aef578160200160208202803683370190505b5090505f84516001611b019190615601565b6001600160401b03811115611b1857611b18614a7a565b604051908082528060200260200182016040528015611b41578160200160208202803683370190505b50905073beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac082865181518110611b6c57611b6c6154f6565b60200260200101906001600160a01b031690816001600160a01b0316815250508281865181518110611ba057611ba06154f6565b60209081029190910101525f5b8551811015611c4157858181518110611bc857611bc86154f6565b6020026020010151838281518110611be257611be26154f6565b60200260200101906001600160a01b031690816001600160a01b031681525050848181518110611c1457611c146154f6565b6020026020010151828281518110611c2e57611c2e6154f6565b6020908102919091010152600101611bad565b509097909650945050505050565b5f6001600160a01b03821615801590611c8157506001600160a01b038083165f818152609a6020526040902054909116145b92915050565b60405163152667d960e31b81526001600160a01b03838116600483015282811660248301525f9182917f0000000000000000000000000000000000000000000000000000000000000000169063a9333ec890604401602060405180830381865afa158015611cf7573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611d1b91906155b6565b9050611d298484835f6134b7565b949350505050565b611d39613692565b6111125f6136ec565b82611d4c816132bc565b611d695760405163932d94f760e01b815260040160405180910390fd5b611d7284611c4f565b611d8f576040516325ec6c1f60e01b815260040160405180910390fd5b836001600160a01b03167f02a919ed0e2acad1dd90f17ef2fa4ae5462ee1339170034a8531cca4b67080908484604051610e95929190615588565b60605f82516001600160401b03811115611de657611de6614a7a565b604051908082528060200260200182016040528015611e0f578160200160208202803683370190505b5090505f5b8351811015611e98576001600160a01b0385165f9081526098602052604081208551909190869084908110611e4b57611e4b6154f6565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020015f2054828281518110611e8557611e856154f6565b6020908102919091010152600101611e14565b509392505050565b606654600290600490811603611ec95760405163840a48d560e01b815260040160405180910390fd5b611ed161373d565b855f5b81811015611f6457611f5c898983818110611ef157611ef16154f6565b9050602002810190611f039190615741565b611f0c90615755565b888884818110611f1e57611f1e6154f6565b9050602002810190611f309190615528565b888886818110611f4257611f426154f6565b9050602002016020810190611f579190615760565b613796565b600101611ed4565b5050610fe1600160c955565b6060611f7b3361236c565b9050610d5a8484846124d2565b6001600160a01b038083165f90815260a260209081526040808320938516835292815282822083519182019093529154825290610d5a90613bd8565b60608082516001600160401b03811115611fe057611fe0614a7a565b604051908082528060200260200182016040528015612009578160200160208202803683370190505b50915082516001600160401b0381111561202557612025614a7a565b60405190808252806020026020018201604052801561204e578160200160208202803683370190505b506001600160a01b038086165f908152609a60205260408120549293509116906120798683876128a0565b90505f5b8551811015612246575f6120a987838151811061209c5761209c6154f6565b60200260200101516135ee565b9050806001600160a01b031663fe243a17898985815181106120cd576120cd6154f6565b60200260200101516040518363ffffffff1660e01b81526004016121079291906001600160a01b0392831681529116602082015260400190565b602060405180830381865afa158015612122573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612146919061572a565b858381518110612158576121586154f6565b6020026020010181815250505f60a25f8a6001600160a01b03166001600160a01b031681526020019081526020015f205f89858151811061219b5761219b6154f6565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020015f206040518060200160405290815f82015481525050905061221f8684815181106121ed576121ed6154f6565b6020026020010151858581518110612207576122076154f6565b6020026020010151836136749092919063ffffffff16565b878481518110612231576122316154f6565b6020908102919091010152505060010161207d565b5050505b9250929050565b5f54610100900460ff161580801561226f57505f54600160ff909116105b806122885750303b15801561228857505f5460ff166001145b6122f05760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b5f805460ff191660011790558015612311575f805461ff0019166101001790555b61231a82612edc565b612323836136ec565b8015611060575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a1505050565b606061237782610fea565b6123945760405163a5c7c44560e01b815260040160405180910390fd5b61239d82611c4f565b156123bb576040516311ca333560e31b815260040160405180910390fd5b336001600160a01b03831614612473576001600160a01b038083165f908152609a6020526040902054166123ee816132bc565b8061241457506001600160a01b038181165f908152609960205260409020600101541633145b61243157604051631e499a2360e11b815260040160405180910390fd5b806001600160a01b0316836001600160a01b03167ff0eddf07e6ea14f388b47e1e94a0f464ecbd9eed4171130e0fc0e99fb4030a8a60405160405180910390a3505b611c8182613bf7565b6066546002906004908116036124a55760405163840a48d560e01b815260040160405180910390fd5b6124ad61373d565b6124c16124b986615755565b858585613796565b6124cb600160c955565b5050505050565b6124db33610fea565b156124f957604051633bf2b50360e11b815260040160405180910390fd5b61250283611c4f565b61251f576040516325ec6c1f60e01b815260040160405180910390fd5b61252b33848484613e56565b6110603384612f99565b60605f83516001600160401b0381111561255157612551614a7a565b60405190808252806020026020018201604052801561258457816020015b606081526020019060019003908161256f5790505b5090505f5b8451811015611e98576125b58582815181106125a7576125a76154f6565b602002602001015185611dca565b8282815181106125c7576125c76154f6565b6020908102919091010152600101612589565b6125e2613692565b6001600160a01b0381166126475760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016122e7565b612650816136ec565b50565b5f7f000000000000000000000000000000000000000000000000000000000000000046146127135750604080518082018252600a81526922b4b3b2b72630bcb2b960b11b60209182015281517f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a866818301527f71b625cfad44bac63b13dba07f2e1d6084ee04b6f8752101ece6126d584ee6ea81840152466060820152306080808301919091528351808303909101815260a0909101909252815191012090565b507f000000000000000000000000000000000000000000000000000000000000000090565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612794573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906127b8919061577b565b6001600160a01b0316336001600160a01b0316146127e95760405163794821ff60e01b815260040160405180910390fd5b606654801982198116146128105760405163c61dca5d60e01b815260040160405180910390fd5b606682905560405182815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c906020015b60405180910390a25050565b6001600160a01b0381165f90815260a360205260409020606090611c8190613f1b565b5f61287b612653565b60405161190160f01b6020820152602281019190915260428101839052606201611126565b60605f82516001600160401b038111156128bc576128bc614a7a565b6040519080825280602002602001820160405280156128e5578160200160208202803683370190505b5090505f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663547afb8786866040518363ffffffff1660e01b8152600401612937929190615796565b5f60405180830381865afa158015612951573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261297891908101906157b9565b90505f5b8451811015610b21576129c28786838151811061299b5761299b6154f6565b60200260200101518484815181106129b5576129b56154f6565b602002602001015161309c565b8382815181106129d4576129d46154f6565b602090810291909101015260010161297c565b5f6001600160a01b038616612a0f576040516339b190bb60e11b815260040160405180910390fd5b83515f03612a305760405163796cc52560e01b815260040160405180910390fd5b5f84516001600160401b03811115612a4a57612a4a614a7a565b604051908082528060200260200182016040528015612a73578160200160208202803683370190505b5090505f85516001600160401b03811115612a9057612a90614a7a565b604051908082528060200260200182016040528015612ab9578160200160208202803683370190505b5090505f5b8651811015612d0f575f612add88838151811061209c5761209c6154f6565b90505f60a25f8c6001600160a01b03166001600160a01b031681526020019081526020015f205f8a8581518110612b1657612b166154f6565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020015f206040518060200160405290815f820154815250509050612b82888481518110612b6857612b686154f6565b6020026020010151888581518110612207576122076154f6565b848481518110612b9457612b946154f6565b602002602001018181525050612bcc888481518110612bb557612bb56154f6565b602002602001015182613f2790919063ffffffff16565b858481518110612bde57612bde6154f6565b60209081029190910101526001600160a01b038a1615612c7357612c358a8a8581518110612c0e57612c0e6154f6565b6020026020010151878681518110612c2857612c286154f6565b6020026020010151613f3b565b612c738a8c8b8681518110612c4c57612c4c6154f6565b6020026020010151878781518110612c6657612c666154f6565b6020026020010151613574565b816001600160a01b031663724af4238c8b8681518110612c9557612c956154f6565b60200260200101518b8781518110612caf57612caf6154f6565b60200260200101516040518463ffffffff1660e01b8152600401612cd593929190615848565b5f604051808303815f87803b158015612cec575f5ffd5b505af1158015612cfe573d5f5f3e3d5ffd5b505050505050806001019050612abe565b506001600160a01b0388165f908152609f60205260408120805491829190612d368361586c565b91905055505f6040518060e001604052808b6001600160a01b031681526020018a6001600160a01b031681526020018b6001600160a01b031681526020018381526020014363ffffffff1681526020018981526020018581525090505f612d9c82611114565b5f818152609e602090815260408083208054600160ff19909116811790915560a4835292819020865181546001600160a01b03199081166001600160a01b039283161783558885015195830180548216968316969096179095559187015160028201805490951692169190911790925560608501516003830155608085015160048301805463ffffffff191663ffffffff90921691909117905560a085015180519394508593612e52926005850192019061486c565b5060c08201518051612e6e9160068401916020909101906148cf565b5050506001600160a01b038b165f90815260a360205260409020612e929082613fc9565b507f26b2aae26516e8719ef50ea2f6831a2efbd4e37dccdf0f6936b27bc08e793e30818386604051612ec693929190615884565b60405180910390a19a9950505050505050505050565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a250565b5f611d2982612f31612f2a87613bd8565b8690613fd4565b90613fd4565b6001600160a01b038281165f8181526099602090815260409182902060010180546001600160a01b0319169486169485179055905192835290917f773b54c04d756fcc5e678111f7d730de3be98192000799eee3d63716055a87c69101612843565b6066545f90600190811603612fc15760405163840a48d560e01b815260040160405180910390fd5b6001600160a01b038381165f818152609a602052604080822080546001600160a01b0319169487169485179055517fc3ee9f2e5fda98e8066a1f745b2df9285f416fe98cf2559cd21484b3d87433049190a35f5f61301e8561194f565b915091505f61302e8686856128a0565b90505f5b8351811015610fe1576130948688868481518110613052576130526154f6565b60200260200101515f87868151811061306d5761306d6154f6565b6020026020010151878781518110613087576130876154f6565b602002602001015161317e565b600101613032565b5f73beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeabf196001600160a01b0384160161316e5760405163a3d75e0960e01b81526001600160a01b0385811660048301525f917f00000000000000000000000000000000000000000000000000000000000000009091169063a3d75e0990602401602060405180830381865afa15801561312a573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061314e91906155b6565b90506131666001600160401b03848116908316613660565b915050610d5a565b506001600160401b031692915050565b805f0361319e57604051630a33bc6960e21b815260040160405180910390fd5b6001600160a01b038086165f90815260a2602090815260408083209388168352929052206131ce81858585613fe8565b6040805160208101909152815481527f8be932bac54561f27260f95463d9b8ab37e06b2842e5ee2404157cc13df6eb8f908790879061320c90613bd8565b60405161321b93929190615848565b60405180910390a161322c86610fea565b15610fe1576001600160a01b038088165f90815260986020908152604080832093891683529290529081208054859290613267908490615601565b92505081905550866001600160a01b03167f1ec042c965e2edd7107b51188ee0f383e22e76179041ab3a9d18ff151405166c8787866040516132ab93929190615848565b60405180910390a250505050505050565b604051631beb2b9760e31b81526001600160a01b0382811660048301523360248301523060448301525f80356001600160e01b0319166064840152917f00000000000000000000000000000000000000000000000000000000000000009091169063df595cb8906084016020604051808303815f875af1158015613342573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611c81919061556d565b60605f83516001600160401b0381111561338257613382614a7a565b6040519080825280602002602001820160405280156133ab578160200160208202803683370190505b5090505f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166394d7d00c8787876040518463ffffffff1660e01b81526004016133ff939291906158ae565b5f60405180830381865afa158015613419573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261344091908101906157b9565b90505f5b8551811015613488576134638887838151811061299b5761299b6154f6565b838281518110613475576134756154f6565b6020908102919091010152600101613444565b50909695505050505050565b5f610d5a8383613660565b5f6134ad8483856001614057565b611d2990856158e7565b6001600160a01b038085165f90815260a560209081526040808320938716835292905290812081906134e8906140b2565b90505f61354e600161351a7f0000000000000000000000000000000000000000000000000000000000000000436158fa565b61352491906158fa565b6001600160a01b03808a165f90815260a560209081526040808320938c16835292905220906140cc565b90505f61355b82846158e7565b90506135688187876140e8565b98975050505050505050565b6001600160a01b038085165f908152609860209081526040808320938616835292905290812080548392906135aa9084906158e7565b92505081905550836001600160a01b03167f6909600037b75d7b4733aedd815442b5ec018a827751c832aaff64eba5d6d2dd848484604051610e9593929190615848565b5f6001600160a01b03821673beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac014613639577f0000000000000000000000000000000000000000000000000000000000000000611c81565b7f000000000000000000000000000000000000000000000000000000000000000092915050565b5f610d5a8383670de0b6b3a7640000614106565b5f611d298261368c61368587613bd8565b8690613660565b90613660565b6033546001600160a01b031633146111125760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016122e7565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b600260c9540361378f5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016122e7565b600260c955565b60a08401515182146137bb576040516343714afd60e01b815260040160405180910390fd5b83604001516001600160a01b0316336001600160a01b0316146137f1576040516316110d3560e21b815260040160405180910390fd5b5f6137fb85611114565b5f818152609e602052604090205490915060ff1661382c576040516387c9d21960e01b815260040160405180910390fd5b60605f7f0000000000000000000000000000000000000000000000000000000000000000876080015161385f91906155e5565b90508063ffffffff164363ffffffff161161388d576040516378f67ae160e11b815260040160405180910390fd5b6138a4875f015188602001518960a0015184613366565b87516001600160a01b03165f90815260a3602052604090209092506138ca9150836141eb565b505f82815260a46020526040812080546001600160a01b031990811682556001820180548216905560028201805490911690556003810182905560048101805463ffffffff19169055906139216005830182614908565b61392e600683015f614908565b50505f828152609e602052604090819020805460ff19169055517f1f40400889274ed07b24845e5054a87a0cab969eb1277aafe61ae352e7c32a00906139779084815260200190565b60405180910390a185516001600160a01b039081165f908152609a6020526040812054885160a08a015191909316926139b19184906128a0565b90505f5b8860a0015151811015613bcd575f6139dc8a60a00151838151811061209c5761209c6154f6565b90505f613a128b60c0015184815181106139f8576139f86154f6565b6020026020010151878581518110611632576116326154f6565b9050805f03613a22575050613bc5565b8715613af057816001600160a01b0316632eae418c8c5f01518d60a001518681518110613a5157613a516154f6565b60200260200101518d8d88818110613a6b57613a6b6154f6565b9050602002016020810190613a809190614da9565b60405160e085901b6001600160e01b03191681526001600160a01b03938416600482015291831660248301529091166044820152606481018490526084015f604051808303815f87803b158015613ad5575f5ffd5b505af1158015613ae7573d5f5f3e3d5ffd5b50505050613bc2565b5f5f836001600160a01b03166350ff72258e5f01518f60a001518881518110613b1b57613b1b6154f6565b6020026020010151866040518463ffffffff1660e01b8152600401613b4293929190615848565b60408051808303815f875af1158015613b5d573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613b819190615916565b91509150613bbf878e5f01518f60a001518881518110613ba357613ba36154f6565b602002602001015185858b8b81518110613087576130876154f6565b50505b50505b6001016139b5565b505050505050505050565b80515f9015613be8578151611c81565b670de0b6b3a764000092915050565b606654606090600190600290811603613c235760405163840a48d560e01b815260040160405180910390fd5b6001600160a01b038084165f818152609a602052604080822080546001600160a01b0319811690915590519316928392917ffee30966a256b71e14bc0ebfc94315e28ef4a97a7131a9e2b7a310a73af4467691a35f5f613c828661194f565b9150915081515f03613c9657505050613e50565b81516001600160401b03811115613caf57613caf614a7a565b604051908082528060200260200182016040528015613cd8578160200160208202803683370190505b5094505f613ce78785856128a0565b90505f5b8351811015613e4a576040805160018082528183019092525f916020808301908036833750506040805160018082528183019092529293505f9291506020808301908036833750506040805160018082528183019092529293505f92915060208083019080368337019050509050868481518110613d6b57613d6b6154f6565b6020026020010151835f81518110613d8557613d856154f6565b60200260200101906001600160a01b031690816001600160a01b031681525050858481518110613db757613db76154f6565b6020026020010151825f81518110613dd157613dd16154f6565b602002602001018181525050848481518110613def57613def6154f6565b6020026020010151815f81518110613e0957613e096154f6565b602002602001018181525050613e228b898585856129e7565b8a8581518110613e3457613e346154f6565b6020908102919091010152505050600101613ceb565b50505050505b50919050565b6001600160a01b038084165f908152609960205260409020600101541680613e7e5750613f15565b6001600160a01b0381165f908152609c6020908152604080832085845290915290205460ff1615613ec257604051630d4c4c9160e21b815260040160405180910390fd5b6001600160a01b0381165f908152609c602090815260408083208584528252909120805460ff191660011790558301516124cb908290613f0990889088908490889061081f565b855160208701516141f6565b50505050565b60605f610d5a83614248565b5f610d5a613f3484613bd8565b8390613660565b6001600160a01b03821673beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac014611060576001600160a01b038084165f90815260a5602090815260408083209386168352929052908120613f8e906140b2565b9050613f1543613f9e8484615601565b6001600160a01b038088165f90815260a560209081526040808320938a1683529290522091906142a1565b5f610d5a83836142ac565b5f610d5a83670de0b6b3a764000084614106565b825f0361400857614001670de0b6b3a764000082613fd4565b8455613f15565b6040805160208101909152845481525f90614024908584613674565b90505f6140318483615601565b90505f61404c84612f31614045888a615601565b8590613fd4565b875550505050505050565b5f5f614064868686614106565b9050600183600281111561407a5761407a615938565b14801561409657505f84806140915761409161594c565b868809115b156140a9576140a6600182615601565b90505b95945050505050565b5f6140bd82826142f8565b6001600160e01b031692915050565b5f6140d883838361433d565b6001600160e01b03169392505050565b5f611d296140f68385615960565b85906001600160401b0316613660565b5f80805f19858709858702925082811083820303915050805f0361413d578382816141335761413361594c565b0492505050610d5a565b8084116141845760405162461bcd60e51b81526020600482015260156024820152744d6174683a206d756c446976206f766572666c6f7760581b60448201526064016122e7565b5f8486880960026001871981018816978890046003810283188082028403028082028403028082028403028082028403028082028403029081029092039091025f889003889004909101858311909403939093029303949094049190911702949350505050565b5f610d5a8383614386565b4281101561421757604051630819bdcd60e01b815260040160405180910390fd5b61422b6001600160a01b0385168484614469565b613f1557604051638baa579f60e01b815260040160405180910390fd5b6060815f0180548060200260200160405190810160405280929190818152602001828054801561429557602002820191905f5260205f20905b815481526020019060010190808311614281575b50505050509050919050565b6110608383836144bd565b5f8181526001830160205260408120546142f157508154600181810184555f848152602080822090930184905584548482528286019093526040902091909155611c81565b505f611c81565b81545f9080156143355761431e846143116001846158e7565b5f91825260209091200190565b5464010000000090046001600160e01b0316611d29565b509092915050565b82545f908161434e868683856145c3565b9050801561437c57614365866143116001846158e7565b5464010000000090046001600160e01b031661089d565b5091949350505050565b5f8181526001830160205260408120548015614460575f6143a86001836158e7565b85549091505f906143bb906001906158e7565b905081811461441a575f865f0182815481106143d9576143d96154f6565b905f5260205f200154905080875f0184815481106143f9576143f96154f6565b5f918252602080832090910192909255918252600188019052604090208390555b855486908061442b5761442b61597f565b600190038181905f5260205f20015f90559055856001015f8681526020019081526020015f205f905560019350505050611c81565b5f915050611c81565b5f5f5f6144768585614616565b90925090505f81600481111561448e5761448e615938565b1480156144ac5750856001600160a01b0316826001600160a01b0316145b8061089d575061089d868686614655565b82548015614575575f6144d5856143116001856158e7565b60408051808201909152905463ffffffff8082168084526401000000009092046001600160e01b0316602084015291925090851610156145285760405163151b8e3f60e11b815260040160405180910390fd5b805163ffffffff8086169116036145735782614549866143116001866158e7565b80546001600160e01b03929092166401000000000263ffffffff9092169190911790555050505050565b505b506040805180820190915263ffffffff92831681526001600160e01b03918216602080830191825285546001810187555f968752952091519051909216640100000000029190921617910155565b5f5b81831015611e98575f6145d8848461473c565b5f8781526020902090915063ffffffff86169082015463ffffffff16111561460257809250614610565b61460d816001615601565b93505b506145c5565b5f5f825160410361464a576020830151604084015160608501515f1a61463e87828585614756565b9450945050505061224a565b505f9050600261224a565b5f5f5f856001600160a01b0316631626ba7e60e01b868660405160240161467d929190615993565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b03199094169390931790925290516146bb91906159cf565b5f60405180830381855afa9150503d805f81146146f3576040519150601f19603f3d011682016040523d82523d5f602084013e6146f8565b606091505b509150915081801561470c57506020815110155b801561089d57508051630b135d3f60e11b90614731908301602090810190840161572a565b149695505050505050565b5f61474a60028484186159e5565b610d5a90848416615601565b5f807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a083111561478b57505f9050600361480a565b604080515f8082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa1580156147dc573d5f5f3e3d5ffd5b5050604051601f1901519150506001600160a01b038116614804575f6001925092505061480a565b91505f90505b94509492505050565b6040518060e001604052805f6001600160a01b031681526020015f6001600160a01b031681526020015f6001600160a01b031681526020015f81526020015f63ffffffff16815260200160608152602001606081525090565b828054828255905f5260205f209081019282156148bf579160200282015b828111156148bf57825182546001600160a01b0319166001600160a01b0390911617825560209092019160019091019061488a565b506148cb92915061491f565b5090565b828054828255905f5260205f209081019282156148bf579160200282015b828111156148bf5782518255916020019190600101906148ed565b5080545f8255905f5260205f209081019061265091905b5b808211156148cb575f8155600101614920565b6001600160a01b0381168114612650575f5ffd5b803561495281614933565b919050565b5f5f5f5f5f60a0868803121561496b575f5ffd5b853561497681614933565b9450602086013561498681614933565b9350604086013561499681614933565b94979396509394606081013594506080013592915050565b5f5f83601f8401126149be575f5ffd5b5081356001600160401b038111156149d4575f5ffd5b6020830191508360208260051b850101111561224a575f5ffd5b5f5f602083850312156149ff575f5ffd5b82356001600160401b03811115614a14575f5ffd5b614a20858286016149ae565b90969095509350505050565b602080825282518282018190525f918401906040840190835b81811015610b21578351835260209384019390920191600101614a45565b5f60208284031215614a73575f5ffd5b5035919050565b634e487b7160e01b5f52604160045260245ffd5b60405160e081016001600160401b0381118282101715614ab057614ab0614a7a565b60405290565b604080519081016001600160401b0381118282101715614ab057614ab0614a7a565b604051601f8201601f191681016001600160401b0381118282101715614b0057614b00614a7a565b604052919050565b5f6001600160401b03821115614b2057614b20614a7a565b5060051b60200190565b5f82601f830112614b39575f5ffd5b8135614b4c614b4782614b08565b614ad8565b8082825260208201915060208360051b860101925085831115614b6d575f5ffd5b602085015b83811015614b93578035614b8581614933565b835260209283019201614b72565b5095945050505050565b5f82601f830112614bac575f5ffd5b8135614bba614b4782614b08565b8082825260208201915060208360051b860101925085831115614bdb575f5ffd5b602085015b83811015614b93578035835260209283019201614be0565b5f5f5f60608486031215614c0a575f5ffd5b8335614c1581614933565b925060208401356001600160401b03811115614c2f575f5ffd5b614c3b86828701614b2a565b92505060408401356001600160401b03811115614c56575f5ffd5b614c6286828701614b9d565b9150509250925092565b5f8151808452602084019350602083015f5b82811015614c9c578151865260209586019590910190600101614c7e565b5093949350505050565b602081525f610d5a6020830184614c6c565b803563ffffffff81168114614952575f5ffd5b5f5f83601f840112614cdb575f5ffd5b5081356001600160401b03811115614cf1575f5ffd5b60208301915083602082850101111561224a575f5ffd5b5f5f5f5f60608587031215614d1b575f5ffd5b8435614d2681614933565b9350614d3460208601614cb8565b925060408501356001600160401b03811115614d4e575f5ffd5b614d5a87828801614ccb565b95989497509550505050565b5f5f5f5f60808587031215614d79575f5ffd5b8435614d8481614933565b93506020850135614d9481614933565b93969395505050506040820135916060013590565b5f60208284031215614db9575f5ffd5b8135610d5a81614933565b5f5f60408385031215614dd5575f5ffd5b8235614de081614933565b91506020830135614df081614933565b809150509250929050565b5f60e08284031215614e0b575f5ffd5b614e13614a8e565b9050614e1e82614947565b8152614e2c60208301614947565b6020820152614e3d60408301614947565b604082015260608281013590820152614e5860808301614cb8565b608082015260a08201356001600160401b03811115614e75575f5ffd5b614e8184828501614b2a565b60a08301525060c08201356001600160401b03811115614e9f575f5ffd5b614eab84828501614b9d565b60c08301525092915050565b5f60208284031215614ec7575f5ffd5b81356001600160401b03811115614edc575f5ffd5b611d2984828501614dfb565b5f60208284031215614ef8575f5ffd5b813560ff81168114610d5a575f5ffd5b5f8151808452602084019350602083015f5b82811015614c9c5781516001600160a01b0316865260209586019590910190600101614f1a565b80516001600160a01b03908116835260208083015182169084015260408083015190911690830152606080820151908301526080808201515f91614f8c9085018263ffffffff169052565b5060a082015160e060a0850152614fa660e0850182614f08565b905060c083015184820360c08601526140a98282614c6c565b602081525f610d5a6020830184614f41565b5f82825180855260208501945060208160051b830101602085015f5b8381101561348857601f19858403018852615009838351614c6c565b6020988901989093509190910190600101614fed565b5f604082016040835280855180835260608501915060608160051b8601019250602087015f5b8281101561507657605f19878603018452615061858351614f41565b94506020938401939190910190600101615045565b5050505082810360208401526140a98185614fd1565b6001600160401b0381168114612650575f5ffd5b5f5f5f5f608085870312156150b3575f5ffd5b84356150be81614933565b935060208501356150ce81614933565b925060408501356150de8161508c565b915060608501356150ee8161508c565b939692955090935050565b5f5f5f6060848603121561510b575f5ffd5b833561511681614933565b925060208401359150604084013561512d8161508c565b809150509250925092565b604081525f61514a6040830185614f08565b82810360208401526140a98185614c6c565b5f5f5f6040848603121561516e575f5ffd5b833561517981614933565b925060208401356001600160401b03811115615193575f5ffd5b61519f86828701614ccb565b9497909650939450505050565b5f5f604083850312156151bd575f5ffd5b82356151c881614933565b915060208301356001600160401b038111156151e2575f5ffd5b6151ee85828601614b2a565b9150509250929050565b5f5f5f5f5f5f6060878903121561520d575f5ffd5b86356001600160401b03811115615222575f5ffd5b61522e89828a016149ae565b90975095505060208701356001600160401b0381111561524c575f5ffd5b61525889828a016149ae565b90955093505060408701356001600160401b03811115615276575f5ffd5b61528289828a016149ae565b979a9699509497509295939492505050565b5f5f5f606084860312156152a6575f5ffd5b83356152b181614933565b925060208401356001600160401b038111156152cb575f5ffd5b8401604081870312156152dc575f5ffd5b6152e4614ab6565b81356001600160401b038111156152f9575f5ffd5b8201601f81018813615309575f5ffd5b80356001600160401b0381111561532257615322614a7a565b615335601f8201601f1916602001614ad8565b818152896020838501011115615349575f5ffd5b816020840160208301375f60209282018301528352928301359282019290925293969395505050506040919091013590565b5f5f6040838503121561538c575f5ffd5b823561539781614933565b946020939093013593505050565b604081525f61514a6040830185614c6c565b8015158114612650575f5ffd5b5f5f5f5f606085870312156153d7575f5ffd5b84356001600160401b038111156153ec575f5ffd5b850160e081880312156153fd575f5ffd5b935060208501356001600160401b03811115615417575f5ffd5b615423878288016149ae565b90945092505060408501356150ee816153b7565b5f5f60408385031215615448575f5ffd5b82356001600160401b0381111561545d575f5ffd5b8301601f8101851361546d575f5ffd5b803561547b614b4782614b08565b8082825260208201915060208360051b85010192508783111561549c575f5ffd5b6020840193505b828410156154c75783356154b681614933565b8252602093840193909101906154a3565b945050505060208301356001600160401b038111156151e2575f5ffd5b602081525f610d5a6020830184614fd1565b634e487b7160e01b5f52603260045260245ffd5b5f8235605e1983360301811261551e575f5ffd5b9190910192915050565b5f5f8335601e1984360301811261553d575f5ffd5b8301803591506001600160401b03821115615556575f5ffd5b6020019150600581901b360382131561224a575f5ffd5b5f6020828403121561557d575f5ffd5b8151610d5a816153b7565b60208152816020820152818360408301375f818301604090810191909152601f909201601f19160101919050565b5f602082840312156155c6575f5ffd5b8151610d5a8161508c565b634e487b7160e01b5f52601160045260245ffd5b63ffffffff8181168382160190811115611c8157611c816155d1565b80820180821115611c8157611c816155d1565b5f82601f830112615623575f5ffd5b8151615631614b4782614b08565b8082825260208201915060208360051b860101925085831115615652575f5ffd5b602085015b83811015614b93578051835260209283019201615657565b5f5f60408385031215615680575f5ffd5b82516001600160401b03811115615695575f5ffd5b8301601f810185136156a5575f5ffd5b80516156b3614b4782614b08565b8082825260208201915060208360051b8501019250878311156156d4575f5ffd5b6020840193505b828410156156ff5783516156ee81614933565b8252602093840193909101906156db565b8095505050505060208301516001600160401b0381111561571e575f5ffd5b6151ee85828601615614565b5f6020828403121561573a575f5ffd5b5051919050565b5f823560de1983360301811261551e575f5ffd5b5f611c813683614dfb565b5f60208284031215615770575f5ffd5b8135610d5a816153b7565b5f6020828403121561578b575f5ffd5b8151610d5a81614933565b6001600160a01b03831681526040602082018190525f90611d2990830184614f08565b5f602082840312156157c9575f5ffd5b81516001600160401b038111156157de575f5ffd5b8201601f810184136157ee575f5ffd5b80516157fc614b4782614b08565b8082825260208201915060208360051b85010192508683111561581d575f5ffd5b6020840193505b8284101561089d5783516158378161508c565b825260209384019390910190615824565b6001600160a01b039384168152919092166020820152604081019190915260600190565b5f6001820161587d5761587d6155d1565b5060010190565b838152606060208201525f61589c6060830185614f41565b828103604084015261089d8185614c6c565b6001600160a01b03841681526060602082018190525f906158d190830185614f08565b905063ffffffff83166040830152949350505050565b81810381811115611c8157611c816155d1565b63ffffffff8281168282160390811115611c8157611c816155d1565b5f5f60408385031215615927575f5ffd5b505080516020909101519092909150565b634e487b7160e01b5f52602160045260245ffd5b634e487b7160e01b5f52601260045260245ffd5b6001600160401b038281168282160390811115611c8157611c816155d1565b634e487b7160e01b5f52603160045260245ffd5b828152604060208201525f82518060408401528060208501606085015e5f606082850101526060601f19601f8301168401019150509392505050565b5f82518060208501845e5f920191825250919050565b5f826159ff57634e487b7160e01b5f52601260045260245ffd5b50049056fea26469706673582212208fa5cd955b119c8677e8e6d1afbc5172b7825bf8b74d37a6210809948a9b574264736f6c634300081b0033", } // DelegationManagerABI 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 093f64d84c..5662a0b235 100644 --- a/pkg/bindings/Eigen/binding.go +++ b/pkg/bindings/Eigen/binding.go @@ -38,7 +38,7 @@ type ERC20VotesUpgradeableCheckpoint struct { // EigenMetaData contains all meta data concerning the Eigen contract. var EigenMetaData = &bind.MetaData{ ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"_bEIGEN\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"CLOCK_MODE\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"DOMAIN_SEPARATOR\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"allowance\",\"inputs\":[{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"spender\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"allowedFrom\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"allowedTo\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"approve\",\"inputs\":[{\"name\":\"spender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"bEIGEN\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"balanceOf\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"checkpoints\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"pos\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structERC20VotesUpgradeable.Checkpoint\",\"components\":[{\"name\":\"fromBlock\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"votes\",\"type\":\"uint224\",\"internalType\":\"uint224\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"clock\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint48\",\"internalType\":\"uint48\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"decimals\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"decreaseAllowance\",\"inputs\":[{\"name\":\"spender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"subtractedValue\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"delegate\",\"inputs\":[{\"name\":\"delegatee\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"delegateBySig\",\"inputs\":[{\"name\":\"delegatee\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"nonce\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"v\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"r\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"s\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"delegates\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"disableTransferRestrictions\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"eip712Domain\",\"inputs\":[],\"outputs\":[{\"name\":\"fields\",\"type\":\"bytes1\",\"internalType\":\"bytes1\"},{\"name\":\"name\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"version\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"chainId\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"verifyingContract\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"extensions\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getPastTotalSupply\",\"inputs\":[{\"name\":\"timepoint\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getPastVotes\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"timepoint\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getVotes\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"increaseAllowance\",\"inputs\":[{\"name\":\"spender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"addedValue\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"initialOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"minters\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"mintingAllowances\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"},{\"name\":\"mintAllowedAfters\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"mint\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"mintAllowedAfter\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"mintingAllowance\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"multisend\",\"inputs\":[{\"name\":\"receivers\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"amounts\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"name\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"nonces\",\"inputs\":[{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"numCheckpoints\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"permit\",\"inputs\":[{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"spender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"deadline\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"v\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"r\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"s\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setAllowedFrom\",\"inputs\":[{\"name\":\"from\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"isAllowedFrom\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setAllowedTo\",\"inputs\":[{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"isAllowedTo\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"symbol\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"totalSupply\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"transfer\",\"inputs\":[{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"transferFrom\",\"inputs\":[{\"name\":\"from\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"transferRestrictionsDisabledAfter\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"unwrap\",\"inputs\":[{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"wrap\",\"inputs\":[{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"Approval\",\"inputs\":[{\"name\":\"owner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"spender\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegateChanged\",\"inputs\":[{\"name\":\"delegator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"fromDelegate\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"toDelegate\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegateVotesChanged\",\"inputs\":[{\"name\":\"delegate\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"previousBalance\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"newBalance\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"EIP712DomainChanged\",\"inputs\":[],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Mint\",\"inputs\":[{\"name\":\"minter\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"SetAllowedFrom\",\"inputs\":[{\"name\":\"from\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"isAllowedFrom\",\"type\":\"bool\",\"indexed\":false,\"internalType\":\"bool\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"SetAllowedTo\",\"inputs\":[{\"name\":\"to\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"isAllowedTo\",\"type\":\"bool\",\"indexed\":false,\"internalType\":\"bool\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Transfer\",\"inputs\":[{\"name\":\"from\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TransferRestrictionsDisabled\",\"inputs\":[],\"anonymous\":false}]", - Bin: "0x60a060405234801561000f575f5ffd5b5060405161352938038061352983398101604081905261002e91610105565b6001600160a01b038116608052610043610049565b50610132565b5f54610100900460ff16156100b45760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff90811614610103575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b5f60208284031215610115575f5ffd5b81516001600160a01b038116811461012b575f5ffd5b9392505050565b6080516133ca61015f5f395f81816103410152818161083e0152818161149e015261158a01526133ca5ff3fe608060405234801561000f575f5ffd5b5060043610610255575f3560e01c806381b9716111610140578063a9059cbb116100bf578063dd62ed3e11610084578063dd62ed3e146105b9578063de0e9a3e146105cc578063ea598cb0146105df578063eb415f45146105f2578063f1127ed8146105fa578063f2fde38b14610637575f5ffd5b8063a9059cbb1461055a578063aad41a411461056d578063b8c2559414610580578063c3cda52014610593578063d505accf146105a6575f5ffd5b806395d89b411161010557806395d89b411461050f5780639ab24eb0146105175780639aec4bae1461052a578063a457c2d714610534578063a7d1195d14610547575f5ffd5b806381b971611461049157806384b0196e146104b15780638da5cb5b146104cc5780638e539e8c146104dd57806391ddadf4146104f0575f5ffd5b80633a46b1a8116101d75780635c19a95c1161019c5780635c19a95c146103f05780636fcfff451461040357806370a082311461042b578063715018a61461045357806378aa33ba1461045b5780637ecebe001461047e575f5ffd5b80633a46b1a8146103295780633f4da4c61461033c5780634bf5d7e91461037b57806353957125146103a5578063587cde1e146103c5575f5ffd5b80631ffacdef1161021d5780631ffacdef146102d957806323b872dd146102ec578063313ce567146102ff5780633644e5151461030e5780633950935114610316575f5ffd5b80630455e6941461025957806306fdde0314610291578063095ea7b3146102a65780631249c58b146102b957806318160ddd146102c3575b5f5ffd5b61027c610267366004612c01565b6101336020525f908152604090205460ff1681565b60405190151581526020015b60405180910390f35b61029961064a565b6040516102889190612c48565b61027c6102b4366004612c5a565b6106da565b6102c16106f3565b005b6102cb61083b565b604051908152602001610288565b6102c16102e7366004612c8f565b6108c1565b61027c6102fa366004612cc4565b610929565b60405160128152602001610288565b6102cb61094c565b61027c610324366004612c5a565b610955565b6102cb610337366004612c5a565b610976565b6103637f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610288565b60408051808201909152600e81526d06d6f64653d74696d657374616d760941b6020820152610299565b6102cb6103b3366004612c01565b6101306020525f908152604090205481565b6103636103d3366004612c01565b6001600160a01b039081165f90815260fe60205260409020541690565b6102c16103fe366004612c01565b6109f9565b610416610411366004612c01565b610a06565b60405163ffffffff9091168152602001610288565b6102cb610439366004612c01565b6001600160a01b03165f9081526065602052604090205490565b6102c1610a27565b61027c610469366004612c01565b6101346020525f908152604090205460ff1681565b6102cb61048c366004612c01565b610a3a565b6102cb61049f366004612c01565b6101316020525f908152604090205481565b6104b9610a57565b6040516102889796959493929190612cfe565b6033546001600160a01b0316610363565b6102cb6104eb366004612d94565b610af0565b6104f8610b57565b60405165ffffffffffff9091168152602001610288565b610299610b61565b6102cb610525366004612c01565b610b70565b6102cb6101325481565b61027c610542366004612c5a565b610bed565b6102c1610555366004612e73565b610c67565b61027c610568366004612c5a565b61107b565b6102c161057b366004612fb8565b611088565b6102c161058e366004612c8f565b611158565b6102c16105a1366004613034565b6111b8565b6102c16105b4366004613088565b6112ed565b6102cb6105c73660046130ee565b61144e565b6102c16105da366004612d94565b611478565b6102c16105ed366004612d94565b611568565b6102c161165d565b61060d61060836600461311f565b611724565b60408051825163ffffffff1681526020928301516001600160e01b03169281019290925201610288565b6102c1610645366004612c01565b6117a5565b60606068805461065990613151565b80601f016020809104026020016040519081016040528092919081815260200182805461068590613151565b80156106d05780601f106106a7576101008083540402835291602001916106d0565b820191905f5260205f20905b8154815290600101906020018083116106b357829003601f168201915b5050505050905090565b5f336106e781858561181b565b60019150505b92915050565b335f908152610131602052604090205461076c5760405162461bcd60e51b815260206004820152602f60248201527f456967656e2e6d696e743a206d73672e73656e64657220686173206e6f206d6960448201526e6e74696e6720616c6c6f77616e636560881b60648201526084015b60405180910390fd5b335f908152610130602052604090205442116107e45760405162461bcd60e51b815260206004820152603160248201527f456967656e2e6d696e743a206d73672e73656e646572206973206e6f7420616c6044820152701b1bddd959081d1bc81b5a5b9d081e595d607a1b6064820152608401610763565b335f81815261013160205260408120805491905590610803908261193e565b60405181815233907f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d41213968859060200160405180910390a250565b5f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610898573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108bc9190613183565b905090565b6108c96119d4565b6001600160a01b0382165f8181526101336020908152604091829020805460ff191685151590811790915591519182527fcf20b1ecb604b0e8888d579c64e8a3b10e590d45c1c2dddb393bed284362227191015b60405180910390a25050565b5f33610936858285611a2e565b610941858585611aa0565b506001949350505050565b5f6108bc611c5a565b5f336106e7818585610967838361144e565b61097191906131ae565b61181b565b5f61097f610b57565b65ffffffffffff1682106109d15760405162461bcd60e51b815260206004820152601960248201527804552433230566f7465733a20667574757265206c6f6f6b757603c1b6044820152606401610763565b6001600160a01b0383165f90815260ff602052604090206109f29083611c63565b9392505050565b610a033382611d44565b50565b6001600160a01b0381165f90815260ff60205260408120546106ed90611dbd565b610a2f6119d4565b610a385f611e25565b565b6001600160a01b0381165f90815260cb60205260408120546106ed565b5f6060805f5f5f60606097545f5f1b148015610a735750609854155b610ab75760405162461bcd60e51b81526020600482015260156024820152741152540dcc4c8e88155b9a5b9a5d1a585b1a5e9959605a1b6044820152606401610763565b610abf611e76565b610ac7611e85565b604080515f80825260208201909252600f60f81b9b939a50919850469750309650945092509050565b5f610af9610b57565b65ffffffffffff168210610b4b5760405162461bcd60e51b815260206004820152601960248201527804552433230566f7465733a20667574757265206c6f6f6b757603c1b6044820152606401610763565b6106ed61010083611c63565b5f6108bc42611e94565b60606069805461065990613151565b6001600160a01b0381165f90815260ff60205260408120548015610bdb576001600160a01b0383165f90815260ff6020526040902080545f198301908110610bba57610bba6131c1565b5f9182526020909120015464010000000090046001600160e01b0316610bdd565b5f5b6001600160e01b03169392505050565b5f3381610bfa828661144e565b905083811015610c5a5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610763565b610941828686840361181b565b5f54610100900460ff1615808015610c8557505f54600160ff909116105b80610c9e5750303b158015610c9e57505f5460ff166001145b610d015760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610763565b5f805460ff191660011790558015610d22575f805461ff0019166101001790555b610d2a611efa565b610d6e6040518060400160405280600581526020016422b4b3b2b760d91b8152506040518060400160405280600581526020016422a4a3a2a760d91b815250611f28565b610d7785611e25565b610d9d6040518060400160405280600581526020016422a4a3a2a760d91b815250611f5c565b8251845114610e245760405162461bcd60e51b815260206004820152604760248201527f456967656e2e696e697469616c697a653a206d696e7465727320616e64206d6960448201527f6e74696e67416c6c6f77616e636573206d757374206265207468652073616d65606482015266040d8cadccee8d60cb1b608482015260a401610763565b8151845114610eab5760405162461bcd60e51b815260206004820152604760248201527f456967656e2e696e697469616c697a653a206d696e7465727320616e64206d6960448201527f6e74416c6c6f776564416674657273206d757374206265207468652073616d65606482015266040d8cadccee8d60cb1b608482015260a401610763565b5f5b845181101561102857838181518110610ec857610ec86131c1565b60200260200101516101315f878481518110610ee657610ee66131c1565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020015f2081905550828181518110610f2357610f236131c1565b60200260200101516101305f878481518110610f4157610f416131c1565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020015f208190555060016101335f878481518110610f8457610f846131c1565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020015f205f6101000a81548160ff021916908315150217905550848181518110610fd357610fd36131c1565b60200260200101516001600160a01b03167fcf20b1ecb604b0e8888d579c64e8a3b10e590d45c1c2dddb393bed28436222716001604051611018911515815260200190565b60405180910390a2600101610ead565b505f19610132558015611074575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050505050565b5f336106e7818585611aa0565b8281146110fd5760405162461bcd60e51b815260206004820152603e60248201527f456967656e2e6d756c746973656e643a2072656365697665727320616e64206160448201527f6d6f756e7473206d757374206265207468652073616d65206c656e67746800006064820152608401610763565b5f5b83811015611074576111503386868481811061111d5761111d6131c1565b90506020020160208101906111329190612c01565b858585818110611144576111446131c1565b90506020020135611aa0565b6001016110ff565b6111606119d4565b6001600160a01b0382165f8181526101346020908152604091829020805460ff191685151590811790915591519182527f72a561d1af7409467dae4f1e9fc52590a9335a1dda17727e2b6aa8c4db35109b910161091d565b834211156112085760405162461bcd60e51b815260206004820152601d60248201527f4552433230566f7465733a207369676e617475726520657870697265640000006044820152606401610763565b604080517fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf60208201526001600160a01b0388169181019190915260608101869052608081018590525f90611281906112799060a00160405160208183030381529060405280519060200120611fa5565b858585611fd1565b905061128c81611ff7565b86146112da5760405162461bcd60e51b815260206004820152601960248201527f4552433230566f7465733a20696e76616c6964206e6f6e6365000000000000006044820152606401610763565b6112e48188611d44565b50505050505050565b8342111561133d5760405162461bcd60e51b815260206004820152601d60248201527f45524332305065726d69743a206578706972656420646561646c696e650000006044820152606401610763565b5f7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c988888861136b8c611ff7565b6040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090505f6113c582611fa5565b90505f6113d482878787611fd1565b9050896001600160a01b0316816001600160a01b0316146114375760405162461bcd60e51b815260206004820152601e60248201527f45524332305065726d69743a20696e76616c6964207369676e617475726500006044820152606401610763565b6114428a8a8a61181b565b50505050505050505050565b6001600160a01b039182165f90815260666020908152604080832093909416825291909152205490565b611482338261201e565b60405163a9059cbb60e01b8152336004820152602481018290527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063a9059cbb906044016020604051808303815f875af11580156114ec573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061151091906131d5565b610a035760405162461bcd60e51b8152602060048201526024808201527f456967656e2e756e777261703a2062454947454e207472616e736665722066616044820152631a5b195960e21b6064820152608401610763565b6040516323b872dd60e01b8152336004820152306024820152604481018290527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906323b872dd906064016020604051808303815f875af11580156115d8573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115fc91906131d5565b6116535760405162461bcd60e51b815260206004820152602260248201527f456967656e2e777261703a2062454947454e207472616e73666572206661696c604482015261195960f21b6064820152608401610763565b610a03338261193e565b6116656119d4565b5f1961013254146116f45760405162461bcd60e51b815260206004820152604d60248201527f456967656e2e64697361626c655472616e736665725265737472696374696f6e60448201527f733a207472616e73666572207265737472696374696f6e732061726520616c7260648201526c1958591e48191a5cd8589b1959609a1b608482015260a401610763565b5f6101328190556040517f2b18986d3ba809db2f13a5d7bf17f60d357b37d9cbb55dd71cbbac8dc4060f649190a1565b604080518082019091525f80825260208201526001600160a01b0383165f90815260ff60205260409020805463ffffffff8416908110611766576117666131c1565b5f9182526020918290206040805180820190915291015463ffffffff8116825264010000000090046001600160e01b0316918101919091529392505050565b6117ad6119d4565b6001600160a01b0381166118125760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610763565b610a0381611e25565b6001600160a01b03831661187d5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610763565b6001600160a01b0382166118de5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610763565b6001600160a01b038381165f8181526066602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6119488282612037565b6001600160e01b0361195861083b565b11156119bf5760405162461bcd60e51b815260206004820152603060248201527f4552433230566f7465733a20746f74616c20737570706c79207269736b73206f60448201526f766572666c6f77696e6720766f74657360801b6064820152608401610763565b6119ce61010061210883612113565b50505050565b6033546001600160a01b03163314610a385760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610763565b5f611a39848461144e565b90505f1981146119ce5781811015611a935760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610763565b6119ce848484840361181b565b6001600160a01b038316611b045760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610763565b6001600160a01b038216611b665760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610763565b611b7183838361227f565b6001600160a01b0383165f9081526065602052604090205481811015611be85760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610763565b6001600160a01b038085165f8181526065602052604080822086860390559286168082529083902080548601905591517fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90611c479086815260200190565b60405180910390a36119ce848484612363565b5f6108bc612394565b81545f9081816005811115611cba575f611c7c84612407565b611c8690856131f0565b5f88815260209020909150869082015463ffffffff161115611caa57809150611cb8565b611cb58160016131ae565b92505b505b80821015611d05575f611ccd83836124eb565b5f88815260209020909150869082015463ffffffff161115611cf157809150611cff565b611cfc8160016131ae565b92505b50611cba565b8015611d2f575f8681526020902081015f19015464010000000090046001600160e01b0316611d31565b5f5b6001600160e01b03169695505050505050565b6001600160a01b038281165f81815260fe6020818152604080842080546065845282862054949093528787166001600160a01b03198416811790915590519190951694919391928592917f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f9190a46119ce828483612505565b5f63ffffffff821115611e215760405162461bcd60e51b815260206004820152602660248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203360448201526532206269747360d01b6064820152608401610763565b5090565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b60606099805461065990613151565b6060609a805461065990613151565b5f65ffffffffffff821115611e215760405162461bcd60e51b815260206004820152602660248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203460448201526538206269747360d01b6064820152608401610763565b5f54610100900460ff16611f205760405162461bcd60e51b815260040161076390613203565b610a3861263f565b5f54610100900460ff16611f4e5760405162461bcd60e51b815260040161076390613203565b611f58828261266e565b5050565b5f54610100900460ff16611f825760405162461bcd60e51b815260040161076390613203565b610a0381604051806040016040528060018152602001603160f81b8152506126ad565b5f6106ed611fb1611c5a565b8360405161190160f01b8152600281019290925260228201526042902090565b5f5f5f611fe0878787876126fa565b91509150611fed816127b7565b5095945050505050565b6001600160a01b0381165f90815260cb602052604090208054600181018255905b50919050565b6120288282612900565b6119ce610100612a4383612113565b6001600160a01b03821661208d5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610763565b6120985f838361227f565b8060675f8282546120a991906131ae565b90915550506001600160a01b0382165f818152606560209081526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3611f585f8383612363565b5f6109f282846131ae565b82545f90819081811561215d575f8781526020902082015f190160408051808201909152905463ffffffff8116825264010000000090046001600160e01b03166020820152612171565b604080518082019091525f80825260208201525b905080602001516001600160e01b0316935061219184868863ffffffff16565b92505f821180156121b957506121a5610b57565b65ffffffffffff16815f015163ffffffff16145b156121fc576121c783612a4e565b5f8881526020902083015f190180546001600160e01b03929092166401000000000263ffffffff909216919091179055612275565b866040518060400160405280612220612213610b57565b65ffffffffffff16611dbd565b63ffffffff16815260200161223486612a4e565b6001600160e01b0390811690915282546001810184555f938452602093849020835194909301519091166401000000000263ffffffff909316929092179101555b5050935093915050565b61013254421161235e576001600160a01b03831615806122a657506001600160a01b038216155b806122c957506001600160a01b0383165f908152610133602052604090205460ff165b806122ec57506001600160a01b0382165f908152610134602052604090205460ff165b61235e5760405162461bcd60e51b815260206004820152603a60248201527f456967656e2e5f6265666f7265546f6b656e5472616e736665723a2066726f6d60448201527f206f7220746f206d7573742062652077686974656c69737465640000000000006064820152608401610763565b505050565b6001600160a01b038381165f90815260fe602052604080822054858416835291205461235e92918216911683612505565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f6123be612ab6565b6123c6612b0e565b60408051602081019490945283019190915260608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b5f815f0361241657505f919050565b5f600161242284612b3e565b901c6001901b9050600181848161243b5761243b61324e565b048201901c905060018184816124535761245361324e565b048201901c9050600181848161246b5761246b61324e565b048201901c905060018184816124835761248361324e565b048201901c9050600181848161249b5761249b61324e565b048201901c905060018184816124b3576124b361324e565b048201901c905060018184816124cb576124cb61324e565b048201901c90506109f2818285816124e5576124e561324e565b04612bd1565b5f6124f96002848418613262565b6109f2908484166131ae565b816001600160a01b0316836001600160a01b03161415801561252657505f81115b1561235e576001600160a01b038316156125b3576001600160a01b0383165f90815260ff60205260408120819061256090612a4385612113565b91509150846001600160a01b03167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a72483836040516125a8929190918252602082015260400190565b60405180910390a250505b6001600160a01b0382161561235e576001600160a01b0382165f90815260ff6020526040812081906125e89061210885612113565b91509150836001600160a01b03167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a7248383604051612630929190918252602082015260400190565b60405180910390a25050505050565b5f54610100900460ff166126655760405162461bcd60e51b815260040161076390613203565b610a3833611e25565b5f54610100900460ff166126945760405162461bcd60e51b815260040161076390613203565b60686126a083826132c5565b50606961235e82826132c5565b5f54610100900460ff166126d35760405162461bcd60e51b815260040161076390613203565b60996126df83826132c5565b50609a6126ec82826132c5565b50505f609781905560985550565b5f807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a083111561272f57505f905060036127ae565b604080515f8082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015612780573d5f5f3e3d5ffd5b5050604051601f1901519150506001600160a01b0381166127a8575f600192509250506127ae565b91505f90505b94509492505050565b5f8160048111156127ca576127ca613380565b036127d25750565b60018160048111156127e6576127e6613380565b036128335760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610763565b600281600481111561284757612847613380565b036128945760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610763565b60038160048111156128a8576128a8613380565b03610a035760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401610763565b6001600160a01b0382166129605760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401610763565b61296b825f8361227f565b6001600160a01b0382165f90815260656020526040902054818110156129de5760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b6064820152608401610763565b6001600160a01b0383165f8181526065602090815260408083208686039055606780548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a361235e835f84612363565b5f6109f282846131f0565b5f6001600160e01b03821115611e215760405162461bcd60e51b815260206004820152602760248201527f53616665436173743a2076616c756520646f65736e27742066697420696e20326044820152663234206269747360c81b6064820152608401610763565b5f5f612ac0611e76565b805190915015612ad7578051602090910120919050565b6097548015612ae65792915050565b7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4709250505090565b5f5f612b18611e85565b805190915015612b2f578051602090910120919050565b6098548015612ae65792915050565b5f80608083901c15612b5257608092831c92015b604083901c15612b6457604092831c92015b602083901c15612b7657602092831c92015b601083901c15612b8857601092831c92015b600883901c15612b9a57600892831c92015b600483901c15612bac57600492831c92015b600283901c15612bbe57600292831c92015b600183901c156106ed5760010192915050565b5f818310612bdf57816109f2565b5090919050565b80356001600160a01b0381168114612bfc575f5ffd5b919050565b5f60208284031215612c11575f5ffd5b6109f282612be6565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f6109f26020830184612c1a565b5f5f60408385031215612c6b575f5ffd5b612c7483612be6565b946020939093013593505050565b8015158114610a03575f5ffd5b5f5f60408385031215612ca0575f5ffd5b612ca983612be6565b91506020830135612cb981612c82565b809150509250929050565b5f5f5f60608486031215612cd6575f5ffd5b612cdf84612be6565b9250612ced60208501612be6565b929592945050506040919091013590565b60ff60f81b8816815260e060208201525f612d1c60e0830189612c1a565b8281036040840152612d2e8189612c1a565b606084018890526001600160a01b038716608085015260a0840186905283810360c0850152845180825260208087019350909101905f5b81811015612d83578351835260209384019390920191600101612d65565b50909b9a5050505050505050505050565b5f60208284031215612da4575f5ffd5b5035919050565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f1916810167ffffffffffffffff81118282101715612de857612de8612dab565b604052919050565b5f67ffffffffffffffff821115612e0957612e09612dab565b5060051b60200190565b5f82601f830112612e22575f5ffd5b8135612e35612e3082612df0565b612dbf565b8082825260208201915060208360051b860101925085831115612e56575f5ffd5b602085015b83811015611fed578035835260209283019201612e5b565b5f5f5f5f60808587031215612e86575f5ffd5b612e8f85612be6565b9350602085013567ffffffffffffffff811115612eaa575f5ffd5b8501601f81018713612eba575f5ffd5b8035612ec8612e3082612df0565b8082825260208201915060208360051b850101925089831115612ee9575f5ffd5b6020840193505b82841015612f1257612f0184612be6565b825260209384019390910190612ef0565b9550505050604085013567ffffffffffffffff811115612f30575f5ffd5b612f3c87828801612e13565b925050606085013567ffffffffffffffff811115612f58575f5ffd5b612f6487828801612e13565b91505092959194509250565b5f5f83601f840112612f80575f5ffd5b50813567ffffffffffffffff811115612f97575f5ffd5b6020830191508360208260051b8501011115612fb1575f5ffd5b9250929050565b5f5f5f5f60408587031215612fcb575f5ffd5b843567ffffffffffffffff811115612fe1575f5ffd5b612fed87828801612f70565b909550935050602085013567ffffffffffffffff81111561300c575f5ffd5b61301887828801612f70565b95989497509550505050565b803560ff81168114612bfc575f5ffd5b5f5f5f5f5f5f60c08789031215613049575f5ffd5b61305287612be6565b9550602087013594506040870135935061306e60608801613024565b9598949750929560808101359460a0909101359350915050565b5f5f5f5f5f5f5f60e0888a03121561309e575f5ffd5b6130a788612be6565b96506130b560208901612be6565b955060408801359450606088013593506130d160808901613024565b9699959850939692959460a0840135945060c09093013592915050565b5f5f604083850312156130ff575f5ffd5b61310883612be6565b915061311660208401612be6565b90509250929050565b5f5f60408385031215613130575f5ffd5b61313983612be6565b9150602083013563ffffffff81168114612cb9575f5ffd5b600181811c9082168061316557607f821691505b60208210810361201857634e487b7160e01b5f52602260045260245ffd5b5f60208284031215613193575f5ffd5b5051919050565b634e487b7160e01b5f52601160045260245ffd5b808201808211156106ed576106ed61319a565b634e487b7160e01b5f52603260045260245ffd5b5f602082840312156131e5575f5ffd5b81516109f281612c82565b818103818111156106ed576106ed61319a565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b634e487b7160e01b5f52601260045260245ffd5b5f8261327c57634e487b7160e01b5f52601260045260245ffd5b500490565b601f82111561235e57805f5260205f20601f840160051c810160208510156132a65750805b601f840160051c820191505b81811015611074575f81556001016132b2565b815167ffffffffffffffff8111156132df576132df612dab565b6132f3816132ed8454613151565b84613281565b6020601f821160018114613325575f831561330e5750848201515b5f19600385901b1c1916600184901b178455611074565b5f84815260208120601f198516915b828110156133545787850151825560209485019460019092019101613334565b508482101561337157868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b634e487b7160e01b5f52602160045260245ffdfea2646970667358221220288064199d2be90b93729dff2dcc2497b661bd2af455c43da5f6db62c74e88c364736f6c634300081b0033", + Bin: "0x60a060405234801561000f575f5ffd5b5060405161352938038061352983398101604081905261002e91610105565b6001600160a01b038116608052610043610049565b50610132565b5f54610100900460ff16156100b45760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff90811614610103575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b5f60208284031215610115575f5ffd5b81516001600160a01b038116811461012b575f5ffd5b9392505050565b6080516133ca61015f5f395f81816103410152818161083e0152818161149e015261158a01526133ca5ff3fe608060405234801561000f575f5ffd5b5060043610610255575f3560e01c806381b9716111610140578063a9059cbb116100bf578063dd62ed3e11610084578063dd62ed3e146105b9578063de0e9a3e146105cc578063ea598cb0146105df578063eb415f45146105f2578063f1127ed8146105fa578063f2fde38b14610637575f5ffd5b8063a9059cbb1461055a578063aad41a411461056d578063b8c2559414610580578063c3cda52014610593578063d505accf146105a6575f5ffd5b806395d89b411161010557806395d89b411461050f5780639ab24eb0146105175780639aec4bae1461052a578063a457c2d714610534578063a7d1195d14610547575f5ffd5b806381b971611461049157806384b0196e146104b15780638da5cb5b146104cc5780638e539e8c146104dd57806391ddadf4146104f0575f5ffd5b80633a46b1a8116101d75780635c19a95c1161019c5780635c19a95c146103f05780636fcfff451461040357806370a082311461042b578063715018a61461045357806378aa33ba1461045b5780637ecebe001461047e575f5ffd5b80633a46b1a8146103295780633f4da4c61461033c5780634bf5d7e91461037b57806353957125146103a5578063587cde1e146103c5575f5ffd5b80631ffacdef1161021d5780631ffacdef146102d957806323b872dd146102ec578063313ce567146102ff5780633644e5151461030e5780633950935114610316575f5ffd5b80630455e6941461025957806306fdde0314610291578063095ea7b3146102a65780631249c58b146102b957806318160ddd146102c3575b5f5ffd5b61027c610267366004612c01565b6101336020525f908152604090205460ff1681565b60405190151581526020015b60405180910390f35b61029961064a565b6040516102889190612c48565b61027c6102b4366004612c5a565b6106da565b6102c16106f3565b005b6102cb61083b565b604051908152602001610288565b6102c16102e7366004612c8f565b6108c1565b61027c6102fa366004612cc4565b610929565b60405160128152602001610288565b6102cb61094c565b61027c610324366004612c5a565b610955565b6102cb610337366004612c5a565b610976565b6103637f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610288565b60408051808201909152600e81526d06d6f64653d74696d657374616d760941b6020820152610299565b6102cb6103b3366004612c01565b6101306020525f908152604090205481565b6103636103d3366004612c01565b6001600160a01b039081165f90815260fe60205260409020541690565b6102c16103fe366004612c01565b6109f9565b610416610411366004612c01565b610a06565b60405163ffffffff9091168152602001610288565b6102cb610439366004612c01565b6001600160a01b03165f9081526065602052604090205490565b6102c1610a27565b61027c610469366004612c01565b6101346020525f908152604090205460ff1681565b6102cb61048c366004612c01565b610a3a565b6102cb61049f366004612c01565b6101316020525f908152604090205481565b6104b9610a57565b6040516102889796959493929190612cfe565b6033546001600160a01b0316610363565b6102cb6104eb366004612d94565b610af0565b6104f8610b57565b60405165ffffffffffff9091168152602001610288565b610299610b61565b6102cb610525366004612c01565b610b70565b6102cb6101325481565b61027c610542366004612c5a565b610bed565b6102c1610555366004612e73565b610c67565b61027c610568366004612c5a565b61107b565b6102c161057b366004612fb8565b611088565b6102c161058e366004612c8f565b611158565b6102c16105a1366004613034565b6111b8565b6102c16105b4366004613088565b6112ed565b6102cb6105c73660046130ee565b61144e565b6102c16105da366004612d94565b611478565b6102c16105ed366004612d94565b611568565b6102c161165d565b61060d61060836600461311f565b611724565b60408051825163ffffffff1681526020928301516001600160e01b03169281019290925201610288565b6102c1610645366004612c01565b6117a5565b60606068805461065990613151565b80601f016020809104026020016040519081016040528092919081815260200182805461068590613151565b80156106d05780601f106106a7576101008083540402835291602001916106d0565b820191905f5260205f20905b8154815290600101906020018083116106b357829003601f168201915b5050505050905090565b5f336106e781858561181b565b60019150505b92915050565b335f908152610131602052604090205461076c5760405162461bcd60e51b815260206004820152602f60248201527f456967656e2e6d696e743a206d73672e73656e64657220686173206e6f206d6960448201526e6e74696e6720616c6c6f77616e636560881b60648201526084015b60405180910390fd5b335f908152610130602052604090205442116107e45760405162461bcd60e51b815260206004820152603160248201527f456967656e2e6d696e743a206d73672e73656e646572206973206e6f7420616c6044820152701b1bddd959081d1bc81b5a5b9d081e595d607a1b6064820152608401610763565b335f81815261013160205260408120805491905590610803908261193e565b60405181815233907f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d41213968859060200160405180910390a250565b5f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610898573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108bc9190613183565b905090565b6108c96119d4565b6001600160a01b0382165f8181526101336020908152604091829020805460ff191685151590811790915591519182527fcf20b1ecb604b0e8888d579c64e8a3b10e590d45c1c2dddb393bed284362227191015b60405180910390a25050565b5f33610936858285611a2e565b610941858585611aa0565b506001949350505050565b5f6108bc611c5a565b5f336106e7818585610967838361144e565b61097191906131ae565b61181b565b5f61097f610b57565b65ffffffffffff1682106109d15760405162461bcd60e51b815260206004820152601960248201527804552433230566f7465733a20667574757265206c6f6f6b757603c1b6044820152606401610763565b6001600160a01b0383165f90815260ff602052604090206109f29083611c63565b9392505050565b610a033382611d44565b50565b6001600160a01b0381165f90815260ff60205260408120546106ed90611dbd565b610a2f6119d4565b610a385f611e25565b565b6001600160a01b0381165f90815260cb60205260408120546106ed565b5f6060805f5f5f60606097545f5f1b148015610a735750609854155b610ab75760405162461bcd60e51b81526020600482015260156024820152741152540dcc4c8e88155b9a5b9a5d1a585b1a5e9959605a1b6044820152606401610763565b610abf611e76565b610ac7611e85565b604080515f80825260208201909252600f60f81b9b939a50919850469750309650945092509050565b5f610af9610b57565b65ffffffffffff168210610b4b5760405162461bcd60e51b815260206004820152601960248201527804552433230566f7465733a20667574757265206c6f6f6b757603c1b6044820152606401610763565b6106ed61010083611c63565b5f6108bc42611e94565b60606069805461065990613151565b6001600160a01b0381165f90815260ff60205260408120548015610bdb576001600160a01b0383165f90815260ff6020526040902080545f198301908110610bba57610bba6131c1565b5f9182526020909120015464010000000090046001600160e01b0316610bdd565b5f5b6001600160e01b03169392505050565b5f3381610bfa828661144e565b905083811015610c5a5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610763565b610941828686840361181b565b5f54610100900460ff1615808015610c8557505f54600160ff909116105b80610c9e5750303b158015610c9e57505f5460ff166001145b610d015760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610763565b5f805460ff191660011790558015610d22575f805461ff0019166101001790555b610d2a611efa565b610d6e6040518060400160405280600581526020016422b4b3b2b760d91b8152506040518060400160405280600581526020016422a4a3a2a760d91b815250611f28565b610d7785611e25565b610d9d6040518060400160405280600581526020016422a4a3a2a760d91b815250611f5c565b8251845114610e245760405162461bcd60e51b815260206004820152604760248201527f456967656e2e696e697469616c697a653a206d696e7465727320616e64206d6960448201527f6e74696e67416c6c6f77616e636573206d757374206265207468652073616d65606482015266040d8cadccee8d60cb1b608482015260a401610763565b8151845114610eab5760405162461bcd60e51b815260206004820152604760248201527f456967656e2e696e697469616c697a653a206d696e7465727320616e64206d6960448201527f6e74416c6c6f776564416674657273206d757374206265207468652073616d65606482015266040d8cadccee8d60cb1b608482015260a401610763565b5f5b845181101561102857838181518110610ec857610ec86131c1565b60200260200101516101315f878481518110610ee657610ee66131c1565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020015f2081905550828181518110610f2357610f236131c1565b60200260200101516101305f878481518110610f4157610f416131c1565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020015f208190555060016101335f878481518110610f8457610f846131c1565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020015f205f6101000a81548160ff021916908315150217905550848181518110610fd357610fd36131c1565b60200260200101516001600160a01b03167fcf20b1ecb604b0e8888d579c64e8a3b10e590d45c1c2dddb393bed28436222716001604051611018911515815260200190565b60405180910390a2600101610ead565b505f19610132558015611074575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050505050565b5f336106e7818585611aa0565b8281146110fd5760405162461bcd60e51b815260206004820152603e60248201527f456967656e2e6d756c746973656e643a2072656365697665727320616e64206160448201527f6d6f756e7473206d757374206265207468652073616d65206c656e67746800006064820152608401610763565b5f5b83811015611074576111503386868481811061111d5761111d6131c1565b90506020020160208101906111329190612c01565b858585818110611144576111446131c1565b90506020020135611aa0565b6001016110ff565b6111606119d4565b6001600160a01b0382165f8181526101346020908152604091829020805460ff191685151590811790915591519182527f72a561d1af7409467dae4f1e9fc52590a9335a1dda17727e2b6aa8c4db35109b910161091d565b834211156112085760405162461bcd60e51b815260206004820152601d60248201527f4552433230566f7465733a207369676e617475726520657870697265640000006044820152606401610763565b604080517fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf60208201526001600160a01b0388169181019190915260608101869052608081018590525f90611281906112799060a00160405160208183030381529060405280519060200120611fa5565b858585611fd1565b905061128c81611ff7565b86146112da5760405162461bcd60e51b815260206004820152601960248201527f4552433230566f7465733a20696e76616c6964206e6f6e6365000000000000006044820152606401610763565b6112e48188611d44565b50505050505050565b8342111561133d5760405162461bcd60e51b815260206004820152601d60248201527f45524332305065726d69743a206578706972656420646561646c696e650000006044820152606401610763565b5f7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c988888861136b8c611ff7565b6040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090505f6113c582611fa5565b90505f6113d482878787611fd1565b9050896001600160a01b0316816001600160a01b0316146114375760405162461bcd60e51b815260206004820152601e60248201527f45524332305065726d69743a20696e76616c6964207369676e617475726500006044820152606401610763565b6114428a8a8a61181b565b50505050505050505050565b6001600160a01b039182165f90815260666020908152604080832093909416825291909152205490565b611482338261201e565b60405163a9059cbb60e01b8152336004820152602481018290527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063a9059cbb906044016020604051808303815f875af11580156114ec573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061151091906131d5565b610a035760405162461bcd60e51b8152602060048201526024808201527f456967656e2e756e777261703a2062454947454e207472616e736665722066616044820152631a5b195960e21b6064820152608401610763565b6040516323b872dd60e01b8152336004820152306024820152604481018290527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906323b872dd906064016020604051808303815f875af11580156115d8573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115fc91906131d5565b6116535760405162461bcd60e51b815260206004820152602260248201527f456967656e2e777261703a2062454947454e207472616e73666572206661696c604482015261195960f21b6064820152608401610763565b610a03338261193e565b6116656119d4565b5f1961013254146116f45760405162461bcd60e51b815260206004820152604d60248201527f456967656e2e64697361626c655472616e736665725265737472696374696f6e60448201527f733a207472616e73666572207265737472696374696f6e732061726520616c7260648201526c1958591e48191a5cd8589b1959609a1b608482015260a401610763565b5f6101328190556040517f2b18986d3ba809db2f13a5d7bf17f60d357b37d9cbb55dd71cbbac8dc4060f649190a1565b604080518082019091525f80825260208201526001600160a01b0383165f90815260ff60205260409020805463ffffffff8416908110611766576117666131c1565b5f9182526020918290206040805180820190915291015463ffffffff8116825264010000000090046001600160e01b0316918101919091529392505050565b6117ad6119d4565b6001600160a01b0381166118125760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610763565b610a0381611e25565b6001600160a01b03831661187d5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610763565b6001600160a01b0382166118de5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610763565b6001600160a01b038381165f8181526066602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6119488282612037565b6001600160e01b0361195861083b565b11156119bf5760405162461bcd60e51b815260206004820152603060248201527f4552433230566f7465733a20746f74616c20737570706c79207269736b73206f60448201526f766572666c6f77696e6720766f74657360801b6064820152608401610763565b6119ce61010061210883612113565b50505050565b6033546001600160a01b03163314610a385760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610763565b5f611a39848461144e565b90505f1981146119ce5781811015611a935760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610763565b6119ce848484840361181b565b6001600160a01b038316611b045760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610763565b6001600160a01b038216611b665760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610763565b611b7183838361227f565b6001600160a01b0383165f9081526065602052604090205481811015611be85760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610763565b6001600160a01b038085165f8181526065602052604080822086860390559286168082529083902080548601905591517fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90611c479086815260200190565b60405180910390a36119ce848484612363565b5f6108bc612394565b81545f9081816005811115611cba575f611c7c84612407565b611c8690856131f0565b5f88815260209020909150869082015463ffffffff161115611caa57809150611cb8565b611cb58160016131ae565b92505b505b80821015611d05575f611ccd83836124eb565b5f88815260209020909150869082015463ffffffff161115611cf157809150611cff565b611cfc8160016131ae565b92505b50611cba565b8015611d2f575f8681526020902081015f19015464010000000090046001600160e01b0316611d31565b5f5b6001600160e01b03169695505050505050565b6001600160a01b038281165f81815260fe6020818152604080842080546065845282862054949093528787166001600160a01b03198416811790915590519190951694919391928592917f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f9190a46119ce828483612505565b5f63ffffffff821115611e215760405162461bcd60e51b815260206004820152602660248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203360448201526532206269747360d01b6064820152608401610763565b5090565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b60606099805461065990613151565b6060609a805461065990613151565b5f65ffffffffffff821115611e215760405162461bcd60e51b815260206004820152602660248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203460448201526538206269747360d01b6064820152608401610763565b5f54610100900460ff16611f205760405162461bcd60e51b815260040161076390613203565b610a3861263f565b5f54610100900460ff16611f4e5760405162461bcd60e51b815260040161076390613203565b611f58828261266e565b5050565b5f54610100900460ff16611f825760405162461bcd60e51b815260040161076390613203565b610a0381604051806040016040528060018152602001603160f81b8152506126ad565b5f6106ed611fb1611c5a565b8360405161190160f01b8152600281019290925260228201526042902090565b5f5f5f611fe0878787876126fa565b91509150611fed816127b7565b5095945050505050565b6001600160a01b0381165f90815260cb602052604090208054600181018255905b50919050565b6120288282612900565b6119ce610100612a4383612113565b6001600160a01b03821661208d5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610763565b6120985f838361227f565b8060675f8282546120a991906131ae565b90915550506001600160a01b0382165f818152606560209081526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3611f585f8383612363565b5f6109f282846131ae565b82545f90819081811561215d575f8781526020902082015f190160408051808201909152905463ffffffff8116825264010000000090046001600160e01b03166020820152612171565b604080518082019091525f80825260208201525b905080602001516001600160e01b0316935061219184868863ffffffff16565b92505f821180156121b957506121a5610b57565b65ffffffffffff16815f015163ffffffff16145b156121fc576121c783612a4e565b5f8881526020902083015f190180546001600160e01b03929092166401000000000263ffffffff909216919091179055612275565b866040518060400160405280612220612213610b57565b65ffffffffffff16611dbd565b63ffffffff16815260200161223486612a4e565b6001600160e01b0390811690915282546001810184555f938452602093849020835194909301519091166401000000000263ffffffff909316929092179101555b5050935093915050565b61013254421161235e576001600160a01b03831615806122a657506001600160a01b038216155b806122c957506001600160a01b0383165f908152610133602052604090205460ff165b806122ec57506001600160a01b0382165f908152610134602052604090205460ff165b61235e5760405162461bcd60e51b815260206004820152603a60248201527f456967656e2e5f6265666f7265546f6b656e5472616e736665723a2066726f6d60448201527f206f7220746f206d7573742062652077686974656c69737465640000000000006064820152608401610763565b505050565b6001600160a01b038381165f90815260fe602052604080822054858416835291205461235e92918216911683612505565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f6123be612ab6565b6123c6612b0e565b60408051602081019490945283019190915260608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b5f815f0361241657505f919050565b5f600161242284612b3e565b901c6001901b9050600181848161243b5761243b61324e565b048201901c905060018184816124535761245361324e565b048201901c9050600181848161246b5761246b61324e565b048201901c905060018184816124835761248361324e565b048201901c9050600181848161249b5761249b61324e565b048201901c905060018184816124b3576124b361324e565b048201901c905060018184816124cb576124cb61324e565b048201901c90506109f2818285816124e5576124e561324e565b04612bd1565b5f6124f96002848418613262565b6109f2908484166131ae565b816001600160a01b0316836001600160a01b03161415801561252657505f81115b1561235e576001600160a01b038316156125b3576001600160a01b0383165f90815260ff60205260408120819061256090612a4385612113565b91509150846001600160a01b03167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a72483836040516125a8929190918252602082015260400190565b60405180910390a250505b6001600160a01b0382161561235e576001600160a01b0382165f90815260ff6020526040812081906125e89061210885612113565b91509150836001600160a01b03167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a7248383604051612630929190918252602082015260400190565b60405180910390a25050505050565b5f54610100900460ff166126655760405162461bcd60e51b815260040161076390613203565b610a3833611e25565b5f54610100900460ff166126945760405162461bcd60e51b815260040161076390613203565b60686126a083826132c5565b50606961235e82826132c5565b5f54610100900460ff166126d35760405162461bcd60e51b815260040161076390613203565b60996126df83826132c5565b50609a6126ec82826132c5565b50505f609781905560985550565b5f807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a083111561272f57505f905060036127ae565b604080515f8082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015612780573d5f5f3e3d5ffd5b5050604051601f1901519150506001600160a01b0381166127a8575f600192509250506127ae565b91505f90505b94509492505050565b5f8160048111156127ca576127ca613380565b036127d25750565b60018160048111156127e6576127e6613380565b036128335760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610763565b600281600481111561284757612847613380565b036128945760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610763565b60038160048111156128a8576128a8613380565b03610a035760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401610763565b6001600160a01b0382166129605760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401610763565b61296b825f8361227f565b6001600160a01b0382165f90815260656020526040902054818110156129de5760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b6064820152608401610763565b6001600160a01b0383165f8181526065602090815260408083208686039055606780548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a361235e835f84612363565b5f6109f282846131f0565b5f6001600160e01b03821115611e215760405162461bcd60e51b815260206004820152602760248201527f53616665436173743a2076616c756520646f65736e27742066697420696e20326044820152663234206269747360c81b6064820152608401610763565b5f5f612ac0611e76565b805190915015612ad7578051602090910120919050565b6097548015612ae65792915050565b7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4709250505090565b5f5f612b18611e85565b805190915015612b2f578051602090910120919050565b6098548015612ae65792915050565b5f80608083901c15612b5257608092831c92015b604083901c15612b6457604092831c92015b602083901c15612b7657602092831c92015b601083901c15612b8857601092831c92015b600883901c15612b9a57600892831c92015b600483901c15612bac57600492831c92015b600283901c15612bbe57600292831c92015b600183901c156106ed5760010192915050565b5f818310612bdf57816109f2565b5090919050565b80356001600160a01b0381168114612bfc575f5ffd5b919050565b5f60208284031215612c11575f5ffd5b6109f282612be6565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f6109f26020830184612c1a565b5f5f60408385031215612c6b575f5ffd5b612c7483612be6565b946020939093013593505050565b8015158114610a03575f5ffd5b5f5f60408385031215612ca0575f5ffd5b612ca983612be6565b91506020830135612cb981612c82565b809150509250929050565b5f5f5f60608486031215612cd6575f5ffd5b612cdf84612be6565b9250612ced60208501612be6565b929592945050506040919091013590565b60ff60f81b8816815260e060208201525f612d1c60e0830189612c1a565b8281036040840152612d2e8189612c1a565b606084018890526001600160a01b038716608085015260a0840186905283810360c0850152845180825260208087019350909101905f5b81811015612d83578351835260209384019390920191600101612d65565b50909b9a5050505050505050505050565b5f60208284031215612da4575f5ffd5b5035919050565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f1916810167ffffffffffffffff81118282101715612de857612de8612dab565b604052919050565b5f67ffffffffffffffff821115612e0957612e09612dab565b5060051b60200190565b5f82601f830112612e22575f5ffd5b8135612e35612e3082612df0565b612dbf565b8082825260208201915060208360051b860101925085831115612e56575f5ffd5b602085015b83811015611fed578035835260209283019201612e5b565b5f5f5f5f60808587031215612e86575f5ffd5b612e8f85612be6565b9350602085013567ffffffffffffffff811115612eaa575f5ffd5b8501601f81018713612eba575f5ffd5b8035612ec8612e3082612df0565b8082825260208201915060208360051b850101925089831115612ee9575f5ffd5b6020840193505b82841015612f1257612f0184612be6565b825260209384019390910190612ef0565b9550505050604085013567ffffffffffffffff811115612f30575f5ffd5b612f3c87828801612e13565b925050606085013567ffffffffffffffff811115612f58575f5ffd5b612f6487828801612e13565b91505092959194509250565b5f5f83601f840112612f80575f5ffd5b50813567ffffffffffffffff811115612f97575f5ffd5b6020830191508360208260051b8501011115612fb1575f5ffd5b9250929050565b5f5f5f5f60408587031215612fcb575f5ffd5b843567ffffffffffffffff811115612fe1575f5ffd5b612fed87828801612f70565b909550935050602085013567ffffffffffffffff81111561300c575f5ffd5b61301887828801612f70565b95989497509550505050565b803560ff81168114612bfc575f5ffd5b5f5f5f5f5f5f60c08789031215613049575f5ffd5b61305287612be6565b9550602087013594506040870135935061306e60608801613024565b9598949750929560808101359460a0909101359350915050565b5f5f5f5f5f5f5f60e0888a03121561309e575f5ffd5b6130a788612be6565b96506130b560208901612be6565b955060408801359450606088013593506130d160808901613024565b9699959850939692959460a0840135945060c09093013592915050565b5f5f604083850312156130ff575f5ffd5b61310883612be6565b915061311660208401612be6565b90509250929050565b5f5f60408385031215613130575f5ffd5b61313983612be6565b9150602083013563ffffffff81168114612cb9575f5ffd5b600181811c9082168061316557607f821691505b60208210810361201857634e487b7160e01b5f52602260045260245ffd5b5f60208284031215613193575f5ffd5b5051919050565b634e487b7160e01b5f52601160045260245ffd5b808201808211156106ed576106ed61319a565b634e487b7160e01b5f52603260045260245ffd5b5f602082840312156131e5575f5ffd5b81516109f281612c82565b818103818111156106ed576106ed61319a565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b634e487b7160e01b5f52601260045260245ffd5b5f8261327c57634e487b7160e01b5f52601260045260245ffd5b500490565b601f82111561235e57805f5260205f20601f840160051c810160208510156132a65750805b601f840160051c820191505b81811015611074575f81556001016132b2565b815167ffffffffffffffff8111156132df576132df612dab565b6132f3816132ed8454613151565b84613281565b6020601f821160018114613325575f831561330e5750848201515b5f19600385901b1c1916600184901b178455611074565b5f84815260208120601f198516915b828110156133545787850151825560209485019460019092019101613334565b508482101561337157868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b634e487b7160e01b5f52602160045260245ffdfea264697066735822122087556507a13c767e1ac5fae7a99abc6e15a1498b1060ca1cde8c320d6d57627664736f6c634300081b0033", } // 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 7f3d80518c..e918812a07 100644 --- a/pkg/bindings/EigenPod/binding.go +++ b/pkg/bindings/EigenPod/binding.go @@ -74,7 +74,7 @@ type IEigenPodTypesValidatorInfo struct { // EigenPodMetaData contains all meta data concerning the EigenPod contract. var EigenPodMetaData = &bind.MetaData{ ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"_ethPOS\",\"type\":\"address\",\"internalType\":\"contractIETHPOSDeposit\"},{\"name\":\"_eigenPodManager\",\"type\":\"address\",\"internalType\":\"contractIEigenPodManager\"},{\"name\":\"_GENESIS_TIME\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"receive\",\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"GENESIS_TIME\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidatorCount\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"checkpointBalanceExitedGwei\",\"inputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"currentCheckpoint\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIEigenPodTypes.Checkpoint\",\"components\":[{\"name\":\"beaconBlockRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"proofsRemaining\",\"type\":\"uint24\",\"internalType\":\"uint24\"},{\"name\":\"podBalanceGwei\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"balanceDeltasGwei\",\"type\":\"int64\",\"internalType\":\"int64\"},{\"name\":\"prevBeaconBalanceGwei\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"currentCheckpointTimestamp\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"eigenPodManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIEigenPodManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"ethPOS\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIETHPOSDeposit\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getParentBlockRoot\",\"inputs\":[{\"name\":\"timestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"_podOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"lastCheckpointTimestamp\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"podOwner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"proofSubmitter\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"recoverTokens\",\"inputs\":[{\"name\":\"tokenList\",\"type\":\"address[]\",\"internalType\":\"contractIERC20[]\"},{\"name\":\"amountsToWithdraw\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"},{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setProofSubmitter\",\"inputs\":[{\"name\":\"newProofSubmitter\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"stake\",\"inputs\":[{\"name\":\"pubkey\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"depositDataRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"startCheckpoint\",\"inputs\":[{\"name\":\"revertIfNoBalance\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"validatorPubkeyHashToInfo\",\"inputs\":[{\"name\":\"validatorPubkeyHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIEigenPodTypes.ValidatorInfo\",\"components\":[{\"name\":\"validatorIndex\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"restakedBalanceGwei\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"lastCheckpointedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumIEigenPodTypes.VALIDATOR_STATUS\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"validatorPubkeyToInfo\",\"inputs\":[{\"name\":\"validatorPubkey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIEigenPodTypes.ValidatorInfo\",\"components\":[{\"name\":\"validatorIndex\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"restakedBalanceGwei\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"lastCheckpointedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumIEigenPodTypes.VALIDATOR_STATUS\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"validatorStatus\",\"inputs\":[{\"name\":\"validatorPubkey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"enumIEigenPodTypes.VALIDATOR_STATUS\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"validatorStatus\",\"inputs\":[{\"name\":\"pubkeyHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"enumIEigenPodTypes.VALIDATOR_STATUS\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"verifyCheckpointProofs\",\"inputs\":[{\"name\":\"balanceContainerProof\",\"type\":\"tuple\",\"internalType\":\"structBeaconChainProofs.BalanceContainerProof\",\"components\":[{\"name\":\"balanceContainerRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"proof\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"proofs\",\"type\":\"tuple[]\",\"internalType\":\"structBeaconChainProofs.BalanceProof[]\",\"components\":[{\"name\":\"pubkeyHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"balanceRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"proof\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"verifyStaleBalance\",\"inputs\":[{\"name\":\"beaconTimestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"stateRootProof\",\"type\":\"tuple\",\"internalType\":\"structBeaconChainProofs.StateRootProof\",\"components\":[{\"name\":\"beaconStateRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"proof\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"proof\",\"type\":\"tuple\",\"internalType\":\"structBeaconChainProofs.ValidatorProof\",\"components\":[{\"name\":\"validatorFields\",\"type\":\"bytes32[]\",\"internalType\":\"bytes32[]\"},{\"name\":\"proof\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"verifyWithdrawalCredentials\",\"inputs\":[{\"name\":\"beaconTimestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"stateRootProof\",\"type\":\"tuple\",\"internalType\":\"structBeaconChainProofs.StateRootProof\",\"components\":[{\"name\":\"beaconStateRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"proof\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"validatorIndices\",\"type\":\"uint40[]\",\"internalType\":\"uint40[]\"},{\"name\":\"validatorFieldsProofs\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"},{\"name\":\"validatorFields\",\"type\":\"bytes32[][]\",\"internalType\":\"bytes32[][]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"withdrawRestakedBeaconChainETH\",\"inputs\":[{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amountWei\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"withdrawableRestakedExecutionLayerGwei\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"event\",\"name\":\"CheckpointCreated\",\"inputs\":[{\"name\":\"checkpointTimestamp\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"beaconBlockRoot\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"validatorCount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"CheckpointFinalized\",\"inputs\":[{\"name\":\"checkpointTimestamp\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"totalShareDeltaWei\",\"type\":\"int256\",\"indexed\":false,\"internalType\":\"int256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"EigenPodStaked\",\"inputs\":[{\"name\":\"pubkey\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"NonBeaconChainETHReceived\",\"inputs\":[{\"name\":\"amountReceived\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ProofSubmitterUpdated\",\"inputs\":[{\"name\":\"prevProofSubmitter\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"newProofSubmitter\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RestakedBeaconChainETHWithdrawn\",\"inputs\":[{\"name\":\"recipient\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorBalanceUpdated\",\"inputs\":[{\"name\":\"validatorIndex\",\"type\":\"uint40\",\"indexed\":false,\"internalType\":\"uint40\"},{\"name\":\"balanceTimestamp\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"newValidatorBalanceGwei\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorCheckpointed\",\"inputs\":[{\"name\":\"checkpointTimestamp\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorIndex\",\"type\":\"uint40\",\"indexed\":true,\"internalType\":\"uint40\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorRestaked\",\"inputs\":[{\"name\":\"validatorIndex\",\"type\":\"uint40\",\"indexed\":false,\"internalType\":\"uint40\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorWithdrawn\",\"inputs\":[{\"name\":\"checkpointTimestamp\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorIndex\",\"type\":\"uint40\",\"indexed\":true,\"internalType\":\"uint40\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"BeaconTimestampTooFarInPast\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"CannotCheckpointTwiceInSingleBlock\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"CheckpointAlreadyActive\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"CredentialsAlreadyVerified\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"CurrentlyPaused\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InputAddressZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InputArrayLengthMismatch\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InsufficientWithdrawableBalance\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidEIP4788Response\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidProof\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidProofLength\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidProofLength\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidPubKeyLength\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidValidatorFieldsLength\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"MsgValueNot32ETH\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NoActiveCheckpoint\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NoBalanceToCheckpoint\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyEigenPodManager\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyEigenPodOwner\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyEigenPodOwnerOrProofSubmitter\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"TimestampOutOfRange\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ValidatorInactiveOnBeaconChain\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ValidatorIsExitingBeaconChain\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ValidatorNotActiveInPod\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ValidatorNotSlashedOnBeaconChain\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"WithdrawalCredentialsNotForEigenPod\",\"inputs\":[]}]", - Bin: "0x60e060405234801561000f575f5ffd5b50604051613c7c380380613c7c83398101604081905261002e91610131565b6001600160a01b03808416608052821660a0526001600160401b03811660c05261005661005e565b505050610186565b5f54610100900460ff16156100c95760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff90811614610118575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b038116811461012e575f5ffd5b50565b5f5f5f60608486031215610143575f5ffd5b835161014e8161011a565b602085015190935061015f8161011a565b60408501519092506001600160401b038116811461017b575f5ffd5b809150509250925092565b60805160a05160c051613a7f6101fd5f395f61060401525f81816102a90152818161063f015281816106e7015281816109ab01528181610b7501528181610e4e01528181610ef50152818161112b01528181611479015281816115ad01526127bb01525f81816104c60152610f5e0152613a7f5ff3fe608060405260043610610164575f3560e01c80636fcd0e53116100cd578063c490744211610087578063dda3346c11610062578063dda3346c14610596578063ee94d67c146105b5578063f074ba62146105d4578063f2882461146105f3575f5ffd5b8063c490744214610539578063c4d66de814610558578063d06d558714610577575f5ffd5b80636fcd0e53146104545780637439841f1461048057806374cdd798146104b557806388676cad146104e85780639b4e463414610507578063b522538a1461051a575f5ffd5b80634665bcda1161011e5780634665bcda1461029857806347d28372146102cb57806352396a59146103b657806358753357146103ea57806358eaee79146104095780636c0d2d5a14610435575f5ffd5b8063039157d2146101a25780630b18ff66146101c35780632340e8d3146101ff5780633474aa16146102225780633f65cf191461025357806342ecff2a14610272575f5ffd5b3661019e576040513481527f6fdd3dbdb173299608c0aa9f368735857c8842b581f8389238bf05bd04b3bf499060200160405180910390a1005b5f5ffd5b3480156101ad575f5ffd5b506101c16101bc366004612ff3565b610626565b005b3480156101ce575f5ffd5b506033546101e2906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b34801561020a575f5ffd5b5061021460395481565b6040519081526020016101f6565b34801561022d575f5ffd5b506034546001600160401b03165b6040516001600160401b0390911681526020016101f6565b34801561025e575f5ffd5b506101c161026d3660046130ac565b610952565b34801561027d575f5ffd5b50603a5461023b90600160401b90046001600160401b031681565b3480156102a3575f5ffd5b506101e27f000000000000000000000000000000000000000000000000000000000000000081565b3480156102d6575f5ffd5b5061035b6040805160a0810182525f80825260208201819052918101829052606081018290526080810191909152506040805160a081018252603c548152603d5462ffffff811660208301526001600160401b0363010000008204811693830193909352600160581b810460070b6060830152600160981b9004909116608082015290565b6040516101f691905f60a0820190508251825262ffffff60208401511660208301526001600160401b036040840151166040830152606083015160070b60608301526001600160401b03608084015116608083015292915050565b3480156103c1575f5ffd5b5061023b6103d0366004613181565b603b6020525f90815260409020546001600160401b031681565b3480156103f5575f5ffd5b50603e546101e2906001600160a01b031681565b348015610414575f5ffd5b506104286104233660046131de565b610bda565b6040516101f69190613250565b348015610440575f5ffd5b5061021461044f366004613181565b610c3c565b34801561045f575f5ffd5b5061047361046e36600461325e565b610d4a565b6040516101f69190613275565b34801561048b575f5ffd5b5061042861049a36600461325e565b5f90815260366020526040902054600160c01b900460ff1690565b3480156104c0575f5ffd5b506101e27f000000000000000000000000000000000000000000000000000000000000000081565b3480156104f3575f5ffd5b506101c16105023660046132d8565b610df5565b6101c16105153660046132f3565b610eea565b348015610525575f5ffd5b506104736105343660046131de565b611031565b348015610544575f5ffd5b506101c1610553366004613383565b611120565b348015610563575f5ffd5b506101c16105723660046133ad565b611257565b348015610582575f5ffd5b506101c16105913660046133ad565b6113a1565b3480156105a1575f5ffd5b506101c16105b0366004613498565b611435565b3480156105c0575f5ffd5b50603a5461023b906001600160401b031681565b3480156105df575f5ffd5b506101c16105ee36600461356a565b611594565b3480156105fe575f5ffd5b5061023b7f000000000000000000000000000000000000000000000000000000000000000081565b604051635ac86ab760e01b8152600660048201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635ac86ab790602401602060405180830381865afa15801561068c573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106b091906135d1565b156106ce5760405163840a48d560e01b815260040160405180910390fd5b604051635ac86ab760e01b8152600860048201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635ac86ab790602401602060405180830381865afa158015610734573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061075891906135d1565b156107765760405163840a48d560e01b815260040160405180910390fd5b5f6107ba61078485806135ec565b808060200260200160405190810160405280939291908181526020018383602002808284375f9201919091525061199192505050565b5f818152603660209081526040808320815160808101835281546001600160401b038082168352600160401b8204811695830195909552600160801b8104909416928101929092529394509192906060830190600160c01b900460ff1660028111156108285761082861321c565b60028111156108395761083961321c565b81525050905080604001516001600160401b0316876001600160401b031611610875576040516337e07ffd60e01b815260040160405180910390fd5b60018160600151600281111561088d5761088d61321c565b146108ab5760405163d49e19a760e01b815260040160405180910390fd5b6108ee6108b886806135ec565b808060200260200160405190810160405280939291908181526020018383602002808284375f920191909152506119b392505050565b61090b5760405163161ce5ed60e31b815260040160405180910390fd5b61091d61091788610c3c565b876119db565b610940863561092c87806135ec565b61093960208a018a613631565b8651611a80565b6109495f611ba7565b50505050505050565b6033546001600160a01b03163314806109755750603e546001600160a01b031633145b6109925760405163427a777960e01b815260040160405180910390fd5b604051635ac86ab760e01b8152600260048201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635ac86ab790602401602060405180830381865afa1580156109f8573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a1c91906135d1565b15610a3a5760405163840a48d560e01b815260040160405180910390fd5b8584148015610a4857508382145b610a65576040516343714afd60e01b815260040160405180910390fd5b603a546001600160401b03600160401b9091048116908a1611610a9b576040516337e07ffd60e01b815260040160405180910390fd5b610aad610aa78a610c3c565b896119db565b5f805b87811015610b4557610b318a358a8a84818110610acf57610acf613673565b9050602002016020810190610ae49190613687565b898985818110610af657610af6613673565b9050602002810190610b089190613631565b898987818110610b1a57610b1a613673565b9050602002810190610b2c91906135ec565b611d27565b610b3b90836136bf565b9150600101610ab0565b5060335460405163a1ca780b60e01b81526001600160a01b0391821660048201525f6024820152604481018390527f00000000000000000000000000000000000000000000000000000000000000009091169063a1ca780b906064015f604051808303815f87803b158015610bb8575f5ffd5b505af1158015610bca573d5f5f3e3d5ffd5b5050505050505050505050505050565b5f5f610c1a84848080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152506121dc92505050565b5f90815260366020526040902054600160c01b900460ff169150505b92915050565b5f610c4a611fff600c6136d2565b610c5d6001600160401b038416426136e9565b10610c7b57604051637944e66d60e11b815260040160405180910390fd5b604080516001600160401b03841660208201525f918291720f3df6d732807ef1319fb7b8bb8522d0beac02910160408051601f1981840301815290829052610cc291613713565b5f60405180830381855afa9150503d805f8114610cfa576040519150601f19603f3d011682016040523d82523d5f602084013e610cff565b606091505b5091509150818015610d1157505f8151115b610d2e5760405163558ad0a360e01b815260040160405180910390fd5b80806020019051810190610d42919061371e565b949350505050565b610d71604080516080810182525f8082526020820181905291810182905290606082015290565b5f82815260366020908152604091829020825160808101845281546001600160401b038082168352600160401b8204811694830194909452600160801b810490931693810193909352906060830190600160c01b900460ff166002811115610ddb57610ddb61321c565b6002811115610dec57610dec61321c565b90525092915050565b6033546001600160a01b0316331480610e185750603e546001600160a01b031633145b610e355760405163427a777960e01b815260040160405180910390fd5b604051635ac86ab760e01b8152600660048201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635ac86ab790602401602060405180830381865afa158015610e9b573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ebf91906135d1565b15610edd5760405163840a48d560e01b815260040160405180910390fd5b610ee682611ba7565b5050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610f3357604051633213a66160e21b815260040160405180910390fd5b346801bc16d674ec80000014610f5c5760405163049696b360e31b815260040160405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663228951186801bc16d674ec8000008787610f9f61226d565b8888886040518863ffffffff1660e01b8152600401610fc39695949392919061378b565b5f604051808303818588803b158015610fda575f5ffd5b505af1158015610fec573d5f5f3e3d5ffd5b50505050507f606865b7934a25d4aed43f6cdb426403353fa4b3009c4d228407474581b01e2385856040516110229291906137d9565b60405180910390a15050505050565b611058604080516080810182525f8082526020820181905291810182905290606082015290565b60365f61109985858080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152506121dc92505050565b815260208082019290925260409081015f20815160808101835281546001600160401b038082168352600160401b8204811695830195909552600160801b81049094169281019290925290916060830190600160c01b900460ff1660028111156111055761110561321c565b60028111156111165761111661321c565b9052509392505050565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461116957604051633213a66160e21b815260040160405180910390fd5b5f611178633b9aca0083613800565b9050611191633b9aca006001600160401b0383166136d2565b6034549092506001600160401b0390811690821611156111c4576040516302c6f54760e21b815260040160405180910390fd5b603480548291905f906111e19084906001600160401b0316613813565b92506101000a8154816001600160401b0302191690836001600160401b03160217905550826001600160a01b03167f8947fd2ce07ef9cc302c4e8f0461015615d91ce851564839e91cc804c2f49d8e8360405161124091815260200190565b60405180910390a261125283836122b1565b505050565b5f54610100900460ff161580801561127557505f54600160ff909116105b8061128e5750303b15801561128e57505f5460ff166001145b6112f65760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b5f805460ff191660011790558015611317575f805461ff0019166101001790555b6001600160a01b03821661133e576040516339b190bb60e11b815260040160405180910390fd5b603380546001600160a01b0319166001600160a01b0384161790558015610ee6575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15050565b6033546001600160a01b031633146113cc5760405163719f370360e11b815260040160405180910390fd5b603e54604080516001600160a01b03928316815291831660208301527ffb8129080a19d34dceac04ba253fc50304dc86c729bd63cdca4a969ad19a5eac910160405180910390a1603e80546001600160a01b0319166001600160a01b0392909216919091179055565b6033546001600160a01b031633146114605760405163719f370360e11b815260040160405180910390fd5b604051635ac86ab760e01b8152600560048201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635ac86ab790602401602060405180830381865afa1580156114c6573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114ea91906135d1565b156115085760405163840a48d560e01b815260040160405180910390fd5b825184511461152a576040516343714afd60e01b815260040160405180910390fd5b5f5b845181101561158d576115858385838151811061154b5761154b613673565b602002602001015187848151811061156557611565613673565b60200260200101516001600160a01b03166123c69092919063ffffffff16565b60010161152c565b5050505050565b604051635ac86ab760e01b8152600760048201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635ac86ab790602401602060405180830381865afa1580156115fa573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061161e91906135d1565b1561163c5760405163840a48d560e01b815260040160405180910390fd5b603a54600160401b90046001600160401b03165f81900361167057604051631a544f4960e01b815260040160405180910390fd5b6040805160a081018252603c54808252603d5462ffffff811660208401526001600160401b0363010000008204811694840194909452600160581b810460070b6060840152600160981b90049092166080820152906116cf9087612418565b5f805b8581101561193857368787838181106116ed576116ed613673565b90506020028101906116ff9190613832565b80355f908152603660209081526040808320815160808101835281546001600160401b038082168352600160401b8204811695830195909552600160801b8104909416928101929092529394509192906060830190600160c01b900460ff16600281111561176f5761176f61321c565b60028111156117805761178061321c565b905250905060018160600151600281111561179d5761179d61321c565b146117a9575050611930565b856001600160401b031681604001516001600160401b0316106117cd575050611930565b5f80806117dd848a8f35886124c9565b60208b01805193965091945092506117f482613850565b62ffffff1690525060808801805184919061181090839061386d565b6001600160401b031690525060608801805183919061183090839061388c565b60070b905250611840818861386d565b85355f908152603660209081526040918290208751815492890151938901516001600160401b03908116600160801b0267ffffffffffffffff60801b19958216600160401b026001600160801b0319909516919092161792909217928316821781556060880151939a50879390929091839160ff60c01b1990911668ffffffffffffffffff60801b1990911617600160c01b8360028111156118e4576118e461321c565b021790555050845160405164ffffffffff90911691506001600160401b038b16907fa91c59033c3423e18b54d0acecebb4972f9ea95aedf5f4cae3b677b02eaf3a3f905f90a350505050505b6001016116d2565b506001600160401b038084165f908152603b60205260408120805484939192916119649185911661386d565b92506101000a8154816001600160401b0302191690836001600160401b03160217905550610949826125ec565b5f815f815181106119a4576119a4613673565b60200260200101519050919050565b5f816003815181106119c7576119c7613673565b60200260200101515f5f1b14159050919050565b6119e7600360206136d2565b6119f46020830183613631565b905014611a14576040516313717da960e21b815260040160405180910390fd5b611a63611a246020830183613631565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152508692505084359050600361281b565b610ee6576040516309bde33960e01b815260040160405180910390fd5b60088414611aa15760405163200591bd60e01b815260040160405180910390fd5b6005611aaf602860016136bf565b611ab991906136bf565b611ac49060206136d2565b8214611ae3576040516313717da960e21b815260040160405180910390fd5b5f611b1f8686808060200260200160405190810160405280939291908181526020018383602002808284375f9201919091525061283292505050565b90505f64ffffffffff8316611b36602860016136bf565b600b901b179050611b8085858080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152508c925086915085905061281b565b611b9d576040516309bde33960e01b815260040160405180910390fd5b5050505050505050565b603a54600160401b90046001600160401b031615611bd75760405162be9bc360e81b815260040160405180910390fd5b603a546001600160401b03428116911603611c05576040516367db5b8b60e01b815260040160405180910390fd5b6034545f906001600160401b0316611c21633b9aca0047613800565b611c2b9190613813565b9050818015611c4157506001600160401b038116155b15611c5f576040516332dea95960e21b815260040160405180910390fd5b5f6040518060a00160405280611c7442610c3c565b815260395462ffffff1660208201526001600160401b0380851660408301525f60608301819052608090920191909152603a805442909216600160401b026fffffffffffffffff0000000000000000199092169190911790559050611cd8816125ec565b805160208083015160405162ffffff90911681526001600160401b034216917f575796133bbed337e5b39aa49a30dc2556a91e0c6c2af4b7b886ae77ebef1076910160405180910390a3505050565b5f5f611d648484808060200260200160405190810160405280939291908181526020018383602002808284375f9201919091525061199192505050565b5f818152603660209081526040808320815160808101835281546001600160401b038082168352600160401b8204811695830195909552600160801b8104909416928101929092529394509192906060830190600160c01b900460ff166002811115611dd257611dd261321c565b6002811115611de357611de361321c565b90525090505f81606001516002811115611dff57611dff61321c565b14611e1d576040516335e09e9d60e01b815260040160405180910390fd5b6001600160401b038016611e628686808060200260200160405190810160405280939291908181526020018383602002808284375f92019190915250612ac292505050565b6001600160401b031603611e8957604051631958236d60e21b815260040160405180910390fd5b6001600160401b038016611ece8686808060200260200160405190810160405280939291908181526020018383602002808284375f92019190915250612ae692505050565b6001600160401b031614611ef557604051632eade63760e01b815260040160405180910390fd5b611efd61226d565b611f06906138bb565b611f418686808060200260200160405190810160405280939291908181526020018383602002808284375f92019190915250612afd92505050565b14611f5f57604051633772dd5360e11b815260040160405180910390fd5b5f611f9b8686808060200260200160405190810160405280939291908181526020018383602002808284375f92019190915250612b1192505050565b9050611fab8a87878b8b8e611a80565b60398054905f611fba836138de565b9091555050603a545f90600160401b90046001600160401b031615611ff157603a54600160401b90046001600160401b0316611ffe565b603a546001600160401b03165b6040805160808101825264ffffffffff8d1681526001600160401b03858116602083015283169181019190915290915060608101600190525f858152603660209081526040918290208351815492850151938501516001600160401b03908116600160801b0267ffffffffffffffff60801b19958216600160401b026001600160801b031990951691909216179290921792831682178155606084015190929091839160ff60c01b1990911668ffffffffffffffffff60801b1990911617600160c01b8360028111156120d3576120d361321c565b021790555050603d80548492506013906120fe908490600160981b90046001600160401b031661386d565b92506101000a8154816001600160401b0302191690836001600160401b031602179055507f2d0800bbc377ea54a08c5db6a87aafff5e3e9c8fead0eda110e40e0c104414498a60405161215e919064ffffffffff91909116815260200190565b60405180910390a16040805164ffffffffff8c1681526001600160401b03838116602083015284168183015290517f0e5fac175b83177cc047381e030d8fb3b42b37bd1c025e22c280facad62c32df9181900360600190a16121cd633b9aca006001600160401b0384166136d2565b9b9a5050505050505050505050565b5f81516030146121ff57604051634f88323960e11b815260040160405180910390fd5b6040516002906122159084905f906020016138f6565b60408051601f198184030181529082905261222f91613713565b602060405180830381855afa15801561224a573d5f5f3e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610c36919061371e565b60408051600160f81b60208201525f602182015230606090811b6bffffffffffffffffffffffff1916602c8301529101604051602081830303815290604052905090565b804710156123015760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e636500000060448201526064016112ed565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f811461234a576040519150601f19603f3d011682016040523d82523d5f602084013e61234f565b606091505b50509050806112525760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d6179206861766520726576657274656400000000000060648201526084016112ed565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052611252908490612b28565b612424600560036136bf565b61242f9060206136d2565b61243c6020830183613631565b90501461245c576040516313717da960e21b815260040160405180910390fd5b606c6124ac61246e6020840184613631565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525087925050853590508461281b565b611252576040516309bde33960e01b815260040160405180910390fd5b83516020850151905f908190816124e1878388612bfb565b9050846001600160401b0316816001600160401b03161461255b57612506858261391a565b6040805164ffffffffff851681526001600160401b038b8116602083015284168183015290519195507f0e5fac175b83177cc047381e030d8fb3b42b37bd1c025e22c280facad62c32df919081900360600190a15b6001600160401b0380821660208b0181905290891660408b01525f036125e05760398054905f61258a83613949565b9091555050600260608a015261259f8461395e565b92508164ffffffffff16886001600160401b03167f2a02361ffa66cf2c2da4682c2355a6adcaa9f6c227b6e6563e68480f9587626a60405160405180910390a35b50509450945094915050565b602081015162ffffff161561268c578051603c556020810151603d80546040840151606085015160809095015162ffffff9094166affffffffffffffffffffff199092169190911763010000006001600160401b0392831602176fffffffffffffffffffffffffffffffff60581b1916600160581b9482169490940267ffffffffffffffff60981b191693909317600160981b9390921692909202179055565b60808101516034545f916126a8916001600160401b031661386d565b90505f826060015183604001516126bf919061388c565b60408401516034805492935090915f906126e39084906001600160401b031661386d565b82546101009290920a6001600160401b03818102199093169183160217909155603a8054600160401b810483166001600160801b03199091161790555f915061273390633b9aca009085166136d2565b90505f612748633b9aca00600785900b613983565b603a546040518281529192506001600160401b0316907f525408c201bc1576eb44116f6478f1c2a54775b19a043bcfdc708364f74f8e449060200160405180910390a260335460405163a1ca780b60e01b81526001600160a01b03918216600482015260248101849052604481018390527f00000000000000000000000000000000000000000000000000000000000000009091169063a1ca780b906064015f604051808303815f87803b1580156127fe575f5ffd5b505af1158015612810573d5f5f3e3d5ffd5b505050505050505050565b5f83612828868585612cd9565b1495945050505050565b5f5f600283516128429190613800565b90505f816001600160401b0381111561285d5761285d6133c8565b604051908082528060200260200182016040528015612886578160200160208202803683370190505b5090505f5b82811015612980576002856128a083836136d2565b815181106128b0576128b0613673565b6020026020010151868360026128c691906136d2565b6128d19060016136bf565b815181106128e1576128e1613673565b6020026020010151604051602001612903929190918252602082015260400190565b60408051601f198184030181529082905261291d91613713565b602060405180830381855afa158015612938573d5f5f3e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061295b919061371e565b82828151811061296d5761296d613673565b602090810291909101015260010161288b565b5061298c600283613800565b91505b8115612a9f575f5b82811015612a8c576002826129ac83836136d2565b815181106129bc576129bc613673565b6020026020010151838360026129d291906136d2565b6129dd9060016136bf565b815181106129ed576129ed613673565b6020026020010151604051602001612a0f929190918252602082015260400190565b60408051601f1981840301815290829052612a2991613713565b602060405180830381855afa158015612a44573d5f5f3e3d5ffd5b5050506040513d601f19601f82011682018060405250810190612a67919061371e565b828281518110612a7957612a79613673565b6020908102919091010152600101612997565b50612a98600283613800565b915061298f565b805f81518110612ab157612ab1613673565b602002602001015192505050919050565b5f610c3682600581518110612ad957612ad9613673565b6020026020010151612dad565b5f610c3682600681518110612ad957612ad9613673565b5f816001815181106119a4576119a4613673565b5f610c3682600281518110612ad957612ad9613673565b5f612b7c826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316612e149092919063ffffffff16565b905080515f1480612b9c575080806020019051810190612b9c91906135d1565b6112525760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016112ed565b5f612c08602660016136bf565b612c139060206136d2565b612c206040840184613631565b905014612c40576040516313717da960e21b815260040160405180910390fd5b5f612c4c6004856139b2565b64ffffffffff169050612ca5612c656040850185613631565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250899250505060208601358461281b565b612cc2576040516309bde33960e01b815260040160405180910390fd5b612cd0836020013585612e22565b95945050505050565b5f83515f14158015612cf6575060208451612cf491906139db565b155b612d13576040516313717da960e21b815260040160405180910390fd5b604080516020808201909252848152905b85518111612da357612d376002856139db565b5f03612d695781515f528086015160205260208260405f60026107d05a03fa612d5e575f5ffd5b600284049350612d91565b808601515f52815160205260208260405f60026107d05a03fa612d8a575f5ffd5b6002840493505b612d9c6020826136bf565b9050612d24565b5051949350505050565b60f881901c60e882901c61ff00161760d882901c62ff0000161760c882901c63ff000000161764ff0000000060b883901c161765ff000000000060a883901c161766ff000000000000609883901c161767ff0000000000000060889290921c919091161790565b6060610d4284845f85612e4e565b5f80612e2f6004846139ee565b612e3a906040613a17565b64ffffffffff169050610d4284821b612dad565b606082471015612eaf5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b60648201526084016112ed565b5f5f866001600160a01b03168587604051612eca9190613713565b5f6040518083038185875af1925050503d805f8114612f04576040519150601f19603f3d011682016040523d82523d5f602084013e612f09565b606091505b5091509150612f1a87838387612f25565b979650505050505050565b60608315612f935782515f03612f8c576001600160a01b0385163b612f8c5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016112ed565b5081610d42565b610d428383815115612fa85781518083602001fd5b8060405162461bcd60e51b81526004016112ed9190613a37565b80356001600160401b0381168114612fd8575f5ffd5b919050565b5f60408284031215612fed575f5ffd5b50919050565b5f5f5f60608486031215613005575f5ffd5b61300e84612fc2565b925060208401356001600160401b03811115613028575f5ffd5b61303486828701612fdd565b92505060408401356001600160401b0381111561304f575f5ffd5b61305b86828701612fdd565b9150509250925092565b5f5f83601f840112613075575f5ffd5b5081356001600160401b0381111561308b575f5ffd5b6020830191508360208260051b85010111156130a5575f5ffd5b9250929050565b5f5f5f5f5f5f5f5f60a0898b0312156130c3575f5ffd5b6130cc89612fc2565b975060208901356001600160401b038111156130e6575f5ffd5b6130f28b828c01612fdd565b97505060408901356001600160401b0381111561310d575f5ffd5b6131198b828c01613065565b90975095505060608901356001600160401b03811115613137575f5ffd5b6131438b828c01613065565b90955093505060808901356001600160401b03811115613161575f5ffd5b61316d8b828c01613065565b999c989b5096995094979396929594505050565b5f60208284031215613191575f5ffd5b61319a82612fc2565b9392505050565b5f5f83601f8401126131b1575f5ffd5b5081356001600160401b038111156131c7575f5ffd5b6020830191508360208285010111156130a5575f5ffd5b5f5f602083850312156131ef575f5ffd5b82356001600160401b03811115613204575f5ffd5b613210858286016131a1565b90969095509350505050565b634e487b7160e01b5f52602160045260245ffd5b6003811061324c57634e487b7160e01b5f52602160045260245ffd5b9052565b60208101610c368284613230565b5f6020828403121561326e575f5ffd5b5035919050565b5f6080820190506001600160401b0383511682526001600160401b0360208401511660208301526001600160401b03604084015116604083015260608301516132c16060840182613230565b5092915050565b80151581146132d5575f5ffd5b50565b5f602082840312156132e8575f5ffd5b813561319a816132c8565b5f5f5f5f5f60608688031215613307575f5ffd5b85356001600160401b0381111561331c575f5ffd5b613328888289016131a1565b90965094505060208601356001600160401b03811115613346575f5ffd5b613352888289016131a1565b96999598509660400135949350505050565b6001600160a01b03811681146132d5575f5ffd5b8035612fd881613364565b5f5f60408385031215613394575f5ffd5b823561339f81613364565b946020939093013593505050565b5f602082840312156133bd575f5ffd5b813561319a81613364565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f191681016001600160401b0381118282101715613404576134046133c8565b604052919050565b5f6001600160401b03821115613424576134246133c8565b5060051b60200190565b5f82601f83011261343d575f5ffd5b813561345061344b8261340c565b6133dc565b8082825260208201915060208360051b860101925085831115613471575f5ffd5b602085015b8381101561348e578035835260209283019201613476565b5095945050505050565b5f5f5f606084860312156134aa575f5ffd5b83356001600160401b038111156134bf575f5ffd5b8401601f810186136134cf575f5ffd5b80356134dd61344b8261340c565b8082825260208201915060208360051b8501019250888311156134fe575f5ffd5b6020840193505b8284101561352957833561351881613364565b825260209384019390910190613505565b955050505060208401356001600160401b03811115613546575f5ffd5b6135528682870161342e565b92505061356160408501613378565b90509250925092565b5f5f5f6040848603121561357c575f5ffd5b83356001600160401b03811115613591575f5ffd5b61359d86828701612fdd565b93505060208401356001600160401b038111156135b8575f5ffd5b6135c486828701613065565b9497909650939450505050565b5f602082840312156135e1575f5ffd5b815161319a816132c8565b5f5f8335601e19843603018112613601575f5ffd5b8301803591506001600160401b0382111561361a575f5ffd5b6020019150600581901b36038213156130a5575f5ffd5b5f5f8335601e19843603018112613646575f5ffd5b8301803591506001600160401b0382111561365f575f5ffd5b6020019150368190038213156130a5575f5ffd5b634e487b7160e01b5f52603260045260245ffd5b5f60208284031215613697575f5ffd5b813564ffffffffff8116811461319a575f5ffd5b634e487b7160e01b5f52601160045260245ffd5b80820180821115610c3657610c366136ab565b8082028115828204841417610c3657610c366136ab565b81810381811115610c3657610c366136ab565b5f81518060208401855e5f93019283525090919050565b5f61319a82846136fc565b5f6020828403121561372e575f5ffd5b5051919050565b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b608081525f61379e60808301888a613735565b82810360208401526137b0818861375d565b905082810360408401526137c5818688613735565b915050826060830152979650505050505050565b602081525f610d42602083018486613735565b634e487b7160e01b5f52601260045260245ffd5b5f8261380e5761380e6137ec565b500490565b6001600160401b038281168282160390811115610c3657610c366136ab565b5f8235605e19833603018112613846575f5ffd5b9190910192915050565b5f62ffffff821680613864576138646136ab565b5f190192915050565b6001600160401b038181168382160190811115610c3657610c366136ab565b600781810b9083900b01677fffffffffffffff8113677fffffffffffffff1982121715610c3657610c366136ab565b80516020808301519190811015612fed575f1960209190910360031b1b16919050565b5f600182016138ef576138ef6136ab565b5060010190565b5f61390182856136fc565b6001600160801b03199390931683525050601001919050565b600782810b9082900b03677fffffffffffffff198112677fffffffffffffff82131715610c3657610c366136ab565b5f81613957576139576136ab565b505f190190565b5f8160070b677fffffffffffffff19810361397b5761397b6136ab565b5f0392915050565b8082025f8212600160ff1b8414161561399e5761399e6136ab565b8181058314821517610c3657610c366136ab565b5f64ffffffffff8316806139c8576139c86137ec565b8064ffffffffff84160491505092915050565b5f826139e9576139e96137ec565b500690565b5f64ffffffffff831680613a0457613a046137ec565b8064ffffffffff84160691505092915050565b64ffffffffff81811683821602908116908181146132c1576132c16136ab565b602081525f61319a602083018461375d56fea26469706673582212208c7e9e7731d6c30987b3a93a2e5abd65e7e50f80eb07d3ef12b55b4d0eaed21b64736f6c634300081b0033", + Bin: "0x60e060405234801561000f575f5ffd5b50604051613c7c380380613c7c83398101604081905261002e91610131565b6001600160a01b03808416608052821660a0526001600160401b03811660c05261005661005e565b505050610186565b5f54610100900460ff16156100c95760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff90811614610118575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b038116811461012e575f5ffd5b50565b5f5f5f60608486031215610143575f5ffd5b835161014e8161011a565b602085015190935061015f8161011a565b60408501519092506001600160401b038116811461017b575f5ffd5b809150509250925092565b60805160a05160c051613a7f6101fd5f395f61060401525f81816102a90152818161063f015281816106e7015281816109ab01528181610b7501528181610e4e01528181610ef50152818161112b01528181611479015281816115ad01526127bb01525f81816104c60152610f5e0152613a7f5ff3fe608060405260043610610164575f3560e01c80636fcd0e53116100cd578063c490744211610087578063dda3346c11610062578063dda3346c14610596578063ee94d67c146105b5578063f074ba62146105d4578063f2882461146105f3575f5ffd5b8063c490744214610539578063c4d66de814610558578063d06d558714610577575f5ffd5b80636fcd0e53146104545780637439841f1461048057806374cdd798146104b557806388676cad146104e85780639b4e463414610507578063b522538a1461051a575f5ffd5b80634665bcda1161011e5780634665bcda1461029857806347d28372146102cb57806352396a59146103b657806358753357146103ea57806358eaee79146104095780636c0d2d5a14610435575f5ffd5b8063039157d2146101a25780630b18ff66146101c35780632340e8d3146101ff5780633474aa16146102225780633f65cf191461025357806342ecff2a14610272575f5ffd5b3661019e576040513481527f6fdd3dbdb173299608c0aa9f368735857c8842b581f8389238bf05bd04b3bf499060200160405180910390a1005b5f5ffd5b3480156101ad575f5ffd5b506101c16101bc366004612ff3565b610626565b005b3480156101ce575f5ffd5b506033546101e2906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b34801561020a575f5ffd5b5061021460395481565b6040519081526020016101f6565b34801561022d575f5ffd5b506034546001600160401b03165b6040516001600160401b0390911681526020016101f6565b34801561025e575f5ffd5b506101c161026d3660046130ac565b610952565b34801561027d575f5ffd5b50603a5461023b90600160401b90046001600160401b031681565b3480156102a3575f5ffd5b506101e27f000000000000000000000000000000000000000000000000000000000000000081565b3480156102d6575f5ffd5b5061035b6040805160a0810182525f80825260208201819052918101829052606081018290526080810191909152506040805160a081018252603c548152603d5462ffffff811660208301526001600160401b0363010000008204811693830193909352600160581b810460070b6060830152600160981b9004909116608082015290565b6040516101f691905f60a0820190508251825262ffffff60208401511660208301526001600160401b036040840151166040830152606083015160070b60608301526001600160401b03608084015116608083015292915050565b3480156103c1575f5ffd5b5061023b6103d0366004613181565b603b6020525f90815260409020546001600160401b031681565b3480156103f5575f5ffd5b50603e546101e2906001600160a01b031681565b348015610414575f5ffd5b506104286104233660046131de565b610bda565b6040516101f69190613250565b348015610440575f5ffd5b5061021461044f366004613181565b610c3c565b34801561045f575f5ffd5b5061047361046e36600461325e565b610d4a565b6040516101f69190613275565b34801561048b575f5ffd5b5061042861049a36600461325e565b5f90815260366020526040902054600160c01b900460ff1690565b3480156104c0575f5ffd5b506101e27f000000000000000000000000000000000000000000000000000000000000000081565b3480156104f3575f5ffd5b506101c16105023660046132d8565b610df5565b6101c16105153660046132f3565b610eea565b348015610525575f5ffd5b506104736105343660046131de565b611031565b348015610544575f5ffd5b506101c1610553366004613383565b611120565b348015610563575f5ffd5b506101c16105723660046133ad565b611257565b348015610582575f5ffd5b506101c16105913660046133ad565b6113a1565b3480156105a1575f5ffd5b506101c16105b0366004613498565b611435565b3480156105c0575f5ffd5b50603a5461023b906001600160401b031681565b3480156105df575f5ffd5b506101c16105ee36600461356a565b611594565b3480156105fe575f5ffd5b5061023b7f000000000000000000000000000000000000000000000000000000000000000081565b604051635ac86ab760e01b8152600660048201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635ac86ab790602401602060405180830381865afa15801561068c573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106b091906135d1565b156106ce5760405163840a48d560e01b815260040160405180910390fd5b604051635ac86ab760e01b8152600860048201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635ac86ab790602401602060405180830381865afa158015610734573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061075891906135d1565b156107765760405163840a48d560e01b815260040160405180910390fd5b5f6107ba61078485806135ec565b808060200260200160405190810160405280939291908181526020018383602002808284375f9201919091525061199192505050565b5f818152603660209081526040808320815160808101835281546001600160401b038082168352600160401b8204811695830195909552600160801b8104909416928101929092529394509192906060830190600160c01b900460ff1660028111156108285761082861321c565b60028111156108395761083961321c565b81525050905080604001516001600160401b0316876001600160401b031611610875576040516337e07ffd60e01b815260040160405180910390fd5b60018160600151600281111561088d5761088d61321c565b146108ab5760405163d49e19a760e01b815260040160405180910390fd5b6108ee6108b886806135ec565b808060200260200160405190810160405280939291908181526020018383602002808284375f920191909152506119b392505050565b61090b5760405163161ce5ed60e31b815260040160405180910390fd5b61091d61091788610c3c565b876119db565b610940863561092c87806135ec565b61093960208a018a613631565b8651611a80565b6109495f611ba7565b50505050505050565b6033546001600160a01b03163314806109755750603e546001600160a01b031633145b6109925760405163427a777960e01b815260040160405180910390fd5b604051635ac86ab760e01b8152600260048201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635ac86ab790602401602060405180830381865afa1580156109f8573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a1c91906135d1565b15610a3a5760405163840a48d560e01b815260040160405180910390fd5b8584148015610a4857508382145b610a65576040516343714afd60e01b815260040160405180910390fd5b603a546001600160401b03600160401b9091048116908a1611610a9b576040516337e07ffd60e01b815260040160405180910390fd5b610aad610aa78a610c3c565b896119db565b5f805b87811015610b4557610b318a358a8a84818110610acf57610acf613673565b9050602002016020810190610ae49190613687565b898985818110610af657610af6613673565b9050602002810190610b089190613631565b898987818110610b1a57610b1a613673565b9050602002810190610b2c91906135ec565b611d27565b610b3b90836136bf565b9150600101610ab0565b5060335460405163a1ca780b60e01b81526001600160a01b0391821660048201525f6024820152604481018390527f00000000000000000000000000000000000000000000000000000000000000009091169063a1ca780b906064015f604051808303815f87803b158015610bb8575f5ffd5b505af1158015610bca573d5f5f3e3d5ffd5b5050505050505050505050505050565b5f5f610c1a84848080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152506121dc92505050565b5f90815260366020526040902054600160c01b900460ff169150505b92915050565b5f610c4a611fff600c6136d2565b610c5d6001600160401b038416426136e9565b10610c7b57604051637944e66d60e11b815260040160405180910390fd5b604080516001600160401b03841660208201525f918291720f3df6d732807ef1319fb7b8bb8522d0beac02910160408051601f1981840301815290829052610cc291613713565b5f60405180830381855afa9150503d805f8114610cfa576040519150601f19603f3d011682016040523d82523d5f602084013e610cff565b606091505b5091509150818015610d1157505f8151115b610d2e5760405163558ad0a360e01b815260040160405180910390fd5b80806020019051810190610d42919061371e565b949350505050565b610d71604080516080810182525f8082526020820181905291810182905290606082015290565b5f82815260366020908152604091829020825160808101845281546001600160401b038082168352600160401b8204811694830194909452600160801b810490931693810193909352906060830190600160c01b900460ff166002811115610ddb57610ddb61321c565b6002811115610dec57610dec61321c565b90525092915050565b6033546001600160a01b0316331480610e185750603e546001600160a01b031633145b610e355760405163427a777960e01b815260040160405180910390fd5b604051635ac86ab760e01b8152600660048201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635ac86ab790602401602060405180830381865afa158015610e9b573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ebf91906135d1565b15610edd5760405163840a48d560e01b815260040160405180910390fd5b610ee682611ba7565b5050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610f3357604051633213a66160e21b815260040160405180910390fd5b346801bc16d674ec80000014610f5c5760405163049696b360e31b815260040160405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663228951186801bc16d674ec8000008787610f9f61226d565b8888886040518863ffffffff1660e01b8152600401610fc39695949392919061378b565b5f604051808303818588803b158015610fda575f5ffd5b505af1158015610fec573d5f5f3e3d5ffd5b50505050507f606865b7934a25d4aed43f6cdb426403353fa4b3009c4d228407474581b01e2385856040516110229291906137d9565b60405180910390a15050505050565b611058604080516080810182525f8082526020820181905291810182905290606082015290565b60365f61109985858080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152506121dc92505050565b815260208082019290925260409081015f20815160808101835281546001600160401b038082168352600160401b8204811695830195909552600160801b81049094169281019290925290916060830190600160c01b900460ff1660028111156111055761110561321c565b60028111156111165761111661321c565b9052509392505050565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461116957604051633213a66160e21b815260040160405180910390fd5b5f611178633b9aca0083613800565b9050611191633b9aca006001600160401b0383166136d2565b6034549092506001600160401b0390811690821611156111c4576040516302c6f54760e21b815260040160405180910390fd5b603480548291905f906111e19084906001600160401b0316613813565b92506101000a8154816001600160401b0302191690836001600160401b03160217905550826001600160a01b03167f8947fd2ce07ef9cc302c4e8f0461015615d91ce851564839e91cc804c2f49d8e8360405161124091815260200190565b60405180910390a261125283836122b1565b505050565b5f54610100900460ff161580801561127557505f54600160ff909116105b8061128e5750303b15801561128e57505f5460ff166001145b6112f65760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b5f805460ff191660011790558015611317575f805461ff0019166101001790555b6001600160a01b03821661133e576040516339b190bb60e11b815260040160405180910390fd5b603380546001600160a01b0319166001600160a01b0384161790558015610ee6575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15050565b6033546001600160a01b031633146113cc5760405163719f370360e11b815260040160405180910390fd5b603e54604080516001600160a01b03928316815291831660208301527ffb8129080a19d34dceac04ba253fc50304dc86c729bd63cdca4a969ad19a5eac910160405180910390a1603e80546001600160a01b0319166001600160a01b0392909216919091179055565b6033546001600160a01b031633146114605760405163719f370360e11b815260040160405180910390fd5b604051635ac86ab760e01b8152600560048201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635ac86ab790602401602060405180830381865afa1580156114c6573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114ea91906135d1565b156115085760405163840a48d560e01b815260040160405180910390fd5b825184511461152a576040516343714afd60e01b815260040160405180910390fd5b5f5b845181101561158d576115858385838151811061154b5761154b613673565b602002602001015187848151811061156557611565613673565b60200260200101516001600160a01b03166123c69092919063ffffffff16565b60010161152c565b5050505050565b604051635ac86ab760e01b8152600760048201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635ac86ab790602401602060405180830381865afa1580156115fa573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061161e91906135d1565b1561163c5760405163840a48d560e01b815260040160405180910390fd5b603a54600160401b90046001600160401b03165f81900361167057604051631a544f4960e01b815260040160405180910390fd5b6040805160a081018252603c54808252603d5462ffffff811660208401526001600160401b0363010000008204811694840194909452600160581b810460070b6060840152600160981b90049092166080820152906116cf9087612418565b5f805b8581101561193857368787838181106116ed576116ed613673565b90506020028101906116ff9190613832565b80355f908152603660209081526040808320815160808101835281546001600160401b038082168352600160401b8204811695830195909552600160801b8104909416928101929092529394509192906060830190600160c01b900460ff16600281111561176f5761176f61321c565b60028111156117805761178061321c565b905250905060018160600151600281111561179d5761179d61321c565b146117a9575050611930565b856001600160401b031681604001516001600160401b0316106117cd575050611930565b5f80806117dd848a8f35886124c9565b60208b01805193965091945092506117f482613850565b62ffffff1690525060808801805184919061181090839061386d565b6001600160401b031690525060608801805183919061183090839061388c565b60070b905250611840818861386d565b85355f908152603660209081526040918290208751815492890151938901516001600160401b03908116600160801b0267ffffffffffffffff60801b19958216600160401b026001600160801b0319909516919092161792909217928316821781556060880151939a50879390929091839160ff60c01b1990911668ffffffffffffffffff60801b1990911617600160c01b8360028111156118e4576118e461321c565b021790555050845160405164ffffffffff90911691506001600160401b038b16907fa91c59033c3423e18b54d0acecebb4972f9ea95aedf5f4cae3b677b02eaf3a3f905f90a350505050505b6001016116d2565b506001600160401b038084165f908152603b60205260408120805484939192916119649185911661386d565b92506101000a8154816001600160401b0302191690836001600160401b03160217905550610949826125ec565b5f815f815181106119a4576119a4613673565b60200260200101519050919050565b5f816003815181106119c7576119c7613673565b60200260200101515f5f1b14159050919050565b6119e7600360206136d2565b6119f46020830183613631565b905014611a14576040516313717da960e21b815260040160405180910390fd5b611a63611a246020830183613631565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152508692505084359050600361281b565b610ee6576040516309bde33960e01b815260040160405180910390fd5b60088414611aa15760405163200591bd60e01b815260040160405180910390fd5b6005611aaf602860016136bf565b611ab991906136bf565b611ac49060206136d2565b8214611ae3576040516313717da960e21b815260040160405180910390fd5b5f611b1f8686808060200260200160405190810160405280939291908181526020018383602002808284375f9201919091525061283292505050565b90505f64ffffffffff8316611b36602860016136bf565b600b901b179050611b8085858080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152508c925086915085905061281b565b611b9d576040516309bde33960e01b815260040160405180910390fd5b5050505050505050565b603a54600160401b90046001600160401b031615611bd75760405162be9bc360e81b815260040160405180910390fd5b603a546001600160401b03428116911603611c05576040516367db5b8b60e01b815260040160405180910390fd5b6034545f906001600160401b0316611c21633b9aca0047613800565b611c2b9190613813565b9050818015611c4157506001600160401b038116155b15611c5f576040516332dea95960e21b815260040160405180910390fd5b5f6040518060a00160405280611c7442610c3c565b815260395462ffffff1660208201526001600160401b0380851660408301525f60608301819052608090920191909152603a805442909216600160401b026fffffffffffffffff0000000000000000199092169190911790559050611cd8816125ec565b805160208083015160405162ffffff90911681526001600160401b034216917f575796133bbed337e5b39aa49a30dc2556a91e0c6c2af4b7b886ae77ebef1076910160405180910390a3505050565b5f5f611d648484808060200260200160405190810160405280939291908181526020018383602002808284375f9201919091525061199192505050565b5f818152603660209081526040808320815160808101835281546001600160401b038082168352600160401b8204811695830195909552600160801b8104909416928101929092529394509192906060830190600160c01b900460ff166002811115611dd257611dd261321c565b6002811115611de357611de361321c565b90525090505f81606001516002811115611dff57611dff61321c565b14611e1d576040516335e09e9d60e01b815260040160405180910390fd5b6001600160401b038016611e628686808060200260200160405190810160405280939291908181526020018383602002808284375f92019190915250612ac292505050565b6001600160401b031603611e8957604051631958236d60e21b815260040160405180910390fd5b6001600160401b038016611ece8686808060200260200160405190810160405280939291908181526020018383602002808284375f92019190915250612ae692505050565b6001600160401b031614611ef557604051632eade63760e01b815260040160405180910390fd5b611efd61226d565b611f06906138bb565b611f418686808060200260200160405190810160405280939291908181526020018383602002808284375f92019190915250612afd92505050565b14611f5f57604051633772dd5360e11b815260040160405180910390fd5b5f611f9b8686808060200260200160405190810160405280939291908181526020018383602002808284375f92019190915250612b1192505050565b9050611fab8a87878b8b8e611a80565b60398054905f611fba836138de565b9091555050603a545f90600160401b90046001600160401b031615611ff157603a54600160401b90046001600160401b0316611ffe565b603a546001600160401b03165b6040805160808101825264ffffffffff8d1681526001600160401b03858116602083015283169181019190915290915060608101600190525f858152603660209081526040918290208351815492850151938501516001600160401b03908116600160801b0267ffffffffffffffff60801b19958216600160401b026001600160801b031990951691909216179290921792831682178155606084015190929091839160ff60c01b1990911668ffffffffffffffffff60801b1990911617600160c01b8360028111156120d3576120d361321c565b021790555050603d80548492506013906120fe908490600160981b90046001600160401b031661386d565b92506101000a8154816001600160401b0302191690836001600160401b031602179055507f2d0800bbc377ea54a08c5db6a87aafff5e3e9c8fead0eda110e40e0c104414498a60405161215e919064ffffffffff91909116815260200190565b60405180910390a16040805164ffffffffff8c1681526001600160401b03838116602083015284168183015290517f0e5fac175b83177cc047381e030d8fb3b42b37bd1c025e22c280facad62c32df9181900360600190a16121cd633b9aca006001600160401b0384166136d2565b9b9a5050505050505050505050565b5f81516030146121ff57604051634f88323960e11b815260040160405180910390fd5b6040516002906122159084905f906020016138f6565b60408051601f198184030181529082905261222f91613713565b602060405180830381855afa15801561224a573d5f5f3e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610c36919061371e565b60408051600160f81b60208201525f602182015230606090811b6bffffffffffffffffffffffff1916602c8301529101604051602081830303815290604052905090565b804710156123015760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e636500000060448201526064016112ed565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f811461234a576040519150601f19603f3d011682016040523d82523d5f602084013e61234f565b606091505b50509050806112525760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d6179206861766520726576657274656400000000000060648201526084016112ed565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052611252908490612b28565b612424600560036136bf565b61242f9060206136d2565b61243c6020830183613631565b90501461245c576040516313717da960e21b815260040160405180910390fd5b606c6124ac61246e6020840184613631565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525087925050853590508461281b565b611252576040516309bde33960e01b815260040160405180910390fd5b83516020850151905f908190816124e1878388612bfb565b9050846001600160401b0316816001600160401b03161461255b57612506858261391a565b6040805164ffffffffff851681526001600160401b038b8116602083015284168183015290519195507f0e5fac175b83177cc047381e030d8fb3b42b37bd1c025e22c280facad62c32df919081900360600190a15b6001600160401b0380821660208b0181905290891660408b01525f036125e05760398054905f61258a83613949565b9091555050600260608a015261259f8461395e565b92508164ffffffffff16886001600160401b03167f2a02361ffa66cf2c2da4682c2355a6adcaa9f6c227b6e6563e68480f9587626a60405160405180910390a35b50509450945094915050565b602081015162ffffff161561268c578051603c556020810151603d80546040840151606085015160809095015162ffffff9094166affffffffffffffffffffff199092169190911763010000006001600160401b0392831602176fffffffffffffffffffffffffffffffff60581b1916600160581b9482169490940267ffffffffffffffff60981b191693909317600160981b9390921692909202179055565b60808101516034545f916126a8916001600160401b031661386d565b90505f826060015183604001516126bf919061388c565b60408401516034805492935090915f906126e39084906001600160401b031661386d565b82546101009290920a6001600160401b03818102199093169183160217909155603a8054600160401b810483166001600160801b03199091161790555f915061273390633b9aca009085166136d2565b90505f612748633b9aca00600785900b613983565b603a546040518281529192506001600160401b0316907f525408c201bc1576eb44116f6478f1c2a54775b19a043bcfdc708364f74f8e449060200160405180910390a260335460405163a1ca780b60e01b81526001600160a01b03918216600482015260248101849052604481018390527f00000000000000000000000000000000000000000000000000000000000000009091169063a1ca780b906064015f604051808303815f87803b1580156127fe575f5ffd5b505af1158015612810573d5f5f3e3d5ffd5b505050505050505050565b5f83612828868585612cd9565b1495945050505050565b5f5f600283516128429190613800565b90505f816001600160401b0381111561285d5761285d6133c8565b604051908082528060200260200182016040528015612886578160200160208202803683370190505b5090505f5b82811015612980576002856128a083836136d2565b815181106128b0576128b0613673565b6020026020010151868360026128c691906136d2565b6128d19060016136bf565b815181106128e1576128e1613673565b6020026020010151604051602001612903929190918252602082015260400190565b60408051601f198184030181529082905261291d91613713565b602060405180830381855afa158015612938573d5f5f3e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061295b919061371e565b82828151811061296d5761296d613673565b602090810291909101015260010161288b565b5061298c600283613800565b91505b8115612a9f575f5b82811015612a8c576002826129ac83836136d2565b815181106129bc576129bc613673565b6020026020010151838360026129d291906136d2565b6129dd9060016136bf565b815181106129ed576129ed613673565b6020026020010151604051602001612a0f929190918252602082015260400190565b60408051601f1981840301815290829052612a2991613713565b602060405180830381855afa158015612a44573d5f5f3e3d5ffd5b5050506040513d601f19601f82011682018060405250810190612a67919061371e565b828281518110612a7957612a79613673565b6020908102919091010152600101612997565b50612a98600283613800565b915061298f565b805f81518110612ab157612ab1613673565b602002602001015192505050919050565b5f610c3682600581518110612ad957612ad9613673565b6020026020010151612dad565b5f610c3682600681518110612ad957612ad9613673565b5f816001815181106119a4576119a4613673565b5f610c3682600281518110612ad957612ad9613673565b5f612b7c826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316612e149092919063ffffffff16565b905080515f1480612b9c575080806020019051810190612b9c91906135d1565b6112525760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016112ed565b5f612c08602660016136bf565b612c139060206136d2565b612c206040840184613631565b905014612c40576040516313717da960e21b815260040160405180910390fd5b5f612c4c6004856139b2565b64ffffffffff169050612ca5612c656040850185613631565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250899250505060208601358461281b565b612cc2576040516309bde33960e01b815260040160405180910390fd5b612cd0836020013585612e22565b95945050505050565b5f83515f14158015612cf6575060208451612cf491906139db565b155b612d13576040516313717da960e21b815260040160405180910390fd5b604080516020808201909252848152905b85518111612da357612d376002856139db565b5f03612d695781515f528086015160205260208260405f60026107d05a03fa612d5e575f5ffd5b600284049350612d91565b808601515f52815160205260208260405f60026107d05a03fa612d8a575f5ffd5b6002840493505b612d9c6020826136bf565b9050612d24565b5051949350505050565b60f881901c60e882901c61ff00161760d882901c62ff0000161760c882901c63ff000000161764ff0000000060b883901c161765ff000000000060a883901c161766ff000000000000609883901c161767ff0000000000000060889290921c919091161790565b6060610d4284845f85612e4e565b5f80612e2f6004846139ee565b612e3a906040613a17565b64ffffffffff169050610d4284821b612dad565b606082471015612eaf5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b60648201526084016112ed565b5f5f866001600160a01b03168587604051612eca9190613713565b5f6040518083038185875af1925050503d805f8114612f04576040519150601f19603f3d011682016040523d82523d5f602084013e612f09565b606091505b5091509150612f1a87838387612f25565b979650505050505050565b60608315612f935782515f03612f8c576001600160a01b0385163b612f8c5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016112ed565b5081610d42565b610d428383815115612fa85781518083602001fd5b8060405162461bcd60e51b81526004016112ed9190613a37565b80356001600160401b0381168114612fd8575f5ffd5b919050565b5f60408284031215612fed575f5ffd5b50919050565b5f5f5f60608486031215613005575f5ffd5b61300e84612fc2565b925060208401356001600160401b03811115613028575f5ffd5b61303486828701612fdd565b92505060408401356001600160401b0381111561304f575f5ffd5b61305b86828701612fdd565b9150509250925092565b5f5f83601f840112613075575f5ffd5b5081356001600160401b0381111561308b575f5ffd5b6020830191508360208260051b85010111156130a5575f5ffd5b9250929050565b5f5f5f5f5f5f5f5f60a0898b0312156130c3575f5ffd5b6130cc89612fc2565b975060208901356001600160401b038111156130e6575f5ffd5b6130f28b828c01612fdd565b97505060408901356001600160401b0381111561310d575f5ffd5b6131198b828c01613065565b90975095505060608901356001600160401b03811115613137575f5ffd5b6131438b828c01613065565b90955093505060808901356001600160401b03811115613161575f5ffd5b61316d8b828c01613065565b999c989b5096995094979396929594505050565b5f60208284031215613191575f5ffd5b61319a82612fc2565b9392505050565b5f5f83601f8401126131b1575f5ffd5b5081356001600160401b038111156131c7575f5ffd5b6020830191508360208285010111156130a5575f5ffd5b5f5f602083850312156131ef575f5ffd5b82356001600160401b03811115613204575f5ffd5b613210858286016131a1565b90969095509350505050565b634e487b7160e01b5f52602160045260245ffd5b6003811061324c57634e487b7160e01b5f52602160045260245ffd5b9052565b60208101610c368284613230565b5f6020828403121561326e575f5ffd5b5035919050565b5f6080820190506001600160401b0383511682526001600160401b0360208401511660208301526001600160401b03604084015116604083015260608301516132c16060840182613230565b5092915050565b80151581146132d5575f5ffd5b50565b5f602082840312156132e8575f5ffd5b813561319a816132c8565b5f5f5f5f5f60608688031215613307575f5ffd5b85356001600160401b0381111561331c575f5ffd5b613328888289016131a1565b90965094505060208601356001600160401b03811115613346575f5ffd5b613352888289016131a1565b96999598509660400135949350505050565b6001600160a01b03811681146132d5575f5ffd5b8035612fd881613364565b5f5f60408385031215613394575f5ffd5b823561339f81613364565b946020939093013593505050565b5f602082840312156133bd575f5ffd5b813561319a81613364565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f191681016001600160401b0381118282101715613404576134046133c8565b604052919050565b5f6001600160401b03821115613424576134246133c8565b5060051b60200190565b5f82601f83011261343d575f5ffd5b813561345061344b8261340c565b6133dc565b8082825260208201915060208360051b860101925085831115613471575f5ffd5b602085015b8381101561348e578035835260209283019201613476565b5095945050505050565b5f5f5f606084860312156134aa575f5ffd5b83356001600160401b038111156134bf575f5ffd5b8401601f810186136134cf575f5ffd5b80356134dd61344b8261340c565b8082825260208201915060208360051b8501019250888311156134fe575f5ffd5b6020840193505b8284101561352957833561351881613364565b825260209384019390910190613505565b955050505060208401356001600160401b03811115613546575f5ffd5b6135528682870161342e565b92505061356160408501613378565b90509250925092565b5f5f5f6040848603121561357c575f5ffd5b83356001600160401b03811115613591575f5ffd5b61359d86828701612fdd565b93505060208401356001600160401b038111156135b8575f5ffd5b6135c486828701613065565b9497909650939450505050565b5f602082840312156135e1575f5ffd5b815161319a816132c8565b5f5f8335601e19843603018112613601575f5ffd5b8301803591506001600160401b0382111561361a575f5ffd5b6020019150600581901b36038213156130a5575f5ffd5b5f5f8335601e19843603018112613646575f5ffd5b8301803591506001600160401b0382111561365f575f5ffd5b6020019150368190038213156130a5575f5ffd5b634e487b7160e01b5f52603260045260245ffd5b5f60208284031215613697575f5ffd5b813564ffffffffff8116811461319a575f5ffd5b634e487b7160e01b5f52601160045260245ffd5b80820180821115610c3657610c366136ab565b8082028115828204841417610c3657610c366136ab565b81810381811115610c3657610c366136ab565b5f81518060208401855e5f93019283525090919050565b5f61319a82846136fc565b5f6020828403121561372e575f5ffd5b5051919050565b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b608081525f61379e60808301888a613735565b82810360208401526137b0818861375d565b905082810360408401526137c5818688613735565b915050826060830152979650505050505050565b602081525f610d42602083018486613735565b634e487b7160e01b5f52601260045260245ffd5b5f8261380e5761380e6137ec565b500490565b6001600160401b038281168282160390811115610c3657610c366136ab565b5f8235605e19833603018112613846575f5ffd5b9190910192915050565b5f62ffffff821680613864576138646136ab565b5f190192915050565b6001600160401b038181168382160190811115610c3657610c366136ab565b600781810b9083900b01677fffffffffffffff8113677fffffffffffffff1982121715610c3657610c366136ab565b80516020808301519190811015612fed575f1960209190910360031b1b16919050565b5f600182016138ef576138ef6136ab565b5060010190565b5f61390182856136fc565b6001600160801b03199390931683525050601001919050565b600782810b9082900b03677fffffffffffffff198112677fffffffffffffff82131715610c3657610c366136ab565b5f81613957576139576136ab565b505f190190565b5f8160070b677fffffffffffffff19810361397b5761397b6136ab565b5f0392915050565b8082025f8212600160ff1b8414161561399e5761399e6136ab565b8181058314821517610c3657610c366136ab565b5f64ffffffffff8316806139c8576139c86137ec565b8064ffffffffff84160491505092915050565b5f826139e9576139e96137ec565b500690565b5f64ffffffffff831680613a0457613a046137ec565b8064ffffffffff84160691505092915050565b64ffffffffff81811683821602908116908181146132c1576132c16136ab565b602081525f61319a602083018461375d56fea2646970667358221220b0eaf8d41aaf00a3ebab3f4140a4ab05e7c299032448e83819d997d107d3974364736f6c634300081b0033", } // 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 828e78392e..63c5fafe19 100644 --- a/pkg/bindings/EigenPodManager/binding.go +++ b/pkg/bindings/EigenPodManager/binding.go @@ -32,7 +32,7 @@ var ( // EigenPodManagerMetaData contains all meta data concerning the EigenPodManager contract. var EigenPodManagerMetaData = &bind.MetaData{ ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"_ethPOS\",\"type\":\"address\",\"internalType\":\"contractIETHPOSDeposit\"},{\"name\":\"_eigenPodBeacon\",\"type\":\"address\",\"internalType\":\"contractIBeacon\"},{\"name\":\"_delegationManager\",\"type\":\"address\",\"internalType\":\"contractIDelegationManager\"},{\"name\":\"_pauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"addShares\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"shares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"beaconChainETHStrategy\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"beaconChainSlashingFactor\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"burnableETHShares\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"createPod\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"delegationManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIDelegationManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"eigenPodBeacon\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIBeacon\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"ethPOS\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIETHPOSDeposit\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getPod\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIEigenPod\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"hasPod\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"increaseBurnableShares\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"addedSharesToBurn\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"initialOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_initPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"numPods\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"ownerToPod\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIEigenPod\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"pauseAll\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[{\"name\":\"index\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pauserRegistry\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"podOwnerDepositShares\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"shares\",\"type\":\"int256\",\"internalType\":\"int256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"recordBeaconChainETHBalanceUpdate\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"prevRestakedBalanceWei\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"balanceDeltaWei\",\"type\":\"int256\",\"internalType\":\"int256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"removeDepositShares\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"depositSharesToRemove\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"stake\",\"inputs\":[{\"name\":\"pubkey\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"depositDataRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"stakerDepositShares\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"depositShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"withdrawSharesAsTokens\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"shares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"BeaconChainETHDeposited\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BeaconChainETHWithdrawalCompleted\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"shares\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"nonce\",\"type\":\"uint96\",\"indexed\":false,\"internalType\":\"uint96\"},{\"name\":\"delegatedAddress\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"withdrawer\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"withdrawalRoot\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BeaconChainSlashingFactorDecreased\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"prevBeaconChainSlashingFactor\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"newBeaconChainSlashingFactor\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BurnableETHSharesIncreased\",\"inputs\":[{\"name\":\"shares\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"NewTotalShares\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newTotalShares\",\"type\":\"int256\",\"indexed\":false,\"internalType\":\"int256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"PodDeployed\",\"inputs\":[{\"name\":\"eigenPod\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"podOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"PodSharesUpdated\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"sharesDelta\",\"type\":\"int256\",\"indexed\":false,\"internalType\":\"int256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"CurrentlyPaused\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"EigenPodAlreadyExists\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InputAddressZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidNewPausedStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidStrategy\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"LegacyWithdrawalsNotCompleted\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyDelegationManager\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyEigenPod\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyPauser\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyUnpauser\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SharesNegative\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SharesNotMultipleOfGwei\",\"inputs\":[]}]", - Bin: "0x610100604052348015610010575f5ffd5b50604051612a80380380612a8083398101604081905261002f9161015c565b838383836001600160a01b03811661005a576040516339b190bb60e11b815260040160405180910390fd5b6001600160a01b0390811660805292831660a05290821660c0521660e052610080610089565b505050506101b8565b5f54610100900460ff16156100f45760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff90811614610143575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b0381168114610159575f5ffd5b50565b5f5f5f5f6080858703121561016f575f5ffd5b845161017a81610145565b602086015190945061018b81610145565b604086015190935061019c81610145565b60608601519092506101ad81610145565b939692955090935050565b60805160a05160c05160e0516128486102385f395f8181610530015281816106dd0152818161092501528181610a8101528181610df801528181610ea5015261116c01525f81816101f001528181610f6b015261167001525f61033701525f818161037e01528181610612015281816109cb015261127201526128485ff3fe6080604052600436106101ba575f3560e01c80639b4e4634116100f2578063d48e889411610092578063f5d4fed311610062578063f5d4fed314610571578063f6848d2414610586578063fabc1cbc146105bf578063fe243a17146105de575f5ffd5b8063d48e8894146104d5578063debe1eab14610500578063ea4d3c9b1461051f578063f2fde38b14610552575f5ffd5b8063a38406a3116100cd578063a38406a31461044a578063a3d75e0914610469578063a6a509be146104a1578063cd6dc687146104b6575f5ffd5b80639b4e4634146103e45780639ba06275146103f7578063a1ca780b1461042b575f5ffd5b8063715018a61161015d57806384d810621161013857806384d8106214610359578063886f11951461036d5780638da5cb5b146103a05780639104c319146103bd575f5ffd5b8063715018a6146102f3578063724af4231461030757806374cdd79814610326575f5ffd5b806350ff72251161019857806350ff72251461024e578063595c6a67146102825780635ac86ab7146102965780635c975abb146102d5575f5ffd5b8063136439dd146101be578063292b7b2b146101df5780632eae418c1461022f575b5f5ffd5b3480156101c9575f5ffd5b506101dd6101d8366004611af4565b6105fd565b005b3480156101ea575f5ffd5b506102127f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020015b60405180910390f35b34801561023a575f5ffd5b506101dd610249366004611b1f565b6106d2565b348015610259575f5ffd5b5061026d610268366004611b6d565b610918565b60408051928352602083019190915201610226565b34801561028d575f5ffd5b506101dd6109b6565b3480156102a1575f5ffd5b506102c56102b0366004611bab565b606654600160ff9092169190911b9081161490565b6040519015158152602001610226565b3480156102e0575f5ffd5b506066545b604051908152602001610226565b3480156102fe575f5ffd5b506101dd610a65565b348015610312575f5ffd5b506101dd610321366004611b6d565b610a76565b348015610331575f5ffd5b506102127f000000000000000000000000000000000000000000000000000000000000000081565b348015610364575f5ffd5b50610212610b9c565b348015610378575f5ffd5b506102127f000000000000000000000000000000000000000000000000000000000000000081565b3480156103ab575f5ffd5b506033546001600160a01b0316610212565b3480156103c8575f5ffd5b5061021273beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac081565b6101dd6103f2366004611c09565b610c0c565b348015610402575f5ffd5b50610212610411366004611c7c565b60986020525f90815260409020546001600160a01b031681565b348015610436575f5ffd5b506101dd610445366004611c97565b610cc9565b348015610455575f5ffd5b50610212610464366004611c7c565b610f11565b348015610474575f5ffd5b50610488610483366004611c7c565b610fe2565b60405167ffffffffffffffff9091168152602001610226565b3480156104ac575f5ffd5b506102e560995481565b3480156104c1575f5ffd5b506101dd6104d0366004611cc9565b611045565b3480156104e0575f5ffd5b506102e56104ef366004611c7c565b609b6020525f908152604090205481565b34801561050b575f5ffd5b506101dd61051a366004611cc9565b611161565b34801561052a575f5ffd5b506102127f000000000000000000000000000000000000000000000000000000000000000081565b34801561055d575f5ffd5b506101dd61056c366004611c7c565b6111f7565b34801561057c575f5ffd5b506102e5609e5481565b348015610591575f5ffd5b506102c56105a0366004611c7c565b6001600160a01b039081165f9081526098602052604090205416151590565b3480156105ca575f5ffd5b506101dd6105d9366004611af4565b611270565b3480156105e9575f5ffd5b506102e56105f8366004611cf3565b611386565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa15801561065f573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106839190611d2a565b6106a057604051631d77d47760e21b815260040160405180910390fd5b60665481811681146106c55760405163c61dca5d60e01b815260040160405180910390fd5b6106ce82611406565b5050565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461071b5760405163f739589b60e01b815260040160405180910390fd5b6001600160a01b03831673beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac01461075857604051632711b74d60e11b815260040160405180910390fd5b6001600160a01b03841661077f576040516339b190bb60e11b815260040160405180910390fd5b5f811361079f5760405163ef147de160e01b815260040160405180910390fd5b6001600160a01b0384165f908152609b6020526040812054908290821215610899575f6107cb83611d5d565b90505f818511156107e95750806107e28186611d77565b92506107ef565b505f9150835b5f6107fa8286611d8a565b6001600160a01b038a165f818152609b60205260409081902083905551919250907f4e2b791dedccd9fb30141b088cabf5c14a8912b52f59375c95c010700b8c61939061084a9085815260200190565b60405180910390a2886001600160a01b03167fd4def76d6d2bed6f14d5cd9af73cc2913d618d00edde42432e81c09bfe0770988260405161088d91815260200190565b60405180910390a25050505b8015610910576001600160a01b038681165f81815260986020526040908190205490516362483a2160e11b81526004810192909252602482018490529091169063c4907442906044015f604051808303815f87803b1580156108f9575f5ffd5b505af115801561090b573d5f5f3e3d5ffd5b505050505b505050505050565b5f80336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146109635760405163f739589b60e01b815260040160405180910390fd5b6001600160a01b03841673beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac0146109a057604051632711b74d60e11b815260040160405180910390fd5b6109aa8584611443565b91509150935093915050565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa158015610a18573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a3c9190611d2a565b610a5957604051631d77d47760e21b815260040160405180910390fd5b610a635f19611406565b565b610a6d611580565b610a635f6115da565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610abf5760405163f739589b60e01b815260040160405180910390fd5b6001600160a01b03821673beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac014610afc57604051632711b74d60e11b815260040160405180910390fd5b6001600160a01b0383165f908152609b6020526040812054610b1f908390611db1565b90505f811215610b425760405163ef147de160e01b815260040160405180910390fd5b6001600160a01b0384165f818152609b602052604090819020839055517fd4def76d6d2bed6f14d5cd9af73cc2913d618d00edde42432e81c09bfe07709890610b8e9084815260200190565b60405180910390a250505050565b6066545f908190600190811603610bc65760405163840a48d560e01b815260040160405180910390fd5b335f908152609860205260409020546001600160a01b031615610bfc5760405163031a852160e21b815260040160405180910390fd5b5f610c0561162b565b9250505090565b6066545f90600190811603610c345760405163840a48d560e01b815260040160405180910390fd5b335f908152609860205260409020546001600160a01b031680610c5c57610c5961162b565b90505b6040516326d3918d60e21b81526001600160a01b03821690639b4e4634903490610c92908b908b908b908b908b90600401611dff565b5f604051808303818588803b158015610ca9575f5ffd5b505af1158015610cbb573d5f5f3e3d5ffd5b505050505050505050505050565b6001600160a01b038084165f908152609860205260409020548491163314610d04576040516312e16d7160e11b815260040160405180910390fd5b610d0c611786565b6001600160a01b038416610d33576040516339b190bb60e11b815260040160405180910390fd5b610d41633b9aca0083611e4c565b15610d5f576040516347d072bb60e11b815260040160405180910390fd5b6001600160a01b0384165f908152609b602052604081205490811215610d9857604051634b692bcf60e01b815260040160405180910390fd5b5f8312610e58575f5f610dab8786611443565b604051631e328e7960e11b81526001600160a01b038a8116600483015273beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac0602483015260448201849052606482018390529294509092507f000000000000000000000000000000000000000000000000000000000000000090911690633c651cf2906084015f604051808303815f87803b158015610e3b575f5ffd5b505af1158015610e4d573d5f5f3e3d5ffd5b505050505050610f00565b5f610e6c8686610e6787611d5d565b6117df565b60405163305068e760e11b81526001600160a01b0388811660048301526024820185905267ffffffffffffffff831660448301529192507f0000000000000000000000000000000000000000000000000000000000000000909116906360a0d1ce906064015f604051808303815f87803b158015610ee8575f5ffd5b505af1158015610efa573d5f5f3e3d5ffd5b50505050505b50610f0b600160c955565b50505050565b6001600160a01b038082165f9081526098602052604081205490911680610fdc57610fd9836001600160a01b03165f1b60405180610940016040528061090e8152602001611f0561090e9139604080516001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000166020820152808201919091525f606082015260800160408051601f1981840301815290829052610fbe9291602001611e82565b604051602081830303815290604052805190602001206118d8565b90505b92915050565b6001600160a01b0381165f908152609d6020908152604080832081518083019092525460ff8116151580835261010090910467ffffffffffffffff16928201929092529061103857670de0b6b3a764000061103e565b80602001515b9392505050565b5f54610100900460ff161580801561106357505f54600160ff909116105b8061107c5750303b15801561107c57505f5460ff166001145b6110e45760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b5f805460ff191660011790558015611105575f805461ff0019166101001790555b61110e836115da565b61111782611406565b801561115c575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146111aa5760405163f739589b60e01b815260040160405180910390fd5b80609e5f8282546111bb9190611e9e565b90915550506040518181527f1ed04b7fd262c0d9e50fa02957f32a81a151f03baaa367faeedc7521b001c4a49060200160405180910390a15050565b6111ff611580565b6001600160a01b0381166112645760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016110db565b61126d816115da565b50565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156112cc573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906112f09190611eb1565b6001600160a01b0316336001600160a01b0316146113215760405163794821ff60e01b815260040160405180910390fd5b606654801982198116146113485760405163c61dca5d60e01b815260040160405180910390fd5b606682905560405182815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c9060200160405180910390a25050565b5f6001600160a01b03821673beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac0146113c457604051632711b74d60e11b815260040160405180910390fd5b6001600160a01b0383165f908152609b6020526040812054126113fe576001600160a01b0383165f908152609b6020526040902054610fd9565b505f92915050565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a250565b5f806001600160a01b03841661146c576040516339b190bb60e11b815260040160405180910390fd5b5f83121561148d5760405163ef147de160e01b815260040160405180910390fd5b6001600160a01b0384165f908152609b602052604081205484916114b18383611d8a565b6001600160a01b0388165f818152609b60205260409081902083905551919250907f4e2b791dedccd9fb30141b088cabf5c14a8912b52f59375c95c010700b8c6193906115019086815260200190565b60405180910390a2866001600160a01b03167fd4def76d6d2bed6f14d5cd9af73cc2913d618d00edde42432e81c09bfe0770988260405161154491815260200190565b60405180910390a25f8113611561575f5f94509450505050611579565b5f821261156e5781611570565b5f5b86945094505050505b9250929050565b6033546001600160a01b03163314610a635760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016110db565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b5f60995f815461163a90611ecc565b9091555060408051610940810190915261090e8082525f916116d79183913391611f056020830139604080516001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000166020820152808201919091525f606082015260800160408051601f19818403018152908290526116c39291602001611e82565b6040516020818303038152906040526118e4565b60405163189acdbd60e31b81523360048201529091506001600160a01b0382169063c4d66de8906024015f604051808303815f87803b158015611718575f5ffd5b505af115801561172a573d5f5f3e3d5ffd5b5050335f8181526098602052604080822080546001600160a01b0319166001600160a01b038816908117909155905192945092507f21c99d0db02213c32fff5b05cf0a718ab5f858802b91498f80d82270289d856a91a3919050565b600260c954036117d85760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016110db565b600260c955565b5f806117eb8385611d77565b90505f6117f786610fe2565b90505f61180f67ffffffffffffffff831684886119e6565b90505f61181c8284611ee4565b6040805180820182526001815267ffffffffffffffff85811660208084018281526001600160a01b038f165f818152609d845287902095518654925168ffffffffffffffffff1990931690151568ffffffffffffffff001916176101009286169290920291909117909455845193845291881691830191909152918101919091529091507fb160ab8589bf47dc04ea11b50d46678d21590cea2ed3e454e7bd3e41510f98cf9060600160405180910390a1979650505050505050565b5f610fd9838330611acb565b5f834710156119355760405162461bcd60e51b815260206004820152601d60248201527f437265617465323a20696e73756666696369656e742062616c616e636500000060448201526064016110db565b81515f036119855760405162461bcd60e51b815260206004820181905260248201527f437265617465323a2062797465636f6465206c656e677468206973207a65726f60448201526064016110db565b8282516020840186f590506001600160a01b03811661103e5760405162461bcd60e51b815260206004820152601960248201527f437265617465323a204661696c6564206f6e206465706c6f790000000000000060448201526064016110db565b5f80805f19858709858702925082811083820303915050805f03611a1d57838281611a1357611a13611e38565b049250505061103e565b808411611a645760405162461bcd60e51b81526020600482015260156024820152744d6174683a206d756c446976206f766572666c6f7760581b60448201526064016110db565b5f8486880960026001871981018816978890046003810283188082028403028082028403028082028403028082028403028082028403029081029092039091025f889003889004909101858311909403939093029303949094049190911702949350505050565b5f604051836040820152846020820152828152600b8101905060ff815360559020949350505050565b5f60208284031215611b04575f5ffd5b5035919050565b6001600160a01b038116811461126d575f5ffd5b5f5f5f5f60808587031215611b32575f5ffd5b8435611b3d81611b0b565b93506020850135611b4d81611b0b565b92506040850135611b5d81611b0b565b9396929550929360600135925050565b5f5f5f60608486031215611b7f575f5ffd5b8335611b8a81611b0b565b92506020840135611b9a81611b0b565b929592945050506040919091013590565b5f60208284031215611bbb575f5ffd5b813560ff8116811461103e575f5ffd5b5f5f83601f840112611bdb575f5ffd5b50813567ffffffffffffffff811115611bf2575f5ffd5b602083019150836020828501011115611579575f5ffd5b5f5f5f5f5f60608688031215611c1d575f5ffd5b853567ffffffffffffffff811115611c33575f5ffd5b611c3f88828901611bcb565b909650945050602086013567ffffffffffffffff811115611c5e575f5ffd5b611c6a88828901611bcb565b96999598509660400135949350505050565b5f60208284031215611c8c575f5ffd5b813561103e81611b0b565b5f5f5f60608486031215611ca9575f5ffd5b8335611cb481611b0b565b95602085013595506040909401359392505050565b5f5f60408385031215611cda575f5ffd5b8235611ce581611b0b565b946020939093013593505050565b5f5f60408385031215611d04575f5ffd5b8235611d0f81611b0b565b91506020830135611d1f81611b0b565b809150509250929050565b5f60208284031215611d3a575f5ffd5b8151801515811461103e575f5ffd5b634e487b7160e01b5f52601160045260245ffd5b5f600160ff1b8201611d7157611d71611d49565b505f0390565b81810381811115610fdc57610fdc611d49565b8082018281125f831280158216821582161715611da957611da9611d49565b505092915050565b8181035f831280158383131683831282161715611dd057611dd0611d49565b5092915050565b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b606081525f611e12606083018789611dd7565b8281036020840152611e25818688611dd7565b9150508260408301529695505050505050565b634e487b7160e01b5f52601260045260245ffd5b5f82611e6657634e487b7160e01b5f52601260045260245ffd5b500790565b5f81518060208401855e5f93019283525090919050565b5f611e96611e908386611e6b565b84611e6b565b949350505050565b80820180821115610fdc57610fdc611d49565b5f60208284031215611ec1575f5ffd5b815161103e81611b0b565b5f60018201611edd57611edd611d49565b5060010190565b67ffffffffffffffff8281168282160390811115610fdc57610fdc611d4956fe608060405260405161090e38038061090e83398101604081905261002291610460565b61002e82826000610035565b505061058a565b61003e83610100565b6040516001600160a01b038416907f1cf3b03a6cf19fa2baba4df148e9dcabedea7f8a5c07840e207e5c089be95d3e90600090a260008251118061007f5750805b156100fb576100f9836001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156100c5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906100e99190610520565b836102a360201b6100291760201c565b505b505050565b610113816102cf60201b6100551760201c565b6101725760405162461bcd60e51b815260206004820152602560248201527f455243313936373a206e657720626561636f6e206973206e6f74206120636f6e6044820152641d1c9858dd60da1b60648201526084015b60405180910390fd5b6101e6816001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156101b3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101d79190610520565b6102cf60201b6100551760201c565b61024b5760405162461bcd60e51b815260206004820152603060248201527f455243313936373a20626561636f6e20696d706c656d656e746174696f6e206960448201526f1cc81b9bdd08184818dbdb9d1c9858dd60821b6064820152608401610169565b806102827fa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d5060001b6102de60201b6100641760201c565b80546001600160a01b0319166001600160a01b039290921691909117905550565b60606102c883836040518060600160405280602781526020016108e7602791396102e1565b9392505050565b6001600160a01b03163b151590565b90565b6060600080856001600160a01b0316856040516102fe919061053b565b600060405180830381855af49150503d8060008114610339576040519150601f19603f3d011682016040523d82523d6000602084013e61033e565b606091505b5090925090506103508683838761035a565b9695505050505050565b606083156103c65782516103bf576001600160a01b0385163b6103bf5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610169565b50816103d0565b6103d083836103d8565b949350505050565b8151156103e85781518083602001fd5b8060405162461bcd60e51b81526004016101699190610557565b80516001600160a01b038116811461041957600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b60005b8381101561044f578181015183820152602001610437565b838111156100f95750506000910152565b6000806040838503121561047357600080fd5b61047c83610402565b60208401519092506001600160401b038082111561049957600080fd5b818501915085601f8301126104ad57600080fd5b8151818111156104bf576104bf61041e565b604051601f8201601f19908116603f011681019083821181831017156104e7576104e761041e565b8160405282815288602084870101111561050057600080fd5b610511836020830160208801610434565b80955050505050509250929050565b60006020828403121561053257600080fd5b6102c882610402565b6000825161054d818460208701610434565b9190910192915050565b6020815260008251806020840152610576816040850160208701610434565b601f01601f19169190910160400192915050565b61034e806105996000396000f3fe60806040523661001357610011610017565b005b6100115b610027610022610067565b610100565b565b606061004e83836040518060600160405280602781526020016102f260279139610124565b9392505050565b6001600160a01b03163b151590565b90565b600061009a7fa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50546001600160a01b031690565b6001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156100d7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906100fb9190610249565b905090565b3660008037600080366000845af43d6000803e80801561011f573d6000f35b3d6000fd5b6060600080856001600160a01b03168560405161014191906102a2565b600060405180830381855af49150503d806000811461017c576040519150601f19603f3d011682016040523d82523d6000602084013e610181565b606091505b50915091506101928683838761019c565b9695505050505050565b6060831561020d578251610206576001600160a01b0385163b6102065760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064015b60405180910390fd5b5081610217565b610217838361021f565b949350505050565b81511561022f5781518083602001fd5b8060405162461bcd60e51b81526004016101fd91906102be565b60006020828403121561025b57600080fd5b81516001600160a01b038116811461004e57600080fd5b60005b8381101561028d578181015183820152602001610275565b8381111561029c576000848401525b50505050565b600082516102b4818460208701610272565b9190910192915050565b60208152600082518060208401526102dd816040850160208701610272565b601f01601f1916919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220d51e81d3bc5ed20a26aeb05dce7e825c503b2061aa78628027300c8d65b9d89a64736f6c634300080c0033416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220206da8ee7fc533b672cccd953d3cea25dfbc2b47e0cf8cbf020dfa09efcccb8264736f6c634300081b0033", + Bin: "0x610100604052348015610010575f5ffd5b50604051612a80380380612a8083398101604081905261002f9161015c565b838383836001600160a01b03811661005a576040516339b190bb60e11b815260040160405180910390fd5b6001600160a01b0390811660805292831660a05290821660c0521660e052610080610089565b505050506101b8565b5f54610100900460ff16156100f45760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff90811614610143575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b0381168114610159575f5ffd5b50565b5f5f5f5f6080858703121561016f575f5ffd5b845161017a81610145565b602086015190945061018b81610145565b604086015190935061019c81610145565b60608601519092506101ad81610145565b939692955090935050565b60805160a05160c05160e0516128486102385f395f8181610530015281816106dd0152818161092501528181610a8101528181610df801528181610ea5015261116c01525f81816101f001528181610f6b015261167001525f61033701525f818161037e01528181610612015281816109cb015261127201526128485ff3fe6080604052600436106101ba575f3560e01c80639b4e4634116100f2578063d48e889411610092578063f5d4fed311610062578063f5d4fed314610571578063f6848d2414610586578063fabc1cbc146105bf578063fe243a17146105de575f5ffd5b8063d48e8894146104d5578063debe1eab14610500578063ea4d3c9b1461051f578063f2fde38b14610552575f5ffd5b8063a38406a3116100cd578063a38406a31461044a578063a3d75e0914610469578063a6a509be146104a1578063cd6dc687146104b6575f5ffd5b80639b4e4634146103e45780639ba06275146103f7578063a1ca780b1461042b575f5ffd5b8063715018a61161015d57806384d810621161013857806384d8106214610359578063886f11951461036d5780638da5cb5b146103a05780639104c319146103bd575f5ffd5b8063715018a6146102f3578063724af4231461030757806374cdd79814610326575f5ffd5b806350ff72251161019857806350ff72251461024e578063595c6a67146102825780635ac86ab7146102965780635c975abb146102d5575f5ffd5b8063136439dd146101be578063292b7b2b146101df5780632eae418c1461022f575b5f5ffd5b3480156101c9575f5ffd5b506101dd6101d8366004611af4565b6105fd565b005b3480156101ea575f5ffd5b506102127f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020015b60405180910390f35b34801561023a575f5ffd5b506101dd610249366004611b1f565b6106d2565b348015610259575f5ffd5b5061026d610268366004611b6d565b610918565b60408051928352602083019190915201610226565b34801561028d575f5ffd5b506101dd6109b6565b3480156102a1575f5ffd5b506102c56102b0366004611bab565b606654600160ff9092169190911b9081161490565b6040519015158152602001610226565b3480156102e0575f5ffd5b506066545b604051908152602001610226565b3480156102fe575f5ffd5b506101dd610a65565b348015610312575f5ffd5b506101dd610321366004611b6d565b610a76565b348015610331575f5ffd5b506102127f000000000000000000000000000000000000000000000000000000000000000081565b348015610364575f5ffd5b50610212610b9c565b348015610378575f5ffd5b506102127f000000000000000000000000000000000000000000000000000000000000000081565b3480156103ab575f5ffd5b506033546001600160a01b0316610212565b3480156103c8575f5ffd5b5061021273beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac081565b6101dd6103f2366004611c09565b610c0c565b348015610402575f5ffd5b50610212610411366004611c7c565b60986020525f90815260409020546001600160a01b031681565b348015610436575f5ffd5b506101dd610445366004611c97565b610cc9565b348015610455575f5ffd5b50610212610464366004611c7c565b610f11565b348015610474575f5ffd5b50610488610483366004611c7c565b610fe2565b60405167ffffffffffffffff9091168152602001610226565b3480156104ac575f5ffd5b506102e560995481565b3480156104c1575f5ffd5b506101dd6104d0366004611cc9565b611045565b3480156104e0575f5ffd5b506102e56104ef366004611c7c565b609b6020525f908152604090205481565b34801561050b575f5ffd5b506101dd61051a366004611cc9565b611161565b34801561052a575f5ffd5b506102127f000000000000000000000000000000000000000000000000000000000000000081565b34801561055d575f5ffd5b506101dd61056c366004611c7c565b6111f7565b34801561057c575f5ffd5b506102e5609e5481565b348015610591575f5ffd5b506102c56105a0366004611c7c565b6001600160a01b039081165f9081526098602052604090205416151590565b3480156105ca575f5ffd5b506101dd6105d9366004611af4565b611270565b3480156105e9575f5ffd5b506102e56105f8366004611cf3565b611386565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa15801561065f573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106839190611d2a565b6106a057604051631d77d47760e21b815260040160405180910390fd5b60665481811681146106c55760405163c61dca5d60e01b815260040160405180910390fd5b6106ce82611406565b5050565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461071b5760405163f739589b60e01b815260040160405180910390fd5b6001600160a01b03831673beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac01461075857604051632711b74d60e11b815260040160405180910390fd5b6001600160a01b03841661077f576040516339b190bb60e11b815260040160405180910390fd5b5f811361079f5760405163ef147de160e01b815260040160405180910390fd5b6001600160a01b0384165f908152609b6020526040812054908290821215610899575f6107cb83611d5d565b90505f818511156107e95750806107e28186611d77565b92506107ef565b505f9150835b5f6107fa8286611d8a565b6001600160a01b038a165f818152609b60205260409081902083905551919250907f4e2b791dedccd9fb30141b088cabf5c14a8912b52f59375c95c010700b8c61939061084a9085815260200190565b60405180910390a2886001600160a01b03167fd4def76d6d2bed6f14d5cd9af73cc2913d618d00edde42432e81c09bfe0770988260405161088d91815260200190565b60405180910390a25050505b8015610910576001600160a01b038681165f81815260986020526040908190205490516362483a2160e11b81526004810192909252602482018490529091169063c4907442906044015f604051808303815f87803b1580156108f9575f5ffd5b505af115801561090b573d5f5f3e3d5ffd5b505050505b505050505050565b5f80336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146109635760405163f739589b60e01b815260040160405180910390fd5b6001600160a01b03841673beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac0146109a057604051632711b74d60e11b815260040160405180910390fd5b6109aa8584611443565b91509150935093915050565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa158015610a18573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a3c9190611d2a565b610a5957604051631d77d47760e21b815260040160405180910390fd5b610a635f19611406565b565b610a6d611580565b610a635f6115da565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610abf5760405163f739589b60e01b815260040160405180910390fd5b6001600160a01b03821673beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac014610afc57604051632711b74d60e11b815260040160405180910390fd5b6001600160a01b0383165f908152609b6020526040812054610b1f908390611db1565b90505f811215610b425760405163ef147de160e01b815260040160405180910390fd5b6001600160a01b0384165f818152609b602052604090819020839055517fd4def76d6d2bed6f14d5cd9af73cc2913d618d00edde42432e81c09bfe07709890610b8e9084815260200190565b60405180910390a250505050565b6066545f908190600190811603610bc65760405163840a48d560e01b815260040160405180910390fd5b335f908152609860205260409020546001600160a01b031615610bfc5760405163031a852160e21b815260040160405180910390fd5b5f610c0561162b565b9250505090565b6066545f90600190811603610c345760405163840a48d560e01b815260040160405180910390fd5b335f908152609860205260409020546001600160a01b031680610c5c57610c5961162b565b90505b6040516326d3918d60e21b81526001600160a01b03821690639b4e4634903490610c92908b908b908b908b908b90600401611dff565b5f604051808303818588803b158015610ca9575f5ffd5b505af1158015610cbb573d5f5f3e3d5ffd5b505050505050505050505050565b6001600160a01b038084165f908152609860205260409020548491163314610d04576040516312e16d7160e11b815260040160405180910390fd5b610d0c611786565b6001600160a01b038416610d33576040516339b190bb60e11b815260040160405180910390fd5b610d41633b9aca0083611e4c565b15610d5f576040516347d072bb60e11b815260040160405180910390fd5b6001600160a01b0384165f908152609b602052604081205490811215610d9857604051634b692bcf60e01b815260040160405180910390fd5b5f8312610e58575f5f610dab8786611443565b604051631e328e7960e11b81526001600160a01b038a8116600483015273beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac0602483015260448201849052606482018390529294509092507f000000000000000000000000000000000000000000000000000000000000000090911690633c651cf2906084015f604051808303815f87803b158015610e3b575f5ffd5b505af1158015610e4d573d5f5f3e3d5ffd5b505050505050610f00565b5f610e6c8686610e6787611d5d565b6117df565b60405163305068e760e11b81526001600160a01b0388811660048301526024820185905267ffffffffffffffff831660448301529192507f0000000000000000000000000000000000000000000000000000000000000000909116906360a0d1ce906064015f604051808303815f87803b158015610ee8575f5ffd5b505af1158015610efa573d5f5f3e3d5ffd5b50505050505b50610f0b600160c955565b50505050565b6001600160a01b038082165f9081526098602052604081205490911680610fdc57610fd9836001600160a01b03165f1b60405180610940016040528061090e8152602001611f0561090e9139604080516001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000166020820152808201919091525f606082015260800160408051601f1981840301815290829052610fbe9291602001611e82565b604051602081830303815290604052805190602001206118d8565b90505b92915050565b6001600160a01b0381165f908152609d6020908152604080832081518083019092525460ff8116151580835261010090910467ffffffffffffffff16928201929092529061103857670de0b6b3a764000061103e565b80602001515b9392505050565b5f54610100900460ff161580801561106357505f54600160ff909116105b8061107c5750303b15801561107c57505f5460ff166001145b6110e45760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b5f805460ff191660011790558015611105575f805461ff0019166101001790555b61110e836115da565b61111782611406565b801561115c575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146111aa5760405163f739589b60e01b815260040160405180910390fd5b80609e5f8282546111bb9190611e9e565b90915550506040518181527f1ed04b7fd262c0d9e50fa02957f32a81a151f03baaa367faeedc7521b001c4a49060200160405180910390a15050565b6111ff611580565b6001600160a01b0381166112645760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016110db565b61126d816115da565b50565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156112cc573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906112f09190611eb1565b6001600160a01b0316336001600160a01b0316146113215760405163794821ff60e01b815260040160405180910390fd5b606654801982198116146113485760405163c61dca5d60e01b815260040160405180910390fd5b606682905560405182815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c9060200160405180910390a25050565b5f6001600160a01b03821673beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac0146113c457604051632711b74d60e11b815260040160405180910390fd5b6001600160a01b0383165f908152609b6020526040812054126113fe576001600160a01b0383165f908152609b6020526040902054610fd9565b505f92915050565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a250565b5f806001600160a01b03841661146c576040516339b190bb60e11b815260040160405180910390fd5b5f83121561148d5760405163ef147de160e01b815260040160405180910390fd5b6001600160a01b0384165f908152609b602052604081205484916114b18383611d8a565b6001600160a01b0388165f818152609b60205260409081902083905551919250907f4e2b791dedccd9fb30141b088cabf5c14a8912b52f59375c95c010700b8c6193906115019086815260200190565b60405180910390a2866001600160a01b03167fd4def76d6d2bed6f14d5cd9af73cc2913d618d00edde42432e81c09bfe0770988260405161154491815260200190565b60405180910390a25f8113611561575f5f94509450505050611579565b5f821261156e5781611570565b5f5b86945094505050505b9250929050565b6033546001600160a01b03163314610a635760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016110db565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b5f60995f815461163a90611ecc565b9091555060408051610940810190915261090e8082525f916116d79183913391611f056020830139604080516001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000166020820152808201919091525f606082015260800160408051601f19818403018152908290526116c39291602001611e82565b6040516020818303038152906040526118e4565b60405163189acdbd60e31b81523360048201529091506001600160a01b0382169063c4d66de8906024015f604051808303815f87803b158015611718575f5ffd5b505af115801561172a573d5f5f3e3d5ffd5b5050335f8181526098602052604080822080546001600160a01b0319166001600160a01b038816908117909155905192945092507f21c99d0db02213c32fff5b05cf0a718ab5f858802b91498f80d82270289d856a91a3919050565b600260c954036117d85760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016110db565b600260c955565b5f806117eb8385611d77565b90505f6117f786610fe2565b90505f61180f67ffffffffffffffff831684886119e6565b90505f61181c8284611ee4565b6040805180820182526001815267ffffffffffffffff85811660208084018281526001600160a01b038f165f818152609d845287902095518654925168ffffffffffffffffff1990931690151568ffffffffffffffff001916176101009286169290920291909117909455845193845291881691830191909152918101919091529091507fb160ab8589bf47dc04ea11b50d46678d21590cea2ed3e454e7bd3e41510f98cf9060600160405180910390a1979650505050505050565b5f610fd9838330611acb565b5f834710156119355760405162461bcd60e51b815260206004820152601d60248201527f437265617465323a20696e73756666696369656e742062616c616e636500000060448201526064016110db565b81515f036119855760405162461bcd60e51b815260206004820181905260248201527f437265617465323a2062797465636f6465206c656e677468206973207a65726f60448201526064016110db565b8282516020840186f590506001600160a01b03811661103e5760405162461bcd60e51b815260206004820152601960248201527f437265617465323a204661696c6564206f6e206465706c6f790000000000000060448201526064016110db565b5f80805f19858709858702925082811083820303915050805f03611a1d57838281611a1357611a13611e38565b049250505061103e565b808411611a645760405162461bcd60e51b81526020600482015260156024820152744d6174683a206d756c446976206f766572666c6f7760581b60448201526064016110db565b5f8486880960026001871981018816978890046003810283188082028403028082028403028082028403028082028403028082028403029081029092039091025f889003889004909101858311909403939093029303949094049190911702949350505050565b5f604051836040820152846020820152828152600b8101905060ff815360559020949350505050565b5f60208284031215611b04575f5ffd5b5035919050565b6001600160a01b038116811461126d575f5ffd5b5f5f5f5f60808587031215611b32575f5ffd5b8435611b3d81611b0b565b93506020850135611b4d81611b0b565b92506040850135611b5d81611b0b565b9396929550929360600135925050565b5f5f5f60608486031215611b7f575f5ffd5b8335611b8a81611b0b565b92506020840135611b9a81611b0b565b929592945050506040919091013590565b5f60208284031215611bbb575f5ffd5b813560ff8116811461103e575f5ffd5b5f5f83601f840112611bdb575f5ffd5b50813567ffffffffffffffff811115611bf2575f5ffd5b602083019150836020828501011115611579575f5ffd5b5f5f5f5f5f60608688031215611c1d575f5ffd5b853567ffffffffffffffff811115611c33575f5ffd5b611c3f88828901611bcb565b909650945050602086013567ffffffffffffffff811115611c5e575f5ffd5b611c6a88828901611bcb565b96999598509660400135949350505050565b5f60208284031215611c8c575f5ffd5b813561103e81611b0b565b5f5f5f60608486031215611ca9575f5ffd5b8335611cb481611b0b565b95602085013595506040909401359392505050565b5f5f60408385031215611cda575f5ffd5b8235611ce581611b0b565b946020939093013593505050565b5f5f60408385031215611d04575f5ffd5b8235611d0f81611b0b565b91506020830135611d1f81611b0b565b809150509250929050565b5f60208284031215611d3a575f5ffd5b8151801515811461103e575f5ffd5b634e487b7160e01b5f52601160045260245ffd5b5f600160ff1b8201611d7157611d71611d49565b505f0390565b81810381811115610fdc57610fdc611d49565b8082018281125f831280158216821582161715611da957611da9611d49565b505092915050565b8181035f831280158383131683831282161715611dd057611dd0611d49565b5092915050565b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b606081525f611e12606083018789611dd7565b8281036020840152611e25818688611dd7565b9150508260408301529695505050505050565b634e487b7160e01b5f52601260045260245ffd5b5f82611e6657634e487b7160e01b5f52601260045260245ffd5b500790565b5f81518060208401855e5f93019283525090919050565b5f611e96611e908386611e6b565b84611e6b565b949350505050565b80820180821115610fdc57610fdc611d49565b5f60208284031215611ec1575f5ffd5b815161103e81611b0b565b5f60018201611edd57611edd611d49565b5060010190565b67ffffffffffffffff8281168282160390811115610fdc57610fdc611d4956fe608060405260405161090e38038061090e83398101604081905261002291610460565b61002e82826000610035565b505061058a565b61003e83610100565b6040516001600160a01b038416907f1cf3b03a6cf19fa2baba4df148e9dcabedea7f8a5c07840e207e5c089be95d3e90600090a260008251118061007f5750805b156100fb576100f9836001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156100c5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906100e99190610520565b836102a360201b6100291760201c565b505b505050565b610113816102cf60201b6100551760201c565b6101725760405162461bcd60e51b815260206004820152602560248201527f455243313936373a206e657720626561636f6e206973206e6f74206120636f6e6044820152641d1c9858dd60da1b60648201526084015b60405180910390fd5b6101e6816001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156101b3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101d79190610520565b6102cf60201b6100551760201c565b61024b5760405162461bcd60e51b815260206004820152603060248201527f455243313936373a20626561636f6e20696d706c656d656e746174696f6e206960448201526f1cc81b9bdd08184818dbdb9d1c9858dd60821b6064820152608401610169565b806102827fa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d5060001b6102de60201b6100641760201c565b80546001600160a01b0319166001600160a01b039290921691909117905550565b60606102c883836040518060600160405280602781526020016108e7602791396102e1565b9392505050565b6001600160a01b03163b151590565b90565b6060600080856001600160a01b0316856040516102fe919061053b565b600060405180830381855af49150503d8060008114610339576040519150601f19603f3d011682016040523d82523d6000602084013e61033e565b606091505b5090925090506103508683838761035a565b9695505050505050565b606083156103c65782516103bf576001600160a01b0385163b6103bf5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610169565b50816103d0565b6103d083836103d8565b949350505050565b8151156103e85781518083602001fd5b8060405162461bcd60e51b81526004016101699190610557565b80516001600160a01b038116811461041957600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b60005b8381101561044f578181015183820152602001610437565b838111156100f95750506000910152565b6000806040838503121561047357600080fd5b61047c83610402565b60208401519092506001600160401b038082111561049957600080fd5b818501915085601f8301126104ad57600080fd5b8151818111156104bf576104bf61041e565b604051601f8201601f19908116603f011681019083821181831017156104e7576104e761041e565b8160405282815288602084870101111561050057600080fd5b610511836020830160208801610434565b80955050505050509250929050565b60006020828403121561053257600080fd5b6102c882610402565b6000825161054d818460208701610434565b9190910192915050565b6020815260008251806020840152610576816040850160208701610434565b601f01601f19169190910160400192915050565b61034e806105996000396000f3fe60806040523661001357610011610017565b005b6100115b610027610022610067565b610100565b565b606061004e83836040518060600160405280602781526020016102f260279139610124565b9392505050565b6001600160a01b03163b151590565b90565b600061009a7fa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50546001600160a01b031690565b6001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156100d7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906100fb9190610249565b905090565b3660008037600080366000845af43d6000803e80801561011f573d6000f35b3d6000fd5b6060600080856001600160a01b03168560405161014191906102a2565b600060405180830381855af49150503d806000811461017c576040519150601f19603f3d011682016040523d82523d6000602084013e610181565b606091505b50915091506101928683838761019c565b9695505050505050565b6060831561020d578251610206576001600160a01b0385163b6102065760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064015b60405180910390fd5b5081610217565b610217838361021f565b949350505050565b81511561022f5781518083602001fd5b8060405162461bcd60e51b81526004016101fd91906102be565b60006020828403121561025b57600080fd5b81516001600160a01b038116811461004e57600080fd5b60005b8381101561028d578181015183820152602001610275565b8381111561029c576000848401525b50505050565b600082516102b4818460208701610272565b9190910192915050565b60208152600082518060208401526102dd816040850160208701610272565b601f01601f1916919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220d51e81d3bc5ed20a26aeb05dce7e825c503b2061aa78628027300c8d65b9d89a64736f6c634300080c0033416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220a96c5597674c26be0962de53794eb0e8efae2c5d17870ccfa03ec45286c1f5ef64736f6c634300081b0033", } // EigenPodManagerABI is the input ABI used to generate the binding from. diff --git a/pkg/bindings/EigenStrategy/binding.go b/pkg/bindings/EigenStrategy/binding.go index e26e04bc48..efedf07cce 100644 --- a/pkg/bindings/EigenStrategy/binding.go +++ b/pkg/bindings/EigenStrategy/binding.go @@ -32,7 +32,7 @@ var ( // EigenStrategyMetaData contains all meta data concerning the EigenStrategy contract. var EigenStrategyMetaData = &bind.MetaData{ ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"_strategyManager\",\"type\":\"address\",\"internalType\":\"contractIStrategyManager\"},{\"name\":\"_pauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"EIGEN\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIEigen\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"deposit\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"newShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"explanation\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"_EIGEN\",\"type\":\"address\",\"internalType\":\"contractIEigen\"},{\"name\":\"_bEIGEN\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"_underlyingToken\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"pauseAll\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[{\"name\":\"index\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pauserRegistry\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"shares\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"sharesToUnderlying\",\"inputs\":[{\"name\":\"amountShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"sharesToUnderlyingView\",\"inputs\":[{\"name\":\"amountShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"strategyManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategyManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"totalShares\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"underlyingToShares\",\"inputs\":[{\"name\":\"amountUnderlying\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"underlyingToSharesView\",\"inputs\":[{\"name\":\"amountUnderlying\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"underlyingToken\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"userUnderlying\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"userUnderlyingView\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"withdraw\",\"inputs\":[{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amountShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"ExchangeRateEmitted\",\"inputs\":[{\"name\":\"rate\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StrategyTokenSet\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIERC20\"},{\"name\":\"decimals\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"BalanceExceedsMaxTotalDeposits\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"CurrentlyPaused\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InputAddressZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidNewPausedStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"MaxPerDepositExceedsMax\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NewSharesZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyPauser\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyStrategyManager\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyUnderlyingToken\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyUnpauser\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"TotalSharesExceedsMax\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"WithdrawalAmountExceedsTotalDeposits\",\"inputs\":[]}]", - Bin: "0x60c060405234801561000f575f5ffd5b5060405161168d38038061168d83398101604081905261002e9161014f565b8181806001600160a01b038116610058576040516339b190bb60e11b815260040160405180910390fd5b6001600160a01b03908116608052821660a05261007361007c565b50505050610187565b5f54610100900460ff16156100e75760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff90811614610136575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b038116811461014c575f5ffd5b50565b5f5f60408385031215610160575f5ffd5b825161016b81610138565b602084015190925061017c81610138565b809150509250929050565b60805160a0516114bb6101d25f395f818161018b0152818161043e01528181610871015261090e01525f81816102540152818161034b0152818161066a0152610a3c01526114bb5ff3fe608060405234801561000f575f5ffd5b506004361061013d575f3560e01c8063886f1195116100b4578063ce7c2ac211610079578063ce7c2ac2146102c4578063d9caed12146102d7578063e3dae51c146102ea578063f3e73875146102fd578063fabc1cbc14610310578063fdc371ce14610323575f5ffd5b8063886f11951461024f5780638c871019146102765780638f6a624014610289578063ab5921e11461029c578063c4d66de8146102b1575f5ffd5b8063485cc95511610105578063485cc955146101d7578063553ca5f8146101ea578063595c6a67146101fd5780635ac86ab7146102055780635c975abb146102345780637a8b26371461023c575f5ffd5b8063136439dd146101415780632495a5991461015657806339b70e38146101865780633a98ef39146101ad57806347e7ef24146101c4575b5f5ffd5b61015461014f3660046111ab565b610336565b005b603254610169906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b6101697f000000000000000000000000000000000000000000000000000000000000000081565b6101b660335481565b60405190815260200161017d565b6101b66101d23660046111d9565b61040b565b6101546101e5366004611203565b610557565b6101b66101f836600461123a565b610642565b610154610655565b61022461021336600461126a565b6001805460ff9092161b9081161490565b604051901515815260200161017d565b6001546101b6565b6101b661024a3660046111ab565b610704565b6101697f000000000000000000000000000000000000000000000000000000000000000081565b6101b66102843660046111ab565b61074d565b6101b661029736600461123a565b610757565b6102a4610764565b60405161017d9190611285565b6101546102bf36600461123a565b610784565b6101b66102d236600461123a565b61084a565b6101546102e53660046112ba565b6108dc565b6101b66102f83660046111ab565b6109f9565b6101b661030b3660046111ab565b610a30565b61015461031e3660046111ab565b610a3a565b606454610169906001600160a01b031681565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa158015610398573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103bc91906112f8565b6103d957604051631d77d47760e21b815260040160405180910390fd5b60015481811681146103fe5760405163c61dca5d60e01b815260040160405180910390fd5b61040782610b50565b5050565b600180545f9182918116036104335760405163840a48d560e01b815260040160405180910390fd5b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461047c576040516348da714f60e01b815260040160405180910390fd5b6104868484610b8d565b6033545f6104966103e88361132b565b90505f6103e86104a4610c46565b6104ae919061132b565b90505f6104bb878361133e565b9050806104c88489611351565b6104d29190611368565b9550855f036104f457604051630c392ed360e11b815260040160405180910390fd5b6104fe868561132b565b60338190556f4b3b4ca85a86c47a098a223fffffffff101561053357604051632f14e8a360e11b815260040160405180910390fd5b61054c826103e8603354610547919061132b565b610cb5565b505050505092915050565b5f54610100900460ff161580801561057557505f54600160ff909116105b8061058e5750303b15801561058e57505f5460ff166001145b6105b35760405162461bcd60e51b81526004016105aa90611387565b60405180910390fd5b5f805460ff1916600117905580156105d4575f805461ff0019166101001790555b606480546001600160a01b0319166001600160a01b0385161790556105f882610d01565b801561063d575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050565b5f61064f61024a8361084a565b92915050565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa1580156106b7573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106db91906112f8565b6106f857604051631d77d47760e21b815260040160405180910390fd5b6107025f19610b50565b565b5f5f6103e8603354610716919061132b565b90505f6103e8610724610c46565b61072e919061132b565b90508161073b8583611351565b6107459190611368565b949350505050565b5f61064f826109f9565b5f61064f61030b8361084a565b60606040518060800160405280604d8152602001611439604d9139905090565b5f54610100900460ff16158080156107a257505f54600160ff909116105b806107bb5750303b1580156107bb57505f5460ff166001145b6107d75760405162461bcd60e51b81526004016105aa90611387565b5f805460ff1916600117905580156107f8575f805461ff0019166101001790555b61080182610d01565b8015610407575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498906020015b60405180910390a15050565b60405163fe243a1760e01b81526001600160a01b0382811660048301523060248301525f917f00000000000000000000000000000000000000000000000000000000000000009091169063fe243a1790604401602060405180830381865afa1580156108b8573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061064f91906113d5565b600180546002908116036109035760405163840a48d560e01b815260040160405180910390fd5b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461094c576040516348da714f60e01b815260040160405180910390fd5b610957848484610e4c565b6033548083111561097b57604051630b469df360e41b815260040160405180910390fd5b5f6109886103e88361132b565b90505f6103e8610996610c46565b6109a0919061132b565b90505f826109ae8784611351565b6109b89190611368565b90506109c4868561133e565b6033556109e46109d4828461133e565b6103e8603354610547919061132b565b6109ef888883610e92565b5050505050505050565b5f5f6103e8603354610a0b919061132b565b90505f6103e8610a19610c46565b610a23919061132b565b90508061073b8386611351565b5f61064f82610704565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610a96573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610aba91906113ec565b6001600160a01b0316336001600160a01b031614610aeb5760405163794821ff60e01b815260040160405180910390fd5b60015480198219811614610b125760405163c61dca5d60e01b815260040160405180910390fd5b600182905560405182815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c9060200160405180910390a25050565b600181905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a250565b6032546001600160a01b0383811691161480610bb657506064546001600160a01b038381169116145b610bd357604051630312abdd60e61b815260040160405180910390fd5b6064546001600160a01b039081169083160361040757606454604051636f074d1f60e11b8152600481018390526001600160a01b039091169063de0e9a3e906024015f604051808303815f87803b158015610c2c575f5ffd5b505af1158015610c3e573d5f5f3e3d5ffd5b505050505050565b6032546040516370a0823160e01b81523060048201525f916001600160a01b0316906370a0823190602401602060405180830381865afa158015610c8c573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610cb091906113d5565b905090565b7fd2494f3479e5da49d386657c292c610b5b01df313d07c62eb0cfa49924a31be881610ce984670de0b6b3a7640000611351565b610cf39190611368565b60405190815260200161083e565b5f54610100900460ff16610d6b5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b60648201526084016105aa565b603280546001600160a01b0319166001600160a01b038316179055610d8f5f610b50565b7f1c540707b00eb5427b6b774fc799d756516a54aee108b64b327acc55af55750760325f9054906101000a90046001600160a01b0316826001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e01573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e259190611407565b604080516001600160a01b03909316835260ff90911660208301520160405180910390a150565b6032546001600160a01b0383811691161480610e7557506064546001600160a01b038381169116145b61063d57604051630312abdd60e61b815260040160405180910390fd5b6064546001600160a01b0390811690831603610f775760325460405163095ea7b360e01b81526001600160a01b038481166004830152602482018490529091169063095ea7b3906044016020604051808303815f875af1158015610ef8573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f1c91906112f8565b50606454604051630ea598cb60e41b8152600481018390526001600160a01b039091169063ea598cb0906024015f604051808303815f87803b158015610f60575f5ffd5b505af1158015610f72573d5f5f3e3d5ffd5b505050505b604080516001600160a01b03858116602483015260448083018590528351808403909101815260649092018352602080830180516001600160e01b031663a9059cbb60e01b17905283518085019094528084527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65649084015261063d92908516918691859185918591905f9061100f908490849061108e565b905080515f148061102f57508080602001905181019061102f91906112f8565b61063d5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016105aa565b606061074584845f85855f5f866001600160a01b031685876040516110b39190611422565b5f6040518083038185875af1925050503d805f81146110ed576040519150601f19603f3d011682016040523d82523d5f602084013e6110f2565b606091505b50915091506111038783838761110e565b979650505050505050565b6060831561117c5782515f03611175576001600160a01b0385163b6111755760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016105aa565b5081610745565b61074583838151156111915781518083602001fd5b8060405162461bcd60e51b81526004016105aa9190611285565b5f602082840312156111bb575f5ffd5b5035919050565b6001600160a01b03811681146111d6575f5ffd5b50565b5f5f604083850312156111ea575f5ffd5b82356111f5816111c2565b946020939093013593505050565b5f5f60408385031215611214575f5ffd5b823561121f816111c2565b9150602083013561122f816111c2565b809150509250929050565b5f6020828403121561124a575f5ffd5b8135611255816111c2565b9392505050565b60ff811681146111d6575f5ffd5b5f6020828403121561127a575f5ffd5b81356112558161125c565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b5f5f5f606084860312156112cc575f5ffd5b83356112d7816111c2565b925060208401356112e7816111c2565b929592945050506040919091013590565b5f60208284031215611308575f5ffd5b81518015158114611255575f5ffd5b634e487b7160e01b5f52601160045260245ffd5b8082018082111561064f5761064f611317565b8181038181111561064f5761064f611317565b808202811582820484141761064f5761064f611317565b5f8261138257634e487b7160e01b5f52601260045260245ffd5b500490565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b5f602082840312156113e5575f5ffd5b5051919050565b5f602082840312156113fc575f5ffd5b8151611255816111c2565b5f60208284031215611417575f5ffd5b81516112558161125c565b5f82518060208501845e5f92019182525091905056fe4261736520537472617465677920696d706c656d656e746174696f6e20746f20696e68657269742066726f6d20666f72206d6f726520636f6d706c657820696d706c656d656e746174696f6e73a26469706673582212204794c1422585f6a4511ce762465f8983be336de03796ce3647c1c2018cda2b7764736f6c634300081b0033", + Bin: "0x60c060405234801561000f575f5ffd5b5060405161168d38038061168d83398101604081905261002e9161014f565b8181806001600160a01b038116610058576040516339b190bb60e11b815260040160405180910390fd5b6001600160a01b03908116608052821660a05261007361007c565b50505050610187565b5f54610100900460ff16156100e75760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff90811614610136575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b038116811461014c575f5ffd5b50565b5f5f60408385031215610160575f5ffd5b825161016b81610138565b602084015190925061017c81610138565b809150509250929050565b60805160a0516114bb6101d25f395f818161018b0152818161043e01528181610871015261090e01525f81816102540152818161034b0152818161066a0152610a3c01526114bb5ff3fe608060405234801561000f575f5ffd5b506004361061013d575f3560e01c8063886f1195116100b4578063ce7c2ac211610079578063ce7c2ac2146102c4578063d9caed12146102d7578063e3dae51c146102ea578063f3e73875146102fd578063fabc1cbc14610310578063fdc371ce14610323575f5ffd5b8063886f11951461024f5780638c871019146102765780638f6a624014610289578063ab5921e11461029c578063c4d66de8146102b1575f5ffd5b8063485cc95511610105578063485cc955146101d7578063553ca5f8146101ea578063595c6a67146101fd5780635ac86ab7146102055780635c975abb146102345780637a8b26371461023c575f5ffd5b8063136439dd146101415780632495a5991461015657806339b70e38146101865780633a98ef39146101ad57806347e7ef24146101c4575b5f5ffd5b61015461014f3660046111ab565b610336565b005b603254610169906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b6101697f000000000000000000000000000000000000000000000000000000000000000081565b6101b660335481565b60405190815260200161017d565b6101b66101d23660046111d9565b61040b565b6101546101e5366004611203565b610557565b6101b66101f836600461123a565b610642565b610154610655565b61022461021336600461126a565b6001805460ff9092161b9081161490565b604051901515815260200161017d565b6001546101b6565b6101b661024a3660046111ab565b610704565b6101697f000000000000000000000000000000000000000000000000000000000000000081565b6101b66102843660046111ab565b61074d565b6101b661029736600461123a565b610757565b6102a4610764565b60405161017d9190611285565b6101546102bf36600461123a565b610784565b6101b66102d236600461123a565b61084a565b6101546102e53660046112ba565b6108dc565b6101b66102f83660046111ab565b6109f9565b6101b661030b3660046111ab565b610a30565b61015461031e3660046111ab565b610a3a565b606454610169906001600160a01b031681565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa158015610398573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103bc91906112f8565b6103d957604051631d77d47760e21b815260040160405180910390fd5b60015481811681146103fe5760405163c61dca5d60e01b815260040160405180910390fd5b61040782610b50565b5050565b600180545f9182918116036104335760405163840a48d560e01b815260040160405180910390fd5b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461047c576040516348da714f60e01b815260040160405180910390fd5b6104868484610b8d565b6033545f6104966103e88361132b565b90505f6103e86104a4610c46565b6104ae919061132b565b90505f6104bb878361133e565b9050806104c88489611351565b6104d29190611368565b9550855f036104f457604051630c392ed360e11b815260040160405180910390fd5b6104fe868561132b565b60338190556f4b3b4ca85a86c47a098a223fffffffff101561053357604051632f14e8a360e11b815260040160405180910390fd5b61054c826103e8603354610547919061132b565b610cb5565b505050505092915050565b5f54610100900460ff161580801561057557505f54600160ff909116105b8061058e5750303b15801561058e57505f5460ff166001145b6105b35760405162461bcd60e51b81526004016105aa90611387565b60405180910390fd5b5f805460ff1916600117905580156105d4575f805461ff0019166101001790555b606480546001600160a01b0319166001600160a01b0385161790556105f882610d01565b801561063d575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050565b5f61064f61024a8361084a565b92915050565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa1580156106b7573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106db91906112f8565b6106f857604051631d77d47760e21b815260040160405180910390fd5b6107025f19610b50565b565b5f5f6103e8603354610716919061132b565b90505f6103e8610724610c46565b61072e919061132b565b90508161073b8583611351565b6107459190611368565b949350505050565b5f61064f826109f9565b5f61064f61030b8361084a565b60606040518060800160405280604d8152602001611439604d9139905090565b5f54610100900460ff16158080156107a257505f54600160ff909116105b806107bb5750303b1580156107bb57505f5460ff166001145b6107d75760405162461bcd60e51b81526004016105aa90611387565b5f805460ff1916600117905580156107f8575f805461ff0019166101001790555b61080182610d01565b8015610407575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498906020015b60405180910390a15050565b60405163fe243a1760e01b81526001600160a01b0382811660048301523060248301525f917f00000000000000000000000000000000000000000000000000000000000000009091169063fe243a1790604401602060405180830381865afa1580156108b8573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061064f91906113d5565b600180546002908116036109035760405163840a48d560e01b815260040160405180910390fd5b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461094c576040516348da714f60e01b815260040160405180910390fd5b610957848484610e4c565b6033548083111561097b57604051630b469df360e41b815260040160405180910390fd5b5f6109886103e88361132b565b90505f6103e8610996610c46565b6109a0919061132b565b90505f826109ae8784611351565b6109b89190611368565b90506109c4868561133e565b6033556109e46109d4828461133e565b6103e8603354610547919061132b565b6109ef888883610e92565b5050505050505050565b5f5f6103e8603354610a0b919061132b565b90505f6103e8610a19610c46565b610a23919061132b565b90508061073b8386611351565b5f61064f82610704565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610a96573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610aba91906113ec565b6001600160a01b0316336001600160a01b031614610aeb5760405163794821ff60e01b815260040160405180910390fd5b60015480198219811614610b125760405163c61dca5d60e01b815260040160405180910390fd5b600182905560405182815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c9060200160405180910390a25050565b600181905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a250565b6032546001600160a01b0383811691161480610bb657506064546001600160a01b038381169116145b610bd357604051630312abdd60e61b815260040160405180910390fd5b6064546001600160a01b039081169083160361040757606454604051636f074d1f60e11b8152600481018390526001600160a01b039091169063de0e9a3e906024015f604051808303815f87803b158015610c2c575f5ffd5b505af1158015610c3e573d5f5f3e3d5ffd5b505050505050565b6032546040516370a0823160e01b81523060048201525f916001600160a01b0316906370a0823190602401602060405180830381865afa158015610c8c573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610cb091906113d5565b905090565b7fd2494f3479e5da49d386657c292c610b5b01df313d07c62eb0cfa49924a31be881610ce984670de0b6b3a7640000611351565b610cf39190611368565b60405190815260200161083e565b5f54610100900460ff16610d6b5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b60648201526084016105aa565b603280546001600160a01b0319166001600160a01b038316179055610d8f5f610b50565b7f1c540707b00eb5427b6b774fc799d756516a54aee108b64b327acc55af55750760325f9054906101000a90046001600160a01b0316826001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e01573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e259190611407565b604080516001600160a01b03909316835260ff90911660208301520160405180910390a150565b6032546001600160a01b0383811691161480610e7557506064546001600160a01b038381169116145b61063d57604051630312abdd60e61b815260040160405180910390fd5b6064546001600160a01b0390811690831603610f775760325460405163095ea7b360e01b81526001600160a01b038481166004830152602482018490529091169063095ea7b3906044016020604051808303815f875af1158015610ef8573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f1c91906112f8565b50606454604051630ea598cb60e41b8152600481018390526001600160a01b039091169063ea598cb0906024015f604051808303815f87803b158015610f60575f5ffd5b505af1158015610f72573d5f5f3e3d5ffd5b505050505b604080516001600160a01b03858116602483015260448083018590528351808403909101815260649092018352602080830180516001600160e01b031663a9059cbb60e01b17905283518085019094528084527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65649084015261063d92908516918691859185918591905f9061100f908490849061108e565b905080515f148061102f57508080602001905181019061102f91906112f8565b61063d5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016105aa565b606061074584845f85855f5f866001600160a01b031685876040516110b39190611422565b5f6040518083038185875af1925050503d805f81146110ed576040519150601f19603f3d011682016040523d82523d5f602084013e6110f2565b606091505b50915091506111038783838761110e565b979650505050505050565b6060831561117c5782515f03611175576001600160a01b0385163b6111755760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016105aa565b5081610745565b61074583838151156111915781518083602001fd5b8060405162461bcd60e51b81526004016105aa9190611285565b5f602082840312156111bb575f5ffd5b5035919050565b6001600160a01b03811681146111d6575f5ffd5b50565b5f5f604083850312156111ea575f5ffd5b82356111f5816111c2565b946020939093013593505050565b5f5f60408385031215611214575f5ffd5b823561121f816111c2565b9150602083013561122f816111c2565b809150509250929050565b5f6020828403121561124a575f5ffd5b8135611255816111c2565b9392505050565b60ff811681146111d6575f5ffd5b5f6020828403121561127a575f5ffd5b81356112558161125c565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b5f5f5f606084860312156112cc575f5ffd5b83356112d7816111c2565b925060208401356112e7816111c2565b929592945050506040919091013590565b5f60208284031215611308575f5ffd5b81518015158114611255575f5ffd5b634e487b7160e01b5f52601160045260245ffd5b8082018082111561064f5761064f611317565b8181038181111561064f5761064f611317565b808202811582820484141761064f5761064f611317565b5f8261138257634e487b7160e01b5f52601260045260245ffd5b500490565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b5f602082840312156113e5575f5ffd5b5051919050565b5f602082840312156113fc575f5ffd5b8151611255816111c2565b5f60208284031215611417575f5ffd5b81516112558161125c565b5f82518060208501845e5f92019182525091905056fe4261736520537472617465677920696d706c656d656e746174696f6e20746f20696e68657269742066726f6d20666f72206d6f726520636f6d706c657820696d706c656d656e746174696f6e73a26469706673582212201c5c49dc9ba91268a0437894b1f63f6b2c10e2eab9c06e8afea4c24894e65ec564736f6c634300081b0033", } // 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 b2a1f90fff..e2995571cc 100644 --- a/pkg/bindings/Endian/binding.go +++ b/pkg/bindings/Endian/binding.go @@ -32,7 +32,7 @@ var ( // EndianMetaData contains all meta data concerning the Endian contract. var EndianMetaData = &bind.MetaData{ ABI: "[]", - Bin: "0x60556032600b8282823980515f1a607314602657634e487b7160e01b5f525f60045260245ffd5b305f52607381538281f3fe730000000000000000000000000000000000000000301460806040525f5ffdfea2646970667358221220d31d5c2b691cbd0a659ac6a2d7575448cb9db5c1e8b20efb6f6fe9e398049e6b64736f6c634300081b0033", + Bin: "0x60556032600b8282823980515f1a607314602657634e487b7160e01b5f525f60045260245ffd5b305f52607381538281f3fe730000000000000000000000000000000000000000301460806040525f5ffdfea264697066735822122065de58e62fc0153ec81e59074101ab95f4a50a4dc9b195d91698d58ec6e19dcb64736f6c634300081b0033", } // EndianABI is the input ABI used to generate the binding from. diff --git a/pkg/bindings/IAllocationManager/binding.go b/pkg/bindings/IAllocationManager/binding.go index e869a7223e..3f74f32ea9 100644 --- a/pkg/bindings/IAllocationManager/binding.go +++ b/pkg/bindings/IAllocationManager/binding.go @@ -80,7 +80,7 @@ type OperatorSet struct { // IAllocationManagerMetaData contains all meta data concerning the IAllocationManager contract. var IAllocationManagerMetaData = &bind.MetaData{ - ABI: "[{\"type\":\"function\",\"name\":\"addStrategiesToOperatorSet\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetId\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"clearDeallocationQueue\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"numToClear\",\"type\":\"uint16[]\",\"internalType\":\"uint16[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"createOperatorSets\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"params\",\"type\":\"tuple[]\",\"internalType\":\"structIAllocationManagerTypes.CreateSetParams[]\",\"components\":[{\"name\":\"operatorSetId\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"deregisterFromOperatorSets\",\"inputs\":[{\"name\":\"params\",\"type\":\"tuple\",\"internalType\":\"structIAllocationManagerTypes.DeregisterParams\",\"components\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetIds\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"getAVSRegistrar\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIAVSRegistrar\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAllocatableMagnitude\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAllocatedSets\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple[]\",\"internalType\":\"structOperatorSet[]\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAllocatedStrategies\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAllocation\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIAllocationManagerTypes.Allocation\",\"components\":[{\"name\":\"currentMagnitude\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"pendingDiff\",\"type\":\"int128\",\"internalType\":\"int128\"},{\"name\":\"effectBlock\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAllocationDelay\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"isSet\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"delay\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAllocations\",\"inputs\":[{\"name\":\"operators\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple[]\",\"internalType\":\"structIAllocationManagerTypes.Allocation[]\",\"components\":[{\"name\":\"currentMagnitude\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"pendingDiff\",\"type\":\"int128\",\"internalType\":\"int128\"},{\"name\":\"effectBlock\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getEncumberedMagnitude\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getMaxMagnitude\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getMaxMagnitudes\",\"inputs\":[{\"name\":\"operators\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64[]\",\"internalType\":\"uint64[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getMaxMagnitudes\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64[]\",\"internalType\":\"uint64[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getMaxMagnitudesAtBlock\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"blockNumber\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64[]\",\"internalType\":\"uint64[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getMemberCount\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getMembers\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[{\"name\":\"operators\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getMinimumSlashableStake\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"operators\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"futureBlock\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[{\"name\":\"slashableStake\",\"type\":\"uint256[][]\",\"internalType\":\"uint256[][]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getOperatorSetCount\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getRegisteredSets\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"operatorSets\",\"type\":\"tuple[]\",\"internalType\":\"structOperatorSet[]\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getStrategiesInOperatorSet\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getStrategyAllocations\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple[]\",\"internalType\":\"structOperatorSet[]\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"\",\"type\":\"tuple[]\",\"internalType\":\"structIAllocationManagerTypes.Allocation[]\",\"components\":[{\"name\":\"currentMagnitude\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"pendingDiff\",\"type\":\"int128\",\"internalType\":\"int128\"},{\"name\":\"effectBlock\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"initialOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"initialPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"isMemberOfOperatorSet\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isOperatorSet\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"modifyAllocations\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"params\",\"type\":\"tuple[]\",\"internalType\":\"structIAllocationManagerTypes.AllocateParams[]\",\"components\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"newMagnitudes\",\"type\":\"uint64[]\",\"internalType\":\"uint64[]\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"registerForOperatorSets\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"params\",\"type\":\"tuple\",\"internalType\":\"structIAllocationManagerTypes.RegisterParams\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetIds\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"removeStrategiesFromOperatorSet\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetId\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setAVSRegistrar\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"registrar\",\"type\":\"address\",\"internalType\":\"contractIAVSRegistrar\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setAllocationDelay\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"delay\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"slashOperator\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"params\",\"type\":\"tuple\",\"internalType\":\"structIAllocationManagerTypes.SlashingParams\",\"components\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetId\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"wadsToSlash\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"},{\"name\":\"description\",\"type\":\"string\",\"internalType\":\"string\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"updateAVSMetadataURI\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"metadataURI\",\"type\":\"string\",\"internalType\":\"string\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"AVSMetadataURIUpdated\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"metadataURI\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"AVSRegistrarSet\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"registrar\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIAVSRegistrar\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"AllocationDelaySet\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"delay\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"},{\"name\":\"effectBlock\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"AllocationUpdated\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"magnitude\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"effectBlock\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"EncumberedMagnitudeUpdated\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"encumberedMagnitude\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"MaxMagnitudeUpdated\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"maxMagnitude\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorAddedToOperatorSet\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorRemovedFromOperatorSet\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorSetCreated\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorSlashed\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"strategies\",\"type\":\"address[]\",\"indexed\":false,\"internalType\":\"contractIStrategy[]\"},{\"name\":\"wadSlashed\",\"type\":\"uint256[]\",\"indexed\":false,\"internalType\":\"uint256[]\"},{\"name\":\"description\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StrategyAddedToOperatorSet\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StrategyRemovedFromOperatorSet\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"AlreadyMemberOfSet\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InputArrayLengthMismatch\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InsufficientMagnitude\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidCaller\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidOperator\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidOperatorSet\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidWadToSlash\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ModificationAlreadyPending\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotMemberOfSet\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OperatorNotSlashable\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SameMagnitude\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StrategiesMustBeInAscendingOrder\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StrategyAlreadyInOperatorSet\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StrategyNotInOperatorSet\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"UninitializedAllocationDelay\",\"inputs\":[]}]", + ABI: "[{\"type\":\"function\",\"name\":\"addStrategiesToOperatorSet\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetId\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"clearDeallocationQueue\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"numToClear\",\"type\":\"uint16[]\",\"internalType\":\"uint16[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"createOperatorSets\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"params\",\"type\":\"tuple[]\",\"internalType\":\"structIAllocationManagerTypes.CreateSetParams[]\",\"components\":[{\"name\":\"operatorSetId\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"deregisterFromOperatorSets\",\"inputs\":[{\"name\":\"params\",\"type\":\"tuple\",\"internalType\":\"structIAllocationManagerTypes.DeregisterParams\",\"components\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetIds\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"getAVSRegistrar\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIAVSRegistrar\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAllocatableMagnitude\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAllocatedSets\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple[]\",\"internalType\":\"structOperatorSet[]\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAllocatedStake\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"operators\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"outputs\":[{\"name\":\"slashableStake\",\"type\":\"uint256[][]\",\"internalType\":\"uint256[][]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAllocatedStrategies\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAllocation\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIAllocationManagerTypes.Allocation\",\"components\":[{\"name\":\"currentMagnitude\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"pendingDiff\",\"type\":\"int128\",\"internalType\":\"int128\"},{\"name\":\"effectBlock\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAllocationDelay\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"isSet\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"delay\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAllocations\",\"inputs\":[{\"name\":\"operators\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple[]\",\"internalType\":\"structIAllocationManagerTypes.Allocation[]\",\"components\":[{\"name\":\"currentMagnitude\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"pendingDiff\",\"type\":\"int128\",\"internalType\":\"int128\"},{\"name\":\"effectBlock\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getEncumberedMagnitude\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getMaxMagnitude\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getMaxMagnitudes\",\"inputs\":[{\"name\":\"operators\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64[]\",\"internalType\":\"uint64[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getMaxMagnitudes\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64[]\",\"internalType\":\"uint64[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getMaxMagnitudesAtBlock\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"blockNumber\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64[]\",\"internalType\":\"uint64[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getMemberCount\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getMembers\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[{\"name\":\"operators\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getMinimumSlashableStake\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"operators\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"futureBlock\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[{\"name\":\"slashableStake\",\"type\":\"uint256[][]\",\"internalType\":\"uint256[][]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getOperatorSetCount\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getRegisteredSets\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"operatorSets\",\"type\":\"tuple[]\",\"internalType\":\"structOperatorSet[]\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getStrategiesInOperatorSet\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getStrategyAllocations\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple[]\",\"internalType\":\"structOperatorSet[]\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"\",\"type\":\"tuple[]\",\"internalType\":\"structIAllocationManagerTypes.Allocation[]\",\"components\":[{\"name\":\"currentMagnitude\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"pendingDiff\",\"type\":\"int128\",\"internalType\":\"int128\"},{\"name\":\"effectBlock\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"initialOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"initialPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"isMemberOfOperatorSet\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isOperatorSet\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isOperatorSlashable\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"modifyAllocations\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"params\",\"type\":\"tuple[]\",\"internalType\":\"structIAllocationManagerTypes.AllocateParams[]\",\"components\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"newMagnitudes\",\"type\":\"uint64[]\",\"internalType\":\"uint64[]\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"registerForOperatorSets\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"params\",\"type\":\"tuple\",\"internalType\":\"structIAllocationManagerTypes.RegisterParams\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetIds\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"removeStrategiesFromOperatorSet\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetId\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setAVSRegistrar\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"registrar\",\"type\":\"address\",\"internalType\":\"contractIAVSRegistrar\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setAllocationDelay\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"delay\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"slashOperator\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"params\",\"type\":\"tuple\",\"internalType\":\"structIAllocationManagerTypes.SlashingParams\",\"components\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetId\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"wadsToSlash\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"},{\"name\":\"description\",\"type\":\"string\",\"internalType\":\"string\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"updateAVSMetadataURI\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"metadataURI\",\"type\":\"string\",\"internalType\":\"string\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"AVSMetadataURIUpdated\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"metadataURI\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"AVSRegistrarSet\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"registrar\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIAVSRegistrar\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"AllocationDelaySet\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"delay\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"},{\"name\":\"effectBlock\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"AllocationUpdated\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"magnitude\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"effectBlock\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"EncumberedMagnitudeUpdated\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"encumberedMagnitude\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"MaxMagnitudeUpdated\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"maxMagnitude\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorAddedToOperatorSet\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorRemovedFromOperatorSet\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorSetCreated\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorSlashed\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"strategies\",\"type\":\"address[]\",\"indexed\":false,\"internalType\":\"contractIStrategy[]\"},{\"name\":\"wadSlashed\",\"type\":\"uint256[]\",\"indexed\":false,\"internalType\":\"uint256[]\"},{\"name\":\"description\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StrategyAddedToOperatorSet\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StrategyRemovedFromOperatorSet\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"AlreadyMemberOfSet\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InputArrayLengthMismatch\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InsufficientMagnitude\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidCaller\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidOperator\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidOperatorSet\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidWadToSlash\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ModificationAlreadyPending\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotMemberOfSet\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OperatorNotSlashable\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SameMagnitude\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StrategiesMustBeInAscendingOrder\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StrategyAlreadyInOperatorSet\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StrategyNotInOperatorSet\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"UninitializedAllocationDelay\",\"inputs\":[]}]", } // IAllocationManagerABI is the input ABI used to generate the binding from. @@ -322,6 +322,37 @@ func (_IAllocationManager *IAllocationManagerCallerSession) GetAllocatedSets(ope return _IAllocationManager.Contract.GetAllocatedSets(&_IAllocationManager.CallOpts, operator) } +// GetAllocatedStake is a free data retrieval call binding the contract method 0x2b453a9a. +// +// Solidity: function getAllocatedStake((address,uint32) operatorSet, address[] operators, address[] strategies) view returns(uint256[][] slashableStake) +func (_IAllocationManager *IAllocationManagerCaller) GetAllocatedStake(opts *bind.CallOpts, operatorSet OperatorSet, operators []common.Address, strategies []common.Address) ([][]*big.Int, error) { + var out []interface{} + err := _IAllocationManager.contract.Call(opts, &out, "getAllocatedStake", operatorSet, operators, strategies) + + if err != nil { + return *new([][]*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new([][]*big.Int)).(*[][]*big.Int) + + return out0, err + +} + +// GetAllocatedStake is a free data retrieval call binding the contract method 0x2b453a9a. +// +// Solidity: function getAllocatedStake((address,uint32) operatorSet, address[] operators, address[] strategies) view returns(uint256[][] slashableStake) +func (_IAllocationManager *IAllocationManagerSession) GetAllocatedStake(operatorSet OperatorSet, operators []common.Address, strategies []common.Address) ([][]*big.Int, error) { + return _IAllocationManager.Contract.GetAllocatedStake(&_IAllocationManager.CallOpts, operatorSet, operators, strategies) +} + +// GetAllocatedStake is a free data retrieval call binding the contract method 0x2b453a9a. +// +// Solidity: function getAllocatedStake((address,uint32) operatorSet, address[] operators, address[] strategies) view returns(uint256[][] slashableStake) +func (_IAllocationManager *IAllocationManagerCallerSession) GetAllocatedStake(operatorSet OperatorSet, operators []common.Address, strategies []common.Address) ([][]*big.Int, error) { + return _IAllocationManager.Contract.GetAllocatedStake(&_IAllocationManager.CallOpts, operatorSet, operators, strategies) +} + // GetAllocatedStrategies is a free data retrieval call binding the contract method 0xc221d8ae. // // Solidity: function getAllocatedStrategies(address operator, (address,uint32) operatorSet) view returns(address[]) @@ -895,6 +926,37 @@ func (_IAllocationManager *IAllocationManagerCallerSession) IsOperatorSet(operat return _IAllocationManager.Contract.IsOperatorSet(&_IAllocationManager.CallOpts, operatorSet) } +// IsOperatorSlashable is a free data retrieval call binding the contract method 0x1352c3e6. +// +// Solidity: function isOperatorSlashable(address operator, (address,uint32) operatorSet) view returns(bool) +func (_IAllocationManager *IAllocationManagerCaller) IsOperatorSlashable(opts *bind.CallOpts, operator common.Address, operatorSet OperatorSet) (bool, error) { + var out []interface{} + err := _IAllocationManager.contract.Call(opts, &out, "isOperatorSlashable", operator, operatorSet) + + if err != nil { + return *new(bool), err + } + + out0 := *abi.ConvertType(out[0], new(bool)).(*bool) + + return out0, err + +} + +// IsOperatorSlashable is a free data retrieval call binding the contract method 0x1352c3e6. +// +// Solidity: function isOperatorSlashable(address operator, (address,uint32) operatorSet) view returns(bool) +func (_IAllocationManager *IAllocationManagerSession) IsOperatorSlashable(operator common.Address, operatorSet OperatorSet) (bool, error) { + return _IAllocationManager.Contract.IsOperatorSlashable(&_IAllocationManager.CallOpts, operator, operatorSet) +} + +// IsOperatorSlashable is a free data retrieval call binding the contract method 0x1352c3e6. +// +// Solidity: function isOperatorSlashable(address operator, (address,uint32) operatorSet) view returns(bool) +func (_IAllocationManager *IAllocationManagerCallerSession) IsOperatorSlashable(operator common.Address, operatorSet OperatorSet) (bool, error) { + return _IAllocationManager.Contract.IsOperatorSlashable(&_IAllocationManager.CallOpts, operator, operatorSet) +} + // AddStrategiesToOperatorSet is a paid mutator transaction binding the contract method 0x50feea20. // // Solidity: function addStrategiesToOperatorSet(address avs, uint32 operatorSetId, address[] strategies) returns() diff --git a/pkg/bindings/Merkle/binding.go b/pkg/bindings/Merkle/binding.go index 0dc9f1d9c9..d1795f6605 100644 --- a/pkg/bindings/Merkle/binding.go +++ b/pkg/bindings/Merkle/binding.go @@ -32,7 +32,7 @@ var ( // MerkleMetaData contains all meta data concerning the Merkle contract. var MerkleMetaData = &bind.MetaData{ ABI: "[{\"type\":\"error\",\"name\":\"InvalidProofLength\",\"inputs\":[]}]", - Bin: "0x60556032600b8282823980515f1a607314602657634e487b7160e01b5f525f60045260245ffd5b305f52607381538281f3fe730000000000000000000000000000000000000000301460806040525f5ffdfea264697066735822122085b24342099ee34c979b25a8181cab47b19a7b5bb98497e7c396cfeef68fc84564736f6c634300081b0033", + Bin: "0x60556032600b8282823980515f1a607314602657634e487b7160e01b5f525f60045260245ffd5b305f52607381538281f3fe730000000000000000000000000000000000000000301460806040525f5ffdfea26469706673582212208de82ea7f1a22cc126cdf4c3791b57f420fcc4ed980bdbddf119e15f4a112e8964736f6c634300081b0033", } // MerkleABI is the input ABI used to generate the binding from. diff --git a/pkg/bindings/OperatorSetLib/binding.go b/pkg/bindings/OperatorSetLib/binding.go index 6053888ada..a48c2cefdd 100644 --- a/pkg/bindings/OperatorSetLib/binding.go +++ b/pkg/bindings/OperatorSetLib/binding.go @@ -32,7 +32,7 @@ var ( // OperatorSetLibMetaData contains all meta data concerning the OperatorSetLib contract. var OperatorSetLibMetaData = &bind.MetaData{ ABI: "[]", - Bin: "0x60556032600b8282823980515f1a607314602657634e487b7160e01b5f525f60045260245ffd5b305f52607381538281f3fe730000000000000000000000000000000000000000301460806040525f5ffdfea26469706673582212208e75671188dda11a78514701822a433b1e7210d9141d5e2911f793e717037afc64736f6c634300081b0033", + Bin: "0x60556032600b8282823980515f1a607314602657634e487b7160e01b5f525f60045260245ffd5b305f52607381538281f3fe730000000000000000000000000000000000000000301460806040525f5ffdfea264697066735822122023e8e6cb91eee2d3c43ff6cfc219a624b12892e20fd5158ca2b4e1484806bb9c64736f6c634300081b0033", } // OperatorSetLibABI is the input ABI used to generate the binding from. diff --git a/pkg/bindings/PauserRegistry/binding.go b/pkg/bindings/PauserRegistry/binding.go index 1e8885e369..a77ccb9e9d 100644 --- a/pkg/bindings/PauserRegistry/binding.go +++ b/pkg/bindings/PauserRegistry/binding.go @@ -32,7 +32,7 @@ var ( // PauserRegistryMetaData contains all meta data concerning the PauserRegistry contract. var PauserRegistryMetaData = &bind.MetaData{ ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"_pausers\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"_unpauser\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"isPauser\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"setIsPauser\",\"inputs\":[{\"name\":\"newPauser\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"canPause\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setUnpauser\",\"inputs\":[{\"name\":\"newUnpauser\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unpauser\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"event\",\"name\":\"PauserStatusChanged\",\"inputs\":[{\"name\":\"pauser\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"canPause\",\"type\":\"bool\",\"indexed\":false,\"internalType\":\"bool\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"UnpauserChanged\",\"inputs\":[{\"name\":\"previousUnpauser\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"newUnpauser\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"InputAddressZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyUnpauser\",\"inputs\":[]}]", - Bin: "0x608060405234801561000f575f5ffd5b506040516105c83803806105c883398101604081905261002e916101c2565b5f5b825181101561006b5761006383828151811061004e5761004e61029e565b6020026020010151600161007c60201b60201c565b600101610030565b5061007581610103565b50506102b2565b6001600160a01b0382166100a3576040516339b190bb60e11b815260040160405180910390fd5b6001600160a01b0382165f8181526020818152604091829020805460ff19168515159081179091558251938452908301527f65d3a1fd4c13f05cba164f80d03ce90fb4b5e21946bfc3ab7dbd434c2d0b9152910160405180910390a15050565b6001600160a01b03811661012a576040516339b190bb60e11b815260040160405180910390fd5b600154604080516001600160a01b03928316815291831660208301527f06b4167a2528887a1e97a366eefe8549bfbf1ea3e6ac81cb2564a934d20e8892910160405180910390a1600180546001600160a01b0319166001600160a01b0392909216919091179055565b634e487b7160e01b5f52604160045260245ffd5b80516001600160a01b03811681146101bd575f5ffd5b919050565b5f5f604083850312156101d3575f5ffd5b82516001600160401b038111156101e8575f5ffd5b8301601f810185136101f8575f5ffd5b80516001600160401b0381111561021157610211610193565b604051600582901b90603f8201601f191681016001600160401b038111828210171561023f5761023f610193565b60405291825260208184018101929081018884111561025c575f5ffd5b6020850194505b8385101561028257610274856101a7565b815260209485019401610263565b50945061029592505050602084016101a7565b90509250929050565b634e487b7160e01b5f52603260045260245ffd5b610309806102bf5f395ff3fe608060405234801561000f575f5ffd5b506004361061004a575f3560e01c806346fbf68e1461004e5780638568520614610085578063ce5484281461009a578063eab66d7a146100ad575b5f5ffd5b61007061005c36600461027a565b5f6020819052908152604090205460ff1681565b60405190151581526020015b60405180910390f35b61009861009336600461029a565b6100d8565b005b6100986100a836600461027a565b610111565b6001546100c0906001600160a01b031681565b6040516001600160a01b03909116815260200161007c565b6001546001600160a01b031633146101035760405163794821ff60e01b815260040160405180910390fd5b61010d8282610148565b5050565b6001546001600160a01b0316331461013c5760405163794821ff60e01b815260040160405180910390fd5b610145816101cf565b50565b6001600160a01b03821661016f576040516339b190bb60e11b815260040160405180910390fd5b6001600160a01b0382165f8181526020818152604091829020805460ff19168515159081179091558251938452908301527f65d3a1fd4c13f05cba164f80d03ce90fb4b5e21946bfc3ab7dbd434c2d0b9152910160405180910390a15050565b6001600160a01b0381166101f6576040516339b190bb60e11b815260040160405180910390fd5b600154604080516001600160a01b03928316815291831660208301527f06b4167a2528887a1e97a366eefe8549bfbf1ea3e6ac81cb2564a934d20e8892910160405180910390a1600180546001600160a01b0319166001600160a01b0392909216919091179055565b80356001600160a01b0381168114610275575f5ffd5b919050565b5f6020828403121561028a575f5ffd5b6102938261025f565b9392505050565b5f5f604083850312156102ab575f5ffd5b6102b48361025f565b9150602083013580151581146102c8575f5ffd5b80915050925092905056fea2646970667358221220db74dd8a1c2636fc45fee53a0fefff90f86f0498901cb732dc4c0ce26247557164736f6c634300081b0033", + Bin: "0x608060405234801561000f575f5ffd5b506040516105c83803806105c883398101604081905261002e916101c2565b5f5b825181101561006b5761006383828151811061004e5761004e61029e565b6020026020010151600161007c60201b60201c565b600101610030565b5061007581610103565b50506102b2565b6001600160a01b0382166100a3576040516339b190bb60e11b815260040160405180910390fd5b6001600160a01b0382165f8181526020818152604091829020805460ff19168515159081179091558251938452908301527f65d3a1fd4c13f05cba164f80d03ce90fb4b5e21946bfc3ab7dbd434c2d0b9152910160405180910390a15050565b6001600160a01b03811661012a576040516339b190bb60e11b815260040160405180910390fd5b600154604080516001600160a01b03928316815291831660208301527f06b4167a2528887a1e97a366eefe8549bfbf1ea3e6ac81cb2564a934d20e8892910160405180910390a1600180546001600160a01b0319166001600160a01b0392909216919091179055565b634e487b7160e01b5f52604160045260245ffd5b80516001600160a01b03811681146101bd575f5ffd5b919050565b5f5f604083850312156101d3575f5ffd5b82516001600160401b038111156101e8575f5ffd5b8301601f810185136101f8575f5ffd5b80516001600160401b0381111561021157610211610193565b604051600582901b90603f8201601f191681016001600160401b038111828210171561023f5761023f610193565b60405291825260208184018101929081018884111561025c575f5ffd5b6020850194505b8385101561028257610274856101a7565b815260209485019401610263565b50945061029592505050602084016101a7565b90509250929050565b634e487b7160e01b5f52603260045260245ffd5b610309806102bf5f395ff3fe608060405234801561000f575f5ffd5b506004361061004a575f3560e01c806346fbf68e1461004e5780638568520614610085578063ce5484281461009a578063eab66d7a146100ad575b5f5ffd5b61007061005c36600461027a565b5f6020819052908152604090205460ff1681565b60405190151581526020015b60405180910390f35b61009861009336600461029a565b6100d8565b005b6100986100a836600461027a565b610111565b6001546100c0906001600160a01b031681565b6040516001600160a01b03909116815260200161007c565b6001546001600160a01b031633146101035760405163794821ff60e01b815260040160405180910390fd5b61010d8282610148565b5050565b6001546001600160a01b0316331461013c5760405163794821ff60e01b815260040160405180910390fd5b610145816101cf565b50565b6001600160a01b03821661016f576040516339b190bb60e11b815260040160405180910390fd5b6001600160a01b0382165f8181526020818152604091829020805460ff19168515159081179091558251938452908301527f65d3a1fd4c13f05cba164f80d03ce90fb4b5e21946bfc3ab7dbd434c2d0b9152910160405180910390a15050565b6001600160a01b0381166101f6576040516339b190bb60e11b815260040160405180910390fd5b600154604080516001600160a01b03928316815291831660208301527f06b4167a2528887a1e97a366eefe8549bfbf1ea3e6ac81cb2564a934d20e8892910160405180910390a1600180546001600160a01b0319166001600160a01b0392909216919091179055565b80356001600160a01b0381168114610275575f5ffd5b919050565b5f6020828403121561028a575f5ffd5b6102938261025f565b9392505050565b5f5f604083850312156102ab575f5ffd5b6102b48361025f565b9150602083013580151581146102c8575f5ffd5b80915050925092905056fea264697066735822122009d8ba5b235f31c96a07127caff39f4f0438590d75b714b9d6de67448091f19864736f6c634300081b0033", } // PauserRegistryABI is the input ABI used to generate the binding from. diff --git a/pkg/bindings/PermissionController/binding.go b/pkg/bindings/PermissionController/binding.go index 42053b7097..21f037d593 100644 --- a/pkg/bindings/PermissionController/binding.go +++ b/pkg/bindings/PermissionController/binding.go @@ -32,7 +32,7 @@ var ( // PermissionControllerMetaData contains all meta data concerning the PermissionController contract. var PermissionControllerMetaData = &bind.MetaData{ ABI: "[{\"type\":\"constructor\",\"inputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"acceptAdmin\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"addPendingAdmin\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"admin\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"canCall\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"caller\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"target\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"selector\",\"type\":\"bytes4\",\"internalType\":\"bytes4\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAdmins\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAppointeePermissions\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"appointee\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"\",\"type\":\"bytes4[]\",\"internalType\":\"bytes4[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAppointees\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"target\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"selector\",\"type\":\"bytes4\",\"internalType\":\"bytes4\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getPendingAdmins\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isAdmin\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"caller\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isPendingAdmin\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"pendingAdmin\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"removeAdmin\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"admin\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"removeAppointee\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"appointee\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"target\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"selector\",\"type\":\"bytes4\",\"internalType\":\"bytes4\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"removePendingAdmin\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"admin\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setAppointee\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"appointee\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"target\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"selector\",\"type\":\"bytes4\",\"internalType\":\"bytes4\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"AdminRemoved\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"admin\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"AdminSet\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"admin\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"AppointeeRemoved\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"appointee\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"target\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"selector\",\"type\":\"bytes4\",\"indexed\":false,\"internalType\":\"bytes4\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"AppointeeSet\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"appointee\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"target\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"selector\",\"type\":\"bytes4\",\"indexed\":false,\"internalType\":\"bytes4\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"PendingAdminAdded\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"admin\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"PendingAdminRemoved\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"admin\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"AdminAlreadyPending\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"AdminAlreadySet\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"AdminNotPending\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"AdminNotSet\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"AppointeeAlreadySet\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"AppointeeNotSet\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"CannotHaveZeroAdmins\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotAdmin\",\"inputs\":[]}]", - Bin: "0x6080604052348015600e575f5ffd5b5060156019565b60d3565b5f54610100900460ff161560835760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff9081161460d1575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b610f40806100e05f395ff3fe608060405234801561000f575f5ffd5b50600436106100cb575f3560e01c80639100674511610088578063ad8aca7711610063578063ad8aca77146101b0578063df595cb8146101c3578063eb5a4e87146101d6578063fddbdefd146101e9575f5ffd5b80639100674514610167578063950d806e1461018a578063ad5f22101461019d575f5ffd5b806306641201146100cf578063268959e5146100e45780634f906cf9146100f7578063628806ef1461010a5780636bddfa1f1461011d578063882a3b3814610146575b5f5ffd5b6100e26100dd366004610cfa565b6101fc565b005b6100e26100f2366004610d4b565b61031d565b6100e2610105366004610d4b565b6103f8565b6100e2610118366004610d7c565b61049b565b61013061012b366004610d7c565b610529565b60405161013d9190610dd8565b60405180910390f35b610159610154366004610d4b565b610552565b60405161013d929190610dea565b61017a610175366004610d4b565b6106b3565b604051901515815260200161013d565b6100e2610198366004610cfa565b610723565b6101306101ab366004610d7c565b610834565b61017a6101be366004610d4b565b6108da565b61017a6101d1366004610cfa565b6108fb565b6100e26101e4366004610d4b565b610950565b6101306101f7366004610e4c565b610a1e565b8361020781336106b3565b61022457604051637bfa4b9f60e01b815260040160405180910390fd5b6001600160a01b0385165f908152600160205260408120906102468585610a5c565b6001600160a01b0387165f908152600484016020526040902090915061026c9082610a89565b6102895760405163262118cd60e01b815260040160405180910390fd5b6001600160a01b0386165f90815260048301602052604090206102ac9082610aa0565b505f81815260058301602052604090206102c69087610aab565b50856001600160a01b0316876001600160a01b03167f18242326b6b862126970679759169f01f646bd55ec5bfcab85ba9f337a74e0c6878760405161030c929190610e8c565b60405180910390a350505050505050565b8161032881336106b3565b61034557604051637bfa4b9f60e01b815260040160405180910390fd5b6001600160a01b0383165f9081526001602081905260409091206002019061036c82610abf565b1161038a576040516310ce892b60e31b815260040160405180910390fd5b6103948184610aab565b6103b157604051630716d81b60e51b815260040160405180910390fd5b6040516001600160a01b0384811682528516907fdb9d5d31320daf5bc7181d565b6da4d12e30f0f4d5aa324a992426c14a1d19ce906020015b60405180910390a250505050565b8161040381336106b3565b61042057604051637bfa4b9f60e01b815260040160405180910390fd5b6001600160a01b0383165f9081526001602052604090206104418184610aab565b61045e5760405163bed8295f60e01b815260040160405180910390fd5b6040516001600160a01b0384811682528516907fd706ed7ae044d795b49e54c9f519f663053951011985f663a862cd9ee72a9ac7906020016103ea565b6001600160a01b0381165f9081526001602052604090206104bc8133610aab565b6104d95760405163bed8295f60e01b815260040160405180910390fd5b6104e66002820133610ac8565b506040513381526001600160a01b038316907fbf265e8326285a2747e33e54d5945f7111f2b5edb826eb8c08d4677779b3ff979060200160405180910390a25050565b6001600160a01b0381165f90815260016020526040902060609061054c90610adc565b92915050565b6001600160a01b038083165f90815260016020908152604080832093851683526004909301905290812060609182919061058b82610abf565b90505f8167ffffffffffffffff8111156105a7576105a7610eaf565b6040519080825280602002602001820160405280156105d0578160200160208202803683370190505b5090505f8267ffffffffffffffff8111156105ed576105ed610eaf565b604051908082528060200260200182016040528015610616578160200160208202803683370190505b5090505f5b838110156106a5576106496106308683610ae8565b606081901c9160a09190911b6001600160e01b03191690565b84838151811061065b5761065b610ec3565b6020026020010184848151811061067457610674610ec3565b6001600160e01b0319909316602093840291909101909201919091526001600160a01b03909116905260010161061b565b509097909650945050505050565b6001600160a01b0382165f9081526001602052604081206106d690600201610abf565b5f036106f857816001600160a01b0316836001600160a01b031614905061054c565b6001600160a01b0383165f90815260016020526040902061071c9060020183610af3565b9392505050565b8361072e81336106b3565b61074b57604051637bfa4b9f60e01b815260040160405180910390fd5b6001600160a01b0385165f9081526001602052604081209061076d8585610a5c565b6001600160a01b0387165f90815260048401602052604090209091506107939082610a89565b156107b15760405163ad8efeb760e01b815260040160405180910390fd5b6001600160a01b0386165f90815260048301602052604090206107d49082610b14565b505f81815260058301602052604090206107ee9087610ac8565b50856001600160a01b0316876001600160a01b03167f037f03a2ad6b967df4a01779b6d2b4c85950df83925d9e31362b519422fc0169878760405161030c929190610e8c565b6001600160a01b0381165f90815260016020526040902060609061085a90600201610abf565b5f036108b2576040805160018082528183019092525f916020808301908036833701905050905082815f8151811061089457610894610ec3565b6001600160a01b039092166020928302919091019091015292915050565b6001600160a01b0382165f90815260016020526040902061054c90600201610adc565b919050565b6001600160a01b0382165f90815260016020526040812061071c9083610af3565b5f61090685856106b3565b8061094757506109476109198484610a5c565b6001600160a01b038088165f908152600160209081526040808320938a168352600490930190522090610a89565b95945050505050565b8161095b81336106b3565b61097857604051637bfa4b9f60e01b815260040160405180910390fd5b6001600160a01b0383165f90815260016020526040902061099c6002820184610af3565b156109ba5760405163130160e560e31b815260040160405180910390fd5b6109c48184610ac8565b6109e1576040516319abede360e11b815260040160405180910390fd5b6040516001600160a01b0384811682528516907fb14b9a3d448c5b04f0e5b087b6f5193390db7955482a6ffb841e7b3ba61a460c906020016103ea565b60605f610a2b8484610a5c565b6001600160a01b0386165f908152600160209081526040808320848452600501909152902090915061094790610adc565b60609190911b6bffffffffffffffffffffffff191660a09190911c6bffffffff0000000000000000161790565b5f818152600183016020526040812054151561071c565b5f61071c8383610b1f565b5f61071c836001600160a01b038416610b1f565b5f61054c825490565b5f61071c836001600160a01b038416610c02565b60605f61071c83610c4e565b5f61071c8383610ca7565b6001600160a01b0381165f908152600183016020526040812054151561071c565b5f61071c8383610c02565b5f8181526001830160205260408120548015610bf9575f610b41600183610ed7565b85549091505f90610b5490600190610ed7565b9050818114610bb3575f865f018281548110610b7257610b72610ec3565b905f5260205f200154905080875f018481548110610b9257610b92610ec3565b5f918252602080832090910192909255918252600188019052604090208390555b8554869080610bc457610bc4610ef6565b600190038181905f5260205f20015f90559055856001015f8681526020019081526020015f205f90556001935050505061054c565b5f91505061054c565b5f818152600183016020526040812054610c4757508154600181810184555f84815260208082209093018490558454848252828601909352604090209190915561054c565b505f61054c565b6060815f01805480602002602001604051908101604052809291908181526020018280548015610c9b57602002820191905f5260205f20905b815481526020019060010190808311610c87575b50505050509050919050565b5f825f018281548110610cbc57610cbc610ec3565b905f5260205f200154905092915050565b80356001600160a01b03811681146108d5575f5ffd5b80356001600160e01b0319811681146108d5575f5ffd5b5f5f5f5f60808587031215610d0d575f5ffd5b610d1685610ccd565b9350610d2460208601610ccd565b9250610d3260408601610ccd565b9150610d4060608601610ce3565b905092959194509250565b5f5f60408385031215610d5c575f5ffd5b610d6583610ccd565b9150610d7360208401610ccd565b90509250929050565b5f60208284031215610d8c575f5ffd5b61071c82610ccd565b5f8151808452602084019350602083015f5b82811015610dce5781516001600160a01b0316865260209586019590910190600101610da7565b5093949350505050565b602081525f61071c6020830184610d95565b604081525f610dfc6040830185610d95565b82810360208401528084518083526020830191506020860192505f5b81811015610e405783516001600160e01b031916835260209384019390920191600101610e18565b50909695505050505050565b5f5f5f60608486031215610e5e575f5ffd5b610e6784610ccd565b9250610e7560208501610ccd565b9150610e8360408501610ce3565b90509250925092565b6001600160a01b039290921682526001600160e01b031916602082015260400190565b634e487b7160e01b5f52604160045260245ffd5b634e487b7160e01b5f52603260045260245ffd5b8181038181111561054c57634e487b7160e01b5f52601160045260245ffd5b634e487b7160e01b5f52603160045260245ffdfea2646970667358221220d51174d6b3c524ff4f2a28349f859cd925e5fb8f0c1cd6c178158e9059cdc26c64736f6c634300081b0033", + Bin: "0x6080604052348015600e575f5ffd5b5060156019565b60d3565b5f54610100900460ff161560835760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff9081161460d1575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b610f40806100e05f395ff3fe608060405234801561000f575f5ffd5b50600436106100cb575f3560e01c80639100674511610088578063ad8aca7711610063578063ad8aca77146101b0578063df595cb8146101c3578063eb5a4e87146101d6578063fddbdefd146101e9575f5ffd5b80639100674514610167578063950d806e1461018a578063ad5f22101461019d575f5ffd5b806306641201146100cf578063268959e5146100e45780634f906cf9146100f7578063628806ef1461010a5780636bddfa1f1461011d578063882a3b3814610146575b5f5ffd5b6100e26100dd366004610cfa565b6101fc565b005b6100e26100f2366004610d4b565b61031d565b6100e2610105366004610d4b565b6103f8565b6100e2610118366004610d7c565b61049b565b61013061012b366004610d7c565b610529565b60405161013d9190610dd8565b60405180910390f35b610159610154366004610d4b565b610552565b60405161013d929190610dea565b61017a610175366004610d4b565b6106b3565b604051901515815260200161013d565b6100e2610198366004610cfa565b610723565b6101306101ab366004610d7c565b610834565b61017a6101be366004610d4b565b6108da565b61017a6101d1366004610cfa565b6108fb565b6100e26101e4366004610d4b565b610950565b6101306101f7366004610e4c565b610a1e565b8361020781336106b3565b61022457604051637bfa4b9f60e01b815260040160405180910390fd5b6001600160a01b0385165f908152600160205260408120906102468585610a5c565b6001600160a01b0387165f908152600484016020526040902090915061026c9082610a89565b6102895760405163262118cd60e01b815260040160405180910390fd5b6001600160a01b0386165f90815260048301602052604090206102ac9082610aa0565b505f81815260058301602052604090206102c69087610aab565b50856001600160a01b0316876001600160a01b03167f18242326b6b862126970679759169f01f646bd55ec5bfcab85ba9f337a74e0c6878760405161030c929190610e8c565b60405180910390a350505050505050565b8161032881336106b3565b61034557604051637bfa4b9f60e01b815260040160405180910390fd5b6001600160a01b0383165f9081526001602081905260409091206002019061036c82610abf565b1161038a576040516310ce892b60e31b815260040160405180910390fd5b6103948184610aab565b6103b157604051630716d81b60e51b815260040160405180910390fd5b6040516001600160a01b0384811682528516907fdb9d5d31320daf5bc7181d565b6da4d12e30f0f4d5aa324a992426c14a1d19ce906020015b60405180910390a250505050565b8161040381336106b3565b61042057604051637bfa4b9f60e01b815260040160405180910390fd5b6001600160a01b0383165f9081526001602052604090206104418184610aab565b61045e5760405163bed8295f60e01b815260040160405180910390fd5b6040516001600160a01b0384811682528516907fd706ed7ae044d795b49e54c9f519f663053951011985f663a862cd9ee72a9ac7906020016103ea565b6001600160a01b0381165f9081526001602052604090206104bc8133610aab565b6104d95760405163bed8295f60e01b815260040160405180910390fd5b6104e66002820133610ac8565b506040513381526001600160a01b038316907fbf265e8326285a2747e33e54d5945f7111f2b5edb826eb8c08d4677779b3ff979060200160405180910390a25050565b6001600160a01b0381165f90815260016020526040902060609061054c90610adc565b92915050565b6001600160a01b038083165f90815260016020908152604080832093851683526004909301905290812060609182919061058b82610abf565b90505f8167ffffffffffffffff8111156105a7576105a7610eaf565b6040519080825280602002602001820160405280156105d0578160200160208202803683370190505b5090505f8267ffffffffffffffff8111156105ed576105ed610eaf565b604051908082528060200260200182016040528015610616578160200160208202803683370190505b5090505f5b838110156106a5576106496106308683610ae8565b606081901c9160a09190911b6001600160e01b03191690565b84838151811061065b5761065b610ec3565b6020026020010184848151811061067457610674610ec3565b6001600160e01b0319909316602093840291909101909201919091526001600160a01b03909116905260010161061b565b509097909650945050505050565b6001600160a01b0382165f9081526001602052604081206106d690600201610abf565b5f036106f857816001600160a01b0316836001600160a01b031614905061054c565b6001600160a01b0383165f90815260016020526040902061071c9060020183610af3565b9392505050565b8361072e81336106b3565b61074b57604051637bfa4b9f60e01b815260040160405180910390fd5b6001600160a01b0385165f9081526001602052604081209061076d8585610a5c565b6001600160a01b0387165f90815260048401602052604090209091506107939082610a89565b156107b15760405163ad8efeb760e01b815260040160405180910390fd5b6001600160a01b0386165f90815260048301602052604090206107d49082610b14565b505f81815260058301602052604090206107ee9087610ac8565b50856001600160a01b0316876001600160a01b03167f037f03a2ad6b967df4a01779b6d2b4c85950df83925d9e31362b519422fc0169878760405161030c929190610e8c565b6001600160a01b0381165f90815260016020526040902060609061085a90600201610abf565b5f036108b2576040805160018082528183019092525f916020808301908036833701905050905082815f8151811061089457610894610ec3565b6001600160a01b039092166020928302919091019091015292915050565b6001600160a01b0382165f90815260016020526040902061054c90600201610adc565b919050565b6001600160a01b0382165f90815260016020526040812061071c9083610af3565b5f61090685856106b3565b8061094757506109476109198484610a5c565b6001600160a01b038088165f908152600160209081526040808320938a168352600490930190522090610a89565b95945050505050565b8161095b81336106b3565b61097857604051637bfa4b9f60e01b815260040160405180910390fd5b6001600160a01b0383165f90815260016020526040902061099c6002820184610af3565b156109ba5760405163130160e560e31b815260040160405180910390fd5b6109c48184610ac8565b6109e1576040516319abede360e11b815260040160405180910390fd5b6040516001600160a01b0384811682528516907fb14b9a3d448c5b04f0e5b087b6f5193390db7955482a6ffb841e7b3ba61a460c906020016103ea565b60605f610a2b8484610a5c565b6001600160a01b0386165f908152600160209081526040808320848452600501909152902090915061094790610adc565b60609190911b6bffffffffffffffffffffffff191660a09190911c6bffffffff0000000000000000161790565b5f818152600183016020526040812054151561071c565b5f61071c8383610b1f565b5f61071c836001600160a01b038416610b1f565b5f61054c825490565b5f61071c836001600160a01b038416610c02565b60605f61071c83610c4e565b5f61071c8383610ca7565b6001600160a01b0381165f908152600183016020526040812054151561071c565b5f61071c8383610c02565b5f8181526001830160205260408120548015610bf9575f610b41600183610ed7565b85549091505f90610b5490600190610ed7565b9050818114610bb3575f865f018281548110610b7257610b72610ec3565b905f5260205f200154905080875f018481548110610b9257610b92610ec3565b5f918252602080832090910192909255918252600188019052604090208390555b8554869080610bc457610bc4610ef6565b600190038181905f5260205f20015f90559055856001015f8681526020019081526020015f205f90556001935050505061054c565b5f91505061054c565b5f818152600183016020526040812054610c4757508154600181810184555f84815260208082209093018490558454848252828601909352604090209190915561054c565b505f61054c565b6060815f01805480602002602001604051908101604052809291908181526020018280548015610c9b57602002820191905f5260205f20905b815481526020019060010190808311610c87575b50505050509050919050565b5f825f018281548110610cbc57610cbc610ec3565b905f5260205f200154905092915050565b80356001600160a01b03811681146108d5575f5ffd5b80356001600160e01b0319811681146108d5575f5ffd5b5f5f5f5f60808587031215610d0d575f5ffd5b610d1685610ccd565b9350610d2460208601610ccd565b9250610d3260408601610ccd565b9150610d4060608601610ce3565b905092959194509250565b5f5f60408385031215610d5c575f5ffd5b610d6583610ccd565b9150610d7360208401610ccd565b90509250929050565b5f60208284031215610d8c575f5ffd5b61071c82610ccd565b5f8151808452602084019350602083015f5b82811015610dce5781516001600160a01b0316865260209586019590910190600101610da7565b5093949350505050565b602081525f61071c6020830184610d95565b604081525f610dfc6040830185610d95565b82810360208401528084518083526020830191506020860192505f5b81811015610e405783516001600160e01b031916835260209384019390920191600101610e18565b50909695505050505050565b5f5f5f60608486031215610e5e575f5ffd5b610e6784610ccd565b9250610e7560208501610ccd565b9150610e8360408501610ce3565b90509250925092565b6001600160a01b039290921682526001600160e01b031916602082015260400190565b634e487b7160e01b5f52604160045260245ffd5b634e487b7160e01b5f52603260045260245ffd5b8181038181111561054c57634e487b7160e01b5f52601160045260245ffd5b634e487b7160e01b5f52603160045260245ffdfea2646970667358221220b63ce7fd361f505a43fbbc1e192d669b57efb369c86636afa2dd2f0c28075a1264736f6c634300081b0033", } // PermissionControllerABI 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 80d435d426..675133506a 100644 --- a/pkg/bindings/RewardsCoordinator/binding.go +++ b/pkg/bindings/RewardsCoordinator/binding.go @@ -106,6 +106,7 @@ var RewardsCoordinatorMetaData = &bind.MetaData{ ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"_delegationManager\",\"type\":\"address\",\"internalType\":\"contractIDelegationManager\"},{\"name\":\"_strategyManager\",\"type\":\"address\",\"internalType\":\"contractIStrategyManager\"},{\"name\":\"_allocationManager\",\"type\":\"address\",\"internalType\":\"contractIAllocationManager\"},{\"name\":\"_pauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"},{\"name\":\"_permissionController\",\"type\":\"address\",\"internalType\":\"contractIPermissionController\"},{\"name\":\"_CALCULATION_INTERVAL_SECONDS\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"_MAX_REWARDS_DURATION\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"_MAX_RETROACTIVE_LENGTH\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"_MAX_FUTURE_LENGTH\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"_GENESIS_REWARDS_TIMESTAMP\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"CALCULATION_INTERVAL_SECONDS\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"GENESIS_REWARDS_TIMESTAMP\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAX_FUTURE_LENGTH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAX_RETROACTIVE_LENGTH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAX_REWARDS_DURATION\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activationDelay\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"allocationManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIAllocationManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"beaconChainETHStrategy\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"calculateEarnerLeafHash\",\"inputs\":[{\"name\":\"leaf\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinatorTypes.EarnerTreeMerkleLeaf\",\"components\":[{\"name\":\"earner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"earnerTokenRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"calculateTokenLeafHash\",\"inputs\":[{\"name\":\"leaf\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinatorTypes.TokenTreeMerkleLeaf\",\"components\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"cumulativeEarnings\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"checkClaim\",\"inputs\":[{\"name\":\"claim\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinatorTypes.RewardsMerkleClaim\",\"components\":[{\"name\":\"rootIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"earnerIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"earnerTreeProof\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"earnerLeaf\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinatorTypes.EarnerTreeMerkleLeaf\",\"components\":[{\"name\":\"earner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"earnerTokenRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"tokenIndices\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"},{\"name\":\"tokenTreeProofs\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"},{\"name\":\"tokenLeaves\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.TokenTreeMerkleLeaf[]\",\"components\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"cumulativeEarnings\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"claimerFor\",\"inputs\":[{\"name\":\"earner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"claimer\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"createAVSRewardsSubmission\",\"inputs\":[{\"name\":\"rewardsSubmissions\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.RewardsSubmission[]\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.StrategyAndMultiplier[]\",\"components\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"multiplier\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"duration\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"createOperatorDirectedAVSRewardsSubmission\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorDirectedRewardsSubmissions\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.OperatorDirectedRewardsSubmission[]\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.StrategyAndMultiplier[]\",\"components\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"multiplier\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"operatorRewards\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.OperatorReward[]\",\"components\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"startTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"duration\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"description\",\"type\":\"string\",\"internalType\":\"string\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"createRewardsForAllEarners\",\"inputs\":[{\"name\":\"rewardsSubmissions\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.RewardsSubmission[]\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.StrategyAndMultiplier[]\",\"components\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"multiplier\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"duration\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"createRewardsForAllSubmission\",\"inputs\":[{\"name\":\"rewardsSubmissions\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.RewardsSubmission[]\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.StrategyAndMultiplier[]\",\"components\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"multiplier\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"duration\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"cumulativeClaimed\",\"inputs\":[{\"name\":\"earner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"outputs\":[{\"name\":\"totalClaimed\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"currRewardsCalculationEndTimestamp\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"defaultOperatorSplitBips\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"delegationManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIDelegationManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"disableRoot\",\"inputs\":[{\"name\":\"rootIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"getCurrentClaimableDistributionRoot\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinatorTypes.DistributionRoot\",\"components\":[{\"name\":\"root\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"rewardsCalculationEndTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"activatedAt\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"disabled\",\"type\":\"bool\",\"internalType\":\"bool\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getCurrentDistributionRoot\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinatorTypes.DistributionRoot\",\"components\":[{\"name\":\"root\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"rewardsCalculationEndTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"activatedAt\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"disabled\",\"type\":\"bool\",\"internalType\":\"bool\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getDistributionRootAtIndex\",\"inputs\":[{\"name\":\"index\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinatorTypes.DistributionRoot\",\"components\":[{\"name\":\"root\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"rewardsCalculationEndTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"activatedAt\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"disabled\",\"type\":\"bool\",\"internalType\":\"bool\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getDistributionRootsLength\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getOperatorAVSSplit\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getOperatorPISplit\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getRootIndexFromHash\",\"inputs\":[{\"name\":\"rootHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"initialOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"initialPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_rewardsUpdater\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_activationDelay\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"_defaultSplitBips\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"isAVSRewardsSubmissionHash\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"hash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"valid\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isOperatorDirectedAVSRewardsSubmissionHash\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isRewardsForAllSubmitter\",\"inputs\":[{\"name\":\"submitter\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"valid\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isRewardsSubmissionForAllEarnersHash\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"hash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"valid\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isRewardsSubmissionForAllHash\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"hash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"valid\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"pauseAll\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[{\"name\":\"index\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pauserRegistry\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"permissionController\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIPermissionController\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"processClaim\",\"inputs\":[{\"name\":\"claim\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinatorTypes.RewardsMerkleClaim\",\"components\":[{\"name\":\"rootIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"earnerIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"earnerTreeProof\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"earnerLeaf\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinatorTypes.EarnerTreeMerkleLeaf\",\"components\":[{\"name\":\"earner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"earnerTokenRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"tokenIndices\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"},{\"name\":\"tokenTreeProofs\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"},{\"name\":\"tokenLeaves\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.TokenTreeMerkleLeaf[]\",\"components\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"cumulativeEarnings\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}]},{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"processClaims\",\"inputs\":[{\"name\":\"claims\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.RewardsMerkleClaim[]\",\"components\":[{\"name\":\"rootIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"earnerIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"earnerTreeProof\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"earnerLeaf\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinatorTypes.EarnerTreeMerkleLeaf\",\"components\":[{\"name\":\"earner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"earnerTokenRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"tokenIndices\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"},{\"name\":\"tokenTreeProofs\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"},{\"name\":\"tokenLeaves\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.TokenTreeMerkleLeaf[]\",\"components\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"cumulativeEarnings\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}]},{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"rewardsUpdater\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"setActivationDelay\",\"inputs\":[{\"name\":\"_activationDelay\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setClaimerFor\",\"inputs\":[{\"name\":\"claimer\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setClaimerFor\",\"inputs\":[{\"name\":\"earner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"claimer\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setDefaultOperatorSplit\",\"inputs\":[{\"name\":\"split\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setOperatorAVSSplit\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"split\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setOperatorPISplit\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"split\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setRewardsForAllSubmitter\",\"inputs\":[{\"name\":\"_submitter\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_newValue\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setRewardsUpdater\",\"inputs\":[{\"name\":\"_rewardsUpdater\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"strategyManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategyManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"submissionNonce\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"nonce\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"submitRoot\",\"inputs\":[{\"name\":\"root\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"rewardsCalculationEndTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"AVSRewardsSubmissionCreated\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"submissionNonce\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"rewardsSubmissionHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"rewardsSubmission\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIRewardsCoordinatorTypes.RewardsSubmission\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.StrategyAndMultiplier[]\",\"components\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"multiplier\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"duration\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ActivationDelaySet\",\"inputs\":[{\"name\":\"oldActivationDelay\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"},{\"name\":\"newActivationDelay\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ClaimerForSet\",\"inputs\":[{\"name\":\"earner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"oldClaimer\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"claimer\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DefaultOperatorSplitBipsSet\",\"inputs\":[{\"name\":\"oldDefaultOperatorSplitBips\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"},{\"name\":\"newDefaultOperatorSplitBips\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DistributionRootDisabled\",\"inputs\":[{\"name\":\"rootIndex\",\"type\":\"uint32\",\"indexed\":true,\"internalType\":\"uint32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DistributionRootSubmitted\",\"inputs\":[{\"name\":\"rootIndex\",\"type\":\"uint32\",\"indexed\":true,\"internalType\":\"uint32\"},{\"name\":\"root\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"rewardsCalculationEndTimestamp\",\"type\":\"uint32\",\"indexed\":true,\"internalType\":\"uint32\"},{\"name\":\"activatedAt\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorAVSSplitBipsSet\",\"inputs\":[{\"name\":\"caller\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"avs\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"activatedAt\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"},{\"name\":\"oldOperatorAVSSplitBips\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"},{\"name\":\"newOperatorAVSSplitBips\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorDirectedAVSRewardsSubmissionCreated\",\"inputs\":[{\"name\":\"caller\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"avs\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"operatorDirectedRewardsSubmissionHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"submissionNonce\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"operatorDirectedRewardsSubmission\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIRewardsCoordinatorTypes.OperatorDirectedRewardsSubmission\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.StrategyAndMultiplier[]\",\"components\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"multiplier\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"operatorRewards\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.OperatorReward[]\",\"components\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"startTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"duration\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"description\",\"type\":\"string\",\"internalType\":\"string\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorPISplitBipsSet\",\"inputs\":[{\"name\":\"caller\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"activatedAt\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"},{\"name\":\"oldOperatorPISplitBips\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"},{\"name\":\"newOperatorPISplitBips\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RewardsClaimed\",\"inputs\":[{\"name\":\"root\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"},{\"name\":\"earner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"claimer\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"recipient\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"token\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIERC20\"},{\"name\":\"claimedAmount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RewardsForAllSubmitterSet\",\"inputs\":[{\"name\":\"rewardsForAllSubmitter\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"oldValue\",\"type\":\"bool\",\"indexed\":true,\"internalType\":\"bool\"},{\"name\":\"newValue\",\"type\":\"bool\",\"indexed\":true,\"internalType\":\"bool\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RewardsSubmissionForAllCreated\",\"inputs\":[{\"name\":\"submitter\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"submissionNonce\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"rewardsSubmissionHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"rewardsSubmission\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIRewardsCoordinatorTypes.RewardsSubmission\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.StrategyAndMultiplier[]\",\"components\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"multiplier\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"duration\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RewardsSubmissionForAllEarnersCreated\",\"inputs\":[{\"name\":\"tokenHopper\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"submissionNonce\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"rewardsSubmissionHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"rewardsSubmission\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIRewardsCoordinatorTypes.RewardsSubmission\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.StrategyAndMultiplier[]\",\"components\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"multiplier\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"duration\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RewardsUpdaterSet\",\"inputs\":[{\"name\":\"oldRewardsUpdater\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newRewardsUpdater\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"AmountExceedsMax\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"AmountIsZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"CurrentlyPaused\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"DurationExceedsMax\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"EarningsNotGreaterThanClaimed\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InputAddressZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InputArrayLengthMismatch\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InputArrayLengthZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidAddressZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidCalculationIntervalSecondsRemainder\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidClaimProof\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidDurationRemainder\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidEarner\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidEarnerLeafIndex\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidGenesisRewardsTimestampRemainder\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidNewPausedStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidPermissions\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidProofLength\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidRoot\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidRootIndex\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidStartTimestampRemainder\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidTokenLeafIndex\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NewRootMustBeForNewCalculatedPeriod\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyPauser\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyUnpauser\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OperatorsNotInAscendingOrder\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"PreviousSplitPending\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RewardsEndTimestampNotElapsed\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RootAlreadyActivated\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RootDisabled\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RootNotActivated\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SplitExceedsMax\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StartTimestampTooFarInFuture\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StartTimestampTooFarInPast\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StrategiesNotInAscendingOrder\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StrategyNotWhitelisted\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SubmissionNotRetroactive\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"UnauthorizedCaller\",\"inputs\":[]}]", <<<<<<< HEAD <<<<<<< HEAD +<<<<<<< HEAD <<<<<<< HEAD Bin: "0x6101c0604052348015610010575f5ffd5b506040516142d63803806142d683398101604081905261002f91610211565b858a8a8a88888888888f6001600160a01b038116610060576040516339b190bb60e11b815260040160405180910390fd5b6001600160a01b031660805261007685826102d3565b63ffffffff161561009a57604051630e06bd3160e01b815260040160405180910390fd5b6100a762015180866102d3565b63ffffffff16156100cb5760405163223c7b3960e11b815260040160405180910390fd5b6001600160a01b0397881660a05295871660c05293861660e05263ffffffff9283166101005290821661012052811661014052908116610160521661018052166101a052610117610126565b50505050505050505050610306565b5f54610100900460ff16156101915760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff908116146101e0575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b03811681146101f6575f5ffd5b50565b805163ffffffff8116811461020c575f5ffd5b919050565b5f5f5f5f5f5f5f5f5f5f6101408b8d03121561022b575f5ffd5b8a51610236816101e2565b60208c0151909a50610247816101e2565b60408c0151909950610258816101e2565b60608c0151909850610269816101e2565b60808c015190975061027a816101e2565b955061028860a08c016101f9565b945061029660c08c016101f9565b93506102a460e08c016101f9565b92506102b36101008c016101f9565b91506102c26101208c016101f9565b90509295989b9194979a5092959850565b5f63ffffffff8316806102f457634e487b7160e01b5f52601260045260245ffd5b8063ffffffff84160691505092915050565b60805160a05160c05160e05161010051610120516101405161016051610180516101a051613f066103d05f395f81816105a601526129ee01525f818161045a0152612f2f01525f81816103bc015261233201525f81816105080152612eed01525f818161080c0152612dfd01525f818161076001528181612e4d0152612e9b01525f81816108600152611a2601525f818161052f0152612fca01525f81816108d3015261199601525f81816106f201528181610b62015281816111750152611dcb0152613f065ff3fe608060405234801561000f575f5ffd5b506004361061037c575f3560e01c8063886f1195116101d4578063dcbb03b311610109578063f2fde38b116100a9578063fabc1cbc11610079578063fabc1cbc14610981578063fbf1e2c114610994578063fce36c7d146109a7578063ff9f6cce146109ba575f5ffd5b8063f2fde38b14610935578063f6efbb5914610948578063f8cd84481461095b578063f96abf2e1461096e575f5ffd5b8063e810ce21116100e4578063e810ce21146108bb578063ea4d3c9b146108ce578063ed71e6a2146108f5578063f22cef8514610922575f5ffd5b8063dcbb03b314610882578063de02e50314610895578063e063f81f146108a8575f5ffd5b8063a50a1d9c11610174578063bb7e451f1161014f578063bb7e451f146107e8578063bf21a8aa14610807578063c46db6061461082e578063ca8aa7c71461085b575f5ffd5b8063a50a1d9c14610795578063aebd8bae146107a8578063b3dbb0e0146107d5575f5ffd5b80639be3d4e4116101af5780639be3d4e4146107405780639cb9a5fa146107485780639d45c2811461075b578063a0169ddd14610782575f5ffd5b8063886f1195146106ed5780638da5cb5b146107145780639104c31914610725575f5ffd5b80634596021c116102b55780635c975abb11610255578063715018a611610225578063715018a6146106a05780637b8f8b05146106a8578063863cb9a9146106b0578063865c6953146106c3575f5ffd5b80635c975abb146106435780635e9d83481461064b57806363f6a7981461065e5780636d21117e14610673575f5ffd5b80634d18cc35116102905780634d18cc35146105ee57806358baaa3e14610605578063595c6a67146106185780635ac86ab714610620575f5ffd5b80634596021c1461058e5780634657e26a146105a15780634b943960146105c8575f5ffd5b80632b9f64a41161032057806339b70e38116102fb57806339b70e381461052a5780633a8c0786146105515780633ccc861d146105685780633efe1db61461057b575f5ffd5b80632b9f64a4146104b057806336af41fa146104f057806337838ed014610503575f5ffd5b80630eb383451161035b5780630eb3834514610440578063131433b414610455578063136439dd1461047c578063149bc8721461048f575f5ffd5b806218572c1461038057806304a0c502146103b75780630e9a53cf146103f3575b5f5ffd5b6103a261038e3660046134e6565b60d16020525f908152604090205460ff1681565b60405190151581526020015b60405180910390f35b6103de7f000000000000000000000000000000000000000000000000000000000000000081565b60405163ffffffff90911681526020016103ae565b6103fb6109cd565b6040516103ae91905f6080820190508251825263ffffffff602084015116602083015263ffffffff604084015116604083015260608301511515606083015292915050565b61045361044e36600461350e565b610acd565b005b6103de7f000000000000000000000000000000000000000000000000000000000000000081565b61045361048a366004613545565b610b4d565b6104a261049d366004613572565b610c22565b6040519081526020016103ae565b6104d86104be3660046134e6565b60cc6020525f90815260409020546001600160a01b031681565b6040516001600160a01b0390911681526020016103ae565b6104536104fe3660046135d4565b610c97565b6103de7f000000000000000000000000000000000000000000000000000000000000000081565b6104d87f000000000000000000000000000000000000000000000000000000000000000081565b60cb546103de90600160a01b900463ffffffff1681565b610453610576366004613624565b610e37565b61045361058936600461367b565b610e7c565b61045361059c3660046136a5565b611070565b6104d87f000000000000000000000000000000000000000000000000000000000000000081565b6105db6105d63660046134e6565b6110f1565b60405161ffff90911681526020016103ae565b60cb546103de90600160c01b900463ffffffff1681565b6104536106133660046136f8565b61114c565b610453611160565b6103a261062e366004613711565b606654600160ff9092169190911b9081161490565b6066546104a2565b6103a2610659366004613731565b61120f565b60cb546105db90600160e01b900461ffff1681565b6103a2610681366004613763565b60cf60209081525f928352604080842090915290825290205460ff1681565b61045361129a565b60ca546104a2565b6104536106be3660046134e6565b6112ab565b6104a26106d136600461378d565b60cd60209081525f928352604080842090915290825290205481565b6104d87f000000000000000000000000000000000000000000000000000000000000000081565b6033546001600160a01b03166104d8565b6104d873beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac081565b6103fb6112bc565b6104536107563660046137b9565b611358565b6103de7f000000000000000000000000000000000000000000000000000000000000000081565b6104536107903660046134e6565b611503565b6104536107a336600461381b565b61150e565b6103a26107b6366004613763565b60d260209081525f928352604080842090915290825290205460ff1681565b6104536107e3366004613834565b61151f565b6104a26107f63660046134e6565b60ce6020525f908152604090205481565b6103de7f000000000000000000000000000000000000000000000000000000000000000081565b6103a261083c366004613763565b60d060209081525f928352604080842090915290825290205460ff1681565b6104d87f000000000000000000000000000000000000000000000000000000000000000081565b61045361089036600461385e565b611668565b6103fb6108a3366004613545565b6117d3565b6105db6108b636600461378d565b611863565b6103de6108c9366004613545565b6118cf565b6104d87f000000000000000000000000000000000000000000000000000000000000000081565b6103a2610903366004613763565b60d360209081525f928352604080842090915290825290205460ff1681565b61045361093036600461378d565b611950565b6104536109433660046134e6565b611aba565b6104536109563660046138a2565b611b35565b6104a2610969366004613572565b611c6a565b61045361097c3660046136f8565b611c7a565b61045361098f366004613545565b611dc9565b60cb546104d8906001600160a01b031681565b6104536109b53660046135d4565b611edf565b6104536109c83660046135d4565b61202e565b604080516080810182525f80825260208201819052918101829052606081019190915260ca545b8015610aa5575f60ca610a08600184613914565b81548110610a1857610a18613927565b5f91825260209182902060408051608081018252600293909302909101805483526001015463ffffffff80821694840194909452600160201b810490931690820152600160401b90910460ff161580156060830181905291925090610a875750806040015163ffffffff164210155b15610a925792915050565b5080610a9d8161393b565b9150506109f4565b5050604080516080810182525f80825260208201819052918101829052606081019190915290565b610ad56121ad565b6001600160a01b0382165f81815260d1602052604080822054905160ff9091169284151592841515927f4de6293e668df1398422e1def12118052c1539a03cbfedc145895d48d7685f1c9190a4506001600160a01b03919091165f90815260d160205260409020805460ff1916911515919091179055565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa158015610baf573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610bd39190613950565b610bf057604051631d77d47760e21b815260040160405180910390fd5b6066548181168114610c155760405163c61dca5d60e01b815260040160405180910390fd5b610c1e82612207565b5050565b5f80610c3160208401846134e6565b8360200135604051602001610c7a9392919060f89390931b6001600160f81b031916835260609190911b6bffffffffffffffffffffffff19166001830152601582015260350190565b604051602081830303815290604052805190602001209050919050565b606654600190600290811603610cc05760405163840a48d560e01b815260040160405180910390fd5b335f90815260d1602052604090205460ff16610cef57604051635c427cd960e01b815260040160405180910390fd5b610cf7612244565b5f5b82811015610e275736848483818110610d1457610d14613927565b9050602002810190610d26919061396b565b335f81815260ce60209081526040808320549051949550939192610d509290918591879101613ab9565b604051602081830303815290604052805190602001209050610d718361229d565b335f90815260d0602090815260408083208484529091529020805460ff19166001908117909155610da3908390613ae8565b335f81815260ce602052604090819020929092559051829184917f51088b8c89628df3a8174002c2a034d0152fce6af8415d651b2a4734bf27048290610dea908890613afb565b60405180910390a4610e1c333060408601803590610e0b90602089016134e6565b6001600160a01b031692919061238d565b505050600101610cf9565b50610e326001609755565b505050565b606654600290600490811603610e605760405163840a48d560e01b815260040160405180910390fd5b610e68612244565b610e7283836123f8565b610e326001609755565b606654600390600890811603610ea55760405163840a48d560e01b815260040160405180910390fd5b60cb546001600160a01b03163314610ed057604051635c427cd960e01b815260040160405180910390fd5b60cb5463ffffffff600160c01b909104811690831611610f0357604051631ca7e50b60e21b815260040160405180910390fd5b428263ffffffff1610610f29576040516306957c9160e11b815260040160405180910390fd5b60ca5460cb545f90610f4890600160a01b900463ffffffff1642613b0d565b6040805160808101825287815263ffffffff87811660208084018281528684168587018181525f6060880181815260ca8054600181018255925297517f42d72674974f694b5f5159593243114d38a5c39c89d6b62fee061ff523240ee160029092029182015592517f42d72674974f694b5f5159593243114d38a5c39c89d6b62fee061ff523240ee290930180549151975193871667ffffffffffffffff1990921691909117600160201b978716979097029690961760ff60401b1916600160401b921515929092029190911790945560cb805463ffffffff60c01b1916600160c01b840217905593519283529394508892908616917fecd866c3c158fa00bf34d803d5f6023000b57080bcb48af004c2b4b46b3afd08910160405180910390a45050505050565b6066546002906004908116036110995760405163840a48d560e01b815260040160405180910390fd5b6110a1612244565b5f5b838110156110e0576110d88585838181106110c0576110c0613927565b90506020028101906110d29190613b29565b846123f8565b6001016110a3565b506110eb6001609755565b50505050565b6001600160a01b0381165f90815260d5602090815260408083208151606081018352905461ffff80821683526201000082041693820193909352600160201b90920463ffffffff169082015261114690612680565b92915050565b6111546121ad565b61115d816126f0565b50565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa1580156111c2573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111e69190613950565b61120357604051631d77d47760e21b815260040160405180910390fd5b61120d5f19612207565b565b5f6112928260ca61122360208301836136f8565b63ffffffff168154811061123957611239613927565b5f91825260209182902060408051608081018252600293909302909101805483526001015463ffffffff80821694840194909452600160201b810490931690820152600160401b90910460ff1615156060820152612761565b506001919050565b6112a26121ad565b61120d5f612904565b6112b36121ad565b61115d81612955565b604080516080810182525f80825260208201819052918101829052606081019190915260ca80546112ef90600190613914565b815481106112ff576112ff613927565b5f91825260209182902060408051608081018252600293909302909101805483526001015463ffffffff80821694840194909452600160201b810490931690820152600160401b90910460ff1615156060820152919050565b6066546005906020908116036113815760405163840a48d560e01b815260040160405180910390fd5b8361138b816129b0565b6113a85760405163932d94f760e01b815260040160405180910390fd5b6113b0612244565b5f5b838110156114f157368585838181106113cd576113cd613927565b90506020028101906113df9190613b3d565b6001600160a01b0388165f90815260ce6020908152604080832054905193945092611410918b918591879101613cab565b6040516020818303038152906040528051906020012090505f61143284612a5a565b6001600160a01b038b165f90815260d3602090815260408083208684529091529020805460ff19166001908117909155909150611470908490613ae8565b6001600160a01b038b165f81815260ce60205260409081902092909255905183919033907ffc8888bffd711da60bc5092b33f677d81896fe80ecc677b84cfab8184462b6e0906114c39088908a90613cd1565b60405180910390a46114e1333083610e0b6040890160208a016134e6565b5050600190920191506113b29050565b506114fc6001609755565b5050505050565b33610c1e8183612c40565b6115166121ad565b61115d81612ca3565b6066546007906080908116036115485760405163840a48d560e01b815260040160405180910390fd5b82611552816129b0565b61156f5760405163932d94f760e01b815260040160405180910390fd5b60cb545f9061158b90600160a01b900463ffffffff1642613b0d565b6001600160a01b0386165f90815260d5602090815260408083208151606081018352905461ffff80821683526201000082041693820193909352600160201b90920463ffffffff1690820152919250906115e490612680565b6001600160a01b0387165f90815260d560205260409020909150611609908684612d0e565b6040805163ffffffff8416815261ffff838116602083015287168183015290516001600160a01b0388169133917fd1e028bd664486a46ad26040e999cd2d22e1e9a094ee6afe19fcf64678f16f749181900360600190a3505050505050565b6066546006906040908116036116915760405163840a48d560e01b815260040160405180910390fd5b8361169b816129b0565b6116b85760405163932d94f760e01b815260040160405180910390fd5b60cb545f906116d490600160a01b900463ffffffff1642613b0d565b6001600160a01b038781165f90815260d460209081526040808320938a1683529281528282208351606081018552905461ffff80821683526201000082041692820192909252600160201b90910463ffffffff169281019290925291925061173b90612680565b6001600160a01b038089165f90815260d460209081526040808320938b1683529290522090915061176d908684612d0e565b6040805163ffffffff8416815261ffff838116602083015287168183015290516001600160a01b0388811692908a169133917f48e198b6ae357e529204ee53a8e514c470ff77d9cc8e4f7207f8b5d490ae6934919081900360600190a450505050505050565b604080516080810182525f80825260208201819052918101829052606081019190915260ca828154811061180957611809613927565b5f91825260209182902060408051608081018252600293909302909101805483526001015463ffffffff80821694840194909452600160201b810490931690820152600160401b90910460ff161515606082015292915050565b6001600160a01b038281165f90815260d46020908152604080832093851683529281528282208351606081018552905461ffff80821683526201000082041692820192909252600160201b90910463ffffffff1692810192909252906118c890612680565b9392505050565b60ca545f905b63ffffffff811615611936578260ca6118ef600184613ce9565b63ffffffff168154811061190557611905613927565b905f5260205f2090600202015f015403611924576118c8600182613ce9565b8061192e81613d05565b9150506118d5565b5060405163504570e360e01b815260040160405180910390fd5b8161195a816129b0565b6119775760405163932d94f760e01b815260040160405180910390fd5b6040516336b87bd760e11b81526001600160a01b0384811660048301527f00000000000000000000000000000000000000000000000000000000000000001690636d70f7ae90602401602060405180830381865afa1580156119db573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906119ff9190613950565b80611a93575060405163ba1a84e560e01b81526001600160a01b0384811660048301525f917f00000000000000000000000000000000000000000000000000000000000000009091169063ba1a84e590602401602060405180830381865afa158015611a6d573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a919190613d23565b115b611ab05760405163fb494ea160e01b815260040160405180910390fd5b610e328383612c40565b611ac26121ad565b6001600160a01b038116611b2c5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084015b60405180910390fd5b61115d81612904565b5f54610100900460ff1615808015611b5357505f54600160ff909116105b80611b6c5750303b158015611b6c57505f5460ff166001145b611bcf5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401611b23565b5f805460ff191660011790558015611bf0575f805461ff0019166101001790555b611bf985612207565b611c0286612904565b611c0b84612955565b611c14836126f0565b611c1d82612ca3565b8015611c62575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050505050565b5f6001610c3160208401846134e6565b606654600390600890811603611ca35760405163840a48d560e01b815260040160405180910390fd5b60cb546001600160a01b03163314611cce57604051635c427cd960e01b815260040160405180910390fd5b60ca5463ffffffff831610611cf6576040516394a8d38960e01b815260040160405180910390fd5b5f60ca8363ffffffff1681548110611d1057611d10613927565b905f5260205f20906002020190508060010160089054906101000a900460ff1615611d4e57604051631b14174b60e01b815260040160405180910390fd5b6001810154600160201b900463ffffffff164210611d7f57604051630c36f66560e21b815260040160405180910390fd5b60018101805460ff60401b1916600160401b17905560405163ffffffff8416907fd850e6e5dfa497b72661fa73df2923464eaed9dc2ff1d3cb82bccbfeabe5c41e905f90a2505050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611e25573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611e499190613d3a565b6001600160a01b0316336001600160a01b031614611e7a5760405163794821ff60e01b815260040160405180910390fd5b60665480198219811614611ea15760405163c61dca5d60e01b815260040160405180910390fd5b606682905560405182815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c9060200160405180910390a25050565b6066545f90600190811603611f075760405163840a48d560e01b815260040160405180910390fd5b611f0f612244565b5f5b82811015610e275736848483818110611f2c57611f2c613927565b9050602002810190611f3e919061396b565b335f81815260ce60209081526040808320549051949550939192611f689290918591879101613ab9565b604051602081830303815290604052805190602001209050611f898361229d565b335f90815260cf602090815260408083208484529091529020805460ff19166001908117909155611fbb908390613ae8565b335f81815260ce602052604090819020929092559051829184917f450a367a380c4e339e5ae7340c8464ef27af7781ad9945cfe8abd828f89e628190612002908890613afb565b60405180910390a4612023333060408601803590610e0b90602089016134e6565b505050600101611f11565b6066546004906010908116036120575760405163840a48d560e01b815260040160405180910390fd5b335f90815260d1602052604090205460ff1661208657604051635c427cd960e01b815260040160405180910390fd5b61208e612244565b5f5b82811015610e2757368484838181106120ab576120ab613927565b90506020028101906120bd919061396b565b335f81815260ce602090815260408083205490519495509391926120e79290918591879101613ab9565b6040516020818303038152906040528051906020012090506121088361229d565b335f90815260d2602090815260408083208484529091529020805460ff1916600190811790915561213a908390613ae8565b335f81815260ce602052604090819020929092559051829184917f5251b6fdefcb5d81144e735f69ea4c695fd43b0289ca53dc075033f5fc80068b90612181908890613afb565b60405180910390a46121a2333060408601803590610e0b90602089016134e6565b505050600101612090565b6033546001600160a01b0316331461120d5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401611b23565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a250565b6002609754036122965760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401611b23565b6002609755565b6122cf6122aa8280613d55565b6122ba60808501606086016136f8565b6122ca60a08601608087016136f8565b612ddd565b5f8160400135116122f3576040516310eb483f60e21b815260040160405180910390fd5b6f4b3b4ca85a86c47a098a223fffffffff816040013511156123285760405163070b5a6f60e21b815260040160405180910390fd5b61235863ffffffff7f00000000000000000000000000000000000000000000000000000000000000001642613ae8565b61236860808301606084016136f8565b63ffffffff16111561115d57604051637ee2b44360e01b815260040160405180910390fd5b6040516001600160a01b03808516602483015283166044820152606481018290526110eb9085906323b872dd60e01b906084015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b0319909316929092179091526130b5565b5f60ca61240860208501856136f8565b63ffffffff168154811061241e5761241e613927565b5f91825260209182902060408051608081018252600293909302909101805483526001015463ffffffff80821694840194909452600160201b810490931690820152600160401b90910460ff1615156060820152905061247e8382612761565b5f61248f60808501606086016134e6565b6001600160a01b038082165f90815260cc602052604090205491925016806124b45750805b336001600160a01b038216146124dd57604051635c427cd960e01b815260040160405180910390fd5b5f5b6124ec60a0870187613d9b565b9050811015611c62573661250360e0880188613d55565b8381811061251357612513613927565b6001600160a01b0387165f90815260cd602090815260408083209302949094019450929091508290612547908501856134e6565b6001600160a01b03166001600160a01b031681526020019081526020015f205490508082602001351161258d5760405163aa385e8160e01b815260040160405180910390fd5b5f61259c826020850135613914565b6001600160a01b0387165f90815260cd602090815260408220929350850180359291906125c990876134e6565b6001600160a01b031681526020808201929092526040015f209190915561260a90899083906125fa908701876134e6565b6001600160a01b03169190613188565b86516001600160a01b03808a1691878216918916907f9543dbd55580842586a951f0386e24d68a5df99ae29e3b216588b45fd684ce319061264e60208901896134e6565b604080519283526001600160a01b039091166020830152810186905260600160405180910390a45050506001016124df565b5f816040015163ffffffff165f14806126b25750815161ffff9081161480156126b25750816040015163ffffffff1642105b156126ca57505060cb54600160e01b900461ffff1690565b816040015163ffffffff164210156126e3578151611146565b506020015190565b919050565b60cb546040805163ffffffff600160a01b9093048316815291831660208301527faf557c6c02c208794817a705609cfa935f827312a1adfdd26494b6b95dd2b4b3910160405180910390a160cb805463ffffffff909216600160a01b0263ffffffff60a01b19909216919091179055565b80606001511561278457604051631b14174b60e01b815260040160405180910390fd5b806040015163ffffffff164210156127af57604051631437a2bb60e31b815260040160405180910390fd5b6127bc60c0830183613d9b565b90506127cb60a0840184613d9b565b9050146127eb576040516343714afd60e01b815260040160405180910390fd5b6127f860e0830183613d55565b905061280760c0840184613d9b565b905014612827576040516343714afd60e01b815260040160405180910390fd5b80516128539061283d60408501602086016136f8565b61284a6040860186613de1565b866060016131b8565b5f5b61286260a0840184613d9b565b9050811015610e32576128fc608084013561288060a0860186613d9b565b8481811061289057612890613927565b90506020020160208101906128a591906136f8565b6128b260c0870187613d9b565b858181106128c2576128c2613927565b90506020028101906128d49190613de1565b6128e160e0890189613d55565b878181106128f1576128f1613927565b90506040020161325c565b600101612855565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b60cb546040516001600160a01b038084169216907f237b82f438d75fc568ebab484b75b01d9287b9e98b490b7c23221623b6705dbb905f90a360cb80546001600160a01b0319166001600160a01b0392909216919091179055565b604051631beb2b9760e31b81526001600160a01b0382811660048301523360248301523060448301525f80356001600160e01b0319166064840152917f00000000000000000000000000000000000000000000000000000000000000009091169063df595cb8906084016020604051808303815f875af1158015612a36573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111469190613950565b5f612a88612a688380613d55565b612a7860808601606087016136f8565b6122ca60a08701608088016136f8565b5f612a966040840184613d55565b905011612ab65760405163796cc52560e01b815260040160405180910390fd5b42612ac760a08401608085016136f8565b612ad760808501606086016136f8565b612ae19190613b0d565b63ffffffff1610612b055760405163150358a160e21b815260040160405180910390fd5b5f80805b612b166040860186613d55565b9050811015612c075736612b2d6040870187613d55565b83818110612b3d57612b3d613927565b6040029190910191505f9050612b5660208301836134e6565b6001600160a01b031603612b7d57604051630863a45360e11b815260040160405180910390fd5b612b8a60208201826134e6565b6001600160a01b0316836001600160a01b031610612bbb576040516310fb47f160e31b815260040160405180910390fd5b5f816020013511612bdf576040516310eb483f60e21b815260040160405180910390fd5b612bec60208201826134e6565b9250612bfc602082013585613ae8565b935050600101612b09565b506f4b3b4ca85a86c47a098a223fffffffff821115612c395760405163070b5a6f60e21b815260040160405180910390fd5b5092915050565b6001600160a01b038083165f81815260cc602052604080822080548686166001600160a01b0319821681179092559151919094169392849290917fbab947934d42e0ad206f25c9cab18b5bb6ae144acfb00f40b4e3aa59590ca3129190a4505050565b60cb546040805161ffff600160e01b9093048316815291831660208301527fe6cd4edfdcc1f6d130ab35f73d72378f3a642944fb4ee5bd84b7807a81ea1c4e910160405180910390a160cb805461ffff909216600160e01b0261ffff60e01b19909216919091179055565b61271061ffff83161115612d355760405163891c63df60e01b815260040160405180910390fd5b8254600160201b900463ffffffff164211612d6357604051637b1e25c560e01b815260040160405180910390fd5b8254600160201b900463ffffffff165f03612d8a57825461ffff191661ffff178355612da1565b825462010000810461ffff1661ffff199091161783555b825463ffffffff909116600160201b0267ffffffff000000001961ffff90931662010000029290921667ffffffffffff00001990911617179055565b82612dfb5760405163796cc52560e01b815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000063ffffffff168163ffffffff161115612e4857604051630dd0b9f560e21b815260040160405180910390fd5b612e727f000000000000000000000000000000000000000000000000000000000000000082613e38565b63ffffffff1615612e965760405163ee66470560e01b815260040160405180910390fd5b612ec07f000000000000000000000000000000000000000000000000000000000000000083613e38565b63ffffffff1615612ee457604051633c1a94f160e21b815260040160405180910390fd5b8163ffffffff167f000000000000000000000000000000000000000000000000000000000000000063ffffffff1642612f1d9190613914565b11158015612f5757508163ffffffff167f000000000000000000000000000000000000000000000000000000000000000063ffffffff1611155b612f745760405163041aa75760e11b815260040160405180910390fd5b5f805b84811015611c62575f868683818110612f9257612f92613927565b612fa892602060409092020190810191506134e6565b60405163198f077960e21b81526001600160a01b0380831660048301529192507f00000000000000000000000000000000000000000000000000000000000000009091169063663c1de490602401602060405180830381865afa158015613011573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906130359190613950565b8061305c57506001600160a01b03811673beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac0145b61307957604051632efd965160e11b815260040160405180910390fd5b806001600160a01b0316836001600160a01b0316106130ab5760405163dfad9ca160e01b815260040160405180910390fd5b9150600101612f77565b5f613109826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b031661329a9092919063ffffffff16565b905080515f14806131295750808060200190518101906131299190613950565b610e325760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401611b23565b6040516001600160a01b038316602482015260448101829052610e3290849063a9059cbb60e01b906064016123c1565b6131c3602083613e5f565b6001901b8463ffffffff16106131eb5760405162c6c39d60e71b815260040160405180910390fd5b5f6131f582610c22565b905061323f84848080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152508a92508591505063ffffffff89166132b0565b611c62576040516369ca16c960e01b815260040160405180910390fd5b613267602083613e5f565b6001901b8463ffffffff16106132905760405163054ff4df60e51b815260040160405180910390fd5b5f6131f582611c6a565b60606132a884845f856132c7565b949350505050565b5f836132bd86858561339e565b1495945050505050565b6060824710156133285760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401611b23565b5f5f866001600160a01b031685876040516133439190613e72565b5f6040518083038185875af1925050503d805f811461337d576040519150601f19603f3d011682016040523d82523d5f602084013e613382565b606091505b509150915061339387838387613435565b979650505050505050565b5f602084516133ad9190613e88565b156133cb576040516313717da960e21b815260040160405180910390fd5b8260205b8551811161342c576133e2600285613e88565b5f0361340357815f528086015160205260405f20915060028404935061341a565b808601515f528160205260405f2091506002840493505b613425602082613ae8565b90506133cf565b50949350505050565b606083156134a35782515f0361349c576001600160a01b0385163b61349c5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401611b23565b50816132a8565b6132a883838151156134b85781518083602001fd5b8060405162461bcd60e51b8152600401611b239190613e9b565b6001600160a01b038116811461115d575f5ffd5b5f602082840312156134f6575f5ffd5b81356118c8816134d2565b801515811461115d575f5ffd5b5f5f6040838503121561351f575f5ffd5b823561352a816134d2565b9150602083013561353a81613501565b809150509250929050565b5f60208284031215613555575f5ffd5b5035919050565b5f6040828403121561356c575f5ffd5b50919050565b5f60408284031215613582575f5ffd5b6118c8838361355c565b5f5f83601f84011261359c575f5ffd5b50813567ffffffffffffffff8111156135b3575f5ffd5b6020830191508360208260051b85010111156135cd575f5ffd5b9250929050565b5f5f602083850312156135e5575f5ffd5b823567ffffffffffffffff8111156135fb575f5ffd5b6136078582860161358c565b90969095509350505050565b5f610100828403121561356c575f5ffd5b5f5f60408385031215613635575f5ffd5b823567ffffffffffffffff81111561364b575f5ffd5b61365785828601613613565b925050602083013561353a816134d2565b803563ffffffff811681146126eb575f5ffd5b5f5f6040838503121561368c575f5ffd5b8235915061369c60208401613668565b90509250929050565b5f5f5f604084860312156136b7575f5ffd5b833567ffffffffffffffff8111156136cd575f5ffd5b6136d98682870161358c565b90945092505060208401356136ed816134d2565b809150509250925092565b5f60208284031215613708575f5ffd5b6118c882613668565b5f60208284031215613721575f5ffd5b813560ff811681146118c8575f5ffd5b5f60208284031215613741575f5ffd5b813567ffffffffffffffff811115613757575f5ffd5b6132a884828501613613565b5f5f60408385031215613774575f5ffd5b823561377f816134d2565b946020939093013593505050565b5f5f6040838503121561379e575f5ffd5b82356137a9816134d2565b9150602083013561353a816134d2565b5f5f5f604084860312156137cb575f5ffd5b83356137d6816134d2565b9250602084013567ffffffffffffffff8111156137f1575f5ffd5b6137fd8682870161358c565b9497909650939450505050565b803561ffff811681146126eb575f5ffd5b5f6020828403121561382b575f5ffd5b6118c88261380a565b5f5f60408385031215613845575f5ffd5b8235613850816134d2565b915061369c6020840161380a565b5f5f5f60608486031215613870575f5ffd5b833561387b816134d2565b9250602084013561388b816134d2565b91506138996040850161380a565b90509250925092565b5f5f5f5f5f60a086880312156138b6575f5ffd5b85356138c1816134d2565b94506020860135935060408601356138d8816134d2565b92506138e660608701613668565b91506138f46080870161380a565b90509295509295909350565b634e487b7160e01b5f52601160045260245ffd5b8181038181111561114657611146613900565b634e487b7160e01b5f52603260045260245ffd5b5f8161394957613949613900565b505f190190565b5f60208284031215613960575f5ffd5b81516118c881613501565b5f8235609e1983360301811261397f575f5ffd5b9190910192915050565b5f5f8335601e1984360301811261399e575f5ffd5b830160208101925035905067ffffffffffffffff8111156139bd575f5ffd5b8060061b36038213156135cd575f5ffd5b8183526020830192505f815f5b84811015613a315781356139ee816134d2565b6001600160a01b0316865260208201356bffffffffffffffffffffffff8116808214613a18575f5ffd5b60208801525060409586019591909101906001016139db565b5093949350505050565b5f613a468283613989565b60a08552613a5860a0860182846139ce565b9150506020830135613a69816134d2565b6001600160a01b031660208501526040838101359085015263ffffffff613a9260608501613668565b16606085015263ffffffff613aa960808501613668565b1660808501528091505092915050565b60018060a01b0384168152826020820152606060408201525f613adf6060830184613a3b565b95945050505050565b8082018082111561114657611146613900565b602081525f6118c86020830184613a3b565b63ffffffff818116838216019081111561114657611146613900565b5f823560fe1983360301811261397f575f5ffd5b5f823560be1983360301811261397f575f5ffd5b5f5f8335601e19843603018112613b66575f5ffd5b830160208101925035905067ffffffffffffffff811115613b85575f5ffd5b8036038213156135cd575f5ffd5b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b5f613bc68283613989565b60c08552613bd860c0860182846139ce565b9150506020830135613be9816134d2565b6001600160a01b03166020850152613c046040840184613989565b858303604087015280835290915f91906020015b81831015613c53578335613c2b816134d2565b6001600160a01b03168152602084810135908201526040938401936001939093019201613c18565b613c5f60608701613668565b63ffffffff811660608901529350613c7960808701613668565b63ffffffff811660808901529350613c9460a0870187613b51565b9450925086810360a0880152613393818585613b93565b60018060a01b0384168152826020820152606060408201525f613adf6060830184613bbb565b828152604060208201525f6132a86040830184613bbb565b63ffffffff828116828216039081111561114657611146613900565b5f63ffffffff821680613d1a57613d1a613900565b5f190192915050565b5f60208284031215613d33575f5ffd5b5051919050565b5f60208284031215613d4a575f5ffd5b81516118c8816134d2565b5f5f8335601e19843603018112613d6a575f5ffd5b83018035915067ffffffffffffffff821115613d84575f5ffd5b6020019150600681901b36038213156135cd575f5ffd5b5f5f8335601e19843603018112613db0575f5ffd5b83018035915067ffffffffffffffff821115613dca575f5ffd5b6020019150600581901b36038213156135cd575f5ffd5b5f5f8335601e19843603018112613df6575f5ffd5b83018035915067ffffffffffffffff821115613e10575f5ffd5b6020019150368190038213156135cd575f5ffd5b634e487b7160e01b5f52601260045260245ffd5b5f63ffffffff831680613e4d57613e4d613e24565b8063ffffffff84160691505092915050565b5f82613e6d57613e6d613e24565b500490565b5f82518060208501845e5f920191825250919050565b5f82613e9657613e96613e24565b500690565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f8301168401019150509291505056fea264697066735822122038b85e072953498a6772816d5247c44e56b614c9fdac6ebf7b0e16c898f84d4b64736f6c634300081b0033", >>>>>>> 7da92a53 (fix: remove token param from Deposit event and related APIs (#1013)) @@ -118,6 +119,9 @@ var RewardsCoordinatorMetaData = &bind.MetaData{ ======= Bin: "0x6101c0604052348015610010575f5ffd5b506040516142d63803806142d683398101604081905261002f91610211565b858a8a8a88888888888f6001600160a01b038116610060576040516339b190bb60e11b815260040160405180910390fd5b6001600160a01b031660805261007685826102d3565b63ffffffff161561009a57604051630e06bd3160e01b815260040160405180910390fd5b6100a762015180866102d3565b63ffffffff16156100cb5760405163223c7b3960e11b815260040160405180910390fd5b6001600160a01b0397881660a05295871660c05293861660e05263ffffffff9283166101005290821661012052811661014052908116610160521661018052166101a052610117610126565b50505050505050505050610306565b5f54610100900460ff16156101915760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff908116146101e0575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b03811681146101f6575f5ffd5b50565b805163ffffffff8116811461020c575f5ffd5b919050565b5f5f5f5f5f5f5f5f5f5f6101408b8d03121561022b575f5ffd5b8a51610236816101e2565b60208c0151909a50610247816101e2565b60408c0151909950610258816101e2565b60608c0151909850610269816101e2565b60808c015190975061027a816101e2565b955061028860a08c016101f9565b945061029660c08c016101f9565b93506102a460e08c016101f9565b92506102b36101008c016101f9565b91506102c26101208c016101f9565b90509295989b9194979a5092959850565b5f63ffffffff8316806102f457634e487b7160e01b5f52601260045260245ffd5b8063ffffffff84160691505092915050565b60805160a05160c05160e05161010051610120516101405161016051610180516101a051613f066103d05f395f81816105a601526129ee01525f818161045a0152612f2f01525f81816103bc015261233201525f81816105080152612eed01525f818161080c0152612dfd01525f818161076001528181612e4d0152612e9b01525f81816108600152611a2601525f818161052f0152612fca01525f81816108d3015261199601525f81816106f201528181610b62015281816111750152611dcb0152613f065ff3fe608060405234801561000f575f5ffd5b506004361061037c575f3560e01c8063886f1195116101d4578063dcbb03b311610109578063f2fde38b116100a9578063fabc1cbc11610079578063fabc1cbc14610981578063fbf1e2c114610994578063fce36c7d146109a7578063ff9f6cce146109ba575f5ffd5b8063f2fde38b14610935578063f6efbb5914610948578063f8cd84481461095b578063f96abf2e1461096e575f5ffd5b8063e810ce21116100e4578063e810ce21146108bb578063ea4d3c9b146108ce578063ed71e6a2146108f5578063f22cef8514610922575f5ffd5b8063dcbb03b314610882578063de02e50314610895578063e063f81f146108a8575f5ffd5b8063a50a1d9c11610174578063bb7e451f1161014f578063bb7e451f146107e8578063bf21a8aa14610807578063c46db6061461082e578063ca8aa7c71461085b575f5ffd5b8063a50a1d9c14610795578063aebd8bae146107a8578063b3dbb0e0146107d5575f5ffd5b80639be3d4e4116101af5780639be3d4e4146107405780639cb9a5fa146107485780639d45c2811461075b578063a0169ddd14610782575f5ffd5b8063886f1195146106ed5780638da5cb5b146107145780639104c31914610725575f5ffd5b80634596021c116102b55780635c975abb11610255578063715018a611610225578063715018a6146106a05780637b8f8b05146106a8578063863cb9a9146106b0578063865c6953146106c3575f5ffd5b80635c975abb146106435780635e9d83481461064b57806363f6a7981461065e5780636d21117e14610673575f5ffd5b80634d18cc35116102905780634d18cc35146105ee57806358baaa3e14610605578063595c6a67146106185780635ac86ab714610620575f5ffd5b80634596021c1461058e5780634657e26a146105a15780634b943960146105c8575f5ffd5b80632b9f64a41161032057806339b70e38116102fb57806339b70e381461052a5780633a8c0786146105515780633ccc861d146105685780633efe1db61461057b575f5ffd5b80632b9f64a4146104b057806336af41fa146104f057806337838ed014610503575f5ffd5b80630eb383451161035b5780630eb3834514610440578063131433b414610455578063136439dd1461047c578063149bc8721461048f575f5ffd5b806218572c1461038057806304a0c502146103b75780630e9a53cf146103f3575b5f5ffd5b6103a261038e3660046134e6565b60d16020525f908152604090205460ff1681565b60405190151581526020015b60405180910390f35b6103de7f000000000000000000000000000000000000000000000000000000000000000081565b60405163ffffffff90911681526020016103ae565b6103fb6109cd565b6040516103ae91905f6080820190508251825263ffffffff602084015116602083015263ffffffff604084015116604083015260608301511515606083015292915050565b61045361044e36600461350e565b610acd565b005b6103de7f000000000000000000000000000000000000000000000000000000000000000081565b61045361048a366004613545565b610b4d565b6104a261049d366004613572565b610c22565b6040519081526020016103ae565b6104d86104be3660046134e6565b60cc6020525f90815260409020546001600160a01b031681565b6040516001600160a01b0390911681526020016103ae565b6104536104fe3660046135d4565b610c97565b6103de7f000000000000000000000000000000000000000000000000000000000000000081565b6104d87f000000000000000000000000000000000000000000000000000000000000000081565b60cb546103de90600160a01b900463ffffffff1681565b610453610576366004613624565b610e37565b61045361058936600461367b565b610e7c565b61045361059c3660046136a5565b611070565b6104d87f000000000000000000000000000000000000000000000000000000000000000081565b6105db6105d63660046134e6565b6110f1565b60405161ffff90911681526020016103ae565b60cb546103de90600160c01b900463ffffffff1681565b6104536106133660046136f8565b61114c565b610453611160565b6103a261062e366004613711565b606654600160ff9092169190911b9081161490565b6066546104a2565b6103a2610659366004613731565b61120f565b60cb546105db90600160e01b900461ffff1681565b6103a2610681366004613763565b60cf60209081525f928352604080842090915290825290205460ff1681565b61045361129a565b60ca546104a2565b6104536106be3660046134e6565b6112ab565b6104a26106d136600461378d565b60cd60209081525f928352604080842090915290825290205481565b6104d87f000000000000000000000000000000000000000000000000000000000000000081565b6033546001600160a01b03166104d8565b6104d873beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac081565b6103fb6112bc565b6104536107563660046137b9565b611358565b6103de7f000000000000000000000000000000000000000000000000000000000000000081565b6104536107903660046134e6565b611503565b6104536107a336600461381b565b61150e565b6103a26107b6366004613763565b60d260209081525f928352604080842090915290825290205460ff1681565b6104536107e3366004613834565b61151f565b6104a26107f63660046134e6565b60ce6020525f908152604090205481565b6103de7f000000000000000000000000000000000000000000000000000000000000000081565b6103a261083c366004613763565b60d060209081525f928352604080842090915290825290205460ff1681565b6104d87f000000000000000000000000000000000000000000000000000000000000000081565b61045361089036600461385e565b611668565b6103fb6108a3366004613545565b6117d3565b6105db6108b636600461378d565b611863565b6103de6108c9366004613545565b6118cf565b6104d87f000000000000000000000000000000000000000000000000000000000000000081565b6103a2610903366004613763565b60d360209081525f928352604080842090915290825290205460ff1681565b61045361093036600461378d565b611950565b6104536109433660046134e6565b611aba565b6104536109563660046138a2565b611b35565b6104a2610969366004613572565b611c6a565b61045361097c3660046136f8565b611c7a565b61045361098f366004613545565b611dc9565b60cb546104d8906001600160a01b031681565b6104536109b53660046135d4565b611edf565b6104536109c83660046135d4565b61202e565b604080516080810182525f80825260208201819052918101829052606081019190915260ca545b8015610aa5575f60ca610a08600184613914565b81548110610a1857610a18613927565b5f91825260209182902060408051608081018252600293909302909101805483526001015463ffffffff80821694840194909452600160201b810490931690820152600160401b90910460ff161580156060830181905291925090610a875750806040015163ffffffff164210155b15610a925792915050565b5080610a9d8161393b565b9150506109f4565b5050604080516080810182525f80825260208201819052918101829052606081019190915290565b610ad56121ad565b6001600160a01b0382165f81815260d1602052604080822054905160ff9091169284151592841515927f4de6293e668df1398422e1def12118052c1539a03cbfedc145895d48d7685f1c9190a4506001600160a01b03919091165f90815260d160205260409020805460ff1916911515919091179055565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa158015610baf573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610bd39190613950565b610bf057604051631d77d47760e21b815260040160405180910390fd5b6066548181168114610c155760405163c61dca5d60e01b815260040160405180910390fd5b610c1e82612207565b5050565b5f80610c3160208401846134e6565b8360200135604051602001610c7a9392919060f89390931b6001600160f81b031916835260609190911b6bffffffffffffffffffffffff19166001830152601582015260350190565b604051602081830303815290604052805190602001209050919050565b606654600190600290811603610cc05760405163840a48d560e01b815260040160405180910390fd5b335f90815260d1602052604090205460ff16610cef57604051635c427cd960e01b815260040160405180910390fd5b610cf7612244565b5f5b82811015610e275736848483818110610d1457610d14613927565b9050602002810190610d26919061396b565b335f81815260ce60209081526040808320549051949550939192610d509290918591879101613ab9565b604051602081830303815290604052805190602001209050610d718361229d565b335f90815260d0602090815260408083208484529091529020805460ff19166001908117909155610da3908390613ae8565b335f81815260ce602052604090819020929092559051829184917f51088b8c89628df3a8174002c2a034d0152fce6af8415d651b2a4734bf27048290610dea908890613afb565b60405180910390a4610e1c333060408601803590610e0b90602089016134e6565b6001600160a01b031692919061238d565b505050600101610cf9565b50610e326001609755565b505050565b606654600290600490811603610e605760405163840a48d560e01b815260040160405180910390fd5b610e68612244565b610e7283836123f8565b610e326001609755565b606654600390600890811603610ea55760405163840a48d560e01b815260040160405180910390fd5b60cb546001600160a01b03163314610ed057604051635c427cd960e01b815260040160405180910390fd5b60cb5463ffffffff600160c01b909104811690831611610f0357604051631ca7e50b60e21b815260040160405180910390fd5b428263ffffffff1610610f29576040516306957c9160e11b815260040160405180910390fd5b60ca5460cb545f90610f4890600160a01b900463ffffffff1642613b0d565b6040805160808101825287815263ffffffff87811660208084018281528684168587018181525f6060880181815260ca8054600181018255925297517f42d72674974f694b5f5159593243114d38a5c39c89d6b62fee061ff523240ee160029092029182015592517f42d72674974f694b5f5159593243114d38a5c39c89d6b62fee061ff523240ee290930180549151975193871667ffffffffffffffff1990921691909117600160201b978716979097029690961760ff60401b1916600160401b921515929092029190911790945560cb805463ffffffff60c01b1916600160c01b840217905593519283529394508892908616917fecd866c3c158fa00bf34d803d5f6023000b57080bcb48af004c2b4b46b3afd08910160405180910390a45050505050565b6066546002906004908116036110995760405163840a48d560e01b815260040160405180910390fd5b6110a1612244565b5f5b838110156110e0576110d88585838181106110c0576110c0613927565b90506020028101906110d29190613b29565b846123f8565b6001016110a3565b506110eb6001609755565b50505050565b6001600160a01b0381165f90815260d5602090815260408083208151606081018352905461ffff80821683526201000082041693820193909352600160201b90920463ffffffff169082015261114690612680565b92915050565b6111546121ad565b61115d816126f0565b50565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa1580156111c2573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111e69190613950565b61120357604051631d77d47760e21b815260040160405180910390fd5b61120d5f19612207565b565b5f6112928260ca61122360208301836136f8565b63ffffffff168154811061123957611239613927565b5f91825260209182902060408051608081018252600293909302909101805483526001015463ffffffff80821694840194909452600160201b810490931690820152600160401b90910460ff1615156060820152612761565b506001919050565b6112a26121ad565b61120d5f612904565b6112b36121ad565b61115d81612955565b604080516080810182525f80825260208201819052918101829052606081019190915260ca80546112ef90600190613914565b815481106112ff576112ff613927565b5f91825260209182902060408051608081018252600293909302909101805483526001015463ffffffff80821694840194909452600160201b810490931690820152600160401b90910460ff1615156060820152919050565b6066546005906020908116036113815760405163840a48d560e01b815260040160405180910390fd5b8361138b816129b0565b6113a85760405163932d94f760e01b815260040160405180910390fd5b6113b0612244565b5f5b838110156114f157368585838181106113cd576113cd613927565b90506020028101906113df9190613b3d565b6001600160a01b0388165f90815260ce6020908152604080832054905193945092611410918b918591879101613cab565b6040516020818303038152906040528051906020012090505f61143284612a5a565b6001600160a01b038b165f90815260d3602090815260408083208684529091529020805460ff19166001908117909155909150611470908490613ae8565b6001600160a01b038b165f81815260ce60205260409081902092909255905183919033907ffc8888bffd711da60bc5092b33f677d81896fe80ecc677b84cfab8184462b6e0906114c39088908a90613cd1565b60405180910390a46114e1333083610e0b6040890160208a016134e6565b5050600190920191506113b29050565b506114fc6001609755565b5050505050565b33610c1e8183612c40565b6115166121ad565b61115d81612ca3565b6066546007906080908116036115485760405163840a48d560e01b815260040160405180910390fd5b82611552816129b0565b61156f5760405163932d94f760e01b815260040160405180910390fd5b60cb545f9061158b90600160a01b900463ffffffff1642613b0d565b6001600160a01b0386165f90815260d5602090815260408083208151606081018352905461ffff80821683526201000082041693820193909352600160201b90920463ffffffff1690820152919250906115e490612680565b6001600160a01b0387165f90815260d560205260409020909150611609908684612d0e565b6040805163ffffffff8416815261ffff838116602083015287168183015290516001600160a01b0388169133917fd1e028bd664486a46ad26040e999cd2d22e1e9a094ee6afe19fcf64678f16f749181900360600190a3505050505050565b6066546006906040908116036116915760405163840a48d560e01b815260040160405180910390fd5b8361169b816129b0565b6116b85760405163932d94f760e01b815260040160405180910390fd5b60cb545f906116d490600160a01b900463ffffffff1642613b0d565b6001600160a01b038781165f90815260d460209081526040808320938a1683529281528282208351606081018552905461ffff80821683526201000082041692820192909252600160201b90910463ffffffff169281019290925291925061173b90612680565b6001600160a01b038089165f90815260d460209081526040808320938b1683529290522090915061176d908684612d0e565b6040805163ffffffff8416815261ffff838116602083015287168183015290516001600160a01b0388811692908a169133917f48e198b6ae357e529204ee53a8e514c470ff77d9cc8e4f7207f8b5d490ae6934919081900360600190a450505050505050565b604080516080810182525f80825260208201819052918101829052606081019190915260ca828154811061180957611809613927565b5f91825260209182902060408051608081018252600293909302909101805483526001015463ffffffff80821694840194909452600160201b810490931690820152600160401b90910460ff161515606082015292915050565b6001600160a01b038281165f90815260d46020908152604080832093851683529281528282208351606081018552905461ffff80821683526201000082041692820192909252600160201b90910463ffffffff1692810192909252906118c890612680565b9392505050565b60ca545f905b63ffffffff811615611936578260ca6118ef600184613ce9565b63ffffffff168154811061190557611905613927565b905f5260205f2090600202015f015403611924576118c8600182613ce9565b8061192e81613d05565b9150506118d5565b5060405163504570e360e01b815260040160405180910390fd5b8161195a816129b0565b6119775760405163932d94f760e01b815260040160405180910390fd5b6040516336b87bd760e11b81526001600160a01b0384811660048301527f00000000000000000000000000000000000000000000000000000000000000001690636d70f7ae90602401602060405180830381865afa1580156119db573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906119ff9190613950565b80611a93575060405163ba1a84e560e01b81526001600160a01b0384811660048301525f917f00000000000000000000000000000000000000000000000000000000000000009091169063ba1a84e590602401602060405180830381865afa158015611a6d573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a919190613d23565b115b611ab05760405163fb494ea160e01b815260040160405180910390fd5b610e328383612c40565b611ac26121ad565b6001600160a01b038116611b2c5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084015b60405180910390fd5b61115d81612904565b5f54610100900460ff1615808015611b5357505f54600160ff909116105b80611b6c5750303b158015611b6c57505f5460ff166001145b611bcf5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401611b23565b5f805460ff191660011790558015611bf0575f805461ff0019166101001790555b611bf985612207565b611c0286612904565b611c0b84612955565b611c14836126f0565b611c1d82612ca3565b8015611c62575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050505050565b5f6001610c3160208401846134e6565b606654600390600890811603611ca35760405163840a48d560e01b815260040160405180910390fd5b60cb546001600160a01b03163314611cce57604051635c427cd960e01b815260040160405180910390fd5b60ca5463ffffffff831610611cf6576040516394a8d38960e01b815260040160405180910390fd5b5f60ca8363ffffffff1681548110611d1057611d10613927565b905f5260205f20906002020190508060010160089054906101000a900460ff1615611d4e57604051631b14174b60e01b815260040160405180910390fd5b6001810154600160201b900463ffffffff164210611d7f57604051630c36f66560e21b815260040160405180910390fd5b60018101805460ff60401b1916600160401b17905560405163ffffffff8416907fd850e6e5dfa497b72661fa73df2923464eaed9dc2ff1d3cb82bccbfeabe5c41e905f90a2505050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611e25573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611e499190613d3a565b6001600160a01b0316336001600160a01b031614611e7a5760405163794821ff60e01b815260040160405180910390fd5b60665480198219811614611ea15760405163c61dca5d60e01b815260040160405180910390fd5b606682905560405182815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c9060200160405180910390a25050565b6066545f90600190811603611f075760405163840a48d560e01b815260040160405180910390fd5b611f0f612244565b5f5b82811015610e275736848483818110611f2c57611f2c613927565b9050602002810190611f3e919061396b565b335f81815260ce60209081526040808320549051949550939192611f689290918591879101613ab9565b604051602081830303815290604052805190602001209050611f898361229d565b335f90815260cf602090815260408083208484529091529020805460ff19166001908117909155611fbb908390613ae8565b335f81815260ce602052604090819020929092559051829184917f450a367a380c4e339e5ae7340c8464ef27af7781ad9945cfe8abd828f89e628190612002908890613afb565b60405180910390a4612023333060408601803590610e0b90602089016134e6565b505050600101611f11565b6066546004906010908116036120575760405163840a48d560e01b815260040160405180910390fd5b335f90815260d1602052604090205460ff1661208657604051635c427cd960e01b815260040160405180910390fd5b61208e612244565b5f5b82811015610e2757368484838181106120ab576120ab613927565b90506020028101906120bd919061396b565b335f81815260ce602090815260408083205490519495509391926120e79290918591879101613ab9565b6040516020818303038152906040528051906020012090506121088361229d565b335f90815260d2602090815260408083208484529091529020805460ff1916600190811790915561213a908390613ae8565b335f81815260ce602052604090819020929092559051829184917f5251b6fdefcb5d81144e735f69ea4c695fd43b0289ca53dc075033f5fc80068b90612181908890613afb565b60405180910390a46121a2333060408601803590610e0b90602089016134e6565b505050600101612090565b6033546001600160a01b0316331461120d5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401611b23565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a250565b6002609754036122965760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401611b23565b6002609755565b6122cf6122aa8280613d55565b6122ba60808501606086016136f8565b6122ca60a08601608087016136f8565b612ddd565b5f8160400135116122f3576040516310eb483f60e21b815260040160405180910390fd5b6f4b3b4ca85a86c47a098a223fffffffff816040013511156123285760405163070b5a6f60e21b815260040160405180910390fd5b61235863ffffffff7f00000000000000000000000000000000000000000000000000000000000000001642613ae8565b61236860808301606084016136f8565b63ffffffff16111561115d57604051637ee2b44360e01b815260040160405180910390fd5b6040516001600160a01b03808516602483015283166044820152606481018290526110eb9085906323b872dd60e01b906084015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b0319909316929092179091526130b5565b5f60ca61240860208501856136f8565b63ffffffff168154811061241e5761241e613927565b5f91825260209182902060408051608081018252600293909302909101805483526001015463ffffffff80821694840194909452600160201b810490931690820152600160401b90910460ff1615156060820152905061247e8382612761565b5f61248f60808501606086016134e6565b6001600160a01b038082165f90815260cc602052604090205491925016806124b45750805b336001600160a01b038216146124dd57604051635c427cd960e01b815260040160405180910390fd5b5f5b6124ec60a0870187613d9b565b9050811015611c62573661250360e0880188613d55565b8381811061251357612513613927565b6001600160a01b0387165f90815260cd602090815260408083209302949094019450929091508290612547908501856134e6565b6001600160a01b03166001600160a01b031681526020019081526020015f205490508082602001351161258d5760405163aa385e8160e01b815260040160405180910390fd5b5f61259c826020850135613914565b6001600160a01b0387165f90815260cd602090815260408220929350850180359291906125c990876134e6565b6001600160a01b031681526020808201929092526040015f209190915561260a90899083906125fa908701876134e6565b6001600160a01b03169190613188565b86516001600160a01b03808a1691878216918916907f9543dbd55580842586a951f0386e24d68a5df99ae29e3b216588b45fd684ce319061264e60208901896134e6565b604080519283526001600160a01b039091166020830152810186905260600160405180910390a45050506001016124df565b5f816040015163ffffffff165f14806126b25750815161ffff9081161480156126b25750816040015163ffffffff1642105b156126ca57505060cb54600160e01b900461ffff1690565b816040015163ffffffff164210156126e3578151611146565b506020015190565b919050565b60cb546040805163ffffffff600160a01b9093048316815291831660208301527faf557c6c02c208794817a705609cfa935f827312a1adfdd26494b6b95dd2b4b3910160405180910390a160cb805463ffffffff909216600160a01b0263ffffffff60a01b19909216919091179055565b80606001511561278457604051631b14174b60e01b815260040160405180910390fd5b806040015163ffffffff164210156127af57604051631437a2bb60e31b815260040160405180910390fd5b6127bc60c0830183613d9b565b90506127cb60a0840184613d9b565b9050146127eb576040516343714afd60e01b815260040160405180910390fd5b6127f860e0830183613d55565b905061280760c0840184613d9b565b905014612827576040516343714afd60e01b815260040160405180910390fd5b80516128539061283d60408501602086016136f8565b61284a6040860186613de1565b866060016131b8565b5f5b61286260a0840184613d9b565b9050811015610e32576128fc608084013561288060a0860186613d9b565b8481811061289057612890613927565b90506020020160208101906128a591906136f8565b6128b260c0870187613d9b565b858181106128c2576128c2613927565b90506020028101906128d49190613de1565b6128e160e0890189613d55565b878181106128f1576128f1613927565b90506040020161325c565b600101612855565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b60cb546040516001600160a01b038084169216907f237b82f438d75fc568ebab484b75b01d9287b9e98b490b7c23221623b6705dbb905f90a360cb80546001600160a01b0319166001600160a01b0392909216919091179055565b604051631beb2b9760e31b81526001600160a01b0382811660048301523360248301523060448301525f80356001600160e01b0319166064840152917f00000000000000000000000000000000000000000000000000000000000000009091169063df595cb8906084016020604051808303815f875af1158015612a36573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111469190613950565b5f612a88612a688380613d55565b612a7860808601606087016136f8565b6122ca60a08701608088016136f8565b5f612a966040840184613d55565b905011612ab65760405163796cc52560e01b815260040160405180910390fd5b42612ac760a08401608085016136f8565b612ad760808501606086016136f8565b612ae19190613b0d565b63ffffffff1610612b055760405163150358a160e21b815260040160405180910390fd5b5f80805b612b166040860186613d55565b9050811015612c075736612b2d6040870187613d55565b83818110612b3d57612b3d613927565b6040029190910191505f9050612b5660208301836134e6565b6001600160a01b031603612b7d57604051630863a45360e11b815260040160405180910390fd5b612b8a60208201826134e6565b6001600160a01b0316836001600160a01b031610612bbb576040516310fb47f160e31b815260040160405180910390fd5b5f816020013511612bdf576040516310eb483f60e21b815260040160405180910390fd5b612bec60208201826134e6565b9250612bfc602082013585613ae8565b935050600101612b09565b506f4b3b4ca85a86c47a098a223fffffffff821115612c395760405163070b5a6f60e21b815260040160405180910390fd5b5092915050565b6001600160a01b038083165f81815260cc602052604080822080548686166001600160a01b0319821681179092559151919094169392849290917fbab947934d42e0ad206f25c9cab18b5bb6ae144acfb00f40b4e3aa59590ca3129190a4505050565b60cb546040805161ffff600160e01b9093048316815291831660208301527fe6cd4edfdcc1f6d130ab35f73d72378f3a642944fb4ee5bd84b7807a81ea1c4e910160405180910390a160cb805461ffff909216600160e01b0261ffff60e01b19909216919091179055565b61271061ffff83161115612d355760405163891c63df60e01b815260040160405180910390fd5b8254600160201b900463ffffffff164211612d6357604051637b1e25c560e01b815260040160405180910390fd5b8254600160201b900463ffffffff165f03612d8a57825461ffff191661ffff178355612da1565b825462010000810461ffff1661ffff199091161783555b825463ffffffff909116600160201b0267ffffffff000000001961ffff90931662010000029290921667ffffffffffff00001990911617179055565b82612dfb5760405163796cc52560e01b815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000063ffffffff168163ffffffff161115612e4857604051630dd0b9f560e21b815260040160405180910390fd5b612e727f000000000000000000000000000000000000000000000000000000000000000082613e38565b63ffffffff1615612e965760405163ee66470560e01b815260040160405180910390fd5b612ec07f000000000000000000000000000000000000000000000000000000000000000083613e38565b63ffffffff1615612ee457604051633c1a94f160e21b815260040160405180910390fd5b8163ffffffff167f000000000000000000000000000000000000000000000000000000000000000063ffffffff1642612f1d9190613914565b11158015612f5757508163ffffffff167f000000000000000000000000000000000000000000000000000000000000000063ffffffff1611155b612f745760405163041aa75760e11b815260040160405180910390fd5b5f805b84811015611c62575f868683818110612f9257612f92613927565b612fa892602060409092020190810191506134e6565b60405163198f077960e21b81526001600160a01b0380831660048301529192507f00000000000000000000000000000000000000000000000000000000000000009091169063663c1de490602401602060405180830381865afa158015613011573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906130359190613950565b8061305c57506001600160a01b03811673beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac0145b61307957604051632efd965160e11b815260040160405180910390fd5b806001600160a01b0316836001600160a01b0316106130ab5760405163dfad9ca160e01b815260040160405180910390fd5b9150600101612f77565b5f613109826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b031661329a9092919063ffffffff16565b905080515f14806131295750808060200190518101906131299190613950565b610e325760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401611b23565b6040516001600160a01b038316602482015260448101829052610e3290849063a9059cbb60e01b906064016123c1565b6131c3602083613e5f565b6001901b8463ffffffff16106131eb5760405162c6c39d60e71b815260040160405180910390fd5b5f6131f582610c22565b905061323f84848080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152508a92508591505063ffffffff89166132b0565b611c62576040516369ca16c960e01b815260040160405180910390fd5b613267602083613e5f565b6001901b8463ffffffff16106132905760405163054ff4df60e51b815260040160405180910390fd5b5f6131f582611c6a565b60606132a884845f856132c7565b949350505050565b5f836132bd86858561339e565b1495945050505050565b6060824710156133285760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401611b23565b5f5f866001600160a01b031685876040516133439190613e72565b5f6040518083038185875af1925050503d805f811461337d576040519150601f19603f3d011682016040523d82523d5f602084013e613382565b606091505b509150915061339387838387613435565b979650505050505050565b5f602084516133ad9190613e88565b156133cb576040516313717da960e21b815260040160405180910390fd5b8260205b8551811161342c576133e2600285613e88565b5f0361340357815f528086015160205260405f20915060028404935061341a565b808601515f528160205260405f2091506002840493505b613425602082613ae8565b90506133cf565b50949350505050565b606083156134a35782515f0361349c576001600160a01b0385163b61349c5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401611b23565b50816132a8565b6132a883838151156134b85781518083602001fd5b8060405162461bcd60e51b8152600401611b239190613e9b565b6001600160a01b038116811461115d575f5ffd5b5f602082840312156134f6575f5ffd5b81356118c8816134d2565b801515811461115d575f5ffd5b5f5f6040838503121561351f575f5ffd5b823561352a816134d2565b9150602083013561353a81613501565b809150509250929050565b5f60208284031215613555575f5ffd5b5035919050565b5f6040828403121561356c575f5ffd5b50919050565b5f60408284031215613582575f5ffd5b6118c8838361355c565b5f5f83601f84011261359c575f5ffd5b50813567ffffffffffffffff8111156135b3575f5ffd5b6020830191508360208260051b85010111156135cd575f5ffd5b9250929050565b5f5f602083850312156135e5575f5ffd5b823567ffffffffffffffff8111156135fb575f5ffd5b6136078582860161358c565b90969095509350505050565b5f610100828403121561356c575f5ffd5b5f5f60408385031215613635575f5ffd5b823567ffffffffffffffff81111561364b575f5ffd5b61365785828601613613565b925050602083013561353a816134d2565b803563ffffffff811681146126eb575f5ffd5b5f5f6040838503121561368c575f5ffd5b8235915061369c60208401613668565b90509250929050565b5f5f5f604084860312156136b7575f5ffd5b833567ffffffffffffffff8111156136cd575f5ffd5b6136d98682870161358c565b90945092505060208401356136ed816134d2565b809150509250925092565b5f60208284031215613708575f5ffd5b6118c882613668565b5f60208284031215613721575f5ffd5b813560ff811681146118c8575f5ffd5b5f60208284031215613741575f5ffd5b813567ffffffffffffffff811115613757575f5ffd5b6132a884828501613613565b5f5f60408385031215613774575f5ffd5b823561377f816134d2565b946020939093013593505050565b5f5f6040838503121561379e575f5ffd5b82356137a9816134d2565b9150602083013561353a816134d2565b5f5f5f604084860312156137cb575f5ffd5b83356137d6816134d2565b9250602084013567ffffffffffffffff8111156137f1575f5ffd5b6137fd8682870161358c565b9497909650939450505050565b803561ffff811681146126eb575f5ffd5b5f6020828403121561382b575f5ffd5b6118c88261380a565b5f5f60408385031215613845575f5ffd5b8235613850816134d2565b915061369c6020840161380a565b5f5f5f60608486031215613870575f5ffd5b833561387b816134d2565b9250602084013561388b816134d2565b91506138996040850161380a565b90509250925092565b5f5f5f5f5f60a086880312156138b6575f5ffd5b85356138c1816134d2565b94506020860135935060408601356138d8816134d2565b92506138e660608701613668565b91506138f46080870161380a565b90509295509295909350565b634e487b7160e01b5f52601160045260245ffd5b8181038181111561114657611146613900565b634e487b7160e01b5f52603260045260245ffd5b5f8161394957613949613900565b505f190190565b5f60208284031215613960575f5ffd5b81516118c881613501565b5f8235609e1983360301811261397f575f5ffd5b9190910192915050565b5f5f8335601e1984360301811261399e575f5ffd5b830160208101925035905067ffffffffffffffff8111156139bd575f5ffd5b8060061b36038213156135cd575f5ffd5b8183526020830192505f815f5b84811015613a315781356139ee816134d2565b6001600160a01b0316865260208201356bffffffffffffffffffffffff8116808214613a18575f5ffd5b60208801525060409586019591909101906001016139db565b5093949350505050565b5f613a468283613989565b60a08552613a5860a0860182846139ce565b9150506020830135613a69816134d2565b6001600160a01b031660208501526040838101359085015263ffffffff613a9260608501613668565b16606085015263ffffffff613aa960808501613668565b1660808501528091505092915050565b60018060a01b0384168152826020820152606060408201525f613adf6060830184613a3b565b95945050505050565b8082018082111561114657611146613900565b602081525f6118c86020830184613a3b565b63ffffffff818116838216019081111561114657611146613900565b5f823560fe1983360301811261397f575f5ffd5b5f823560be1983360301811261397f575f5ffd5b5f5f8335601e19843603018112613b66575f5ffd5b830160208101925035905067ffffffffffffffff811115613b85575f5ffd5b8036038213156135cd575f5ffd5b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b5f613bc68283613989565b60c08552613bd860c0860182846139ce565b9150506020830135613be9816134d2565b6001600160a01b03166020850152613c046040840184613989565b858303604087015280835290915f91906020015b81831015613c53578335613c2b816134d2565b6001600160a01b03168152602084810135908201526040938401936001939093019201613c18565b613c5f60608701613668565b63ffffffff811660608901529350613c7960808701613668565b63ffffffff811660808901529350613c9460a0870187613b51565b9450925086810360a0880152613393818585613b93565b60018060a01b0384168152826020820152606060408201525f613adf6060830184613bbb565b828152604060208201525f6132a86040830184613bbb565b63ffffffff828116828216039081111561114657611146613900565b5f63ffffffff821680613d1a57613d1a613900565b5f190192915050565b5f60208284031215613d33575f5ffd5b5051919050565b5f60208284031215613d4a575f5ffd5b81516118c8816134d2565b5f5f8335601e19843603018112613d6a575f5ffd5b83018035915067ffffffffffffffff821115613d84575f5ffd5b6020019150600681901b36038213156135cd575f5ffd5b5f5f8335601e19843603018112613db0575f5ffd5b83018035915067ffffffffffffffff821115613dca575f5ffd5b6020019150600581901b36038213156135cd575f5ffd5b5f5f8335601e19843603018112613df6575f5ffd5b83018035915067ffffffffffffffff821115613e10575f5ffd5b6020019150368190038213156135cd575f5ffd5b634e487b7160e01b5f52601260045260245ffd5b5f63ffffffff831680613e4d57613e4d613e24565b8063ffffffff84160691505092915050565b5f82613e6d57613e6d613e24565b500490565b5f82518060208501845e5f920191825250919050565b5f82613e9657613e96613e24565b500690565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f8301168401019150509291505056fea264697066735822122066af1d025e7df449cf3df2cce310aeeb67e5fcdbf154aaac2a03c9f01d9eebdd64736f6c634300081b0033", >>>>>>> 0a38914f (feat: changing burnableShares to EnumerableMap (#1028)) +======= + Bin: "0x6101c0604052348015610010575f5ffd5b506040516142d63803806142d683398101604081905261002f91610211565b858a8a8a88888888888f6001600160a01b038116610060576040516339b190bb60e11b815260040160405180910390fd5b6001600160a01b031660805261007685826102d3565b63ffffffff161561009a57604051630e06bd3160e01b815260040160405180910390fd5b6100a762015180866102d3565b63ffffffff16156100cb5760405163223c7b3960e11b815260040160405180910390fd5b6001600160a01b0397881660a05295871660c05293861660e05263ffffffff9283166101005290821661012052811661014052908116610160521661018052166101a052610117610126565b50505050505050505050610306565b5f54610100900460ff16156101915760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff908116146101e0575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b03811681146101f6575f5ffd5b50565b805163ffffffff8116811461020c575f5ffd5b919050565b5f5f5f5f5f5f5f5f5f5f6101408b8d03121561022b575f5ffd5b8a51610236816101e2565b60208c0151909a50610247816101e2565b60408c0151909950610258816101e2565b60608c0151909850610269816101e2565b60808c015190975061027a816101e2565b955061028860a08c016101f9565b945061029660c08c016101f9565b93506102a460e08c016101f9565b92506102b36101008c016101f9565b91506102c26101208c016101f9565b90509295989b9194979a5092959850565b5f63ffffffff8316806102f457634e487b7160e01b5f52601260045260245ffd5b8063ffffffff84160691505092915050565b60805160a05160c05160e05161010051610120516101405161016051610180516101a051613f066103d05f395f81816105a601526129ee01525f818161045a0152612f2f01525f81816103bc015261233201525f81816105080152612eed01525f818161080c0152612dfd01525f818161076001528181612e4d0152612e9b01525f81816108600152611a2601525f818161052f0152612fca01525f81816108d3015261199601525f81816106f201528181610b62015281816111750152611dcb0152613f065ff3fe608060405234801561000f575f5ffd5b506004361061037c575f3560e01c8063886f1195116101d4578063dcbb03b311610109578063f2fde38b116100a9578063fabc1cbc11610079578063fabc1cbc14610981578063fbf1e2c114610994578063fce36c7d146109a7578063ff9f6cce146109ba575f5ffd5b8063f2fde38b14610935578063f6efbb5914610948578063f8cd84481461095b578063f96abf2e1461096e575f5ffd5b8063e810ce21116100e4578063e810ce21146108bb578063ea4d3c9b146108ce578063ed71e6a2146108f5578063f22cef8514610922575f5ffd5b8063dcbb03b314610882578063de02e50314610895578063e063f81f146108a8575f5ffd5b8063a50a1d9c11610174578063bb7e451f1161014f578063bb7e451f146107e8578063bf21a8aa14610807578063c46db6061461082e578063ca8aa7c71461085b575f5ffd5b8063a50a1d9c14610795578063aebd8bae146107a8578063b3dbb0e0146107d5575f5ffd5b80639be3d4e4116101af5780639be3d4e4146107405780639cb9a5fa146107485780639d45c2811461075b578063a0169ddd14610782575f5ffd5b8063886f1195146106ed5780638da5cb5b146107145780639104c31914610725575f5ffd5b80634596021c116102b55780635c975abb11610255578063715018a611610225578063715018a6146106a05780637b8f8b05146106a8578063863cb9a9146106b0578063865c6953146106c3575f5ffd5b80635c975abb146106435780635e9d83481461064b57806363f6a7981461065e5780636d21117e14610673575f5ffd5b80634d18cc35116102905780634d18cc35146105ee57806358baaa3e14610605578063595c6a67146106185780635ac86ab714610620575f5ffd5b80634596021c1461058e5780634657e26a146105a15780634b943960146105c8575f5ffd5b80632b9f64a41161032057806339b70e38116102fb57806339b70e381461052a5780633a8c0786146105515780633ccc861d146105685780633efe1db61461057b575f5ffd5b80632b9f64a4146104b057806336af41fa146104f057806337838ed014610503575f5ffd5b80630eb383451161035b5780630eb3834514610440578063131433b414610455578063136439dd1461047c578063149bc8721461048f575f5ffd5b806218572c1461038057806304a0c502146103b75780630e9a53cf146103f3575b5f5ffd5b6103a261038e3660046134e6565b60d16020525f908152604090205460ff1681565b60405190151581526020015b60405180910390f35b6103de7f000000000000000000000000000000000000000000000000000000000000000081565b60405163ffffffff90911681526020016103ae565b6103fb6109cd565b6040516103ae91905f6080820190508251825263ffffffff602084015116602083015263ffffffff604084015116604083015260608301511515606083015292915050565b61045361044e36600461350e565b610acd565b005b6103de7f000000000000000000000000000000000000000000000000000000000000000081565b61045361048a366004613545565b610b4d565b6104a261049d366004613572565b610c22565b6040519081526020016103ae565b6104d86104be3660046134e6565b60cc6020525f90815260409020546001600160a01b031681565b6040516001600160a01b0390911681526020016103ae565b6104536104fe3660046135d4565b610c97565b6103de7f000000000000000000000000000000000000000000000000000000000000000081565b6104d87f000000000000000000000000000000000000000000000000000000000000000081565b60cb546103de90600160a01b900463ffffffff1681565b610453610576366004613624565b610e37565b61045361058936600461367b565b610e7c565b61045361059c3660046136a5565b611070565b6104d87f000000000000000000000000000000000000000000000000000000000000000081565b6105db6105d63660046134e6565b6110f1565b60405161ffff90911681526020016103ae565b60cb546103de90600160c01b900463ffffffff1681565b6104536106133660046136f8565b61114c565b610453611160565b6103a261062e366004613711565b606654600160ff9092169190911b9081161490565b6066546104a2565b6103a2610659366004613731565b61120f565b60cb546105db90600160e01b900461ffff1681565b6103a2610681366004613763565b60cf60209081525f928352604080842090915290825290205460ff1681565b61045361129a565b60ca546104a2565b6104536106be3660046134e6565b6112ab565b6104a26106d136600461378d565b60cd60209081525f928352604080842090915290825290205481565b6104d87f000000000000000000000000000000000000000000000000000000000000000081565b6033546001600160a01b03166104d8565b6104d873beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac081565b6103fb6112bc565b6104536107563660046137b9565b611358565b6103de7f000000000000000000000000000000000000000000000000000000000000000081565b6104536107903660046134e6565b611503565b6104536107a336600461381b565b61150e565b6103a26107b6366004613763565b60d260209081525f928352604080842090915290825290205460ff1681565b6104536107e3366004613834565b61151f565b6104a26107f63660046134e6565b60ce6020525f908152604090205481565b6103de7f000000000000000000000000000000000000000000000000000000000000000081565b6103a261083c366004613763565b60d060209081525f928352604080842090915290825290205460ff1681565b6104d87f000000000000000000000000000000000000000000000000000000000000000081565b61045361089036600461385e565b611668565b6103fb6108a3366004613545565b6117d3565b6105db6108b636600461378d565b611863565b6103de6108c9366004613545565b6118cf565b6104d87f000000000000000000000000000000000000000000000000000000000000000081565b6103a2610903366004613763565b60d360209081525f928352604080842090915290825290205460ff1681565b61045361093036600461378d565b611950565b6104536109433660046134e6565b611aba565b6104536109563660046138a2565b611b35565b6104a2610969366004613572565b611c6a565b61045361097c3660046136f8565b611c7a565b61045361098f366004613545565b611dc9565b60cb546104d8906001600160a01b031681565b6104536109b53660046135d4565b611edf565b6104536109c83660046135d4565b61202e565b604080516080810182525f80825260208201819052918101829052606081019190915260ca545b8015610aa5575f60ca610a08600184613914565b81548110610a1857610a18613927565b5f91825260209182902060408051608081018252600293909302909101805483526001015463ffffffff80821694840194909452600160201b810490931690820152600160401b90910460ff161580156060830181905291925090610a875750806040015163ffffffff164210155b15610a925792915050565b5080610a9d8161393b565b9150506109f4565b5050604080516080810182525f80825260208201819052918101829052606081019190915290565b610ad56121ad565b6001600160a01b0382165f81815260d1602052604080822054905160ff9091169284151592841515927f4de6293e668df1398422e1def12118052c1539a03cbfedc145895d48d7685f1c9190a4506001600160a01b03919091165f90815260d160205260409020805460ff1916911515919091179055565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa158015610baf573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610bd39190613950565b610bf057604051631d77d47760e21b815260040160405180910390fd5b6066548181168114610c155760405163c61dca5d60e01b815260040160405180910390fd5b610c1e82612207565b5050565b5f80610c3160208401846134e6565b8360200135604051602001610c7a9392919060f89390931b6001600160f81b031916835260609190911b6bffffffffffffffffffffffff19166001830152601582015260350190565b604051602081830303815290604052805190602001209050919050565b606654600190600290811603610cc05760405163840a48d560e01b815260040160405180910390fd5b335f90815260d1602052604090205460ff16610cef57604051635c427cd960e01b815260040160405180910390fd5b610cf7612244565b5f5b82811015610e275736848483818110610d1457610d14613927565b9050602002810190610d26919061396b565b335f81815260ce60209081526040808320549051949550939192610d509290918591879101613ab9565b604051602081830303815290604052805190602001209050610d718361229d565b335f90815260d0602090815260408083208484529091529020805460ff19166001908117909155610da3908390613ae8565b335f81815260ce602052604090819020929092559051829184917f51088b8c89628df3a8174002c2a034d0152fce6af8415d651b2a4734bf27048290610dea908890613afb565b60405180910390a4610e1c333060408601803590610e0b90602089016134e6565b6001600160a01b031692919061238d565b505050600101610cf9565b50610e326001609755565b505050565b606654600290600490811603610e605760405163840a48d560e01b815260040160405180910390fd5b610e68612244565b610e7283836123f8565b610e326001609755565b606654600390600890811603610ea55760405163840a48d560e01b815260040160405180910390fd5b60cb546001600160a01b03163314610ed057604051635c427cd960e01b815260040160405180910390fd5b60cb5463ffffffff600160c01b909104811690831611610f0357604051631ca7e50b60e21b815260040160405180910390fd5b428263ffffffff1610610f29576040516306957c9160e11b815260040160405180910390fd5b60ca5460cb545f90610f4890600160a01b900463ffffffff1642613b0d565b6040805160808101825287815263ffffffff87811660208084018281528684168587018181525f6060880181815260ca8054600181018255925297517f42d72674974f694b5f5159593243114d38a5c39c89d6b62fee061ff523240ee160029092029182015592517f42d72674974f694b5f5159593243114d38a5c39c89d6b62fee061ff523240ee290930180549151975193871667ffffffffffffffff1990921691909117600160201b978716979097029690961760ff60401b1916600160401b921515929092029190911790945560cb805463ffffffff60c01b1916600160c01b840217905593519283529394508892908616917fecd866c3c158fa00bf34d803d5f6023000b57080bcb48af004c2b4b46b3afd08910160405180910390a45050505050565b6066546002906004908116036110995760405163840a48d560e01b815260040160405180910390fd5b6110a1612244565b5f5b838110156110e0576110d88585838181106110c0576110c0613927565b90506020028101906110d29190613b29565b846123f8565b6001016110a3565b506110eb6001609755565b50505050565b6001600160a01b0381165f90815260d5602090815260408083208151606081018352905461ffff80821683526201000082041693820193909352600160201b90920463ffffffff169082015261114690612680565b92915050565b6111546121ad565b61115d816126f0565b50565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa1580156111c2573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111e69190613950565b61120357604051631d77d47760e21b815260040160405180910390fd5b61120d5f19612207565b565b5f6112928260ca61122360208301836136f8565b63ffffffff168154811061123957611239613927565b5f91825260209182902060408051608081018252600293909302909101805483526001015463ffffffff80821694840194909452600160201b810490931690820152600160401b90910460ff1615156060820152612761565b506001919050565b6112a26121ad565b61120d5f612904565b6112b36121ad565b61115d81612955565b604080516080810182525f80825260208201819052918101829052606081019190915260ca80546112ef90600190613914565b815481106112ff576112ff613927565b5f91825260209182902060408051608081018252600293909302909101805483526001015463ffffffff80821694840194909452600160201b810490931690820152600160401b90910460ff1615156060820152919050565b6066546005906020908116036113815760405163840a48d560e01b815260040160405180910390fd5b8361138b816129b0565b6113a85760405163932d94f760e01b815260040160405180910390fd5b6113b0612244565b5f5b838110156114f157368585838181106113cd576113cd613927565b90506020028101906113df9190613b3d565b6001600160a01b0388165f90815260ce6020908152604080832054905193945092611410918b918591879101613cab565b6040516020818303038152906040528051906020012090505f61143284612a5a565b6001600160a01b038b165f90815260d3602090815260408083208684529091529020805460ff19166001908117909155909150611470908490613ae8565b6001600160a01b038b165f81815260ce60205260409081902092909255905183919033907ffc8888bffd711da60bc5092b33f677d81896fe80ecc677b84cfab8184462b6e0906114c39088908a90613cd1565b60405180910390a46114e1333083610e0b6040890160208a016134e6565b5050600190920191506113b29050565b506114fc6001609755565b5050505050565b33610c1e8183612c40565b6115166121ad565b61115d81612ca3565b6066546007906080908116036115485760405163840a48d560e01b815260040160405180910390fd5b82611552816129b0565b61156f5760405163932d94f760e01b815260040160405180910390fd5b60cb545f9061158b90600160a01b900463ffffffff1642613b0d565b6001600160a01b0386165f90815260d5602090815260408083208151606081018352905461ffff80821683526201000082041693820193909352600160201b90920463ffffffff1690820152919250906115e490612680565b6001600160a01b0387165f90815260d560205260409020909150611609908684612d0e565b6040805163ffffffff8416815261ffff838116602083015287168183015290516001600160a01b0388169133917fd1e028bd664486a46ad26040e999cd2d22e1e9a094ee6afe19fcf64678f16f749181900360600190a3505050505050565b6066546006906040908116036116915760405163840a48d560e01b815260040160405180910390fd5b8361169b816129b0565b6116b85760405163932d94f760e01b815260040160405180910390fd5b60cb545f906116d490600160a01b900463ffffffff1642613b0d565b6001600160a01b038781165f90815260d460209081526040808320938a1683529281528282208351606081018552905461ffff80821683526201000082041692820192909252600160201b90910463ffffffff169281019290925291925061173b90612680565b6001600160a01b038089165f90815260d460209081526040808320938b1683529290522090915061176d908684612d0e565b6040805163ffffffff8416815261ffff838116602083015287168183015290516001600160a01b0388811692908a169133917f48e198b6ae357e529204ee53a8e514c470ff77d9cc8e4f7207f8b5d490ae6934919081900360600190a450505050505050565b604080516080810182525f80825260208201819052918101829052606081019190915260ca828154811061180957611809613927565b5f91825260209182902060408051608081018252600293909302909101805483526001015463ffffffff80821694840194909452600160201b810490931690820152600160401b90910460ff161515606082015292915050565b6001600160a01b038281165f90815260d46020908152604080832093851683529281528282208351606081018552905461ffff80821683526201000082041692820192909252600160201b90910463ffffffff1692810192909252906118c890612680565b9392505050565b60ca545f905b63ffffffff811615611936578260ca6118ef600184613ce9565b63ffffffff168154811061190557611905613927565b905f5260205f2090600202015f015403611924576118c8600182613ce9565b8061192e81613d05565b9150506118d5565b5060405163504570e360e01b815260040160405180910390fd5b8161195a816129b0565b6119775760405163932d94f760e01b815260040160405180910390fd5b6040516336b87bd760e11b81526001600160a01b0384811660048301527f00000000000000000000000000000000000000000000000000000000000000001690636d70f7ae90602401602060405180830381865afa1580156119db573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906119ff9190613950565b80611a93575060405163ba1a84e560e01b81526001600160a01b0384811660048301525f917f00000000000000000000000000000000000000000000000000000000000000009091169063ba1a84e590602401602060405180830381865afa158015611a6d573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a919190613d23565b115b611ab05760405163fb494ea160e01b815260040160405180910390fd5b610e328383612c40565b611ac26121ad565b6001600160a01b038116611b2c5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084015b60405180910390fd5b61115d81612904565b5f54610100900460ff1615808015611b5357505f54600160ff909116105b80611b6c5750303b158015611b6c57505f5460ff166001145b611bcf5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401611b23565b5f805460ff191660011790558015611bf0575f805461ff0019166101001790555b611bf985612207565b611c0286612904565b611c0b84612955565b611c14836126f0565b611c1d82612ca3565b8015611c62575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050505050565b5f6001610c3160208401846134e6565b606654600390600890811603611ca35760405163840a48d560e01b815260040160405180910390fd5b60cb546001600160a01b03163314611cce57604051635c427cd960e01b815260040160405180910390fd5b60ca5463ffffffff831610611cf6576040516394a8d38960e01b815260040160405180910390fd5b5f60ca8363ffffffff1681548110611d1057611d10613927565b905f5260205f20906002020190508060010160089054906101000a900460ff1615611d4e57604051631b14174b60e01b815260040160405180910390fd5b6001810154600160201b900463ffffffff164210611d7f57604051630c36f66560e21b815260040160405180910390fd5b60018101805460ff60401b1916600160401b17905560405163ffffffff8416907fd850e6e5dfa497b72661fa73df2923464eaed9dc2ff1d3cb82bccbfeabe5c41e905f90a2505050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611e25573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611e499190613d3a565b6001600160a01b0316336001600160a01b031614611e7a5760405163794821ff60e01b815260040160405180910390fd5b60665480198219811614611ea15760405163c61dca5d60e01b815260040160405180910390fd5b606682905560405182815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c9060200160405180910390a25050565b6066545f90600190811603611f075760405163840a48d560e01b815260040160405180910390fd5b611f0f612244565b5f5b82811015610e275736848483818110611f2c57611f2c613927565b9050602002810190611f3e919061396b565b335f81815260ce60209081526040808320549051949550939192611f689290918591879101613ab9565b604051602081830303815290604052805190602001209050611f898361229d565b335f90815260cf602090815260408083208484529091529020805460ff19166001908117909155611fbb908390613ae8565b335f81815260ce602052604090819020929092559051829184917f450a367a380c4e339e5ae7340c8464ef27af7781ad9945cfe8abd828f89e628190612002908890613afb565b60405180910390a4612023333060408601803590610e0b90602089016134e6565b505050600101611f11565b6066546004906010908116036120575760405163840a48d560e01b815260040160405180910390fd5b335f90815260d1602052604090205460ff1661208657604051635c427cd960e01b815260040160405180910390fd5b61208e612244565b5f5b82811015610e2757368484838181106120ab576120ab613927565b90506020028101906120bd919061396b565b335f81815260ce602090815260408083205490519495509391926120e79290918591879101613ab9565b6040516020818303038152906040528051906020012090506121088361229d565b335f90815260d2602090815260408083208484529091529020805460ff1916600190811790915561213a908390613ae8565b335f81815260ce602052604090819020929092559051829184917f5251b6fdefcb5d81144e735f69ea4c695fd43b0289ca53dc075033f5fc80068b90612181908890613afb565b60405180910390a46121a2333060408601803590610e0b90602089016134e6565b505050600101612090565b6033546001600160a01b0316331461120d5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401611b23565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a250565b6002609754036122965760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401611b23565b6002609755565b6122cf6122aa8280613d55565b6122ba60808501606086016136f8565b6122ca60a08601608087016136f8565b612ddd565b5f8160400135116122f3576040516310eb483f60e21b815260040160405180910390fd5b6f4b3b4ca85a86c47a098a223fffffffff816040013511156123285760405163070b5a6f60e21b815260040160405180910390fd5b61235863ffffffff7f00000000000000000000000000000000000000000000000000000000000000001642613ae8565b61236860808301606084016136f8565b63ffffffff16111561115d57604051637ee2b44360e01b815260040160405180910390fd5b6040516001600160a01b03808516602483015283166044820152606481018290526110eb9085906323b872dd60e01b906084015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b0319909316929092179091526130b5565b5f60ca61240860208501856136f8565b63ffffffff168154811061241e5761241e613927565b5f91825260209182902060408051608081018252600293909302909101805483526001015463ffffffff80821694840194909452600160201b810490931690820152600160401b90910460ff1615156060820152905061247e8382612761565b5f61248f60808501606086016134e6565b6001600160a01b038082165f90815260cc602052604090205491925016806124b45750805b336001600160a01b038216146124dd57604051635c427cd960e01b815260040160405180910390fd5b5f5b6124ec60a0870187613d9b565b9050811015611c62573661250360e0880188613d55565b8381811061251357612513613927565b6001600160a01b0387165f90815260cd602090815260408083209302949094019450929091508290612547908501856134e6565b6001600160a01b03166001600160a01b031681526020019081526020015f205490508082602001351161258d5760405163aa385e8160e01b815260040160405180910390fd5b5f61259c826020850135613914565b6001600160a01b0387165f90815260cd602090815260408220929350850180359291906125c990876134e6565b6001600160a01b031681526020808201929092526040015f209190915561260a90899083906125fa908701876134e6565b6001600160a01b03169190613188565b86516001600160a01b03808a1691878216918916907f9543dbd55580842586a951f0386e24d68a5df99ae29e3b216588b45fd684ce319061264e60208901896134e6565b604080519283526001600160a01b039091166020830152810186905260600160405180910390a45050506001016124df565b5f816040015163ffffffff165f14806126b25750815161ffff9081161480156126b25750816040015163ffffffff1642105b156126ca57505060cb54600160e01b900461ffff1690565b816040015163ffffffff164210156126e3578151611146565b506020015190565b919050565b60cb546040805163ffffffff600160a01b9093048316815291831660208301527faf557c6c02c208794817a705609cfa935f827312a1adfdd26494b6b95dd2b4b3910160405180910390a160cb805463ffffffff909216600160a01b0263ffffffff60a01b19909216919091179055565b80606001511561278457604051631b14174b60e01b815260040160405180910390fd5b806040015163ffffffff164210156127af57604051631437a2bb60e31b815260040160405180910390fd5b6127bc60c0830183613d9b565b90506127cb60a0840184613d9b565b9050146127eb576040516343714afd60e01b815260040160405180910390fd5b6127f860e0830183613d55565b905061280760c0840184613d9b565b905014612827576040516343714afd60e01b815260040160405180910390fd5b80516128539061283d60408501602086016136f8565b61284a6040860186613de1565b866060016131b8565b5f5b61286260a0840184613d9b565b9050811015610e32576128fc608084013561288060a0860186613d9b565b8481811061289057612890613927565b90506020020160208101906128a591906136f8565b6128b260c0870187613d9b565b858181106128c2576128c2613927565b90506020028101906128d49190613de1565b6128e160e0890189613d55565b878181106128f1576128f1613927565b90506040020161325c565b600101612855565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b60cb546040516001600160a01b038084169216907f237b82f438d75fc568ebab484b75b01d9287b9e98b490b7c23221623b6705dbb905f90a360cb80546001600160a01b0319166001600160a01b0392909216919091179055565b604051631beb2b9760e31b81526001600160a01b0382811660048301523360248301523060448301525f80356001600160e01b0319166064840152917f00000000000000000000000000000000000000000000000000000000000000009091169063df595cb8906084016020604051808303815f875af1158015612a36573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111469190613950565b5f612a88612a688380613d55565b612a7860808601606087016136f8565b6122ca60a08701608088016136f8565b5f612a966040840184613d55565b905011612ab65760405163796cc52560e01b815260040160405180910390fd5b42612ac760a08401608085016136f8565b612ad760808501606086016136f8565b612ae19190613b0d565b63ffffffff1610612b055760405163150358a160e21b815260040160405180910390fd5b5f80805b612b166040860186613d55565b9050811015612c075736612b2d6040870187613d55565b83818110612b3d57612b3d613927565b6040029190910191505f9050612b5660208301836134e6565b6001600160a01b031603612b7d57604051630863a45360e11b815260040160405180910390fd5b612b8a60208201826134e6565b6001600160a01b0316836001600160a01b031610612bbb576040516310fb47f160e31b815260040160405180910390fd5b5f816020013511612bdf576040516310eb483f60e21b815260040160405180910390fd5b612bec60208201826134e6565b9250612bfc602082013585613ae8565b935050600101612b09565b506f4b3b4ca85a86c47a098a223fffffffff821115612c395760405163070b5a6f60e21b815260040160405180910390fd5b5092915050565b6001600160a01b038083165f81815260cc602052604080822080548686166001600160a01b0319821681179092559151919094169392849290917fbab947934d42e0ad206f25c9cab18b5bb6ae144acfb00f40b4e3aa59590ca3129190a4505050565b60cb546040805161ffff600160e01b9093048316815291831660208301527fe6cd4edfdcc1f6d130ab35f73d72378f3a642944fb4ee5bd84b7807a81ea1c4e910160405180910390a160cb805461ffff909216600160e01b0261ffff60e01b19909216919091179055565b61271061ffff83161115612d355760405163891c63df60e01b815260040160405180910390fd5b8254600160201b900463ffffffff164211612d6357604051637b1e25c560e01b815260040160405180910390fd5b8254600160201b900463ffffffff165f03612d8a57825461ffff191661ffff178355612da1565b825462010000810461ffff1661ffff199091161783555b825463ffffffff909116600160201b0267ffffffff000000001961ffff90931662010000029290921667ffffffffffff00001990911617179055565b82612dfb5760405163796cc52560e01b815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000063ffffffff168163ffffffff161115612e4857604051630dd0b9f560e21b815260040160405180910390fd5b612e727f000000000000000000000000000000000000000000000000000000000000000082613e38565b63ffffffff1615612e965760405163ee66470560e01b815260040160405180910390fd5b612ec07f000000000000000000000000000000000000000000000000000000000000000083613e38565b63ffffffff1615612ee457604051633c1a94f160e21b815260040160405180910390fd5b8163ffffffff167f000000000000000000000000000000000000000000000000000000000000000063ffffffff1642612f1d9190613914565b11158015612f5757508163ffffffff167f000000000000000000000000000000000000000000000000000000000000000063ffffffff1611155b612f745760405163041aa75760e11b815260040160405180910390fd5b5f805b84811015611c62575f868683818110612f9257612f92613927565b612fa892602060409092020190810191506134e6565b60405163198f077960e21b81526001600160a01b0380831660048301529192507f00000000000000000000000000000000000000000000000000000000000000009091169063663c1de490602401602060405180830381865afa158015613011573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906130359190613950565b8061305c57506001600160a01b03811673beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac0145b61307957604051632efd965160e11b815260040160405180910390fd5b806001600160a01b0316836001600160a01b0316106130ab5760405163dfad9ca160e01b815260040160405180910390fd5b9150600101612f77565b5f613109826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b031661329a9092919063ffffffff16565b905080515f14806131295750808060200190518101906131299190613950565b610e325760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401611b23565b6040516001600160a01b038316602482015260448101829052610e3290849063a9059cbb60e01b906064016123c1565b6131c3602083613e5f565b6001901b8463ffffffff16106131eb5760405162c6c39d60e71b815260040160405180910390fd5b5f6131f582610c22565b905061323f84848080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152508a92508591505063ffffffff89166132b0565b611c62576040516369ca16c960e01b815260040160405180910390fd5b613267602083613e5f565b6001901b8463ffffffff16106132905760405163054ff4df60e51b815260040160405180910390fd5b5f6131f582611c6a565b60606132a884845f856132c7565b949350505050565b5f836132bd86858561339e565b1495945050505050565b6060824710156133285760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401611b23565b5f5f866001600160a01b031685876040516133439190613e72565b5f6040518083038185875af1925050503d805f811461337d576040519150601f19603f3d011682016040523d82523d5f602084013e613382565b606091505b509150915061339387838387613435565b979650505050505050565b5f602084516133ad9190613e88565b156133cb576040516313717da960e21b815260040160405180910390fd5b8260205b8551811161342c576133e2600285613e88565b5f0361340357815f528086015160205260405f20915060028404935061341a565b808601515f528160205260405f2091506002840493505b613425602082613ae8565b90506133cf565b50949350505050565b606083156134a35782515f0361349c576001600160a01b0385163b61349c5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401611b23565b50816132a8565b6132a883838151156134b85781518083602001fd5b8060405162461bcd60e51b8152600401611b239190613e9b565b6001600160a01b038116811461115d575f5ffd5b5f602082840312156134f6575f5ffd5b81356118c8816134d2565b801515811461115d575f5ffd5b5f5f6040838503121561351f575f5ffd5b823561352a816134d2565b9150602083013561353a81613501565b809150509250929050565b5f60208284031215613555575f5ffd5b5035919050565b5f6040828403121561356c575f5ffd5b50919050565b5f60408284031215613582575f5ffd5b6118c8838361355c565b5f5f83601f84011261359c575f5ffd5b50813567ffffffffffffffff8111156135b3575f5ffd5b6020830191508360208260051b85010111156135cd575f5ffd5b9250929050565b5f5f602083850312156135e5575f5ffd5b823567ffffffffffffffff8111156135fb575f5ffd5b6136078582860161358c565b90969095509350505050565b5f610100828403121561356c575f5ffd5b5f5f60408385031215613635575f5ffd5b823567ffffffffffffffff81111561364b575f5ffd5b61365785828601613613565b925050602083013561353a816134d2565b803563ffffffff811681146126eb575f5ffd5b5f5f6040838503121561368c575f5ffd5b8235915061369c60208401613668565b90509250929050565b5f5f5f604084860312156136b7575f5ffd5b833567ffffffffffffffff8111156136cd575f5ffd5b6136d98682870161358c565b90945092505060208401356136ed816134d2565b809150509250925092565b5f60208284031215613708575f5ffd5b6118c882613668565b5f60208284031215613721575f5ffd5b813560ff811681146118c8575f5ffd5b5f60208284031215613741575f5ffd5b813567ffffffffffffffff811115613757575f5ffd5b6132a884828501613613565b5f5f60408385031215613774575f5ffd5b823561377f816134d2565b946020939093013593505050565b5f5f6040838503121561379e575f5ffd5b82356137a9816134d2565b9150602083013561353a816134d2565b5f5f5f604084860312156137cb575f5ffd5b83356137d6816134d2565b9250602084013567ffffffffffffffff8111156137f1575f5ffd5b6137fd8682870161358c565b9497909650939450505050565b803561ffff811681146126eb575f5ffd5b5f6020828403121561382b575f5ffd5b6118c88261380a565b5f5f60408385031215613845575f5ffd5b8235613850816134d2565b915061369c6020840161380a565b5f5f5f60608486031215613870575f5ffd5b833561387b816134d2565b9250602084013561388b816134d2565b91506138996040850161380a565b90509250925092565b5f5f5f5f5f60a086880312156138b6575f5ffd5b85356138c1816134d2565b94506020860135935060408601356138d8816134d2565b92506138e660608701613668565b91506138f46080870161380a565b90509295509295909350565b634e487b7160e01b5f52601160045260245ffd5b8181038181111561114657611146613900565b634e487b7160e01b5f52603260045260245ffd5b5f8161394957613949613900565b505f190190565b5f60208284031215613960575f5ffd5b81516118c881613501565b5f8235609e1983360301811261397f575f5ffd5b9190910192915050565b5f5f8335601e1984360301811261399e575f5ffd5b830160208101925035905067ffffffffffffffff8111156139bd575f5ffd5b8060061b36038213156135cd575f5ffd5b8183526020830192505f815f5b84811015613a315781356139ee816134d2565b6001600160a01b0316865260208201356bffffffffffffffffffffffff8116808214613a18575f5ffd5b60208801525060409586019591909101906001016139db565b5093949350505050565b5f613a468283613989565b60a08552613a5860a0860182846139ce565b9150506020830135613a69816134d2565b6001600160a01b031660208501526040838101359085015263ffffffff613a9260608501613668565b16606085015263ffffffff613aa960808501613668565b1660808501528091505092915050565b60018060a01b0384168152826020820152606060408201525f613adf6060830184613a3b565b95945050505050565b8082018082111561114657611146613900565b602081525f6118c86020830184613a3b565b63ffffffff818116838216019081111561114657611146613900565b5f823560fe1983360301811261397f575f5ffd5b5f823560be1983360301811261397f575f5ffd5b5f5f8335601e19843603018112613b66575f5ffd5b830160208101925035905067ffffffffffffffff811115613b85575f5ffd5b8036038213156135cd575f5ffd5b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b5f613bc68283613989565b60c08552613bd860c0860182846139ce565b9150506020830135613be9816134d2565b6001600160a01b03166020850152613c046040840184613989565b858303604087015280835290915f91906020015b81831015613c53578335613c2b816134d2565b6001600160a01b03168152602084810135908201526040938401936001939093019201613c18565b613c5f60608701613668565b63ffffffff811660608901529350613c7960808701613668565b63ffffffff811660808901529350613c9460a0870187613b51565b9450925086810360a0880152613393818585613b93565b60018060a01b0384168152826020820152606060408201525f613adf6060830184613bbb565b828152604060208201525f6132a86040830184613bbb565b63ffffffff828116828216039081111561114657611146613900565b5f63ffffffff821680613d1a57613d1a613900565b5f190192915050565b5f60208284031215613d33575f5ffd5b5051919050565b5f60208284031215613d4a575f5ffd5b81516118c8816134d2565b5f5f8335601e19843603018112613d6a575f5ffd5b83018035915067ffffffffffffffff821115613d84575f5ffd5b6020019150600681901b36038213156135cd575f5ffd5b5f5f8335601e19843603018112613db0575f5ffd5b83018035915067ffffffffffffffff821115613dca575f5ffd5b6020019150600581901b36038213156135cd575f5ffd5b5f5f8335601e19843603018112613df6575f5ffd5b83018035915067ffffffffffffffff821115613e10575f5ffd5b6020019150368190038213156135cd575f5ffd5b634e487b7160e01b5f52601260045260245ffd5b5f63ffffffff831680613e4d57613e4d613e24565b8063ffffffff84160691505092915050565b5f82613e6d57613e6d613e24565b500490565b5f82518060208501845e5f920191825250919050565b5f82613e9657613e96613e24565b500690565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f8301168401019150509291505056fea26469706673582212206e80bedbb6b3ce4c9903361c1aa7c4613c7d3e70cc3a47bb89d3c7bb5e321a9664736f6c634300081b0033", +>>>>>>> 1b97e8d0 (feat: add `getAllocatedStake` and update `getMinimumSlashableStake` (#1037)) } // RewardsCoordinatorABI is the input ABI used to generate the binding from. diff --git a/pkg/bindings/SlashingLib/binding.go b/pkg/bindings/SlashingLib/binding.go index 50d5dc40de..7d63923c31 100644 --- a/pkg/bindings/SlashingLib/binding.go +++ b/pkg/bindings/SlashingLib/binding.go @@ -32,7 +32,7 @@ var ( // SlashingLibMetaData contains all meta data concerning the SlashingLib contract. var SlashingLibMetaData = &bind.MetaData{ ABI: "[]", - Bin: "0x60556032600b8282823980515f1a607314602657634e487b7160e01b5f525f60045260245ffd5b305f52607381538281f3fe730000000000000000000000000000000000000000301460806040525f5ffdfea264697066735822122058e15e955a976861c65d02452e26cd3829c665a8a59b90392f5f7985280fe5d864736f6c634300081b0033", + Bin: "0x60556032600b8282823980515f1a607314602657634e487b7160e01b5f525f60045260245ffd5b305f52607381538281f3fe730000000000000000000000000000000000000000301460806040525f5ffdfea264697066735822122079d8acd82faee8c5e28651bbc1515549e1c13cf6bb3869d1f31aa11a796fa9f664736f6c634300081b0033", } // SlashingLibABI is the input ABI used to generate the binding from. diff --git a/pkg/bindings/Snapshots/binding.go b/pkg/bindings/Snapshots/binding.go index d300db193e..2a6027eebf 100644 --- a/pkg/bindings/Snapshots/binding.go +++ b/pkg/bindings/Snapshots/binding.go @@ -32,7 +32,7 @@ var ( // SnapshotsMetaData contains all meta data concerning the Snapshots contract. var SnapshotsMetaData = &bind.MetaData{ ABI: "[{\"type\":\"error\",\"name\":\"InvalidSnapshotOrdering\",\"inputs\":[]}]", - Bin: "0x60556032600b8282823980515f1a607314602657634e487b7160e01b5f525f60045260245ffd5b305f52607381538281f3fe730000000000000000000000000000000000000000301460806040525f5ffdfea264697066735822122000b32b484185179f60b3b1528c5fcf3ab158742c3034b94518561b44ec7dd07564736f6c634300081b0033", + Bin: "0x60556032600b8282823980515f1a607314602657634e487b7160e01b5f525f60045260245ffd5b305f52607381538281f3fe730000000000000000000000000000000000000000301460806040525f5ffdfea264697066735822122044bb5b18319bff57ed60efd0467beb2f05208fa5189c267bfd18f0a7f7417aa964736f6c634300081b0033", } // SnapshotsABI is the input ABI used to generate the binding from. diff --git a/pkg/bindings/StrategyBase/binding.go b/pkg/bindings/StrategyBase/binding.go index 3286d6f529..ac35ee68e7 100644 --- a/pkg/bindings/StrategyBase/binding.go +++ b/pkg/bindings/StrategyBase/binding.go @@ -32,7 +32,7 @@ var ( // StrategyBaseMetaData contains all meta data concerning the StrategyBase contract. var StrategyBaseMetaData = &bind.MetaData{ ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"_strategyManager\",\"type\":\"address\",\"internalType\":\"contractIStrategyManager\"},{\"name\":\"_pauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"deposit\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"newShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"explanation\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"_underlyingToken\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"pauseAll\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[{\"name\":\"index\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pauserRegistry\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"shares\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"sharesToUnderlying\",\"inputs\":[{\"name\":\"amountShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"sharesToUnderlyingView\",\"inputs\":[{\"name\":\"amountShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"strategyManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategyManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"totalShares\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"underlyingToShares\",\"inputs\":[{\"name\":\"amountUnderlying\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"underlyingToSharesView\",\"inputs\":[{\"name\":\"amountUnderlying\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"underlyingToken\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"userUnderlying\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"userUnderlyingView\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"withdraw\",\"inputs\":[{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amountShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"ExchangeRateEmitted\",\"inputs\":[{\"name\":\"rate\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StrategyTokenSet\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIERC20\"},{\"name\":\"decimals\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"BalanceExceedsMaxTotalDeposits\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"CurrentlyPaused\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InputAddressZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidNewPausedStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"MaxPerDepositExceedsMax\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NewSharesZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyPauser\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyStrategyManager\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyUnderlyingToken\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyUnpauser\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"TotalSharesExceedsMax\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"WithdrawalAmountExceedsTotalDeposits\",\"inputs\":[]}]", - Bin: "0x60c060405234801561000f575f5ffd5b506040516113a63803806113a683398101604081905261002e9161014b565b806001600160a01b038116610056576040516339b190bb60e11b815260040160405180910390fd5b6001600160a01b03908116608052821660a052610071610078565b5050610183565b5f54610100900460ff16156100e35760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff90811614610132575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b0381168114610148575f5ffd5b50565b5f5f6040838503121561015c575f5ffd5b825161016781610134565b602084015190925061017881610134565b809150509250929050565b60805160a0516111d86101ce5f395f81816101750152818161040201528181610796015261083301525f818161022b0152818161030f01528181610543015261096101526111d85ff3fe608060405234801561000f575f5ffd5b5060043610610127575f3560e01c8063886f1195116100a9578063ce7c2ac21161006e578063ce7c2ac21461029b578063d9caed12146102ae578063e3dae51c146102c1578063f3e73875146102d4578063fabc1cbc146102e7575f5ffd5b8063886f1195146102265780638c8710191461024d5780638f6a624014610260578063ab5921e114610273578063c4d66de814610288575f5ffd5b8063553ca5f8116100ef578063553ca5f8146101c1578063595c6a67146101d45780635ac86ab7146101dc5780635c975abb1461020b5780637a8b263714610213575f5ffd5b8063136439dd1461012b5780632495a5991461014057806339b70e38146101705780633a98ef391461019757806347e7ef24146101ae575b5f5ffd5b61013e610139366004610f4d565b6102fa565b005b603254610153906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b6101537f000000000000000000000000000000000000000000000000000000000000000081565b6101a060335481565b604051908152602001610167565b6101a06101bc366004610f7b565b6103cf565b6101a06101cf366004610fa5565b61051b565b61013e61052e565b6101fb6101ea366004610fd5565b6001805460ff9092161b9081161490565b6040519015158152602001610167565b6001546101a0565b6101a0610221366004610f4d565b6105dd565b6101537f000000000000000000000000000000000000000000000000000000000000000081565b6101a061025b366004610f4d565b610626565b6101a061026e366004610fa5565b610630565b61027b61063d565b6040516101679190610ff0565b61013e610296366004610fa5565b61065d565b6101a06102a9366004610fa5565b61076f565b61013e6102bc366004611025565b610801565b6101a06102cf366004610f4d565b61091e565b6101a06102e2366004610f4d565b610955565b61013e6102f5366004610f4d565b61095f565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa15801561035c573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103809190611063565b61039d57604051631d77d47760e21b815260040160405180910390fd5b60015481811681146103c25760405163c61dca5d60e01b815260040160405180910390fd5b6103cb82610a75565b5050565b600180545f9182918116036103f75760405163840a48d560e01b815260040160405180910390fd5b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610440576040516348da714f60e01b815260040160405180910390fd5b61044a8484610ab2565b6033545f61045a6103e883611096565b90505f6103e8610468610ae0565b6104729190611096565b90505f61047f87836110a9565b90508061048c84896110bc565b61049691906110d3565b9550855f036104b857604051630c392ed360e11b815260040160405180910390fd5b6104c28685611096565b60338190556f4b3b4ca85a86c47a098a223fffffffff10156104f757604051632f14e8a360e11b815260040160405180910390fd5b610510826103e860335461050b9190611096565b610b4f565b505050505092915050565b5f6105286102218361076f565b92915050565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa158015610590573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105b49190611063565b6105d157604051631d77d47760e21b815260040160405180910390fd5b6105db5f19610a75565b565b5f5f6103e86033546105ef9190611096565b90505f6103e86105fd610ae0565b6106079190611096565b90508161061485836110bc565b61061e91906110d3565b949350505050565b5f6105288261091e565b5f6105286102e28361076f565b60606040518060800160405280604d8152602001611156604d9139905090565b5f54610100900460ff161580801561067b57505f54600160ff909116105b806106945750303b15801561069457505f5460ff166001145b6106fc5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b5f805460ff19166001179055801561071d575f805461ff0019166101001790555b61072682610b9b565b80156103cb575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498906020015b60405180910390a15050565b60405163fe243a1760e01b81526001600160a01b0382811660048301523060248301525f917f00000000000000000000000000000000000000000000000000000000000000009091169063fe243a1790604401602060405180830381865afa1580156107dd573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061052891906110f2565b600180546002908116036108285760405163840a48d560e01b815260040160405180910390fd5b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610871576040516348da714f60e01b815260040160405180910390fd5b61087c848484610ce6565b603354808311156108a057604051630b469df360e41b815260040160405180910390fd5b5f6108ad6103e883611096565b90505f6103e86108bb610ae0565b6108c59190611096565b90505f826108d387846110bc565b6108dd91906110d3565b90506108e986856110a9565b6033556109096108f982846110a9565b6103e860335461050b9190611096565b610914888883610d19565b5050505050505050565b5f5f6103e86033546109309190611096565b90505f6103e861093e610ae0565b6109489190611096565b90508061061483866110bc565b5f610528826105dd565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156109bb573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109df9190611109565b6001600160a01b0316336001600160a01b031614610a105760405163794821ff60e01b815260040160405180910390fd5b60015480198219811614610a375760405163c61dca5d60e01b815260040160405180910390fd5b600182905560405182815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c9060200160405180910390a25050565b600181905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a250565b6032546001600160a01b038381169116146103cb57604051630312abdd60e61b815260040160405180910390fd5b6032546040516370a0823160e01b81523060048201525f916001600160a01b0316906370a0823190602401602060405180830381865afa158015610b26573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b4a91906110f2565b905090565b7fd2494f3479e5da49d386657c292c610b5b01df313d07c62eb0cfa49924a31be881610b8384670de0b6b3a76400006110bc565b610b8d91906110d3565b604051908152602001610763565b5f54610100900460ff16610c055760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b60648201526084016106f3565b603280546001600160a01b0319166001600160a01b038316179055610c295f610a75565b7f1c540707b00eb5427b6b774fc799d756516a54aee108b64b327acc55af55750760325f9054906101000a90046001600160a01b0316826001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015610c9b573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610cbf9190611124565b604080516001600160a01b03909316835260ff90911660208301520160405180910390a150565b6032546001600160a01b03838116911614610d1457604051630312abdd60e61b815260040160405180910390fd5b505050565b604080516001600160a01b03858116602483015260448083018590528351808403909101815260649092018352602080830180516001600160e01b031663a9059cbb60e01b17905283518085019094528084527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c656490840152610d1492908516918691859185918591905f90610db19084908490610e30565b905080515f1480610dd1575080806020019051810190610dd19190611063565b610d145760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016106f3565b606061061e84845f85855f5f866001600160a01b03168587604051610e55919061113f565b5f6040518083038185875af1925050503d805f8114610e8f576040519150601f19603f3d011682016040523d82523d5f602084013e610e94565b606091505b5091509150610ea587838387610eb0565b979650505050505050565b60608315610f1e5782515f03610f17576001600160a01b0385163b610f175760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016106f3565b508161061e565b61061e8383815115610f335781518083602001fd5b8060405162461bcd60e51b81526004016106f39190610ff0565b5f60208284031215610f5d575f5ffd5b5035919050565b6001600160a01b0381168114610f78575f5ffd5b50565b5f5f60408385031215610f8c575f5ffd5b8235610f9781610f64565b946020939093013593505050565b5f60208284031215610fb5575f5ffd5b8135610fc081610f64565b9392505050565b60ff81168114610f78575f5ffd5b5f60208284031215610fe5575f5ffd5b8135610fc081610fc7565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b5f5f5f60608486031215611037575f5ffd5b833561104281610f64565b9250602084013561105281610f64565b929592945050506040919091013590565b5f60208284031215611073575f5ffd5b81518015158114610fc0575f5ffd5b634e487b7160e01b5f52601160045260245ffd5b8082018082111561052857610528611082565b8181038181111561052857610528611082565b808202811582820484141761052857610528611082565b5f826110ed57634e487b7160e01b5f52601260045260245ffd5b500490565b5f60208284031215611102575f5ffd5b5051919050565b5f60208284031215611119575f5ffd5b8151610fc081610f64565b5f60208284031215611134575f5ffd5b8151610fc081610fc7565b5f82518060208501845e5f92019182525091905056fe4261736520537472617465677920696d706c656d656e746174696f6e20746f20696e68657269742066726f6d20666f72206d6f726520636f6d706c657820696d706c656d656e746174696f6e73a264697066735822122051aebd204cadf78dd013bb624848f20df5d7f30cc5a724fd45127b53a808148b64736f6c634300081b0033", + Bin: "0x60c060405234801561000f575f5ffd5b506040516113a63803806113a683398101604081905261002e9161014b565b806001600160a01b038116610056576040516339b190bb60e11b815260040160405180910390fd5b6001600160a01b03908116608052821660a052610071610078565b5050610183565b5f54610100900460ff16156100e35760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff90811614610132575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b0381168114610148575f5ffd5b50565b5f5f6040838503121561015c575f5ffd5b825161016781610134565b602084015190925061017881610134565b809150509250929050565b60805160a0516111d86101ce5f395f81816101750152818161040201528181610796015261083301525f818161022b0152818161030f01528181610543015261096101526111d85ff3fe608060405234801561000f575f5ffd5b5060043610610127575f3560e01c8063886f1195116100a9578063ce7c2ac21161006e578063ce7c2ac21461029b578063d9caed12146102ae578063e3dae51c146102c1578063f3e73875146102d4578063fabc1cbc146102e7575f5ffd5b8063886f1195146102265780638c8710191461024d5780638f6a624014610260578063ab5921e114610273578063c4d66de814610288575f5ffd5b8063553ca5f8116100ef578063553ca5f8146101c1578063595c6a67146101d45780635ac86ab7146101dc5780635c975abb1461020b5780637a8b263714610213575f5ffd5b8063136439dd1461012b5780632495a5991461014057806339b70e38146101705780633a98ef391461019757806347e7ef24146101ae575b5f5ffd5b61013e610139366004610f4d565b6102fa565b005b603254610153906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b6101537f000000000000000000000000000000000000000000000000000000000000000081565b6101a060335481565b604051908152602001610167565b6101a06101bc366004610f7b565b6103cf565b6101a06101cf366004610fa5565b61051b565b61013e61052e565b6101fb6101ea366004610fd5565b6001805460ff9092161b9081161490565b6040519015158152602001610167565b6001546101a0565b6101a0610221366004610f4d565b6105dd565b6101537f000000000000000000000000000000000000000000000000000000000000000081565b6101a061025b366004610f4d565b610626565b6101a061026e366004610fa5565b610630565b61027b61063d565b6040516101679190610ff0565b61013e610296366004610fa5565b61065d565b6101a06102a9366004610fa5565b61076f565b61013e6102bc366004611025565b610801565b6101a06102cf366004610f4d565b61091e565b6101a06102e2366004610f4d565b610955565b61013e6102f5366004610f4d565b61095f565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa15801561035c573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103809190611063565b61039d57604051631d77d47760e21b815260040160405180910390fd5b60015481811681146103c25760405163c61dca5d60e01b815260040160405180910390fd5b6103cb82610a75565b5050565b600180545f9182918116036103f75760405163840a48d560e01b815260040160405180910390fd5b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610440576040516348da714f60e01b815260040160405180910390fd5b61044a8484610ab2565b6033545f61045a6103e883611096565b90505f6103e8610468610ae0565b6104729190611096565b90505f61047f87836110a9565b90508061048c84896110bc565b61049691906110d3565b9550855f036104b857604051630c392ed360e11b815260040160405180910390fd5b6104c28685611096565b60338190556f4b3b4ca85a86c47a098a223fffffffff10156104f757604051632f14e8a360e11b815260040160405180910390fd5b610510826103e860335461050b9190611096565b610b4f565b505050505092915050565b5f6105286102218361076f565b92915050565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa158015610590573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105b49190611063565b6105d157604051631d77d47760e21b815260040160405180910390fd5b6105db5f19610a75565b565b5f5f6103e86033546105ef9190611096565b90505f6103e86105fd610ae0565b6106079190611096565b90508161061485836110bc565b61061e91906110d3565b949350505050565b5f6105288261091e565b5f6105286102e28361076f565b60606040518060800160405280604d8152602001611156604d9139905090565b5f54610100900460ff161580801561067b57505f54600160ff909116105b806106945750303b15801561069457505f5460ff166001145b6106fc5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b5f805460ff19166001179055801561071d575f805461ff0019166101001790555b61072682610b9b565b80156103cb575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498906020015b60405180910390a15050565b60405163fe243a1760e01b81526001600160a01b0382811660048301523060248301525f917f00000000000000000000000000000000000000000000000000000000000000009091169063fe243a1790604401602060405180830381865afa1580156107dd573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061052891906110f2565b600180546002908116036108285760405163840a48d560e01b815260040160405180910390fd5b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610871576040516348da714f60e01b815260040160405180910390fd5b61087c848484610ce6565b603354808311156108a057604051630b469df360e41b815260040160405180910390fd5b5f6108ad6103e883611096565b90505f6103e86108bb610ae0565b6108c59190611096565b90505f826108d387846110bc565b6108dd91906110d3565b90506108e986856110a9565b6033556109096108f982846110a9565b6103e860335461050b9190611096565b610914888883610d19565b5050505050505050565b5f5f6103e86033546109309190611096565b90505f6103e861093e610ae0565b6109489190611096565b90508061061483866110bc565b5f610528826105dd565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156109bb573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109df9190611109565b6001600160a01b0316336001600160a01b031614610a105760405163794821ff60e01b815260040160405180910390fd5b60015480198219811614610a375760405163c61dca5d60e01b815260040160405180910390fd5b600182905560405182815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c9060200160405180910390a25050565b600181905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a250565b6032546001600160a01b038381169116146103cb57604051630312abdd60e61b815260040160405180910390fd5b6032546040516370a0823160e01b81523060048201525f916001600160a01b0316906370a0823190602401602060405180830381865afa158015610b26573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b4a91906110f2565b905090565b7fd2494f3479e5da49d386657c292c610b5b01df313d07c62eb0cfa49924a31be881610b8384670de0b6b3a76400006110bc565b610b8d91906110d3565b604051908152602001610763565b5f54610100900460ff16610c055760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b60648201526084016106f3565b603280546001600160a01b0319166001600160a01b038316179055610c295f610a75565b7f1c540707b00eb5427b6b774fc799d756516a54aee108b64b327acc55af55750760325f9054906101000a90046001600160a01b0316826001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015610c9b573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610cbf9190611124565b604080516001600160a01b03909316835260ff90911660208301520160405180910390a150565b6032546001600160a01b03838116911614610d1457604051630312abdd60e61b815260040160405180910390fd5b505050565b604080516001600160a01b03858116602483015260448083018590528351808403909101815260649092018352602080830180516001600160e01b031663a9059cbb60e01b17905283518085019094528084527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c656490840152610d1492908516918691859185918591905f90610db19084908490610e30565b905080515f1480610dd1575080806020019051810190610dd19190611063565b610d145760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016106f3565b606061061e84845f85855f5f866001600160a01b03168587604051610e55919061113f565b5f6040518083038185875af1925050503d805f8114610e8f576040519150601f19603f3d011682016040523d82523d5f602084013e610e94565b606091505b5091509150610ea587838387610eb0565b979650505050505050565b60608315610f1e5782515f03610f17576001600160a01b0385163b610f175760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016106f3565b508161061e565b61061e8383815115610f335781518083602001fd5b8060405162461bcd60e51b81526004016106f39190610ff0565b5f60208284031215610f5d575f5ffd5b5035919050565b6001600160a01b0381168114610f78575f5ffd5b50565b5f5f60408385031215610f8c575f5ffd5b8235610f9781610f64565b946020939093013593505050565b5f60208284031215610fb5575f5ffd5b8135610fc081610f64565b9392505050565b60ff81168114610f78575f5ffd5b5f60208284031215610fe5575f5ffd5b8135610fc081610fc7565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b5f5f5f60608486031215611037575f5ffd5b833561104281610f64565b9250602084013561105281610f64565b929592945050506040919091013590565b5f60208284031215611073575f5ffd5b81518015158114610fc0575f5ffd5b634e487b7160e01b5f52601160045260245ffd5b8082018082111561052857610528611082565b8181038181111561052857610528611082565b808202811582820484141761052857610528611082565b5f826110ed57634e487b7160e01b5f52601260045260245ffd5b500490565b5f60208284031215611102575f5ffd5b5051919050565b5f60208284031215611119575f5ffd5b8151610fc081610f64565b5f60208284031215611134575f5ffd5b8151610fc081610fc7565b5f82518060208501845e5f92019182525091905056fe4261736520537472617465677920696d706c656d656e746174696f6e20746f20696e68657269742066726f6d20666f72206d6f726520636f6d706c657820696d706c656d656e746174696f6e73a2646970667358221220601b35d308a21bc556eb3a47693a37c1997871cb19c44ae4188b093a82e9065f64736f6c634300081b0033", } // 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 de2a278236..fa4679dba3 100644 --- a/pkg/bindings/StrategyBaseTVLLimits/binding.go +++ b/pkg/bindings/StrategyBaseTVLLimits/binding.go @@ -32,7 +32,7 @@ var ( // StrategyBaseTVLLimitsMetaData contains all meta data concerning the StrategyBaseTVLLimits contract. var StrategyBaseTVLLimitsMetaData = &bind.MetaData{ ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"_strategyManager\",\"type\":\"address\",\"internalType\":\"contractIStrategyManager\"},{\"name\":\"_pauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"deposit\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"newShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"explanation\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"getTVLLimits\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"_maxPerDeposit\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_maxTotalDeposits\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_underlyingToken\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"_underlyingToken\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"maxPerDeposit\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"maxTotalDeposits\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"pauseAll\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[{\"name\":\"index\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pauserRegistry\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"setTVLLimits\",\"inputs\":[{\"name\":\"newMaxPerDeposit\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"newMaxTotalDeposits\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"shares\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"sharesToUnderlying\",\"inputs\":[{\"name\":\"amountShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"sharesToUnderlyingView\",\"inputs\":[{\"name\":\"amountShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"strategyManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategyManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"totalShares\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"underlyingToShares\",\"inputs\":[{\"name\":\"amountUnderlying\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"underlyingToSharesView\",\"inputs\":[{\"name\":\"amountUnderlying\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"underlyingToken\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"userUnderlying\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"userUnderlyingView\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"withdraw\",\"inputs\":[{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amountShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"ExchangeRateEmitted\",\"inputs\":[{\"name\":\"rate\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"MaxPerDepositUpdated\",\"inputs\":[{\"name\":\"previousValue\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"newValue\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"MaxTotalDepositsUpdated\",\"inputs\":[{\"name\":\"previousValue\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"newValue\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StrategyTokenSet\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIERC20\"},{\"name\":\"decimals\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"BalanceExceedsMaxTotalDeposits\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"CurrentlyPaused\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InputAddressZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidNewPausedStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"MaxPerDepositExceedsMax\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NewSharesZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyPauser\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyStrategyManager\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyUnderlyingToken\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyUnpauser\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"TotalSharesExceedsMax\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"WithdrawalAmountExceedsTotalDeposits\",\"inputs\":[]}]", - Bin: "0x60c060405234801561000f575f5ffd5b5060405161173e38038061173e83398101604081905261002e9161014f565b8181806001600160a01b038116610058576040516339b190bb60e11b815260040160405180910390fd5b6001600160a01b03908116608052821660a05261007361007c565b50505050610187565b5f54610100900460ff16156100e75760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff90811614610136575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b038116811461014c575f5ffd5b50565b5f5f60408385031215610160575f5ffd5b825161016b81610138565b602084015190925061017c81610138565b809150509250929050565b60805160a0516115656101d95f395f81816101ce01528181610556015281816109790152610a1601525f81816102960152818161039501528181610467015281816106970152610b4401526115655ff3fe608060405234801561000f575f5ffd5b506004361061016d575f3560e01c80637a8b2637116100d9578063c4d66de811610093578063df6fadc11161006e578063df6fadc11461033f578063e3dae51c1461035a578063f3e738751461036d578063fabc1cbc14610380575f5ffd5b8063c4d66de814610306578063ce7c2ac214610319578063d9caed121461032c575f5ffd5b80637a8b26371461027e578063886f1195146102915780638c871019146102b85780638f6a6240146102cb578063a6ab36f2146102de578063ab5921e1146102f1575f5ffd5b806347e7ef241161012a57806347e7ef2414610210578063553ca5f814610223578063595c6a67146102365780635ac86ab71461023e5780635c975abb1461026d57806361b01b5d14610275575f5ffd5b806311c70c9d14610171578063136439dd146101865780632495a5991461019957806339b70e38146101c95780633a98ef39146101f057806343fe08b014610207575b5f5ffd5b61018461017f366004611236565b610393565b005b610184610194366004611256565b610452565b6032546101ac906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b6101ac7f000000000000000000000000000000000000000000000000000000000000000081565b6101f960335481565b6040519081526020016101c0565b6101f960645481565b6101f961021e366004611284565b610523565b6101f96102313660046112ae565b61066f565b610184610682565b61025d61024c3660046112de565b6001805460ff9092161b9081161490565b60405190151581526020016101c0565b6001546101f9565b6101f960655481565b6101f961028c366004611256565b610731565b6101ac7f000000000000000000000000000000000000000000000000000000000000000081565b6101f96102c6366004611256565b61077a565b6101f96102d93660046112ae565b610784565b6101846102ec3660046112f9565b610791565b6102f961086c565b6040516101c0919061132f565b6101846103143660046112ae565b61088c565b6101f96103273660046112ae565b610952565b61018461033a366004611364565b6109e4565b606454606554604080519283526020830191909152016101c0565b6101f9610368366004611256565b610b01565b6101f961037b366004611256565b610b38565b61018461038e366004611256565b610b42565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156103ef573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061041391906113a2565b6001600160a01b0316336001600160a01b0316146104445760405163794821ff60e01b815260040160405180910390fd5b61044e8282610c58565b5050565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa1580156104b4573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104d891906113bd565b6104f557604051631d77d47760e21b815260040160405180910390fd5b600154818116811461051a5760405163c61dca5d60e01b815260040160405180910390fd5b61044e82610cfc565b600180545f91829181160361054b5760405163840a48d560e01b815260040160405180910390fd5b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610594576040516348da714f60e01b815260040160405180910390fd5b61059e8484610d39565b6033545f6105ae6103e8836113f0565b90505f6103e86105bc610d90565b6105c691906113f0565b90505f6105d38783611403565b9050806105e08489611416565b6105ea919061142d565b9550855f0361060c57604051630c392ed360e11b815260040160405180910390fd5b61061686856113f0565b60338190556f4b3b4ca85a86c47a098a223fffffffff101561064b57604051632f14e8a360e11b815260040160405180910390fd5b610664826103e860335461065f91906113f0565b610dff565b505050505092915050565b5f61067c61028c83610952565b92915050565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa1580156106e4573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061070891906113bd565b61072557604051631d77d47760e21b815260040160405180910390fd5b61072f5f19610cfc565b565b5f5f6103e860335461074391906113f0565b90505f6103e8610751610d90565b61075b91906113f0565b9050816107688583611416565b610772919061142d565b949350505050565b5f61067c82610b01565b5f61067c61037b83610952565b5f54610100900460ff16158080156107af57505f54600160ff909116105b806107c85750303b1580156107c857505f5460ff166001145b6107ed5760405162461bcd60e51b81526004016107e49061144c565b60405180910390fd5b5f805460ff19166001179055801561080e575f805461ff0019166101001790555b6108188484610c58565b61082182610e4b565b8015610866575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b60606040518060800160405280604d81526020016114e3604d9139905090565b5f54610100900460ff16158080156108aa57505f54600160ff909116105b806108c35750303b1580156108c357505f5460ff166001145b6108df5760405162461bcd60e51b81526004016107e49061144c565b5f805460ff191660011790558015610900575f805461ff0019166101001790555b61090982610e4b565b801561044e575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498906020015b60405180910390a15050565b60405163fe243a1760e01b81526001600160a01b0382811660048301523060248301525f917f00000000000000000000000000000000000000000000000000000000000000009091169063fe243a1790604401602060405180830381865afa1580156109c0573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061067c919061149a565b60018054600290811603610a0b5760405163840a48d560e01b815260040160405180910390fd5b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610a54576040516348da714f60e01b815260040160405180910390fd5b610a5f848484610f96565b60335480831115610a8357604051630b469df360e41b815260040160405180910390fd5b5f610a906103e8836113f0565b90505f6103e8610a9e610d90565b610aa891906113f0565b90505f82610ab68784611416565b610ac0919061142d565b9050610acc8685611403565b603355610aec610adc8284611403565b6103e860335461065f91906113f0565b610af7888883610fc9565b5050505050505050565b5f5f6103e8603354610b1391906113f0565b90505f6103e8610b21610d90565b610b2b91906113f0565b9050806107688386611416565b5f61067c82610731565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b9e573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610bc291906113a2565b6001600160a01b0316336001600160a01b031614610bf35760405163794821ff60e01b815260040160405180910390fd5b60015480198219811614610c1a5760405163c61dca5d60e01b815260040160405180910390fd5b600182905560405182815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c9060200160405180910390a25050565b60645460408051918252602082018490527ff97ed4e083acac67830025ecbc756d8fe847cdbdca4cee3fe1e128e98b54ecb5910160405180910390a160655460408051918252602082018390527f6ab181e0440bfbf4bacdf2e99674735ce6638005490688c5f994f5399353e452910160405180910390a180821115610cf15760405163052b07b760e21b815260040160405180910390fd5b606491909155606555565b600181905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a250565b606454811115610d5c5760405163052b07b760e21b815260040160405180910390fd5b606554610d67610d90565b1115610d865760405163d86bae6760e01b815260040160405180910390fd5b61044e8282610fdd565b6032546040516370a0823160e01b81523060048201525f916001600160a01b0316906370a0823190602401602060405180830381865afa158015610dd6573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610dfa919061149a565b905090565b7fd2494f3479e5da49d386657c292c610b5b01df313d07c62eb0cfa49924a31be881610e3384670de0b6b3a7640000611416565b610e3d919061142d565b604051908152602001610946565b5f54610100900460ff16610eb55760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b60648201526084016107e4565b603280546001600160a01b0319166001600160a01b038316179055610ed95f610cfc565b7f1c540707b00eb5427b6b774fc799d756516a54aee108b64b327acc55af55750760325f9054906101000a90046001600160a01b0316826001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f4b573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f6f91906114b1565b604080516001600160a01b03909316835260ff90911660208301520160405180910390a150565b6032546001600160a01b03838116911614610fc457604051630312abdd60e61b815260040160405180910390fd5b505050565b610fc46001600160a01b038316848361100b565b6032546001600160a01b0383811691161461044e57604051630312abdd60e61b815260040160405180910390fd5b604080516001600160a01b03848116602483015260448083018590528351808403909101815260649092018352602080830180516001600160e01b031663a9059cbb60e01b17905283518085019094528084527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c656490840152610fc4928692915f9161109a918516908490611119565b905080515f14806110ba5750808060200190518101906110ba91906113bd565b610fc45760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016107e4565b606061077284845f85855f5f866001600160a01b0316858760405161113e91906114cc565b5f6040518083038185875af1925050503d805f8114611178576040519150601f19603f3d011682016040523d82523d5f602084013e61117d565b606091505b509150915061118e87838387611199565b979650505050505050565b606083156112075782515f03611200576001600160a01b0385163b6112005760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016107e4565b5081610772565b610772838381511561121c5781518083602001fd5b8060405162461bcd60e51b81526004016107e4919061132f565b5f5f60408385031215611247575f5ffd5b50508035926020909101359150565b5f60208284031215611266575f5ffd5b5035919050565b6001600160a01b0381168114611281575f5ffd5b50565b5f5f60408385031215611295575f5ffd5b82356112a08161126d565b946020939093013593505050565b5f602082840312156112be575f5ffd5b81356112c98161126d565b9392505050565b60ff81168114611281575f5ffd5b5f602082840312156112ee575f5ffd5b81356112c9816112d0565b5f5f5f6060848603121561130b575f5ffd5b833592506020840135915060408401356113248161126d565b809150509250925092565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b5f5f5f60608486031215611376575f5ffd5b83356113818161126d565b925060208401356113918161126d565b929592945050506040919091013590565b5f602082840312156113b2575f5ffd5b81516112c98161126d565b5f602082840312156113cd575f5ffd5b815180151581146112c9575f5ffd5b634e487b7160e01b5f52601160045260245ffd5b8082018082111561067c5761067c6113dc565b8181038181111561067c5761067c6113dc565b808202811582820484141761067c5761067c6113dc565b5f8261144757634e487b7160e01b5f52601260045260245ffd5b500490565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b5f602082840312156114aa575f5ffd5b5051919050565b5f602082840312156114c1575f5ffd5b81516112c9816112d0565b5f82518060208501845e5f92019182525091905056fe4261736520537472617465677920696d706c656d656e746174696f6e20746f20696e68657269742066726f6d20666f72206d6f726520636f6d706c657820696d706c656d656e746174696f6e73a2646970667358221220f7549fe36abce1db431789495a45e0b7247b65b61a09934b09e0fdd4a52befc464736f6c634300081b0033", + Bin: "0x60c060405234801561000f575f5ffd5b5060405161173e38038061173e83398101604081905261002e9161014f565b8181806001600160a01b038116610058576040516339b190bb60e11b815260040160405180910390fd5b6001600160a01b03908116608052821660a05261007361007c565b50505050610187565b5f54610100900460ff16156100e75760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff90811614610136575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b038116811461014c575f5ffd5b50565b5f5f60408385031215610160575f5ffd5b825161016b81610138565b602084015190925061017c81610138565b809150509250929050565b60805160a0516115656101d95f395f81816101ce01528181610556015281816109790152610a1601525f81816102960152818161039501528181610467015281816106970152610b4401526115655ff3fe608060405234801561000f575f5ffd5b506004361061016d575f3560e01c80637a8b2637116100d9578063c4d66de811610093578063df6fadc11161006e578063df6fadc11461033f578063e3dae51c1461035a578063f3e738751461036d578063fabc1cbc14610380575f5ffd5b8063c4d66de814610306578063ce7c2ac214610319578063d9caed121461032c575f5ffd5b80637a8b26371461027e578063886f1195146102915780638c871019146102b85780638f6a6240146102cb578063a6ab36f2146102de578063ab5921e1146102f1575f5ffd5b806347e7ef241161012a57806347e7ef2414610210578063553ca5f814610223578063595c6a67146102365780635ac86ab71461023e5780635c975abb1461026d57806361b01b5d14610275575f5ffd5b806311c70c9d14610171578063136439dd146101865780632495a5991461019957806339b70e38146101c95780633a98ef39146101f057806343fe08b014610207575b5f5ffd5b61018461017f366004611236565b610393565b005b610184610194366004611256565b610452565b6032546101ac906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b6101ac7f000000000000000000000000000000000000000000000000000000000000000081565b6101f960335481565b6040519081526020016101c0565b6101f960645481565b6101f961021e366004611284565b610523565b6101f96102313660046112ae565b61066f565b610184610682565b61025d61024c3660046112de565b6001805460ff9092161b9081161490565b60405190151581526020016101c0565b6001546101f9565b6101f960655481565b6101f961028c366004611256565b610731565b6101ac7f000000000000000000000000000000000000000000000000000000000000000081565b6101f96102c6366004611256565b61077a565b6101f96102d93660046112ae565b610784565b6101846102ec3660046112f9565b610791565b6102f961086c565b6040516101c0919061132f565b6101846103143660046112ae565b61088c565b6101f96103273660046112ae565b610952565b61018461033a366004611364565b6109e4565b606454606554604080519283526020830191909152016101c0565b6101f9610368366004611256565b610b01565b6101f961037b366004611256565b610b38565b61018461038e366004611256565b610b42565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156103ef573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061041391906113a2565b6001600160a01b0316336001600160a01b0316146104445760405163794821ff60e01b815260040160405180910390fd5b61044e8282610c58565b5050565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa1580156104b4573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104d891906113bd565b6104f557604051631d77d47760e21b815260040160405180910390fd5b600154818116811461051a5760405163c61dca5d60e01b815260040160405180910390fd5b61044e82610cfc565b600180545f91829181160361054b5760405163840a48d560e01b815260040160405180910390fd5b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610594576040516348da714f60e01b815260040160405180910390fd5b61059e8484610d39565b6033545f6105ae6103e8836113f0565b90505f6103e86105bc610d90565b6105c691906113f0565b90505f6105d38783611403565b9050806105e08489611416565b6105ea919061142d565b9550855f0361060c57604051630c392ed360e11b815260040160405180910390fd5b61061686856113f0565b60338190556f4b3b4ca85a86c47a098a223fffffffff101561064b57604051632f14e8a360e11b815260040160405180910390fd5b610664826103e860335461065f91906113f0565b610dff565b505050505092915050565b5f61067c61028c83610952565b92915050565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa1580156106e4573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061070891906113bd565b61072557604051631d77d47760e21b815260040160405180910390fd5b61072f5f19610cfc565b565b5f5f6103e860335461074391906113f0565b90505f6103e8610751610d90565b61075b91906113f0565b9050816107688583611416565b610772919061142d565b949350505050565b5f61067c82610b01565b5f61067c61037b83610952565b5f54610100900460ff16158080156107af57505f54600160ff909116105b806107c85750303b1580156107c857505f5460ff166001145b6107ed5760405162461bcd60e51b81526004016107e49061144c565b60405180910390fd5b5f805460ff19166001179055801561080e575f805461ff0019166101001790555b6108188484610c58565b61082182610e4b565b8015610866575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b60606040518060800160405280604d81526020016114e3604d9139905090565b5f54610100900460ff16158080156108aa57505f54600160ff909116105b806108c35750303b1580156108c357505f5460ff166001145b6108df5760405162461bcd60e51b81526004016107e49061144c565b5f805460ff191660011790558015610900575f805461ff0019166101001790555b61090982610e4b565b801561044e575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498906020015b60405180910390a15050565b60405163fe243a1760e01b81526001600160a01b0382811660048301523060248301525f917f00000000000000000000000000000000000000000000000000000000000000009091169063fe243a1790604401602060405180830381865afa1580156109c0573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061067c919061149a565b60018054600290811603610a0b5760405163840a48d560e01b815260040160405180910390fd5b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610a54576040516348da714f60e01b815260040160405180910390fd5b610a5f848484610f96565b60335480831115610a8357604051630b469df360e41b815260040160405180910390fd5b5f610a906103e8836113f0565b90505f6103e8610a9e610d90565b610aa891906113f0565b90505f82610ab68784611416565b610ac0919061142d565b9050610acc8685611403565b603355610aec610adc8284611403565b6103e860335461065f91906113f0565b610af7888883610fc9565b5050505050505050565b5f5f6103e8603354610b1391906113f0565b90505f6103e8610b21610d90565b610b2b91906113f0565b9050806107688386611416565b5f61067c82610731565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b9e573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610bc291906113a2565b6001600160a01b0316336001600160a01b031614610bf35760405163794821ff60e01b815260040160405180910390fd5b60015480198219811614610c1a5760405163c61dca5d60e01b815260040160405180910390fd5b600182905560405182815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c9060200160405180910390a25050565b60645460408051918252602082018490527ff97ed4e083acac67830025ecbc756d8fe847cdbdca4cee3fe1e128e98b54ecb5910160405180910390a160655460408051918252602082018390527f6ab181e0440bfbf4bacdf2e99674735ce6638005490688c5f994f5399353e452910160405180910390a180821115610cf15760405163052b07b760e21b815260040160405180910390fd5b606491909155606555565b600181905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a250565b606454811115610d5c5760405163052b07b760e21b815260040160405180910390fd5b606554610d67610d90565b1115610d865760405163d86bae6760e01b815260040160405180910390fd5b61044e8282610fdd565b6032546040516370a0823160e01b81523060048201525f916001600160a01b0316906370a0823190602401602060405180830381865afa158015610dd6573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610dfa919061149a565b905090565b7fd2494f3479e5da49d386657c292c610b5b01df313d07c62eb0cfa49924a31be881610e3384670de0b6b3a7640000611416565b610e3d919061142d565b604051908152602001610946565b5f54610100900460ff16610eb55760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b60648201526084016107e4565b603280546001600160a01b0319166001600160a01b038316179055610ed95f610cfc565b7f1c540707b00eb5427b6b774fc799d756516a54aee108b64b327acc55af55750760325f9054906101000a90046001600160a01b0316826001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f4b573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f6f91906114b1565b604080516001600160a01b03909316835260ff90911660208301520160405180910390a150565b6032546001600160a01b03838116911614610fc457604051630312abdd60e61b815260040160405180910390fd5b505050565b610fc46001600160a01b038316848361100b565b6032546001600160a01b0383811691161461044e57604051630312abdd60e61b815260040160405180910390fd5b604080516001600160a01b03848116602483015260448083018590528351808403909101815260649092018352602080830180516001600160e01b031663a9059cbb60e01b17905283518085019094528084527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c656490840152610fc4928692915f9161109a918516908490611119565b905080515f14806110ba5750808060200190518101906110ba91906113bd565b610fc45760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016107e4565b606061077284845f85855f5f866001600160a01b0316858760405161113e91906114cc565b5f6040518083038185875af1925050503d805f8114611178576040519150601f19603f3d011682016040523d82523d5f602084013e61117d565b606091505b509150915061118e87838387611199565b979650505050505050565b606083156112075782515f03611200576001600160a01b0385163b6112005760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016107e4565b5081610772565b610772838381511561121c5781518083602001fd5b8060405162461bcd60e51b81526004016107e4919061132f565b5f5f60408385031215611247575f5ffd5b50508035926020909101359150565b5f60208284031215611266575f5ffd5b5035919050565b6001600160a01b0381168114611281575f5ffd5b50565b5f5f60408385031215611295575f5ffd5b82356112a08161126d565b946020939093013593505050565b5f602082840312156112be575f5ffd5b81356112c98161126d565b9392505050565b60ff81168114611281575f5ffd5b5f602082840312156112ee575f5ffd5b81356112c9816112d0565b5f5f5f6060848603121561130b575f5ffd5b833592506020840135915060408401356113248161126d565b809150509250925092565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b5f5f5f60608486031215611376575f5ffd5b83356113818161126d565b925060208401356113918161126d565b929592945050506040919091013590565b5f602082840312156113b2575f5ffd5b81516112c98161126d565b5f602082840312156113cd575f5ffd5b815180151581146112c9575f5ffd5b634e487b7160e01b5f52601160045260245ffd5b8082018082111561067c5761067c6113dc565b8181038181111561067c5761067c6113dc565b808202811582820484141761067c5761067c6113dc565b5f8261144757634e487b7160e01b5f52601260045260245ffd5b500490565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b5f602082840312156114aa575f5ffd5b5051919050565b5f602082840312156114c1575f5ffd5b81516112c9816112d0565b5f82518060208501845e5f92019182525091905056fe4261736520537472617465677920696d706c656d656e746174696f6e20746f20696e68657269742066726f6d20666f72206d6f726520636f6d706c657820696d706c656d656e746174696f6e73a26469706673582212205df8ec77e37a2856c3fac4bcc3eb4eefddc60d13421f6d5549020a803042ff6564736f6c634300081b0033", } // 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 468b4423e1..97185cc669 100644 --- a/pkg/bindings/StrategyFactory/binding.go +++ b/pkg/bindings/StrategyFactory/binding.go @@ -32,7 +32,7 @@ var ( // StrategyFactoryMetaData contains all meta data concerning the StrategyFactory contract. var StrategyFactoryMetaData = &bind.MetaData{ ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"_strategyManager\",\"type\":\"address\",\"internalType\":\"contractIStrategyManager\"},{\"name\":\"_pauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"blacklistTokens\",\"inputs\":[{\"name\":\"tokens\",\"type\":\"address[]\",\"internalType\":\"contractIERC20[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"deployNewStrategy\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"outputs\":[{\"name\":\"newStrategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"deployedStrategies\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"_initialOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_initialPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_strategyBeacon\",\"type\":\"address\",\"internalType\":\"contractIBeacon\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"isBlacklisted\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"pauseAll\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[{\"name\":\"index\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pauserRegistry\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"removeStrategiesFromWhitelist\",\"inputs\":[{\"name\":\"strategiesToRemoveFromWhitelist\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"strategyBeacon\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIBeacon\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"strategyManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategyManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"whitelistStrategies\",\"inputs\":[{\"name\":\"strategiesToWhitelist\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StrategyBeaconModified\",\"inputs\":[{\"name\":\"previousBeacon\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIBeacon\"},{\"name\":\"newBeacon\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIBeacon\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StrategySetForToken\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIERC20\"},{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TokenBlacklisted\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIERC20\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"AlreadyBlacklisted\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"BlacklistedToken\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"CurrentlyPaused\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InputAddressZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidNewPausedStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyPauser\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyUnpauser\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StrategyAlreadyExists\",\"inputs\":[]}]", - Bin: "0x60c060405234801561000f575f5ffd5b5060405161195e38038061195e83398101604081905261002e9161014e565b806001600160a01b038116610056576040516339b190bb60e11b815260040160405180910390fd5b6001600160a01b03908116608052821660a052610071610078565b5050610186565b603354610100900460ff16156100e45760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60335460ff90811614610135576033805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b038116811461014b575f5ffd5b50565b5f5f6040838503121561015f575f5ffd5b825161016a81610137565b602084015190925061017b81610137565b809150509250929050565b60805160a0516117866101d85f395f8181610142015281816105d501528181610869015281816109060152610c4701525f8181610215015281816102f0015281816106530152610b1401526117865ff3fe608060405234801561000f575f5ffd5b5060043610610111575f3560e01c8063886f11951161009e578063f0062d9a1161006e578063f0062d9a1461026e578063f2fde38b14610280578063fabc1cbc14610293578063fe38b32d146102a6578063fe575a87146102b9575f5ffd5b8063886f1195146102105780638da5cb5b14610237578063b768ebc914610248578063c350a1b51461025b575f5ffd5b8063595c6a67116100e4578063595c6a67146101a95780635ac86ab7146101b15780635c975abb146101e45780636b9b6229146101f5578063715018a614610208575f5ffd5b8063136439dd1461011557806323103c411461012a57806339b70e381461013d578063581dfd6514610181575b5f5ffd5b610128610123366004610e44565b6102db565b005b610128610138366004610ea3565b6103b0565b6101647f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020015b60405180910390f35b61016461018f366004610ef6565b60016020525f90815260409020546001600160a01b031681565b61012861063e565b6101d46101bf366004610f18565b609954600160ff9092169190911b9081161490565b6040519015158152602001610178565b609954604051908152602001610178565b610164610203366004610ef6565b6106ed565b6101286108d6565b6101647f000000000000000000000000000000000000000000000000000000000000000081565b6066546001600160a01b0316610164565b610128610256366004610ea3565b6108e7565b610128610269366004610f38565b61096e565b5f54610164906001600160a01b031681565b61012861028e366004610ef6565b610a99565b6101286102a1366004610e44565b610b12565b6101286102b4366004610ea3565b610c28565b6101d46102c7366004610ef6565b60026020525f908152604090205460ff1681565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa15801561033d573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103619190610f77565b61037e57604051631d77d47760e21b815260040160405180910390fd5b60995481811681146103a35760405163c61dca5d60e01b815260040160405180910390fd5b6103ac82610c7e565b5050565b6103b8610cbb565b5f8167ffffffffffffffff8111156103d2576103d2610f96565b6040519080825280602002602001820160405280156103fb578160200160208202803683370190505b5090505f805b838110156105b45760025f86868481811061041e5761041e610faa565b90506020020160208101906104339190610ef6565b6001600160a01b0316815260208101919091526040015f205460ff161561046d5760405163f53de75f60e01b815260040160405180910390fd5b600160025f87878581811061048457610484610faa565b90506020020160208101906104999190610ef6565b6001600160a01b0316815260208101919091526040015f20805460ff19169115159190911790557f75519c51f39873ec0e27dd3bbc09549e4865a113f505393fb9eab5898f6418b38585838181106104f3576104f3610faa565b90506020020160208101906105089190610ef6565b6040516001600160a01b03909116815260200160405180910390a15f60015f87878581811061053957610539610faa565b905060200201602081019061054e9190610ef6565b6001600160a01b03908116825260208201929092526040015f205416905080156105ab578084848151811061058557610585610faa565b6001600160a01b0390921660209283029190910190910152826105a781610fbe565b9350505b50600101610401565b508082528015610638576040516316bb16b760e31b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063b5d8b5b89061060a908590600401610fe2565b5f604051808303815f87803b158015610621575f5ffd5b505af1158015610633573d5f5f3e3d5ffd5b505050505b50505050565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa1580156106a0573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106c49190610f77565b6106e157604051631d77d47760e21b815260040160405180910390fd5b6106eb5f19610c7e565b565b6099545f9081906001908116036107175760405163840a48d560e01b815260040160405180910390fd5b6001600160a01b0383165f9081526002602052604090205460ff16156107505760405163091867bd60e11b815260040160405180910390fd5b6001600160a01b038381165f9081526001602052604090205416156107885760405163c45546f760e01b815260040160405180910390fd5b5f8054604080516001600160a01b0387811660248084019190915283518084039091018152604490920183526020820180516001600160e01b031663189acdbd60e31b17905291519190921691906107df90610e37565b6107ea92919061102d565b604051809103905ff080158015610803573d5f5f3e3d5ffd5b5090506108108482610d15565b6040805160018082528183019092525f916020808301908036833701905050905081815f8151811061084457610844610faa565b6001600160a01b039283166020918202929092010152604051632ef047f960e11b81527f000000000000000000000000000000000000000000000000000000000000000090911690635de08ff2906108a0908490600401610fe2565b5f604051808303815f87803b1580156108b7575f5ffd5b505af11580156108c9573d5f5f3e3d5ffd5b5093979650505050505050565b6108de610cbb565b6106eb5f610d7f565b6108ef610cbb565b604051632ef047f960e11b81526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690635de08ff29061093d9085908590600401611071565b5f604051808303815f87803b158015610954575f5ffd5b505af1158015610966573d5f5f3e3d5ffd5b505050505050565b603354610100900460ff161580801561098e5750603354600160ff909116105b806109a85750303b1580156109a8575060335460ff166001145b610a105760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b6033805460ff191660011790558015610a33576033805461ff0019166101001790555b610a3c84610d7f565b610a4583610c7e565b610a4e82610dd0565b8015610638576033805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a150505050565b610aa1610cbb565b6001600160a01b038116610b065760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610a07565b610b0f81610d7f565b50565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b6e573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b9291906110bd565b6001600160a01b0316336001600160a01b031614610bc35760405163794821ff60e01b815260040160405180910390fd5b60995480198219811614610bea5760405163c61dca5d60e01b815260040160405180910390fd5b609982905560405182815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c9060200160405180910390a25050565b610c30610cbb565b6040516316bb16b760e31b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063b5d8b5b89061093d9085908590600401611071565b609981905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a250565b6066546001600160a01b031633146106eb5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a07565b6001600160a01b038281165f8181526001602090815260409182902080546001600160a01b031916948616948517905581519283528201929092527f6852a55230ef089d785bce7ffbf757985de34026df90a87d7b4a6e56f95d251f910160405180910390a15050565b606680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b5f54604080516001600160a01b03928316815291831660208301527fe21755962a7d7e100b59b9c3e4d4b54085b146313719955efb6a7a25c5c7feee910160405180910390a15f80546001600160a01b0319166001600160a01b0392909216919091179055565b610678806110d983390190565b5f60208284031215610e54575f5ffd5b5035919050565b5f5f83601f840112610e6b575f5ffd5b50813567ffffffffffffffff811115610e82575f5ffd5b6020830191508360208260051b8501011115610e9c575f5ffd5b9250929050565b5f5f60208385031215610eb4575f5ffd5b823567ffffffffffffffff811115610eca575f5ffd5b610ed685828601610e5b565b90969095509350505050565b6001600160a01b0381168114610b0f575f5ffd5b5f60208284031215610f06575f5ffd5b8135610f1181610ee2565b9392505050565b5f60208284031215610f28575f5ffd5b813560ff81168114610f11575f5ffd5b5f5f5f60608486031215610f4a575f5ffd5b8335610f5581610ee2565b9250602084013591506040840135610f6c81610ee2565b809150509250925092565b5f60208284031215610f87575f5ffd5b81518015158114610f11575f5ffd5b634e487b7160e01b5f52604160045260245ffd5b634e487b7160e01b5f52603260045260245ffd5b5f60018201610fdb57634e487b7160e01b5f52601160045260245ffd5b5060010190565b602080825282518282018190525f918401906040840190835b818110156110225783516001600160a01b0316835260209384019390920191600101610ffb565b509095945050505050565b60018060a01b0383168152604060208201525f82518060408401528060208501606085015e5f606082850101526060601f19601f8301168401019150509392505050565b602080825281018290525f8360408301825b858110156110b357823561109681610ee2565b6001600160a01b0316825260209283019290910190600101611083565b5095945050505050565b5f602082840312156110cd575f5ffd5b8151610f1181610ee256fe6080604052604051610678380380610678833981016040819052610022916103ed565b61002d82825f610034565b5050610513565b61003d836100f1565b6040516001600160a01b038416907f1cf3b03a6cf19fa2baba4df148e9dcabedea7f8a5c07840e207e5c089be95d3e905f90a25f8251118061007c5750805b156100ec576100ea836001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156100c0573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906100e491906104af565b83610273565b505b505050565b6001600160a01b0381163b61015b5760405162461bcd60e51b815260206004820152602560248201527f455243313936373a206e657720626561636f6e206973206e6f74206120636f6e6044820152641d1c9858dd60da1b60648201526084015b60405180910390fd5b6101cd816001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561019a573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906101be91906104af565b6001600160a01b03163b151590565b6102325760405162461bcd60e51b815260206004820152603060248201527f455243313936373a20626561636f6e20696d706c656d656e746174696f6e206960448201526f1cc81b9bdd08184818dbdb9d1c9858dd60821b6064820152608401610152565b7fa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d5080546001600160a01b0319166001600160a01b0392909216919091179055565b606061029883836040518060600160405280602781526020016106516027913961029f565b9392505050565b60605f5f856001600160a01b0316856040516102bb91906104c8565b5f60405180830381855af49150503d805f81146102f3576040519150601f19603f3d011682016040523d82523d5f602084013e6102f8565b606091505b50909250905061030a86838387610314565b9695505050505050565b606083156103825782515f0361037b576001600160a01b0385163b61037b5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610152565b508161038c565b61038c8383610394565b949350505050565b8151156103a45781518083602001fd5b8060405162461bcd60e51b815260040161015291906104de565b80516001600160a01b03811681146103d4575f5ffd5b919050565b634e487b7160e01b5f52604160045260245ffd5b5f5f604083850312156103fe575f5ffd5b610407836103be565b60208401519092506001600160401b03811115610422575f5ffd5b8301601f81018513610432575f5ffd5b80516001600160401b0381111561044b5761044b6103d9565b604051601f8201601f19908116603f011681016001600160401b0381118282101715610479576104796103d9565b604052818152828201602001871015610490575f5ffd5b8160208401602083015e5f602083830101528093505050509250929050565b5f602082840312156104bf575f5ffd5b610298826103be565b5f82518060208501845e5f920191825250919050565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b610131806105205f395ff3fe608060405236601057600e6013565b005b600e5b601f601b6021565b60b3565b565b5f60527fa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50546001600160a01b031690565b6001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015608c573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019060ae919060d0565b905090565b365f5f375f5f365f845af43d5f5f3e80801560cc573d5ff35b3d5ffd5b5f6020828403121560df575f5ffd5b81516001600160a01b038116811460f4575f5ffd5b939250505056fea2646970667358221220f37d2ffd80ec7d14cc9a0f17394e9d97446c1f630de382043b1ed4ccacf6a7d464736f6c634300081b0033416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a26469706673582212201cd135a2da2f82c937c8f9e355639d7b1cfd44fe5720e906079e20ad40503c7364736f6c634300081b0033", + Bin: "0x60c060405234801561000f575f5ffd5b5060405161195e38038061195e83398101604081905261002e9161014e565b806001600160a01b038116610056576040516339b190bb60e11b815260040160405180910390fd5b6001600160a01b03908116608052821660a052610071610078565b5050610186565b603354610100900460ff16156100e45760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60335460ff90811614610135576033805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b038116811461014b575f5ffd5b50565b5f5f6040838503121561015f575f5ffd5b825161016a81610137565b602084015190925061017b81610137565b809150509250929050565b60805160a0516117866101d85f395f8181610142015281816105d501528181610869015281816109060152610c4701525f8181610215015281816102f0015281816106530152610b1401526117865ff3fe608060405234801561000f575f5ffd5b5060043610610111575f3560e01c8063886f11951161009e578063f0062d9a1161006e578063f0062d9a1461026e578063f2fde38b14610280578063fabc1cbc14610293578063fe38b32d146102a6578063fe575a87146102b9575f5ffd5b8063886f1195146102105780638da5cb5b14610237578063b768ebc914610248578063c350a1b51461025b575f5ffd5b8063595c6a67116100e4578063595c6a67146101a95780635ac86ab7146101b15780635c975abb146101e45780636b9b6229146101f5578063715018a614610208575f5ffd5b8063136439dd1461011557806323103c411461012a57806339b70e381461013d578063581dfd6514610181575b5f5ffd5b610128610123366004610e44565b6102db565b005b610128610138366004610ea3565b6103b0565b6101647f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020015b60405180910390f35b61016461018f366004610ef6565b60016020525f90815260409020546001600160a01b031681565b61012861063e565b6101d46101bf366004610f18565b609954600160ff9092169190911b9081161490565b6040519015158152602001610178565b609954604051908152602001610178565b610164610203366004610ef6565b6106ed565b6101286108d6565b6101647f000000000000000000000000000000000000000000000000000000000000000081565b6066546001600160a01b0316610164565b610128610256366004610ea3565b6108e7565b610128610269366004610f38565b61096e565b5f54610164906001600160a01b031681565b61012861028e366004610ef6565b610a99565b6101286102a1366004610e44565b610b12565b6101286102b4366004610ea3565b610c28565b6101d46102c7366004610ef6565b60026020525f908152604090205460ff1681565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa15801561033d573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103619190610f77565b61037e57604051631d77d47760e21b815260040160405180910390fd5b60995481811681146103a35760405163c61dca5d60e01b815260040160405180910390fd5b6103ac82610c7e565b5050565b6103b8610cbb565b5f8167ffffffffffffffff8111156103d2576103d2610f96565b6040519080825280602002602001820160405280156103fb578160200160208202803683370190505b5090505f805b838110156105b45760025f86868481811061041e5761041e610faa565b90506020020160208101906104339190610ef6565b6001600160a01b0316815260208101919091526040015f205460ff161561046d5760405163f53de75f60e01b815260040160405180910390fd5b600160025f87878581811061048457610484610faa565b90506020020160208101906104999190610ef6565b6001600160a01b0316815260208101919091526040015f20805460ff19169115159190911790557f75519c51f39873ec0e27dd3bbc09549e4865a113f505393fb9eab5898f6418b38585838181106104f3576104f3610faa565b90506020020160208101906105089190610ef6565b6040516001600160a01b03909116815260200160405180910390a15f60015f87878581811061053957610539610faa565b905060200201602081019061054e9190610ef6565b6001600160a01b03908116825260208201929092526040015f205416905080156105ab578084848151811061058557610585610faa565b6001600160a01b0390921660209283029190910190910152826105a781610fbe565b9350505b50600101610401565b508082528015610638576040516316bb16b760e31b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063b5d8b5b89061060a908590600401610fe2565b5f604051808303815f87803b158015610621575f5ffd5b505af1158015610633573d5f5f3e3d5ffd5b505050505b50505050565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa1580156106a0573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106c49190610f77565b6106e157604051631d77d47760e21b815260040160405180910390fd5b6106eb5f19610c7e565b565b6099545f9081906001908116036107175760405163840a48d560e01b815260040160405180910390fd5b6001600160a01b0383165f9081526002602052604090205460ff16156107505760405163091867bd60e11b815260040160405180910390fd5b6001600160a01b038381165f9081526001602052604090205416156107885760405163c45546f760e01b815260040160405180910390fd5b5f8054604080516001600160a01b0387811660248084019190915283518084039091018152604490920183526020820180516001600160e01b031663189acdbd60e31b17905291519190921691906107df90610e37565b6107ea92919061102d565b604051809103905ff080158015610803573d5f5f3e3d5ffd5b5090506108108482610d15565b6040805160018082528183019092525f916020808301908036833701905050905081815f8151811061084457610844610faa565b6001600160a01b039283166020918202929092010152604051632ef047f960e11b81527f000000000000000000000000000000000000000000000000000000000000000090911690635de08ff2906108a0908490600401610fe2565b5f604051808303815f87803b1580156108b7575f5ffd5b505af11580156108c9573d5f5f3e3d5ffd5b5093979650505050505050565b6108de610cbb565b6106eb5f610d7f565b6108ef610cbb565b604051632ef047f960e11b81526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690635de08ff29061093d9085908590600401611071565b5f604051808303815f87803b158015610954575f5ffd5b505af1158015610966573d5f5f3e3d5ffd5b505050505050565b603354610100900460ff161580801561098e5750603354600160ff909116105b806109a85750303b1580156109a8575060335460ff166001145b610a105760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b6033805460ff191660011790558015610a33576033805461ff0019166101001790555b610a3c84610d7f565b610a4583610c7e565b610a4e82610dd0565b8015610638576033805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a150505050565b610aa1610cbb565b6001600160a01b038116610b065760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610a07565b610b0f81610d7f565b50565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b6e573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b9291906110bd565b6001600160a01b0316336001600160a01b031614610bc35760405163794821ff60e01b815260040160405180910390fd5b60995480198219811614610bea5760405163c61dca5d60e01b815260040160405180910390fd5b609982905560405182815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c9060200160405180910390a25050565b610c30610cbb565b6040516316bb16b760e31b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063b5d8b5b89061093d9085908590600401611071565b609981905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a250565b6066546001600160a01b031633146106eb5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a07565b6001600160a01b038281165f8181526001602090815260409182902080546001600160a01b031916948616948517905581519283528201929092527f6852a55230ef089d785bce7ffbf757985de34026df90a87d7b4a6e56f95d251f910160405180910390a15050565b606680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b5f54604080516001600160a01b03928316815291831660208301527fe21755962a7d7e100b59b9c3e4d4b54085b146313719955efb6a7a25c5c7feee910160405180910390a15f80546001600160a01b0319166001600160a01b0392909216919091179055565b610678806110d983390190565b5f60208284031215610e54575f5ffd5b5035919050565b5f5f83601f840112610e6b575f5ffd5b50813567ffffffffffffffff811115610e82575f5ffd5b6020830191508360208260051b8501011115610e9c575f5ffd5b9250929050565b5f5f60208385031215610eb4575f5ffd5b823567ffffffffffffffff811115610eca575f5ffd5b610ed685828601610e5b565b90969095509350505050565b6001600160a01b0381168114610b0f575f5ffd5b5f60208284031215610f06575f5ffd5b8135610f1181610ee2565b9392505050565b5f60208284031215610f28575f5ffd5b813560ff81168114610f11575f5ffd5b5f5f5f60608486031215610f4a575f5ffd5b8335610f5581610ee2565b9250602084013591506040840135610f6c81610ee2565b809150509250925092565b5f60208284031215610f87575f5ffd5b81518015158114610f11575f5ffd5b634e487b7160e01b5f52604160045260245ffd5b634e487b7160e01b5f52603260045260245ffd5b5f60018201610fdb57634e487b7160e01b5f52601160045260245ffd5b5060010190565b602080825282518282018190525f918401906040840190835b818110156110225783516001600160a01b0316835260209384019390920191600101610ffb565b509095945050505050565b60018060a01b0383168152604060208201525f82518060408401528060208501606085015e5f606082850101526060601f19601f8301168401019150509392505050565b602080825281018290525f8360408301825b858110156110b357823561109681610ee2565b6001600160a01b0316825260209283019290910190600101611083565b5095945050505050565b5f602082840312156110cd575f5ffd5b8151610f1181610ee256fe6080604052604051610678380380610678833981016040819052610022916103ed565b61002d82825f610034565b5050610513565b61003d836100f1565b6040516001600160a01b038416907f1cf3b03a6cf19fa2baba4df148e9dcabedea7f8a5c07840e207e5c089be95d3e905f90a25f8251118061007c5750805b156100ec576100ea836001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156100c0573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906100e491906104af565b83610273565b505b505050565b6001600160a01b0381163b61015b5760405162461bcd60e51b815260206004820152602560248201527f455243313936373a206e657720626561636f6e206973206e6f74206120636f6e6044820152641d1c9858dd60da1b60648201526084015b60405180910390fd5b6101cd816001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561019a573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906101be91906104af565b6001600160a01b03163b151590565b6102325760405162461bcd60e51b815260206004820152603060248201527f455243313936373a20626561636f6e20696d706c656d656e746174696f6e206960448201526f1cc81b9bdd08184818dbdb9d1c9858dd60821b6064820152608401610152565b7fa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d5080546001600160a01b0319166001600160a01b0392909216919091179055565b606061029883836040518060600160405280602781526020016106516027913961029f565b9392505050565b60605f5f856001600160a01b0316856040516102bb91906104c8565b5f60405180830381855af49150503d805f81146102f3576040519150601f19603f3d011682016040523d82523d5f602084013e6102f8565b606091505b50909250905061030a86838387610314565b9695505050505050565b606083156103825782515f0361037b576001600160a01b0385163b61037b5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610152565b508161038c565b61038c8383610394565b949350505050565b8151156103a45781518083602001fd5b8060405162461bcd60e51b815260040161015291906104de565b80516001600160a01b03811681146103d4575f5ffd5b919050565b634e487b7160e01b5f52604160045260245ffd5b5f5f604083850312156103fe575f5ffd5b610407836103be565b60208401519092506001600160401b03811115610422575f5ffd5b8301601f81018513610432575f5ffd5b80516001600160401b0381111561044b5761044b6103d9565b604051601f8201601f19908116603f011681016001600160401b0381118282101715610479576104796103d9565b604052818152828201602001871015610490575f5ffd5b8160208401602083015e5f602083830101528093505050509250929050565b5f602082840312156104bf575f5ffd5b610298826103be565b5f82518060208501845e5f920191825250919050565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b610131806105205f395ff3fe608060405236601057600e6013565b005b600e5b601f601b6021565b60b3565b565b5f60527fa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50546001600160a01b031690565b6001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015608c573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019060ae919060d0565b905090565b365f5f375f5f365f845af43d5f5f3e80801560cc573d5ff35b3d5ffd5b5f6020828403121560df575f5ffd5b81516001600160a01b038116811460f4575f5ffd5b939250505056fea26469706673582212205e179e1700322d816f025eafa6283d01eb81392a9f5f438a46fb77683652459464736f6c634300081b0033416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a264697066735822122027041a49b85274d31fb56a004f79f652f3b195704430362e75a0e2e190553a9364736f6c634300081b0033", } // StrategyFactoryABI 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 552e009134..a11b22ffac 100644 --- a/pkg/bindings/StrategyManager/binding.go +++ b/pkg/bindings/StrategyManager/binding.go @@ -32,7 +32,7 @@ var ( // StrategyManagerMetaData contains all meta data concerning the StrategyManager contract. var StrategyManagerMetaData = &bind.MetaData{ ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"_delegation\",\"type\":\"address\",\"internalType\":\"contractIDelegationManager\"},{\"name\":\"_pauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"DEFAULT_BURN_ADDRESS\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"DEPOSIT_TYPEHASH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"addShares\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"shares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"addStrategiesToDepositWhitelist\",\"inputs\":[{\"name\":\"strategiesToWhitelist\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"burnShares\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"calculateStrategyDepositDigestHash\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"nonce\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"delegation\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIDelegationManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"depositIntoStrategy\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"depositShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"depositIntoStrategyWithSignature\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"depositShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"domainSeparator\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getBurnableShares\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getDeposits\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getStakerStrategyList\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getStrategiesWithBurnableShares\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"increaseBurnableShares\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"addedSharesToBurn\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"initialOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"initialStrategyWhitelister\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"initialPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"nonces\",\"inputs\":[{\"name\":\"signer\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"nonce\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"pauseAll\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[{\"name\":\"index\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pauserRegistry\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"removeDepositShares\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"depositSharesToRemove\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"removeStrategiesFromDepositWhitelist\",\"inputs\":[{\"name\":\"strategiesToRemoveFromWhitelist\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setStrategyWhitelister\",\"inputs\":[{\"name\":\"newStrategyWhitelister\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"stakerDepositShares\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"shares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"stakerStrategyList\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"strategies\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"stakerStrategyListLength\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"strategyIsWhitelistedForDeposit\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"whitelisted\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"strategyWhitelister\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"withdrawSharesAsTokens\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"shares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"BurnableSharesDecreased\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"shares\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BurnableSharesIncreased\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"shares\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Deposit\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"shares\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StrategyAddedToDepositWhitelist\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StrategyRemovedFromDepositWhitelist\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StrategyWhitelisterChanged\",\"inputs\":[{\"name\":\"previousAddress\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"newAddress\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"CurrentlyPaused\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InputAddressZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidNewPausedStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidSignature\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"MaxStrategiesExceeded\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyDelegationManager\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyPauser\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyStrategyWhitelister\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyUnpauser\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SharesAmountTooHigh\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SharesAmountZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SignatureExpired\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StakerAddressZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StrategyNotFound\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StrategyNotWhitelisted\",\"inputs\":[]}]", - Bin: "0x610100604052348015610010575f5ffd5b50604051612c9b380380612c9b83398101604081905261002f916101ed565b81816001600160a01b038116610058576040516339b190bb60e11b815260040160405180910390fd5b6001600160a01b039081166080521660a0524660c052610108604080518082018252600a81526922b4b3b2b72630bcb2b960b11b60209182015281517f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a866818301527f71b625cfad44bac63b13dba07f2e1d6084ee04b6f8752101ece6126d584ee6ea81840152466060820152306080808301919091528351808303909101815260a0909101909252815191012090565b60e05261011361011a565b5050610225565b5f54610100900460ff16156101855760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff908116146101d4575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b03811681146101ea575f5ffd5b50565b5f5f604083850312156101fe575f5ffd5b8251610209816101d6565b602084015190925061021a816101d6565b809150509250929050565b60805160a05160c05160e051612a0b6102905f395f61140101525f61134101525f81816104c70152818161077701528181610b1801528181610d77015281816111cb01526117f901525f818161039c0152818161058601528181610b8201526114250152612a0b5ff3fe608060405234801561000f575f5ffd5b5060043610610208575f3560e01c80638b8aac3c1161011f578063debe1eab116100a9578063f3b4a00011610079578063f3b4a0001461050f578063f698da2514610519578063fabc1cbc14610521578063fd98042314610534578063fe243a1714610547575f5ffd5b8063debe1eab146104af578063df5cf723146104c2578063e7a050aa146104e9578063f2fde38b146104fc575f5ffd5b80639ac01d61116100ef5780639ac01d6114610443578063b5d8b5b814610456578063c665670214610469578063cbc2bd621461047c578063de44acb61461048f575f5ffd5b80638b8aac3c146103d65780638da5cb5b146103fe57806394f649dd1461040f578063967fc0d214610430575f5ffd5b8063595c6a67116101a0578063663c1de411610170578063663c1de41461033b578063715018a61461035d578063724af423146103655780637ecebe0014610378578063886f119514610397575f5ffd5b8063595c6a67146102e55780635ac86ab7146102ed5780635c975abb146103205780635de08ff214610328575f5ffd5b806336a8c500116101db57806336a8c5001461026d57806348825e94146102835780634b6d5d6e146102aa57806350ff7225146102bd575f5ffd5b8063136439dd1461020c5780631794bb3c146102215780632eae418c1461023457806332e89ace14610247575b5f5ffd5b61021f61021a366004612440565b610571565b005b61021f61022f36600461246b565b610646565b61021f6102423660046124a9565b61076c565b61025a61025536600461250b565b610818565b6040519081526020015b60405180910390f35b6102756108bc565b604051610264929190612640565b61025a7f4337f82d142e41f2a8c10547cd8c859bddb92262a61058e77842e24d9dea922481565b61021f6102b8366004612696565b6109d9565b6102d06102cb36600461246b565b610b0b565b60408051928352602083019190915201610264565b61021f610b6d565b6103106102fb3660046126b1565b609854600160ff9092169190911b9081161490565b6040519015158152602001610264565b60985461025a565b61021f6103363660046126d1565b610c1c565b610310610349366004612696565b60d16020525f908152604090205460ff1681565b61021f610d5b565b61021f61037336600461246b565b610d6c565b61025a610386366004612696565b60ca6020525f908152604090205481565b6103be7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610264565b61025a6103e4366004612696565b6001600160a01b03165f90815260ce602052604090205490565b6033546001600160a01b03166103be565b61042261041d366004612696565b610dc0565b60405161026492919061277b565b60cb546103be906001600160a01b031681565b61025a6104513660046127a8565b610f38565b61021f6104643660046126d1565b610fc9565b61021f610477366004612696565b611108565b6103be61048a366004612809565b611119565b6104a261049d366004612696565b61114d565b6040516102649190612833565b61021f6104bd366004612809565b6111c0565b6103be7f000000000000000000000000000000000000000000000000000000000000000081565b61025a6104f736600461246b565b611276565b61021f61050a366004612696565b6112c8565b6103be620e16e481565b61025a61133e565b61021f61052f366004612440565b611423565b61025a610542366004612696565b611539565b61025a610555366004612845565b60cd60209081525f928352604080842090915290825290205481565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa1580156105d3573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105f7919061287c565b61061457604051631d77d47760e21b815260040160405180910390fd5b60985481811681146106395760405163c61dca5d60e01b815260040160405180910390fd5b6106428261154e565b5050565b5f54610100900460ff161580801561066457505f54600160ff909116105b8061067d5750303b15801561067d57505f5460ff166001145b6106e55760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b5f805460ff191660011790558015610706575f805461ff0019166101001790555b61070f8261154e565b6107188461158b565b610721836115dc565b8015610766575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146107b55760405163f739589b60e01b815260040160405180910390fd5b604051636ce5768960e11b81526001600160a01b0384169063d9caed12906107e59087908690869060040161289b565b5f604051808303815f87803b1580156107fc575f5ffd5b505af115801561080e573d5f5f3e3d5ffd5b5050505050505050565b6098545f9081906001908116036108425760405163840a48d560e01b815260040160405180910390fd5b61084a611645565b6001600160a01b0385165f90815260ca602052604090205461087b86610874818c8c8c878c610f38565b868861169e565b6001600160a01b0386165f90815260ca602052604090206001820190556108a4868a8a8a6116f0565b9250506108b16001606555565b509695505050505050565b6060805f6108ca60d461185d565b90505f8167ffffffffffffffff8111156108e6576108e66124f7565b60405190808252806020026020018201604052801561090f578160200160208202803683370190505b5090505f8267ffffffffffffffff81111561092c5761092c6124f7565b604051908082528060200260200182016040528015610955578160200160208202803683370190505b5090505f5b838110156109ce575f5f61096f60d48461186d565b9150915081858481518110610986576109866128bf565b60200260200101906001600160a01b031690816001600160a01b031681525050808484815181106109b9576109b96128bf565b6020908102919091010152505060010161095a565b509094909350915050565b6109e1611645565b5f6109ed60d48361188a565b9150506109fb60d4836118a1565b50604080516001600160a01b0384168152602081018390527fd9d082c3ec4f3a3ffa55c324939a06407f5fbcb87d5e0ce3b9508c92c84ed839910160405180910390a1816001600160a01b031663d9caed12620e16e4846001600160a01b0316632495a5996040518163ffffffff1660e01b8152600401602060405180830381865afa158015610a8d573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ab191906128d3565b846040518463ffffffff1660e01b8152600401610ad09392919061289b565b5f604051808303815f87803b158015610ae7575f5ffd5b505af1158015610af9573d5f5f3e3d5ffd5b5050505050610b086001606555565b50565b5f80336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610b565760405163f739589b60e01b815260040160405180910390fd5b610b618585856118bc565b91509150935093915050565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa158015610bcf573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610bf3919061287c565b610c1057604051631d77d47760e21b815260040160405180910390fd5b610c1a5f1961154e565b565b60cb546001600160a01b03163314610c47576040516320ba3ff960e21b815260040160405180910390fd5b805f5b818110156107665760d15f858584818110610c6757610c676128bf565b9050602002016020810190610c7c9190612696565b6001600160a01b0316815260208101919091526040015f205460ff16610d5357600160d15f868685818110610cb357610cb36128bf565b9050602002016020810190610cc89190612696565b6001600160a01b0316815260208101919091526040015f20805460ff19169115159190911790557f0c35b17d91c96eb2751cd456e1252f42a386e524ef9ff26ecc9950859fdc04fe848483818110610d2257610d226128bf565b9050602002016020810190610d379190612696565b6040516001600160a01b03909116815260200160405180910390a15b600101610c4a565b610d63611a24565b610c1a5f61158b565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610db55760405163f739589b60e01b815260040160405180910390fd5b610766838383611a7e565b6001600160a01b0381165f90815260ce60205260408120546060918291908167ffffffffffffffff811115610df757610df76124f7565b604051908082528060200260200182016040528015610e20578160200160208202803683370190505b5090505f5b82811015610eae576001600160a01b0386165f90815260cd6020908152604080832060ce9092528220805491929184908110610e6357610e636128bf565b5f9182526020808320909101546001600160a01b031683528201929092526040019020548251839083908110610e9b57610e9b6128bf565b6020908102919091010152600101610e25565b5060ce5f866001600160a01b03166001600160a01b031681526020019081526020015f208181805480602002602001604051908101604052809291908181526020018280548015610f2657602002820191905f5260205f20905b81546001600160a01b03168152600190910190602001808311610f08575b50505050509150935093505050915091565b604080517f4337f82d142e41f2a8c10547cd8c859bddb92262a61058e77842e24d9dea922460208201526001600160a01b03808916928201929092528187166060820152908516608082015260a0810184905260c0810183905260e081018290525f90610fbe906101000160405160208183030381529060405280519060200120611b40565b979650505050505050565b60cb546001600160a01b03163314610ff4576040516320ba3ff960e21b815260040160405180910390fd5b805f5b818110156107665760d15f858584818110611014576110146128bf565b90506020020160208101906110299190612696565b6001600160a01b0316815260208101919091526040015f205460ff1615611100575f60d15f868685818110611060576110606128bf565b90506020020160208101906110759190612696565b6001600160a01b0316815260208101919091526040015f20805460ff19169115159190911790557f4074413b4b443e4e58019f2855a8765113358c7c72e39509c6af45fc0f5ba0308484838181106110cf576110cf6128bf565b90506020020160208101906110e49190612696565b6040516001600160a01b03909116815260200160405180910390a15b600101610ff7565b611110611a24565b610b08816115dc565b60ce602052815f5260405f208181548110611132575f80fd5b5f918252602090912001546001600160a01b03169150829050565b6001600160a01b0381165f90815260ce60209081526040918290208054835181840281018401909452808452606093928301828280156111b457602002820191905f5260205f20905b81546001600160a01b03168152600190910190602001808311611196575b50505050509050919050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146112095760405163f739589b60e01b815260040160405180910390fd5b5f61121560d48461188a565b915061122e905060d4846112298585612902565b611b86565b50604080516001600160a01b0385168152602081018490527fca3e02a4ab7ad3c47a8e36e5a624c30170791726ab720f1babfef21046d953ff910160405180910390a1505050565b6098545f9081906001908116036112a05760405163840a48d560e01b815260040160405180910390fd5b6112a8611645565b6112b4338686866116f0565b91506112c06001606555565b509392505050565b6112d0611a24565b6001600160a01b0381166113355760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016106dc565b610b088161158b565b5f7f000000000000000000000000000000000000000000000000000000000000000046146113fe5750604080518082018252600a81526922b4b3b2b72630bcb2b960b11b60209182015281517f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a866818301527f71b625cfad44bac63b13dba07f2e1d6084ee04b6f8752101ece6126d584ee6ea81840152466060820152306080808301919091528351808303909101815260a0909101909252815191012090565b507f000000000000000000000000000000000000000000000000000000000000000090565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561147f573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114a391906128d3565b6001600160a01b0316336001600160a01b0316146114d45760405163794821ff60e01b815260040160405180910390fd5b609854801982198116146114fb5760405163c61dca5d60e01b815260040160405180910390fd5b609882905560405182815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c9060200160405180910390a25050565b5f5f61154660d48461188a565b949350505050565b609881905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a250565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b60cb54604080516001600160a01b03928316815291831660208301527f4264275e593955ff9d6146a51a4525f6ddace2e81db9391abcc9d1ca48047d29910160405180910390a160cb80546001600160a01b0319166001600160a01b0392909216919091179055565b6002606554036116975760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016106dc565b6002606555565b428110156116bf57604051630819bdcd60e01b815260040160405180910390fd5b6116d36001600160a01b0385168484611b9b565b61076657604051638baa579f60e01b815260040160405180910390fd5b6001600160a01b0383165f90815260d16020526040812054849060ff1661172a57604051632efd965160e11b815260040160405180910390fd5b61173f6001600160a01b038516338786611bf9565b6040516311f9fbc960e21b81526001600160a01b038581166004830152602482018590528616906347e7ef24906044016020604051808303815f875af115801561178b573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906117af9190612915565b91505f5f6117be8888866118bc565b604051631e328e7960e11b81526001600160a01b038b811660048301528a8116602483015260448201849052606482018390529294509092507f000000000000000000000000000000000000000000000000000000000000000090911690633c651cf2906084015f604051808303815f87803b15801561183c575f5ffd5b505af115801561184e573d5f5f3e3d5ffd5b50505050505050949350505050565b5f61186782611c51565b92915050565b5f80808061187b8686611c5b565b909450925050505b9250929050565b5f80808061187b866001600160a01b038716611c84565b5f6118b5836001600160a01b038416611cbc565b9392505050565b5f806001600160a01b0385166118e5576040516316f2ccc960e01b815260040160405180910390fd5b825f03611905576040516342061b2560e11b815260040160405180910390fd5b6001600160a01b038086165f90815260cd60209081526040808320938816835292905290812054908190036119ab576001600160a01b0386165f90815260ce60209081526040909120541061196d576040516301a1443960e31b815260040160405180910390fd5b6001600160a01b038681165f90815260ce602090815260408220805460018101825590835291200180546001600160a01b0319169187169190911790555b6119b58482612902565b6001600160a01b038088165f90815260cd60209081526040808320938a16835292905281902091909155517f5548c837ab068cf56a2c2479df0882a4922fd203edb7517321831d95078c5f6290611a119088908890889061289b565b60405180910390a1959294509192505050565b6033546001600160a01b03163314610c1a5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016106dc565b5f815f03611a9f576040516342061b2560e11b815260040160405180910390fd5b6001600160a01b038085165f90815260cd602090815260408083209387168352929052205480831115611ae557604051634b18b19360e01b815260040160405180910390fd5b611aef838261292c565b6001600160a01b038087165f90815260cd602090815260408083209389168352929052908120829055909150819003611b3657611b2c8585611cd8565b60019150506118b5565b505f949350505050565b5f611b4961133e565b60405161190160f01b6020820152602281019190915260428101839052606201604051602081830303815290604052805190602001209050919050565b5f611546846001600160a01b03851684611e56565b5f5f5f611ba88585611e72565b90925090505f816004811115611bc057611bc061293f565b148015611bde5750856001600160a01b0316826001600160a01b0316145b80611bef5750611bef868686611eb1565b9695505050505050565b610766846323b872dd60e01b858585604051602401611c1a9392919061289b565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152611f98565b5f61186782612070565b5f8080611c688585612079565b5f81815260029690960160205260409095205494959350505050565b5f818152600283016020526040812054819080611cb157611ca58585612084565b92505f91506118839050565b600192509050611883565b5f81815260028301602052604081208190556118b5838361208f565b6001600160a01b0382165f90815260ce6020526040812054905b81811015611dea576001600160a01b038481165f90815260ce6020526040902080549185169183908110611d2857611d286128bf565b5f918252602090912001546001600160a01b031603611de2576001600160a01b0384165f90815260ce602052604090208054611d669060019061292c565b81548110611d7657611d766128bf565b5f9182526020808320909101546001600160a01b03878116845260ce9092526040909220805491909216919083908110611db257611db26128bf565b905f5260205f20015f6101000a8154816001600160a01b0302191690836001600160a01b03160217905550611dea565b600101611cf2565b818103611e0a57604051632df15a4160e11b815260040160405180910390fd5b6001600160a01b0384165f90815260ce60205260409020805480611e3057611e30612953565b5f8281526020902081015f1990810180546001600160a01b031916905501905550505050565b5f8281526002840160205260408120829055611546848461209a565b5f5f8251604103611ea6576020830151604084015160608501515f1a611e9a878285856120a5565b94509450505050611883565b505f90506002611883565b5f5f5f856001600160a01b0316631626ba7e60e01b8686604051602401611ed9929190612995565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b0319909416939093179092529051611f1791906129ad565b5f60405180830381855afa9150503d805f8114611f4f576040519150601f19603f3d011682016040523d82523d5f602084013e611f54565b606091505b5091509150818015611f6857506020815110155b8015611bef57508051630b135d3f60e11b90611f8d9083016020908101908401612915565b149695505050505050565b5f611fec826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166121629092919063ffffffff16565b905080515f148061200c57508080602001905181019061200c919061287c565b61206b5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016106dc565b505050565b5f611867825490565b5f6118b58383612170565b5f6118b58383612196565b5f6118b583836121ad565b5f6118b58383612290565b5f807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08311156120da57505f90506003612159565b604080515f8082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa15801561212b573d5f5f3e3d5ffd5b5050604051601f1901519150506001600160a01b038116612153575f60019250925050612159565b91505f90505b94509492505050565b606061154684845f856122dc565b5f825f018281548110612185576121856128bf565b905f5260205f200154905092915050565b5f81815260018301602052604081205415156118b5565b5f8181526001830160205260408120548015612287575f6121cf60018361292c565b85549091505f906121e29060019061292c565b9050818114612241575f865f018281548110612200576122006128bf565b905f5260205f200154905080875f018481548110612220576122206128bf565b5f918252602080832090910192909255918252600188019052604090208390555b855486908061225257612252612953565b600190038181905f5260205f20015f90559055856001015f8681526020019081526020015f205f905560019350505050611867565b5f915050611867565b5f8181526001830160205260408120546122d557508154600181810184555f848152602080822090930184905584548482528286019093526040902091909155611867565b505f611867565b60608247101561233d5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b60648201526084016106dc565b5f5f866001600160a01b0316858760405161235891906129ad565b5f6040518083038185875af1925050503d805f8114612392576040519150601f19603f3d011682016040523d82523d5f602084013e612397565b606091505b5091509150610fbe87838387606083156124115782515f0361240a576001600160a01b0385163b61240a5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016106dc565b5081611546565b61154683838151156124265781518083602001fd5b8060405162461bcd60e51b81526004016106dc91906129c3565b5f60208284031215612450575f5ffd5b5035919050565b6001600160a01b0381168114610b08575f5ffd5b5f5f5f6060848603121561247d575f5ffd5b833561248881612457565b9250602084013561249881612457565b929592945050506040919091013590565b5f5f5f5f608085870312156124bc575f5ffd5b84356124c781612457565b935060208501356124d781612457565b925060408501356124e781612457565b9396929550929360600135925050565b634e487b7160e01b5f52604160045260245ffd5b5f5f5f5f5f5f60c08789031215612520575f5ffd5b863561252b81612457565b9550602087013561253b81612457565b945060408701359350606087013561255281612457565b92506080870135915060a087013567ffffffffffffffff811115612574575f5ffd5b8701601f81018913612584575f5ffd5b803567ffffffffffffffff81111561259e5761259e6124f7565b604051601f8201601f19908116603f0116810167ffffffffffffffff811182821017156125cd576125cd6124f7565b6040528181528282016020018b10156125e4575f5ffd5b816020840160208301375f602083830101528093505050509295509295509295565b5f8151808452602084019350602083015f5b82811015612636578151865260209586019590910190600101612618565b5093949350505050565b604080825283519082018190525f9060208501906060840190835b818110156126825783516001600160a01b031683526020938401939092019160010161265b565b50508381036020850152611bef8186612606565b5f602082840312156126a6575f5ffd5b81356118b581612457565b5f602082840312156126c1575f5ffd5b813560ff811681146118b5575f5ffd5b5f5f602083850312156126e2575f5ffd5b823567ffffffffffffffff8111156126f8575f5ffd5b8301601f81018513612708575f5ffd5b803567ffffffffffffffff81111561271e575f5ffd5b8560208260051b8401011115612732575f5ffd5b6020919091019590945092505050565b5f8151808452602084019350602083015f5b828110156126365781516001600160a01b0316865260209586019590910190600101612754565b604081525f61278d6040830185612742565b828103602084015261279f8185612606565b95945050505050565b5f5f5f5f5f5f60c087890312156127bd575f5ffd5b86356127c881612457565b955060208701356127d881612457565b945060408701356127e881612457565b959894975094956060810135955060808101359460a0909101359350915050565b5f5f6040838503121561281a575f5ffd5b823561282581612457565b946020939093013593505050565b602081525f6118b56020830184612742565b5f5f60408385031215612856575f5ffd5b823561286181612457565b9150602083013561287181612457565b809150509250929050565b5f6020828403121561288c575f5ffd5b815180151581146118b5575f5ffd5b6001600160a01b039384168152919092166020820152604081019190915260600190565b634e487b7160e01b5f52603260045260245ffd5b5f602082840312156128e3575f5ffd5b81516118b581612457565b634e487b7160e01b5f52601160045260245ffd5b80820180821115611867576118676128ee565b5f60208284031215612925575f5ffd5b5051919050565b81810381811115611867576118676128ee565b634e487b7160e01b5f52602160045260245ffd5b634e487b7160e01b5f52603160045260245ffd5b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b828152604060208201525f6115466040830184612967565b5f82518060208501845e5f920191825250919050565b602081525f6118b5602083018461296756fea2646970667358221220cc7a838b889ebd0b67bb90d4ebf733e1b23b684c939f0e81770d642fe800aa8864736f6c634300081b0033", + Bin: "0x610100604052348015610010575f5ffd5b50604051612c9b380380612c9b83398101604081905261002f916101ed565b81816001600160a01b038116610058576040516339b190bb60e11b815260040160405180910390fd5b6001600160a01b039081166080521660a0524660c052610108604080518082018252600a81526922b4b3b2b72630bcb2b960b11b60209182015281517f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a866818301527f71b625cfad44bac63b13dba07f2e1d6084ee04b6f8752101ece6126d584ee6ea81840152466060820152306080808301919091528351808303909101815260a0909101909252815191012090565b60e05261011361011a565b5050610225565b5f54610100900460ff16156101855760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff908116146101d4575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b03811681146101ea575f5ffd5b50565b5f5f604083850312156101fe575f5ffd5b8251610209816101d6565b602084015190925061021a816101d6565b809150509250929050565b60805160a05160c05160e051612a0b6102905f395f61140101525f61134101525f81816104c70152818161077701528181610b1801528181610d77015281816111cb01526117f901525f818161039c0152818161058601528181610b8201526114250152612a0b5ff3fe608060405234801561000f575f5ffd5b5060043610610208575f3560e01c80638b8aac3c1161011f578063debe1eab116100a9578063f3b4a00011610079578063f3b4a0001461050f578063f698da2514610519578063fabc1cbc14610521578063fd98042314610534578063fe243a1714610547575f5ffd5b8063debe1eab146104af578063df5cf723146104c2578063e7a050aa146104e9578063f2fde38b146104fc575f5ffd5b80639ac01d61116100ef5780639ac01d6114610443578063b5d8b5b814610456578063c665670214610469578063cbc2bd621461047c578063de44acb61461048f575f5ffd5b80638b8aac3c146103d65780638da5cb5b146103fe57806394f649dd1461040f578063967fc0d214610430575f5ffd5b8063595c6a67116101a0578063663c1de411610170578063663c1de41461033b578063715018a61461035d578063724af423146103655780637ecebe0014610378578063886f119514610397575f5ffd5b8063595c6a67146102e55780635ac86ab7146102ed5780635c975abb146103205780635de08ff214610328575f5ffd5b806336a8c500116101db57806336a8c5001461026d57806348825e94146102835780634b6d5d6e146102aa57806350ff7225146102bd575f5ffd5b8063136439dd1461020c5780631794bb3c146102215780632eae418c1461023457806332e89ace14610247575b5f5ffd5b61021f61021a366004612440565b610571565b005b61021f61022f36600461246b565b610646565b61021f6102423660046124a9565b61076c565b61025a61025536600461250b565b610818565b6040519081526020015b60405180910390f35b6102756108bc565b604051610264929190612640565b61025a7f4337f82d142e41f2a8c10547cd8c859bddb92262a61058e77842e24d9dea922481565b61021f6102b8366004612696565b6109d9565b6102d06102cb36600461246b565b610b0b565b60408051928352602083019190915201610264565b61021f610b6d565b6103106102fb3660046126b1565b609854600160ff9092169190911b9081161490565b6040519015158152602001610264565b60985461025a565b61021f6103363660046126d1565b610c1c565b610310610349366004612696565b60d16020525f908152604090205460ff1681565b61021f610d5b565b61021f61037336600461246b565b610d6c565b61025a610386366004612696565b60ca6020525f908152604090205481565b6103be7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610264565b61025a6103e4366004612696565b6001600160a01b03165f90815260ce602052604090205490565b6033546001600160a01b03166103be565b61042261041d366004612696565b610dc0565b60405161026492919061277b565b60cb546103be906001600160a01b031681565b61025a6104513660046127a8565b610f38565b61021f6104643660046126d1565b610fc9565b61021f610477366004612696565b611108565b6103be61048a366004612809565b611119565b6104a261049d366004612696565b61114d565b6040516102649190612833565b61021f6104bd366004612809565b6111c0565b6103be7f000000000000000000000000000000000000000000000000000000000000000081565b61025a6104f736600461246b565b611276565b61021f61050a366004612696565b6112c8565b6103be620e16e481565b61025a61133e565b61021f61052f366004612440565b611423565b61025a610542366004612696565b611539565b61025a610555366004612845565b60cd60209081525f928352604080842090915290825290205481565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa1580156105d3573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105f7919061287c565b61061457604051631d77d47760e21b815260040160405180910390fd5b60985481811681146106395760405163c61dca5d60e01b815260040160405180910390fd5b6106428261154e565b5050565b5f54610100900460ff161580801561066457505f54600160ff909116105b8061067d5750303b15801561067d57505f5460ff166001145b6106e55760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b5f805460ff191660011790558015610706575f805461ff0019166101001790555b61070f8261154e565b6107188461158b565b610721836115dc565b8015610766575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146107b55760405163f739589b60e01b815260040160405180910390fd5b604051636ce5768960e11b81526001600160a01b0384169063d9caed12906107e59087908690869060040161289b565b5f604051808303815f87803b1580156107fc575f5ffd5b505af115801561080e573d5f5f3e3d5ffd5b5050505050505050565b6098545f9081906001908116036108425760405163840a48d560e01b815260040160405180910390fd5b61084a611645565b6001600160a01b0385165f90815260ca602052604090205461087b86610874818c8c8c878c610f38565b868861169e565b6001600160a01b0386165f90815260ca602052604090206001820190556108a4868a8a8a6116f0565b9250506108b16001606555565b509695505050505050565b6060805f6108ca60d461185d565b90505f8167ffffffffffffffff8111156108e6576108e66124f7565b60405190808252806020026020018201604052801561090f578160200160208202803683370190505b5090505f8267ffffffffffffffff81111561092c5761092c6124f7565b604051908082528060200260200182016040528015610955578160200160208202803683370190505b5090505f5b838110156109ce575f5f61096f60d48461186d565b9150915081858481518110610986576109866128bf565b60200260200101906001600160a01b031690816001600160a01b031681525050808484815181106109b9576109b96128bf565b6020908102919091010152505060010161095a565b509094909350915050565b6109e1611645565b5f6109ed60d48361188a565b9150506109fb60d4836118a1565b50604080516001600160a01b0384168152602081018390527fd9d082c3ec4f3a3ffa55c324939a06407f5fbcb87d5e0ce3b9508c92c84ed839910160405180910390a1816001600160a01b031663d9caed12620e16e4846001600160a01b0316632495a5996040518163ffffffff1660e01b8152600401602060405180830381865afa158015610a8d573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ab191906128d3565b846040518463ffffffff1660e01b8152600401610ad09392919061289b565b5f604051808303815f87803b158015610ae7575f5ffd5b505af1158015610af9573d5f5f3e3d5ffd5b5050505050610b086001606555565b50565b5f80336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610b565760405163f739589b60e01b815260040160405180910390fd5b610b618585856118bc565b91509150935093915050565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa158015610bcf573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610bf3919061287c565b610c1057604051631d77d47760e21b815260040160405180910390fd5b610c1a5f1961154e565b565b60cb546001600160a01b03163314610c47576040516320ba3ff960e21b815260040160405180910390fd5b805f5b818110156107665760d15f858584818110610c6757610c676128bf565b9050602002016020810190610c7c9190612696565b6001600160a01b0316815260208101919091526040015f205460ff16610d5357600160d15f868685818110610cb357610cb36128bf565b9050602002016020810190610cc89190612696565b6001600160a01b0316815260208101919091526040015f20805460ff19169115159190911790557f0c35b17d91c96eb2751cd456e1252f42a386e524ef9ff26ecc9950859fdc04fe848483818110610d2257610d226128bf565b9050602002016020810190610d379190612696565b6040516001600160a01b03909116815260200160405180910390a15b600101610c4a565b610d63611a24565b610c1a5f61158b565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610db55760405163f739589b60e01b815260040160405180910390fd5b610766838383611a7e565b6001600160a01b0381165f90815260ce60205260408120546060918291908167ffffffffffffffff811115610df757610df76124f7565b604051908082528060200260200182016040528015610e20578160200160208202803683370190505b5090505f5b82811015610eae576001600160a01b0386165f90815260cd6020908152604080832060ce9092528220805491929184908110610e6357610e636128bf565b5f9182526020808320909101546001600160a01b031683528201929092526040019020548251839083908110610e9b57610e9b6128bf565b6020908102919091010152600101610e25565b5060ce5f866001600160a01b03166001600160a01b031681526020019081526020015f208181805480602002602001604051908101604052809291908181526020018280548015610f2657602002820191905f5260205f20905b81546001600160a01b03168152600190910190602001808311610f08575b50505050509150935093505050915091565b604080517f4337f82d142e41f2a8c10547cd8c859bddb92262a61058e77842e24d9dea922460208201526001600160a01b03808916928201929092528187166060820152908516608082015260a0810184905260c0810183905260e081018290525f90610fbe906101000160405160208183030381529060405280519060200120611b40565b979650505050505050565b60cb546001600160a01b03163314610ff4576040516320ba3ff960e21b815260040160405180910390fd5b805f5b818110156107665760d15f858584818110611014576110146128bf565b90506020020160208101906110299190612696565b6001600160a01b0316815260208101919091526040015f205460ff1615611100575f60d15f868685818110611060576110606128bf565b90506020020160208101906110759190612696565b6001600160a01b0316815260208101919091526040015f20805460ff19169115159190911790557f4074413b4b443e4e58019f2855a8765113358c7c72e39509c6af45fc0f5ba0308484838181106110cf576110cf6128bf565b90506020020160208101906110e49190612696565b6040516001600160a01b03909116815260200160405180910390a15b600101610ff7565b611110611a24565b610b08816115dc565b60ce602052815f5260405f208181548110611132575f80fd5b5f918252602090912001546001600160a01b03169150829050565b6001600160a01b0381165f90815260ce60209081526040918290208054835181840281018401909452808452606093928301828280156111b457602002820191905f5260205f20905b81546001600160a01b03168152600190910190602001808311611196575b50505050509050919050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146112095760405163f739589b60e01b815260040160405180910390fd5b5f61121560d48461188a565b915061122e905060d4846112298585612902565b611b86565b50604080516001600160a01b0385168152602081018490527fca3e02a4ab7ad3c47a8e36e5a624c30170791726ab720f1babfef21046d953ff910160405180910390a1505050565b6098545f9081906001908116036112a05760405163840a48d560e01b815260040160405180910390fd5b6112a8611645565b6112b4338686866116f0565b91506112c06001606555565b509392505050565b6112d0611a24565b6001600160a01b0381166113355760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016106dc565b610b088161158b565b5f7f000000000000000000000000000000000000000000000000000000000000000046146113fe5750604080518082018252600a81526922b4b3b2b72630bcb2b960b11b60209182015281517f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a866818301527f71b625cfad44bac63b13dba07f2e1d6084ee04b6f8752101ece6126d584ee6ea81840152466060820152306080808301919091528351808303909101815260a0909101909252815191012090565b507f000000000000000000000000000000000000000000000000000000000000000090565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561147f573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114a391906128d3565b6001600160a01b0316336001600160a01b0316146114d45760405163794821ff60e01b815260040160405180910390fd5b609854801982198116146114fb5760405163c61dca5d60e01b815260040160405180910390fd5b609882905560405182815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c9060200160405180910390a25050565b5f5f61154660d48461188a565b949350505050565b609881905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a250565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b60cb54604080516001600160a01b03928316815291831660208301527f4264275e593955ff9d6146a51a4525f6ddace2e81db9391abcc9d1ca48047d29910160405180910390a160cb80546001600160a01b0319166001600160a01b0392909216919091179055565b6002606554036116975760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016106dc565b6002606555565b428110156116bf57604051630819bdcd60e01b815260040160405180910390fd5b6116d36001600160a01b0385168484611b9b565b61076657604051638baa579f60e01b815260040160405180910390fd5b6001600160a01b0383165f90815260d16020526040812054849060ff1661172a57604051632efd965160e11b815260040160405180910390fd5b61173f6001600160a01b038516338786611bf9565b6040516311f9fbc960e21b81526001600160a01b038581166004830152602482018590528616906347e7ef24906044016020604051808303815f875af115801561178b573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906117af9190612915565b91505f5f6117be8888866118bc565b604051631e328e7960e11b81526001600160a01b038b811660048301528a8116602483015260448201849052606482018390529294509092507f000000000000000000000000000000000000000000000000000000000000000090911690633c651cf2906084015f604051808303815f87803b15801561183c575f5ffd5b505af115801561184e573d5f5f3e3d5ffd5b50505050505050949350505050565b5f61186782611c51565b92915050565b5f80808061187b8686611c5b565b909450925050505b9250929050565b5f80808061187b866001600160a01b038716611c84565b5f6118b5836001600160a01b038416611cbc565b9392505050565b5f806001600160a01b0385166118e5576040516316f2ccc960e01b815260040160405180910390fd5b825f03611905576040516342061b2560e11b815260040160405180910390fd5b6001600160a01b038086165f90815260cd60209081526040808320938816835292905290812054908190036119ab576001600160a01b0386165f90815260ce60209081526040909120541061196d576040516301a1443960e31b815260040160405180910390fd5b6001600160a01b038681165f90815260ce602090815260408220805460018101825590835291200180546001600160a01b0319169187169190911790555b6119b58482612902565b6001600160a01b038088165f90815260cd60209081526040808320938a16835292905281902091909155517f5548c837ab068cf56a2c2479df0882a4922fd203edb7517321831d95078c5f6290611a119088908890889061289b565b60405180910390a1959294509192505050565b6033546001600160a01b03163314610c1a5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016106dc565b5f815f03611a9f576040516342061b2560e11b815260040160405180910390fd5b6001600160a01b038085165f90815260cd602090815260408083209387168352929052205480831115611ae557604051634b18b19360e01b815260040160405180910390fd5b611aef838261292c565b6001600160a01b038087165f90815260cd602090815260408083209389168352929052908120829055909150819003611b3657611b2c8585611cd8565b60019150506118b5565b505f949350505050565b5f611b4961133e565b60405161190160f01b6020820152602281019190915260428101839052606201604051602081830303815290604052805190602001209050919050565b5f611546846001600160a01b03851684611e56565b5f5f5f611ba88585611e72565b90925090505f816004811115611bc057611bc061293f565b148015611bde5750856001600160a01b0316826001600160a01b0316145b80611bef5750611bef868686611eb1565b9695505050505050565b610766846323b872dd60e01b858585604051602401611c1a9392919061289b565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152611f98565b5f61186782612070565b5f8080611c688585612079565b5f81815260029690960160205260409095205494959350505050565b5f818152600283016020526040812054819080611cb157611ca58585612084565b92505f91506118839050565b600192509050611883565b5f81815260028301602052604081208190556118b5838361208f565b6001600160a01b0382165f90815260ce6020526040812054905b81811015611dea576001600160a01b038481165f90815260ce6020526040902080549185169183908110611d2857611d286128bf565b5f918252602090912001546001600160a01b031603611de2576001600160a01b0384165f90815260ce602052604090208054611d669060019061292c565b81548110611d7657611d766128bf565b5f9182526020808320909101546001600160a01b03878116845260ce9092526040909220805491909216919083908110611db257611db26128bf565b905f5260205f20015f6101000a8154816001600160a01b0302191690836001600160a01b03160217905550611dea565b600101611cf2565b818103611e0a57604051632df15a4160e11b815260040160405180910390fd5b6001600160a01b0384165f90815260ce60205260409020805480611e3057611e30612953565b5f8281526020902081015f1990810180546001600160a01b031916905501905550505050565b5f8281526002840160205260408120829055611546848461209a565b5f5f8251604103611ea6576020830151604084015160608501515f1a611e9a878285856120a5565b94509450505050611883565b505f90506002611883565b5f5f5f856001600160a01b0316631626ba7e60e01b8686604051602401611ed9929190612995565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b0319909416939093179092529051611f1791906129ad565b5f60405180830381855afa9150503d805f8114611f4f576040519150601f19603f3d011682016040523d82523d5f602084013e611f54565b606091505b5091509150818015611f6857506020815110155b8015611bef57508051630b135d3f60e11b90611f8d9083016020908101908401612915565b149695505050505050565b5f611fec826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166121629092919063ffffffff16565b905080515f148061200c57508080602001905181019061200c919061287c565b61206b5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016106dc565b505050565b5f611867825490565b5f6118b58383612170565b5f6118b58383612196565b5f6118b583836121ad565b5f6118b58383612290565b5f807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08311156120da57505f90506003612159565b604080515f8082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa15801561212b573d5f5f3e3d5ffd5b5050604051601f1901519150506001600160a01b038116612153575f60019250925050612159565b91505f90505b94509492505050565b606061154684845f856122dc565b5f825f018281548110612185576121856128bf565b905f5260205f200154905092915050565b5f81815260018301602052604081205415156118b5565b5f8181526001830160205260408120548015612287575f6121cf60018361292c565b85549091505f906121e29060019061292c565b9050818114612241575f865f018281548110612200576122006128bf565b905f5260205f200154905080875f018481548110612220576122206128bf565b5f918252602080832090910192909255918252600188019052604090208390555b855486908061225257612252612953565b600190038181905f5260205f20015f90559055856001015f8681526020019081526020015f205f905560019350505050611867565b5f915050611867565b5f8181526001830160205260408120546122d557508154600181810184555f848152602080822090930184905584548482528286019093526040902091909155611867565b505f611867565b60608247101561233d5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b60648201526084016106dc565b5f5f866001600160a01b0316858760405161235891906129ad565b5f6040518083038185875af1925050503d805f8114612392576040519150601f19603f3d011682016040523d82523d5f602084013e612397565b606091505b5091509150610fbe87838387606083156124115782515f0361240a576001600160a01b0385163b61240a5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016106dc565b5081611546565b61154683838151156124265781518083602001fd5b8060405162461bcd60e51b81526004016106dc91906129c3565b5f60208284031215612450575f5ffd5b5035919050565b6001600160a01b0381168114610b08575f5ffd5b5f5f5f6060848603121561247d575f5ffd5b833561248881612457565b9250602084013561249881612457565b929592945050506040919091013590565b5f5f5f5f608085870312156124bc575f5ffd5b84356124c781612457565b935060208501356124d781612457565b925060408501356124e781612457565b9396929550929360600135925050565b634e487b7160e01b5f52604160045260245ffd5b5f5f5f5f5f5f60c08789031215612520575f5ffd5b863561252b81612457565b9550602087013561253b81612457565b945060408701359350606087013561255281612457565b92506080870135915060a087013567ffffffffffffffff811115612574575f5ffd5b8701601f81018913612584575f5ffd5b803567ffffffffffffffff81111561259e5761259e6124f7565b604051601f8201601f19908116603f0116810167ffffffffffffffff811182821017156125cd576125cd6124f7565b6040528181528282016020018b10156125e4575f5ffd5b816020840160208301375f602083830101528093505050509295509295509295565b5f8151808452602084019350602083015f5b82811015612636578151865260209586019590910190600101612618565b5093949350505050565b604080825283519082018190525f9060208501906060840190835b818110156126825783516001600160a01b031683526020938401939092019160010161265b565b50508381036020850152611bef8186612606565b5f602082840312156126a6575f5ffd5b81356118b581612457565b5f602082840312156126c1575f5ffd5b813560ff811681146118b5575f5ffd5b5f5f602083850312156126e2575f5ffd5b823567ffffffffffffffff8111156126f8575f5ffd5b8301601f81018513612708575f5ffd5b803567ffffffffffffffff81111561271e575f5ffd5b8560208260051b8401011115612732575f5ffd5b6020919091019590945092505050565b5f8151808452602084019350602083015f5b828110156126365781516001600160a01b0316865260209586019590910190600101612754565b604081525f61278d6040830185612742565b828103602084015261279f8185612606565b95945050505050565b5f5f5f5f5f5f60c087890312156127bd575f5ffd5b86356127c881612457565b955060208701356127d881612457565b945060408701356127e881612457565b959894975094956060810135955060808101359460a0909101359350915050565b5f5f6040838503121561281a575f5ffd5b823561282581612457565b946020939093013593505050565b602081525f6118b56020830184612742565b5f5f60408385031215612856575f5ffd5b823561286181612457565b9150602083013561287181612457565b809150509250929050565b5f6020828403121561288c575f5ffd5b815180151581146118b5575f5ffd5b6001600160a01b039384168152919092166020820152604081019190915260600190565b634e487b7160e01b5f52603260045260245ffd5b5f602082840312156128e3575f5ffd5b81516118b581612457565b634e487b7160e01b5f52601160045260245ffd5b80820180821115611867576118676128ee565b5f60208284031215612925575f5ffd5b5051919050565b81810381811115611867576118676128ee565b634e487b7160e01b5f52602160045260245ffd5b634e487b7160e01b5f52603160045260245ffd5b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b828152604060208201525f6115466040830184612967565b5f82518060208501845e5f920191825250919050565b602081525f6118b5602083018461296756fea2646970667358221220dd50178ee12aa9672bc3158aff1ab98ae0d2b217bf934148e25e1fbf519fbb3d64736f6c634300081b0033", } // StrategyManagerABI is the input ABI used to generate the binding from. diff --git a/src/contracts/core/AllocationManager.sol b/src/contracts/core/AllocationManager.sol index 5a8083c1f8..9d5195baf6 100644 --- a/src/contracts/core/AllocationManager.sol +++ b/src/contracts/core/AllocationManager.sol @@ -62,10 +62,9 @@ contract AllocationManager is ) external onlyWhenNotPaused(PAUSED_OPERATOR_SLASHING) checkCanCall(avs) { // Check that the operator set exists and the operator is registered to it OperatorSet memory operatorSet = OperatorSet(avs, params.operatorSetId); - bool isOperatorSlashable = _isOperatorSlashable(params.operator, operatorSet); require(params.strategies.length == params.wadsToSlash.length, InputArrayLengthMismatch()); require(_operatorSets[operatorSet.avs].contains(operatorSet.id), InvalidOperatorSet()); - require(isOperatorSlashable, OperatorNotSlashable()); + require(isOperatorSlashable(params.operator, operatorSet), OperatorNotSlashable()); uint256[] memory wadSlashed = new uint256[](params.strategies.length); @@ -172,7 +171,7 @@ contract AllocationManager is OperatorSet memory operatorSet = params[i].operatorSet; require(_operatorSets[operatorSet.avs].contains(operatorSet.id), InvalidOperatorSet()); - bool isOperatorSlashable = _isOperatorSlashable(operator, operatorSet); + bool _isOperatorSlashable = isOperatorSlashable(operator, operatorSet); for (uint256 j = 0; j < params[i].strategies.length; j++) { IStrategy strategy = params[i].strategies[j]; @@ -188,7 +187,7 @@ contract AllocationManager is // 2. Check whether the operator's allocation is slashable. If not, we allow instant // deallocation. - bool isSlashable = _isAllocationSlashable(operatorSet, strategy, allocation, isOperatorSlashable); + bool isSlashable = _isAllocationSlashable(operatorSet, strategy, allocation, _isOperatorSlashable); // 3. Calculate the change in magnitude allocation.pendingDiff = _calcDelta(allocation.currentMagnitude, params[i].newMagnitudes[j]); @@ -261,7 +260,7 @@ contract AllocationManager is // Check the operator set exists and the operator is not currently registered to it OperatorSet memory operatorSet = OperatorSet(params.avs, params.operatorSetIds[i]); require(_operatorSets[operatorSet.avs].contains(operatorSet.id), InvalidOperatorSet()); - require(!_isOperatorSlashable(operator, operatorSet), AlreadyMemberOfSet()); + require(!isOperatorSlashable(operator, operatorSet), AlreadyMemberOfSet()); // Add operator to operator set registeredSets[operator].add(operatorSet.key()); @@ -440,28 +439,19 @@ contract AllocationManager is emit AllocationDelaySet(operator, delay, info.effectBlock); } - /// @notice returns whether the operator is slashable in the given operator set - function _isOperatorSlashable(address operator, OperatorSet memory operatorSet) internal view returns (bool) { - RegistrationStatus memory status = registrationStatus[operator][operatorSet.key()]; - - // slashableUntil returns the last block the operator is slashable in so we check for - // less than or equal to - return status.registered || block.number <= status.slashableUntil; - } - /// @notice returns whether the operator's allocation is slashable in the given operator set function _isAllocationSlashable( OperatorSet memory operatorSet, IStrategy strategy, Allocation memory allocation, - bool isOperatorSlashable + bool _isOperatorSlashable ) internal view returns (bool) { /// forgefmt: disable-next-item return // If the operator set does not use this strategy, any allocation from it is not slashable _operatorSetStrategies[operatorSet.key()].contains(address(strategy)) && // If the operator is not slashable by the operatorSet, any allocation is not slashable - isOperatorSlashable && + _isOperatorSlashable && // If there is nothing allocated, the allocation is not slashable allocation.currentMagnitude != 0; } @@ -542,6 +532,53 @@ contract AllocationManager is } } + /** + * @dev Returns the minimum allocated stake at the future block. + * @param operatorSet The operator set to get the minimum allocated stake for. + * @param operators The operators to get the minimum allocated stake for. + * @param strategies The strategies to get the minimum allocated stake for. + * @param futureBlock The future block to get the minimum allocated stake for. + */ + function _getMinimumAllocatedStake( + OperatorSet memory operatorSet, + address[] memory operators, + IStrategy[] memory strategies, + uint32 futureBlock + ) internal view returns (uint256[][] memory allocatedStake) { + allocatedStake = new uint256[][](operators.length); + uint256[][] memory delegatedStake = delegation.getOperatorsShares(operators, strategies); + + for (uint256 i = 0; i < operators.length; i++) { + address operator = operators[i]; + + allocatedStake[i] = new uint256[](strategies.length); + + for (uint256 j = 0; j < strategies.length; j++) { + IStrategy strategy = strategies[j]; + + // Fetch the max magnitude and allocation for the operator/strategy. + // Prevent division by 0 if needed. This mirrors the "FullySlashed" checks + // in the DelegationManager + uint64 maxMagnitude = _maxMagnitudeHistory[operator][strategy].latest(); + if (maxMagnitude == 0) { + continue; + } + + Allocation memory alloc = getAllocation(operator, operatorSet, strategy); + + // If the pending change takes effect before `futureBlock`, include it in `currentMagnitude` + // However, ONLY include the pending change if it is a deallocation, since this method + // is supposed to return the minimum slashable stake between now and `futureBlock` + if (alloc.effectBlock <= futureBlock && alloc.pendingDiff < 0) { + alloc.currentMagnitude = _addInt128(alloc.currentMagnitude, alloc.pendingDiff); + } + + uint256 slashableProportion = uint256(alloc.currentMagnitude).divWad(maxMagnitude); + allocatedStake[i][j] = delegatedStake[i][j].mulWad(slashableProportion); + } + } + } + function _updateMaxMagnitude(address operator, IStrategy strategy, uint64 newMaxMagnitude) internal { _maxMagnitudeHistory[operator][strategy].push({key: uint32(block.number), value: newMaxMagnitude}); emit MaxMagnitudeUpdated(operator, strategy, newMaxMagnitude); @@ -824,36 +861,35 @@ contract AllocationManager is IStrategy[] memory strategies, uint32 futureBlock ) external view returns (uint256[][] memory slashableStake) { - slashableStake = new uint256[][](operators.length); - uint256[][] memory delegatedStake = delegation.getOperatorsShares(operators, strategies); + slashableStake = _getMinimumAllocatedStake(operatorSet, operators, strategies, futureBlock); for (uint256 i = 0; i < operators.length; i++) { - address operator = operators[i]; - slashableStake[i] = new uint256[](strategies.length); - - for (uint256 j = 0; j < strategies.length; j++) { - IStrategy strategy = strategies[j]; - - // Fetch the max magnitude and allocation for the operator/strategy. - // Prevent division by 0 if needed. This mirrors the "FullySlashed" checks - // in the DelegationManager - uint64 maxMagnitude = _maxMagnitudeHistory[operator][strategy].latest(); - if (maxMagnitude == 0) { - continue; + // If the operator is not slashable by the opSet, all strategies should have a slashable stake of 0 + if (!isOperatorSlashable(operators[i], operatorSet)) { + for (uint256 j = 0; j < strategies.length; j++) { + slashableStake[i][j] = 0; } + } + } + } - Allocation memory alloc = getAllocation(operator, operatorSet, strategy); + /// @inheritdoc IAllocationManager + function getAllocatedStake( + OperatorSet memory operatorSet, + address[] memory operators, + IStrategy[] memory strategies + ) public view returns (uint256[][] memory) { + /// This helper function returns the minimum allocated stake by taking into account deallocations at some `futureBlock`. + /// We use the block.number, as the `futureBlock`, meaning that no **future** deallocations are considered. + return _getMinimumAllocatedStake(operatorSet, operators, strategies, uint32(block.number)); + } - // If the pending change takes effect before `futureBlock`, include it in `currentMagnitude` - // However, ONLY include the pending change if it is a deallocation, since this method - // is supposed to return the minimum slashable stake between now and `futureBlock` - if (alloc.effectBlock <= futureBlock && alloc.pendingDiff < 0) { - alloc.currentMagnitude = _addInt128(alloc.currentMagnitude, alloc.pendingDiff); - } + /// @inheritdoc IAllocationManager + function isOperatorSlashable(address operator, OperatorSet memory operatorSet) public view returns (bool) { + RegistrationStatus memory status = registrationStatus[operator][operatorSet.key()]; - uint256 slashableProportion = uint256(alloc.currentMagnitude).divWad(maxMagnitude); - slashableStake[i][j] = delegatedStake[i][j].mulWad(slashableProportion); - } - } + // slashableUntil returns the last block the operator is slashable in so we check for + // less than or equal to + return status.registered || block.number <= status.slashableUntil; } } diff --git a/src/contracts/interfaces/IAllocationManager.sol b/src/contracts/interfaces/IAllocationManager.sol index ac8467405f..8676869a88 100644 --- a/src/contracts/interfaces/IAllocationManager.sol +++ b/src/contracts/interfaces/IAllocationManager.sol @@ -536,7 +536,8 @@ interface IAllocationManager is IAllocationManagerErrors, IAllocationManagerEven /** * @notice Returns the minimum amount of stake that will be slashable as of some future block, - * according to each operator's allocation from each strategy to the operator set. + * according to each operator's allocation from each strategy to the operator set. Note that this function + * will return 0 for the slashable stake if the operator is not slashable at the time of the call. * @dev This method queries actual delegated stakes in the DelegationManager and applies * each operator's allocation to the stake to produce the slashable stake each allocation * represents. @@ -549,7 +550,6 @@ interface IAllocationManager is IAllocationManagerErrors, IAllocationManagerEven * @param operators the list of operators whose slashable stakes will be returned * @param strategies the strategies that each slashable stake corresponds to * @param futureBlock the block at which to get allocation information. Should be a future block. - * @return slashableStake a list of slashable stakes, indexed by [operator][strategy] */ function getMinimumSlashableStake( OperatorSet memory operatorSet, @@ -557,4 +557,25 @@ interface IAllocationManager is IAllocationManagerErrors, IAllocationManagerEven IStrategy[] memory strategies, uint32 futureBlock ) external view returns (uint256[][] memory slashableStake); + + /** + * @notice Returns the current allocated stake, irrespective of the operator's slashable status for the operatorSet. + * @param operatorSet the operator set to query + * @param operators the operators to query + * @param strategies the strategies to query + */ + function getAllocatedStake( + OperatorSet memory operatorSet, + address[] memory operators, + IStrategy[] memory strategies + ) external view returns (uint256[][] memory slashableStake); + + /** + * @notice Returns whether an operator is slashable by an operator set. + * This returns true if the operator is registered or their slashableUntil block has not passed. + * This is because even when operators are deregistered, they still remain slashable for a period of time. + * @param operator the operator to check slashability for + * @param operatorSet the operator set to check slashability for + */ + function isOperatorSlashable(address operator, OperatorSet memory operatorSet) external view returns (bool); } diff --git a/src/test/unit/AllocationManagerUnit.t.sol b/src/test/unit/AllocationManagerUnit.t.sol index d2018b6d2b..ebd8ca1243 100644 --- a/src/test/unit/AllocationManagerUnit.t.sol +++ b/src/test/unit/AllocationManagerUnit.t.sol @@ -270,17 +270,17 @@ contract AllocationManagerUnitTests is EigenLayerUnitTestSetup, IAllocationManag uint256 expectedSlashableStake, uint256 futureBlock ) internal view { - uint256[] memory slashableStake = allocationManager.getMinimumSlashableStake({ + uint256[][] memory slashableStake = allocationManager.getMinimumSlashableStake({ operatorSet: operatorSet, operators: operator.toArray(), strategies: strategies, futureBlock: uint32(futureBlock) - })[0]; + }); for (uint256 i = 0; i < strategies.length; i++) { console.log("\nChecking Slashable Stake:".yellow()); - console.log(" slashableStake[%d] = %d", i, slashableStake[i]); - assertEq(slashableStake[i], expectedSlashableStake, "slashableStake != expected"); + console.log(" slashableStake[%d] = %d", i, slashableStake[0][i]); + assertEq(slashableStake[0][i], expectedSlashableStake, "slashableStake != expected"); } console.log("Success!".green().bold()); @@ -1419,9 +1419,7 @@ contract AllocationManagerUnitTests_SlashOperator is AllocationManagerUnitTests cheats.roll(block.number + DEFAULT_OPERATOR_ALLOCATION_DELAY); // Get slashable shares for each operatorSet - uint256 opset2SlashableSharesBefore = allocationManager.getMinimumSlashableStake( - operatorSet2, defaultOperator.toArray(), defaultStrategies, uint32(block.number) - )[0][0]; + uint256[][] memory opset2SlashableSharesBefore = allocationManager.getMinimumSlashableStake(operatorSet2, defaultOperator.toArray(), defaultStrategies, uint32(block.number)); // Slash operator on operatorSet1 for 50% SlashingParams memory slashingParams = SlashingParams({ operator: defaultOperator, @@ -1476,11 +1474,10 @@ contract AllocationManagerUnitTests_SlashOperator is AllocationManagerUnitTests ); // Assert that slashable stake is the same - we add slippage here due to rounding error from the slash itself + uint256[][] memory minSlashableStake = allocationManager.getMinimumSlashableStake(operatorSet2, defaultOperator.toArray(), defaultStrategies, uint32(block.number)); assertEq( - opset2SlashableSharesBefore, - allocationManager.getMinimumSlashableStake( - operatorSet2, defaultOperator.toArray(), defaultStrategies, uint32(block.number) - )[0][0] + 1, + opset2SlashableSharesBefore[0][0], + minSlashableStake[0][0] + 1, "opSet2 slashable shares should be the same" ); } @@ -3720,6 +3717,7 @@ contract AllocationManagerUnitTests_getStrategyAllocations is AllocationManagerU contract AllocationManagerUnitTests_getSlashableStake is AllocationManagerUnitTests { using SlashingLib for *; + using ArrayLib for *; /** * Allocates half of magnitude for a single strategy to an operatorSet. Then allocates again. Slashes 50% @@ -3938,6 +3936,92 @@ contract AllocationManagerUnitTests_getSlashableStake is AllocationManagerUnitTe expectedSlashableStake: expectedCurrentMagnitude - uint128(-expectedPendingDiff) - 1 }); } + + function testFuzz_allocate_deregister( + Randomness r + ) public rand(r) { + AllocateParams[] memory allocateParams = _newAllocateParams(defaultOperatorSet, 5e17); + cheats.prank(defaultOperator); + allocationManager.modifyAllocations(defaultOperator, allocateParams); + cheats.roll(block.number + DEFAULT_OPERATOR_ALLOCATION_DELAY); + + cheats.prank(defaultOperator); + allocationManager.deregisterFromOperatorSets( + DeregisterParams(defaultOperator, defaultOperatorSet.avs, defaultOperatorSet.id.toArrayU32()) + ); + + // Check slashable stake right after deregistration + _checkSlashableStake({ + operatorSet: allocateParams[0].operatorSet, + operator: defaultOperator, + strategies: allocateParams[0].strategies, + expectedSlashableStake: DEFAULT_OPERATOR_SHARES.mulWad(5e17) + }); + + // Assert slashable stake after deregistration delay is 0 + cheats.roll(block.number + DEALLOCATION_DELAY + 1); + _checkSlashableStake({ + operatorSet: allocateParams[0].operatorSet, + operator: defaultOperator, + strategies: allocateParams[0].strategies, + expectedSlashableStake: 0 + }); + } +} + +contract AllocationManagerUnitTests_isOperatorSlashable is AllocationManagerUnitTests { + using SlashingLib for *; + using ArrayLib for *; + + function test_registeredOperator() public { + assertEq( + allocationManager.isOperatorSlashable(defaultOperator, defaultOperatorSet), + true, + "registered operator should be slashable" + ); + assertEq( + allocationManager.isMemberOfOperatorSet(defaultOperator, defaultOperatorSet), + true, + "operator should be member of set" + ); + } + + function test_deregisteredOperatorAndSlashable() public { + // 1. deregister defaultOperator from defaultOperator set + uint32 deregisterBlock = uint32(block.number); + cheats.prank(defaultOperator); + allocationManager.deregisterFromOperatorSets( + DeregisterParams(defaultOperator, defaultOperatorSet.avs, defaultOperatorSet.id.toArrayU32()) + ); + assertEq( + allocationManager.isMemberOfOperatorSet(defaultOperator, defaultOperatorSet), + false, + "operator should not be member of set" + ); + + // 2. assert operator is still slashable + assertEq( + allocationManager.isOperatorSlashable(defaultOperator, defaultOperatorSet), + true, + "deregistered operator should be slashable" + ); + + // 3. roll blocks forward to slashableUntil block assert still slashable + cheats.roll(deregisterBlock + DEALLOCATION_DELAY); + assertEq( + allocationManager.isOperatorSlashable(defaultOperator, defaultOperatorSet), + true, + "deregistered operator should be slashable" + ); + + // 4. roll 1 block forward and assert not slashable + cheats.roll(deregisterBlock + DEALLOCATION_DELAY + 1); + assertEq( + allocationManager.isOperatorSlashable(defaultOperator, defaultOperatorSet), + false, + "deregistered operator should not be slashable" + ); + } } contract AllocationManagerUnitTests_getMaxMagnitudesAtBlock is AllocationManagerUnitTests { @@ -3992,3 +4076,84 @@ contract AllocationManagerUnitTests_getMaxMagnitudesAtBlock is AllocationManager ); } } + +contract AllocationManagerUnitTests_getAllocatedStake is AllocationManagerUnitTests { + using ArrayLib for *; + using SlashingLib for *; + + /** + * Allocates to `firstMod` magnitude and validates allocated stake is correct + */ + function testFuzz_allocate( + Randomness r + ) public rand(r) { + // Generate allocation for `strategyMock`, we allocate half + AllocateParams[] memory allocateParams = _newAllocateParams(defaultOperatorSet, 5e17); + cheats.prank(defaultOperator); + allocationManager.modifyAllocations(defaultOperator, allocateParams); + cheats.roll(block.number + DEFAULT_OPERATOR_ALLOCATION_DELAY); + + uint256[][] memory allocatedStake = allocationManager.getAllocatedStake(defaultOperatorSet, defaultOperator.toArray(), defaultStrategies); + + assertEq(allocatedStake[0][0], DEFAULT_OPERATOR_SHARES.mulWad(5e17), "allocated stake not correct"); + } + + /** + * Allocates to `firstMod` magnitude and then deallocate to `secondMod` magnitude + * Validates allocated stake is updated even after deallocation is cleared in storage + */ + function testFuzz_allocate_deallocate( + Randomness r + ) public rand(r) { + // Bound allocation and deallocation + uint64 firstMod = r.Uint64(1, WAD); + uint64 secondMod = r.Uint64(0, firstMod - 1); + + // 1. Allocate magnitude to default registered set & warp to allocation complete block + AllocateParams[] memory allocateParams = _newAllocateParams(defaultOperatorSet, firstMod); + cheats.prank(defaultOperator); + allocationManager.modifyAllocations(defaultOperator, allocateParams); + cheats.roll(block.number + DEFAULT_OPERATOR_ALLOCATION_DELAY); + + // 2. Deallocate + allocateParams = _newAllocateParams(defaultOperatorSet, secondMod); + cheats.prank(defaultOperator); + allocationManager.modifyAllocations(defaultOperator, allocateParams); + + // 3. Check allocated stake right after deallocation - shouldn't be updated + uint256[][] memory allocatedStake = allocationManager.getAllocatedStake(defaultOperatorSet, defaultOperator.toArray(), defaultStrategies); + assertEq(allocatedStake[0][0], DEFAULT_OPERATOR_SHARES.mulWad(firstMod), "allocated stake not correct"); + + // 4. Check slashable stake at the deallocation effect block + // Warp to deallocation effect block + cheats.roll(block.number + DEALLOCATION_DELAY + 1); + + allocatedStake = allocationManager.getAllocatedStake(defaultOperatorSet, defaultOperator.toArray(), defaultStrategies); + assertEq(allocatedStake[0][0], DEFAULT_OPERATOR_SHARES.mulWad(secondMod), "allocated stake not correct"); + } + + /** + * Allocates to `firstMod` magnitude and then deregisters the operator. + * Validates allocated stake is nonzero even after deregistration delay + */ + function testFuzz_allocate_deregister( + Randomness r + ) public rand(r) { + // 1. Generate allocation for `strategyMock`, we allocate half + AllocateParams[] memory allocateParams = _newAllocateParams(defaultOperatorSet, 5e17); + cheats.prank(defaultOperator); + allocationManager.modifyAllocations(defaultOperator, allocateParams); + cheats.roll(block.number + DEFAULT_OPERATOR_ALLOCATION_DELAY); + + // 2. Deregister from operator set & warp to deregistration effect block + cheats.prank(defaultOperator); + allocationManager.deregisterFromOperatorSets( + DeregisterParams(defaultOperator, defaultOperatorSet.avs, defaultOperatorSet.id.toArrayU32()) + ); + cheats.roll(block.number + DEALLOCATION_DELAY + 1); + + // 3. Check allocated stake + uint256[][] memory allocatedStake = allocationManager.getAllocatedStake(defaultOperatorSet, defaultOperator.toArray(), defaultStrategies); + assertEq(allocatedStake[0][0], DEFAULT_OPERATOR_SHARES.mulWad(5e17), "allocated stake should remain same after deregistration"); + } +} From 3b19ac6ab0c4a464d996ee9b625b7c18b9559b42 Mon Sep 17 00:00:00 2001 From: Alex <18387287+wadealexc@users.noreply.github.com> Date: Thu, 30 Jan 2025 14:57:37 -0500 Subject: [PATCH 13/35] test(integration): implement registration and allocation invariants (#1042) * chore: fix forge nightly release breaking two tests * test: fix outdated alm tests --- foundry.toml | 2 +- script/utils/ExistingDeploymentParser.sol | 4 +- src/test/integration/IntegrationBase.t.sol | 1195 ++++++++++++++--- src/test/integration/IntegrationChecks.t.sol | 512 ++++++- .../integration/IntegrationDeployer.t.sol | 64 +- src/test/integration/TimeMachine.t.sol | 4 +- src/test/integration/TypeImporter.t.sol | 26 + src/test/integration/tests/ALM_Multi.t.sol | 431 ++++++ .../tests/ALM_RegisterAndModify.t.sol | 229 ++++ .../Delegate_Deposit_Queue_Complete.t.sol | 4 +- ...egate_Allocate_Slash_Queue_Redeposit.t.sol | 259 +--- .../Deposit_Delegate_Queue_Complete.t.sol | 8 +- ...Deposit_Delegate_Redelegate_Complete.t.sol | 16 +- ...Deposit_Delegate_Undelegate_Complete.t.sol | 10 +- .../Deposit_Delegate_UpdateBalance.t.sol | 2 +- .../tests/Deposit_Queue_Complete.t.sol | 4 +- ...it_Register_QueueWithdrawal_Complete.t.sol | 4 +- .../tests/SlashingWithdrawals.t.sol | 90 +- .../Complete_PreSlashing_Withdrawal.t.sol | 8 +- .../upgrade/Delegate_Upgrade_Allocate.t.sol | 19 +- src/test/integration/users/User.t.sol | 45 +- src/test/unit/libraries/SnapshotsUnit.t.sol | 1 + src/test/unit/mixins/SignatureUtilsUnit.t.sol | 1 + src/test/utils/Logger.t.sol | 49 +- 24 files changed, 2493 insertions(+), 494 deletions(-) create mode 100644 src/test/integration/TypeImporter.t.sol create mode 100644 src/test/integration/tests/ALM_Multi.t.sol create mode 100644 src/test/integration/tests/ALM_RegisterAndModify.t.sol diff --git a/foundry.toml b/foundry.toml index 0d1c575633..d8494c0b57 100644 --- a/foundry.toml +++ b/foundry.toml @@ -24,7 +24,7 @@ # Specifies the exact version of Solidity to use, overriding auto-detection. solc_version = '0.8.27' # If enabled, treats Solidity compiler warnings as errors, preventing artifact generation if warnings are present. - deny_warnings = true + deny_warnings = false # If set to true, changes compilation pipeline to go through the new IR optimizer. via_ir = false # Whether or not to enable the Solidity optimizer. diff --git a/script/utils/ExistingDeploymentParser.sol b/script/utils/ExistingDeploymentParser.sol index 53f6789044..84c1886b7d 100644 --- a/script/utils/ExistingDeploymentParser.sol +++ b/script/utils/ExistingDeploymentParser.sol @@ -185,7 +185,7 @@ contract ExistingDeploymentParser is Script, Logger { /// @notice use for parsing already deployed EigenLayer contracts function _parseDeployedContracts( string memory existingDeploymentInfoPath - ) internal virtual { + ) internal noTracing virtual { // read and log the chainID uint256 currentChainId = block.chainid; console.log("You are parsing on ChainID", currentChainId); @@ -663,7 +663,7 @@ contract ExistingDeploymentParser is Script, Logger { /// @notice used for parsing parameters used in the integration test upgrade function _parseParamsForIntegrationUpgrade( string memory initialDeploymentParamsPath - ) internal virtual { + ) internal noTracing virtual { // read and log the chainID uint256 currentChainId = block.chainid; console.log("You are parsing on ChainID", currentChainId); diff --git a/src/test/integration/IntegrationBase.t.sol b/src/test/integration/IntegrationBase.t.sol index cceccdd67e..95910a00e2 100644 --- a/src/test/integration/IntegrationBase.t.sol +++ b/src/test/integration/IntegrationBase.t.sol @@ -9,12 +9,13 @@ import "@openzeppelin/contracts/utils/Strings.sol"; import "src/contracts/libraries/BeaconChainProofs.sol"; import "src/contracts/libraries/SlashingLib.sol"; +import "src/test/integration/TypeImporter.t.sol"; import "src/test/integration/IntegrationDeployer.t.sol"; import "src/test/integration/TimeMachine.t.sol"; import "src/test/integration/users/User.t.sol"; import "src/test/integration/users/User_M1.t.sol"; -abstract contract IntegrationBase is IntegrationDeployer { +abstract contract IntegrationBase is IntegrationDeployer, TypeImporter { using StdStyle for *; using SlashingLib for *; using Strings for *; @@ -103,7 +104,7 @@ abstract contract IntegrationBase is IntegrationDeployer { operator.depositIntoEigenlayer(strategies, tokenBalances); // Roll past the allocation configuration delay - rollForward({blocks: ALLOCATION_CONFIGURATION_DELAY}); + rollForward({blocks: ALLOCATION_CONFIGURATION_DELAY + 1}); assert_Snap_Added_Staker_DepositShares(operator, strategies, addedShares, "_newRandomOperator: failed to add delegatable shares"); } @@ -115,6 +116,34 @@ abstract contract IntegrationBase is IntegrationDeployer { return (operator, strategies, tokenBalances); } + /// @dev Creates a new operator with no assets + function _newRandomOperator_NoAssets() internal returns (User) { + User operator; + + if (!isUpgraded) { + string memory operatorName = string.concat("M2Operator", numOperators.toString()); + + // Create an operator for M2. + operator = _randUser_NoAssets(operatorName); + User_M2(payable(operator)).registerAsOperator_M2(); + + operatorsToMigrate.push(operator); + } else { + string memory operatorName = string.concat("operator", numOperators.toString()); + + operator = _randUser_NoAssets(operatorName); + operator.registerAsOperator(); + + // Roll past the allocation configuration delay + rollForward({blocks: ALLOCATION_CONFIGURATION_DELAY + 1}); + } + + assertTrue(delegationManager.isOperator(address(operator)), "_newRandomOperator: operator should be registered"); + + numOperators++; + return operator; + } + function _newRandomAVS() internal returns (AVS avs, OperatorSet[] memory operatorSets) { string memory avsName = string.concat("avs", numAVSs.toString()); avs = _genRandAVS(avsName); @@ -251,179 +280,766 @@ abstract contract IntegrationBase is IntegrationDeployer { } function assert_ValidWithdrawalHashes( - IDelegationManagerTypes.Withdrawal[] memory withdrawals, + Withdrawal[] memory withdrawals, bytes32[] memory withdrawalRoots, string memory err - ) internal view { - for (uint i = 0; i < withdrawals.length; i++) { - assert_ValidWithdrawalHash(withdrawals[i], withdrawalRoots[i], err); + ) internal view { + for (uint i = 0; i < withdrawals.length; i++) { + assert_ValidWithdrawalHash(withdrawals[i], withdrawalRoots[i], err); + } + } + + function assert_ValidWithdrawalHash( + Withdrawal memory withdrawal, + bytes32 withdrawalRoot, + string memory err + ) internal view { + assertEq(withdrawalRoot, delegationManager.calculateWithdrawalRoot(withdrawal), err); + } + + function assert_PodBalance_Eq( + User staker, + uint expectedBalance, + string memory err + ) internal view { + EigenPod pod = staker.pod(); + assertEq(address(pod).balance, expectedBalance, err); + } + + function assert_ProofsRemainingEqualsActive( + User staker, + string memory err + ) internal view { + EigenPod pod = staker.pod(); + assertEq(pod.currentCheckpoint().proofsRemaining, pod.activeValidatorCount(), err); + } + + function assert_CheckpointPodBalance( + User staker, + uint64 expectedPodBalanceGwei, + string memory err + ) internal view { + EigenPod pod = staker.pod(); + assertEq(pod.currentCheckpoint().podBalanceGwei, expectedPodBalanceGwei, err); + } + + function assert_MaxEqualsAllocatablePlusEncumbered( + User operator, + string memory err + ) internal view { + Magnitudes[] memory mags = _getMagnitudes(operator, allStrats); + + for (uint i = 0; i < allStrats.length; i++) { + Magnitudes memory m = mags[i]; + assertEq(m.max, m.encumbered + m.allocatable, err); + } + } + + function assert_CurMinSlashableEqualsMinAllocated( + User operator, + OperatorSet memory operatorSet, + IStrategy[] memory strategies, + string memory err + ) internal view { + uint[] memory minSlashableStake = _getMinSlashableStake(operator, operatorSet, strategies); + uint[] memory minAllocatedStake = _getAllocatedStake(operator, operatorSet, strategies); + + for (uint i = 0; i < strategies.length; i++) { + assertEq(minSlashableStake[i], minAllocatedStake[i], err); + } + } + + function assert_MaxMagsEqualMaxMagsAtCurrentBlock( + User operator, + IStrategy[] memory strategies, + string memory err + ) internal view { + uint64[] memory maxMagnitudes = _getMaxMagnitudes(operator, strategies); + uint64[] memory maxAtCurrentBlock = _getMaxMagnitudes(operator, strategies, uint32(block.number)); + + for (uint i = 0; i < strategies.length; i++) { + assertEq(maxMagnitudes[i], maxAtCurrentBlock[i], err); + } + } + + function assert_CurrentMagnitude( + User operator, + AllocateParams memory params, + string memory err + ) internal view { + Allocation[] memory allocations = _getAllocations(operator, params.operatorSet, params.strategies); + + for (uint i = 0; i < allocations.length; i++) { + assertEq(allocations[i].currentMagnitude, params.newMagnitudes[i], err); + } + } + + function assert_NoPendingModification( + User operator, + OperatorSet memory operatorSet, + IStrategy[] memory strategies, + string memory err + ) internal view { + Allocation[] memory allocations = _getAllocations(operator, operatorSet, strategies); + + for (uint i = 0; i < allocations.length; i++) { + assertEq(0, allocations[i].effectBlock, err); + } + } + + function assert_HasPendingIncrease( + User operator, + AllocateParams memory params, + string memory err + ) internal view { + uint32 delay = _getExistingAllocationDelay(operator); + Allocation[] memory allocations = _getAllocations(operator, params.operatorSet, params.strategies); + + for (uint i = 0; i < allocations.length; i++) { + assertEq(allocations[i].effectBlock, uint32(block.number) + delay, err); + assertTrue(allocations[i].currentMagnitude != params.newMagnitudes[i], err); + assertGt(allocations[i].pendingDiff, 0, err); + } + } + + function assert_HasPendingDecrease( + User operator, + AllocateParams memory params, + string memory err + ) internal view { + uint32 deallocationDelay = allocationManager.DEALLOCATION_DELAY(); + Allocation[] memory allocations = _getAllocations(operator, params.operatorSet, params.strategies); + + for (uint i = 0; i < allocations.length; i++) { + assertEq(allocations[i].effectBlock, uint32(block.number) + deallocationDelay + 1, err); + assertTrue(allocations[i].currentMagnitude != params.newMagnitudes[i], err); + assertLt(allocations[i].pendingDiff, 0, err); + } + } + + function assert_IsRegistered( + User operator, + OperatorSet memory operatorSet, + string memory err + ) internal view { + assertTrue(allocationManager.isMemberOfOperatorSet(address(operator), operatorSet), err); + } + + function assert_IsSlashable( + User operator, + OperatorSet memory operatorSet, + string memory err + ) internal view { + assertTrue(allocationManager.isOperatorSlashable(address(operator), operatorSet), err); + } + + function assert_NotSlashable( + User operator, + OperatorSet memory operatorSet, + string memory err + ) internal view { + assertFalse(allocationManager.isOperatorSlashable(address(operator), operatorSet), err); + } + + function assert_IsAllocatedToSet( + User operator, + OperatorSet memory operatorSet, + string memory err + ) internal view { + assertTrue(allocationManager.getAllocatedSets(address(operator)).contains(operatorSet), err); + } + + function assert_IsNotAllocated( + User operator, + OperatorSet memory operatorSet, + string memory err + ) internal view { + assertEq(allocationManager.getAllocatedStrategies(address(operator), operatorSet).length, 0, err); + } + + function assert_IsAllocatedToSetStrats( + User operator, + OperatorSet memory operatorSet, + IStrategy[] memory strategies, + string memory err + ) internal view { + IStrategy[] memory allocatedStrategies = allocationManager.getAllocatedStrategies(address(operator), operatorSet); + + for (uint i = 0; i < strategies.length; i++) { + assertTrue(allocatedStrategies.contains(strategies[i]), err); + } + } + + function assert_HasAllocatedStake( + User operator, + AllocateParams memory params, + string memory err + ) internal view { + OperatorSet memory operatorSet = params.operatorSet; + IStrategy[] memory strategies = params.strategies; + uint64[] memory curMagnitudes = params.newMagnitudes; + + uint64[] memory maxMagnitudes = _getMaxMagnitudes(operator, params.strategies); + uint[] memory operatorShares = _getOperatorShares(operator, params.strategies); + uint[] memory allocatedStake = _getAllocatedStake(operator, operatorSet, strategies); + + for (uint i = 0; i < strategies.length; i++) { + uint expectedAllocated; + if (maxMagnitudes[i] == 0) { + expectedAllocated = 0; + } else { + uint slashableProportion = uint(curMagnitudes[i]).divWad(maxMagnitudes[i]); + expectedAllocated = operatorShares[i].mulWad(slashableProportion); + } + + assertEq(expectedAllocated, allocatedStake[i], err); + } + } + + function assert_HasSlashableStake( + User operator, + AllocateParams memory params, + string memory err + ) internal view { + OperatorSet memory operatorSet = params.operatorSet; + IStrategy[] memory strategies = params.strategies; + uint64[] memory curMagnitudes = params.newMagnitudes; + + uint64[] memory maxMagnitudes = _getMaxMagnitudes(operator, params.strategies); + uint[] memory operatorShares = _getOperatorShares(operator, params.strategies); + uint[] memory slashableStake = _getMinSlashableStake(operator, operatorSet, strategies); + + for (uint i = 0; i < strategies.length; i++) { + uint expectedSlashable; + if (maxMagnitudes[i] == 0) { + expectedSlashable = 0; + } else { + uint slashableProportion = uint(curMagnitudes[i]).divWad(maxMagnitudes[i]); + expectedSlashable = operatorShares[i].mulWad(slashableProportion); + } + + assertEq(expectedSlashable, slashableStake[i], err); + } + } + + function assert_NoSlashableStake( + User operator, + OperatorSet memory operatorSet, + string memory err + ) internal view { + IStrategy[] memory strategies = allocationManager.getStrategiesInOperatorSet(operatorSet); + uint[] memory slashableStake = _getMinSlashableStake(operator, operatorSet, strategies); + + for (uint i = 0; i < slashableStake.length; i++) { + assertEq(slashableStake[i], 0, err); + } + } + + /******************************************************************************* + SNAPSHOT ASSERTIONS + TIME TRAVELERS ONLY BEYOND THIS POINT + *******************************************************************************/ + + /******************************************************************************* + SNAPSHOT ASSERTIONS: ALLOCATIONS + *******************************************************************************/ + + function assert_Snap_Became_Registered( + User operator, + OperatorSet memory operatorSet, + string memory err + ) internal { + bool curIsMemberOfSet = _getIsMemberOfSet(operator, operatorSet); + bool prevIsMemberOfSet = _getPrevIsMemberOfSet(operator, operatorSet); + + assertFalse(prevIsMemberOfSet, err); + assertTrue(curIsMemberOfSet, err); + } + + function assert_Snap_Became_Deregistered( + User operator, + OperatorSet memory operatorSet, + string memory err + ) internal { + bool curIsMemberOfSet = _getIsMemberOfSet(operator, operatorSet); + bool prevIsMemberOfSet = _getPrevIsMemberOfSet(operator, operatorSet); + + assertTrue(prevIsMemberOfSet, err); + assertFalse(curIsMemberOfSet, err); + } + + function assert_Snap_Unchanged_Registration( + User operator, + OperatorSet memory operatorSet, + string memory err + ) internal { + bool curIsMemberOfSet = _getIsMemberOfSet(operator, operatorSet); + bool prevIsMemberOfSet = _getPrevIsMemberOfSet(operator, operatorSet); + + assertEq(prevIsMemberOfSet, curIsMemberOfSet, err); + } + + function assert_Snap_Became_Slashable( + User operator, + OperatorSet memory operatorSet, + string memory err + ) internal { + bool curIsSlashable = _getIsSlashable(operator, operatorSet); + bool prevIsSlashable = _getPrevIsSlashable(operator, operatorSet); + + assertFalse(prevIsSlashable, err); + assertTrue(curIsSlashable, err); + } + + function assert_Snap_Remains_Slashable( + User operator, + OperatorSet memory operatorSet, + string memory err + ) internal { + bool curIsSlashable = _getIsSlashable(operator, operatorSet); + bool prevIsSlashable = _getPrevIsSlashable(operator, operatorSet); + + assertTrue(prevIsSlashable, err); + assertTrue(curIsSlashable, err); + } + + function assert_Snap_Unchanged_Slashability( + User operator, + OperatorSet memory operatorSet, + string memory err + ) internal { + bool curIsSlashable = _getIsSlashable(operator, operatorSet); + bool prevIsSlashable = _getPrevIsSlashable(operator, operatorSet); + + assertEq(prevIsSlashable, curIsSlashable, err); + } + + function assert_Snap_Unchanged_AllocatedStrats( + User operator, + OperatorSet memory operatorSet, + string memory err + ) internal { + IStrategy[] memory curAllocatedStrats = _getAllocatedStrats(operator, operatorSet); + IStrategy[] memory prevAllocatedStrats = _getPrevAllocatedStrats(operator, operatorSet); + + assertEq(curAllocatedStrats.length, prevAllocatedStrats.length, err); + + for (uint i = 0; i < curAllocatedStrats.length; i++) { + assertEq(address(curAllocatedStrats[i]), address(prevAllocatedStrats[i]), err); + } + } + + function assert_Snap_Unchanged_StrategyAllocations( + User operator, + OperatorSet memory operatorSet, + IStrategy[] memory strategies, + string memory err + ) internal { + Allocation[] memory curAllocations = _getAllocations(operator, operatorSet, strategies); + Allocation[] memory prevAllocations = _getPrevAllocations(operator, operatorSet, strategies); + + for (uint i = 0; i < strategies.length; i++) { + Allocation memory curAllocation = curAllocations[i]; + Allocation memory prevAllocation = prevAllocations[i]; + + assertEq(curAllocation.currentMagnitude, prevAllocation.currentMagnitude, err); + assertEq(curAllocation.pendingDiff, prevAllocation.pendingDiff, err); + assertEq(curAllocation.effectBlock, prevAllocation.effectBlock, err); + } + } + + function assert_Snap_Added_AllocatedSet( + User operator, + OperatorSet memory operatorSet, + string memory err + ) internal { + OperatorSet[] memory curAllocatedSets = _getAllocatedSets(operator); + OperatorSet[] memory prevAllocatedSets = _getPrevAllocatedSets(operator); + + assertEq(curAllocatedSets.length, prevAllocatedSets.length + 1, err); + assertFalse(prevAllocatedSets.contains(operatorSet), err); + assertTrue(curAllocatedSets.contains(operatorSet), err); + } + + function assert_Snap_Unchanged_AllocatedSets( + User operator, + string memory err + ) internal { + OperatorSet[] memory curAllocatedSets = _getAllocatedSets(operator); + OperatorSet[] memory prevAllocatedSets = _getPrevAllocatedSets(operator); + + assertEq(curAllocatedSets.length, prevAllocatedSets.length, err); + } + + function assert_Snap_Removed_AllocatedSet( + User operator, + OperatorSet memory operatorSet, + string memory err + ) internal { + OperatorSet[] memory curAllocatedSets = _getAllocatedSets(operator); + OperatorSet[] memory prevAllocatedSets = _getPrevAllocatedSets(operator); + + assertEq(curAllocatedSets.length + 1, prevAllocatedSets.length, err); + assertTrue(prevAllocatedSets.contains(operatorSet), err); + assertFalse(curAllocatedSets.contains(operatorSet), err); + } + + function assert_Snap_Added_RegisteredSet( + User operator, + OperatorSet memory operatorSet, + string memory err + ) internal { + OperatorSet[] memory curRegisteredSets = _getRegisteredSets(operator); + OperatorSet[] memory prevRegisteredSets = _getPrevRegisteredSets(operator); + + assertEq(curRegisteredSets.length, prevRegisteredSets.length + 1, err); + assertFalse(prevRegisteredSets.contains(operatorSet), err); + assertTrue(curRegisteredSets.contains(operatorSet), err); + } + + function assert_Snap_Removed_RegisteredSet( + User operator, + OperatorSet memory operatorSet, + string memory err + ) internal { + OperatorSet[] memory curRegisteredSets = _getRegisteredSets(operator); + OperatorSet[] memory prevRegisteredSets = _getPrevRegisteredSets(operator); + + assertEq(curRegisteredSets.length + 1, prevRegisteredSets.length, err); + assertTrue(prevRegisteredSets.contains(operatorSet), err); + assertFalse(curRegisteredSets.contains(operatorSet), err); + } + + function assert_Snap_Unchanged_RegisteredSet( + User operator, + string memory err + ) internal { + OperatorSet[] memory curRegisteredSets = _getRegisteredSets(operator); + OperatorSet[] memory prevRegisteredSets = _getPrevRegisteredSets(operator); + + assertEq(curRegisteredSets.length, prevRegisteredSets.length, err); + for (uint i = 0; i < curRegisteredSets.length; i++) { + assertEq(curRegisteredSets[i].avs, prevRegisteredSets[i].avs, err); + assertEq(curRegisteredSets[i].id, prevRegisteredSets[i].id, err); + } + } + + function assert_Snap_Added_MemberOfSet( + User operator, + OperatorSet memory operatorSet, + string memory err + ) internal { + address[] memory curOperators = _getMembers(operatorSet); + address[] memory prevOperators = _getPrevMembers(operatorSet); + + assertEq(curOperators.length, prevOperators.length + 1, err); + assertFalse(prevOperators.contains(address(operator)), err); + assertTrue(curOperators.contains(address(operator)), err); + } + + function assert_Snap_Removed_MemberOfSet( + User operator, + OperatorSet memory operatorSet, + string memory err + ) internal { + address[] memory curOperators = _getMembers(operatorSet); + address[] memory prevOperators = _getPrevMembers(operatorSet); + + assertEq(curOperators.length + 1, prevOperators.length, err); + assertTrue(prevOperators.contains(address(operator)), err); + assertFalse(curOperators.contains(address(operator)), err); + } + + function assert_Snap_Unchanged_MemberOfSet( + OperatorSet memory operatorSet, + string memory err + ) internal { + address[] memory curOperators = _getMembers(operatorSet); + address[] memory prevOperators = _getPrevMembers(operatorSet); + + assertEq(curOperators.length, prevOperators.length, err); + for (uint i = 0; i < curOperators.length; i++) { + assertEq(curOperators[i], prevOperators[i], err); + } + } + + function assert_Snap_StakeBecameSlashable( + User operator, + OperatorSet memory operatorSet, + IStrategy[] memory strategies, + string memory err + ) internal { + uint[] memory curSlashableStake = _getMinSlashableStake(operator, operatorSet, strategies); + uint[] memory prevSlashableStake = _getPrevMinSlashableStake(operator, operatorSet, strategies); + + for (uint i = 0; i < strategies.length; i++) { + assertTrue(prevSlashableStake[i] < curSlashableStake[i], err); + } + } + + function assert_Snap_StakeBecomeUnslashable( + User operator, + OperatorSet memory operatorSet, + IStrategy[] memory strategies, + string memory err + ) internal { + uint[] memory curSlashableStake = _getMinSlashableStake(operator, operatorSet, strategies); + uint[] memory prevSlashableStake = _getPrevMinSlashableStake(operator, operatorSet, strategies); + + for (uint i = 0; i < strategies.length; i++) { + assertTrue(prevSlashableStake[i] > curSlashableStake[i], err); + } + } + + function assert_Snap_Added_SlashableStake( + User operator, + OperatorSet memory operatorSet, + IStrategy[] memory strategies, + uint[] memory slashableShares, + string memory err + ) internal { + uint[] memory curSlashableStake = _getMinSlashableStake(operator, operatorSet, strategies); + uint[] memory prevSlashableStake = _getPrevMinSlashableStake(operator, operatorSet, strategies); + + for (uint i = 0; i < strategies.length; i++) { + assertEq(curSlashableStake[i], prevSlashableStake[i] + slashableShares[i], err); + } + } + + function assert_Snap_Unchanged_SlashableStake( + User operator, + OperatorSet memory operatorSet, + IStrategy[] memory strategies, + string memory err + ) internal { + uint[] memory curSlashableStake = _getMinSlashableStake(operator, operatorSet, strategies); + uint[] memory prevSlashableStake = _getPrevMinSlashableStake(operator, operatorSet, strategies); + + for (uint i = 0; i < strategies.length; i++) { + assertEq(curSlashableStake[i], prevSlashableStake[i], err); + } + } + + function assert_Snap_Removed_SlashableStake( + User operator, + OperatorSet memory operatorSet, + IStrategy[] memory strategies, + uint[] memory removedSlashableShares, + string memory err + ) internal { + uint[] memory curSlashableStake = _getMinSlashableStake(operator, operatorSet, strategies); + uint[] memory prevSlashableStake = _getPrevMinSlashableStake(operator, operatorSet, strategies); + + for (uint i = 0; i < strategies.length; i++) { + assertEq(curSlashableStake[i] + removedSlashableShares[i], prevSlashableStake[i], err); + } + } + + function assert_Snap_StakeBecameAllocated( + User operator, + OperatorSet memory operatorSet, + IStrategy[] memory strategies, + string memory err + ) internal { + uint[] memory curMinAllocatedStake = _getAllocatedStake(operator, operatorSet, strategies); + uint[] memory prevMinAllocatedStake = _getPrevAllocatedStake(operator, operatorSet, strategies); + + for (uint i = 0; i < strategies.length; i++) { + assertGt(curMinAllocatedStake[i], prevMinAllocatedStake[i], err); + } + } + + function assert_Snap_StakeBecameDeallocated( + User operator, + OperatorSet memory operatorSet, + IStrategy[] memory strategies, + string memory err + ) internal { + uint[] memory curMinAllocatedStake = _getAllocatedStake(operator, operatorSet, strategies); + uint[] memory prevMinAllocatedStake = _getPrevAllocatedStake(operator, operatorSet, strategies); + + for (uint i = 0; i < strategies.length; i++) { + assertLt(curMinAllocatedStake[i], prevMinAllocatedStake[i], err); + } + } + + function assert_Snap_Unchanged_AllocatedStake( + User operator, + OperatorSet memory operatorSet, + IStrategy[] memory strategies, + string memory err + ) internal { + uint[] memory curAllocatedStake = _getAllocatedStake(operator, operatorSet, strategies); + uint[] memory prevAllocatedStake = _getPrevAllocatedStake(operator, operatorSet, strategies); + + for (uint i = 0; i < curAllocatedStake.length; i++) { + assertEq(curAllocatedStake[i], prevAllocatedStake[i], err); } } - function assert_ValidWithdrawalHash( - IDelegationManagerTypes.Withdrawal memory withdrawal, - bytes32 withdrawalRoot, + function assert_Snap_Added_EncumberedMagnitude( + User operator, + IStrategy[] memory strategies, + uint64[] memory magnitudeAdded, string memory err - ) internal view { - assertEq(withdrawalRoot, delegationManager.calculateWithdrawalRoot(withdrawal), err); + ) internal { + Magnitudes[] memory curMagnitudes = _getMagnitudes(operator, strategies); + Magnitudes[] memory prevMagnitudes = _getPrevMagnitudes(operator, strategies); + + for (uint i = 0; i < strategies.length; i++) { + assertEq(curMagnitudes[i].encumbered, prevMagnitudes[i].encumbered + magnitudeAdded[i], err); + } } - function assert_PodBalance_Eq( - User staker, - uint expectedBalance, + function assert_Snap_Unchanged_EncumberedMagnitude( + User operator, + IStrategy[] memory strategies, string memory err - ) internal view { - EigenPod pod = staker.pod(); - assertEq(address(pod).balance, expectedBalance, err); + ) internal { + Magnitudes[] memory curMagnitudes = _getMagnitudes(operator, strategies); + Magnitudes[] memory prevMagnitudes = _getPrevMagnitudes(operator, strategies); + + for (uint i = 0; i < strategies.length; i++) { + assertEq(curMagnitudes[i].encumbered, prevMagnitudes[i].encumbered, err); + } } - function assert_ProofsRemainingEqualsActive( - User staker, + function assert_Snap_Removed_EncumberedMagnitude( + User operator, + IStrategy[] memory strategies, + uint64[] memory magnitudeRemoved, string memory err - ) internal view { - EigenPod pod = staker.pod(); - assertEq(pod.currentCheckpoint().proofsRemaining, pod.activeValidatorCount(), err); + ) internal { + Magnitudes[] memory curMagnitudes = _getMagnitudes(operator, strategies); + Magnitudes[] memory prevMagnitudes = _getPrevMagnitudes(operator, strategies); + + for (uint i = 0; i < strategies.length; i++) { + assertEq(curMagnitudes[i].encumbered + magnitudeRemoved[i], prevMagnitudes[i].encumbered, err); + } } - function assert_CheckpointPodBalance( - User staker, - uint64 expectedPodBalanceGwei, + function assert_Snap_Added_AllocatableMagnitude( + User operator, + IStrategy[] memory strategies, + uint64[] memory magnitudeFreed, string memory err - ) internal view { - EigenPod pod = staker.pod(); - assertEq(pod.currentCheckpoint().podBalanceGwei, expectedPodBalanceGwei, err); - } - - /******************************************************************************* - SNAPSHOT ASSERTIONS - TIME TRAVELERS ONLY BEYOND THIS POINT - *******************************************************************************/ + ) internal { + Magnitudes[] memory curMagnitudes = _getMagnitudes(operator, strategies); + Magnitudes[] memory prevMagnitudes = _getPrevMagnitudes(operator, strategies); - /******************************************************************************* - SNAPSHOT ASSERTIONS: ALLOCATIONS - *******************************************************************************/ + for (uint i = 0; i < strategies.length; i++) { + assertEq(curMagnitudes[i].allocatable, prevMagnitudes[i].allocatable + magnitudeFreed[i], err); + } + } - function assert_Snap_Allocations_Modified( + function assert_Snap_Unchanged_AllocatableMagnitude( User operator, - IAllocationManagerTypes.AllocateParams memory allocateParams, - bool completed, + IStrategy[] memory strategies, string memory err ) internal { - IAllocationManagerTypes.Allocation[] memory curAllocs = _getAllocations(operator, allocateParams.operatorSet, allocateParams.strategies); - IAllocationManagerTypes.Allocation[] memory prevAllocs = _getPrevAllocations(operator, allocateParams.operatorSet, allocateParams.strategies); - Magnitudes[] memory curMagnitudes = _getMagnitudes(operator, allocateParams.strategies); - Magnitudes[] memory prevMagnitudes = _getPrevMagnitudes(operator, allocateParams.strategies); + Magnitudes[] memory curMagnitudes = _getMagnitudes(operator, strategies); + Magnitudes[] memory prevMagnitudes = _getPrevMagnitudes(operator, strategies); - for (uint i = 0; i < allocateParams.strategies.length; i++) { - IAllocationManagerTypes.Allocation memory curAlloc = curAllocs[i]; - IAllocationManagerTypes.Allocation memory prevAlloc = prevAllocs[i]; - - // Check allocations - if (completed) { - assertEq(curAlloc.currentMagnitude, allocateParams.newMagnitudes[i], string.concat(err, " (currentMagnitude)")); - assertEq(curAlloc.pendingDiff, 0, string.concat(err, " (pendingDiff)")); - assertEq(curAlloc.effectBlock, 0, string.concat(err, " (effectBlock)")); - } else { - assertEq( - curAlloc.currentMagnitude, - prevAlloc.currentMagnitude, - string.concat(err, " (currentMagnitude)") - ); - assertEq( - curAlloc.pendingDiff, - prevAlloc.pendingDiff + int128(int64(allocateParams.newMagnitudes[i])), - string.concat(err, " (pendingDiff)") - ); + for (uint i = 0; i < strategies.length; i++) { + assertEq(curMagnitudes[i].allocatable, prevMagnitudes[i].allocatable, err); + } + } - (, uint32 delay) = allocationManager.getAllocationDelay(address(operator)); + function assert_Snap_Removed_AllocatableMagnitude( + User operator, + IStrategy[] memory strategies, + uint64[] memory magnitudeAllocated, + string memory err + ) internal { + Magnitudes[] memory curMagnitudes = _getMagnitudes(operator, strategies); + Magnitudes[] memory prevMagnitudes = _getPrevMagnitudes(operator, strategies); - assertEq( - curAlloc.effectBlock, - block.number + delay, - string.concat(err, " (effectBlock)") - ); - } + for (uint i = 0; i < strategies.length; i++) { + assertEq(curMagnitudes[i].allocatable, prevMagnitudes[i].allocatable - magnitudeAllocated[i], err); + } + } - // Check magnitudes - Magnitudes memory curMagnitude = curMagnitudes[i]; - Magnitudes memory prevMagnitude = prevMagnitudes[i]; + function assert_Snap_Allocated_Magnitude( + User operator, + IStrategy[] memory strategies, + string memory err + ) internal { + Magnitudes[] memory curMagnitudes = _getMagnitudes(operator, strategies); + Magnitudes[] memory prevMagnitudes = _getPrevMagnitudes(operator, strategies); - // if (isAllocation) ... - if (prevAlloc.currentMagnitude < allocateParams.newMagnitudes[i]) { - uint256 delta = allocateParams.newMagnitudes[i] - prevAlloc.currentMagnitude; - - // FIXME: Fails on `testFuzz_deposit_delegate_allocate` when completed == true. - if (!completed) { - assertEq( - curMagnitude.encumbered, - prevMagnitude.encumbered + delta, - string.concat(err, " (encumbered magnitude)") - ); + /// Check: + /// allocatable increased + /// encumbered decreased + for (uint i = 0; i < strategies.length; i++) { + assertLt(curMagnitudes[i].allocatable, prevMagnitudes[i].allocatable, err); + assertGt(curMagnitudes[i].encumbered, prevMagnitudes[i].encumbered, err); + } + } - assertEq( - curMagnitude.allocatable, - prevMagnitude.allocatable - delta, - string.concat(err, " (allocatable magnitude)") - ); - } - } else { - uint256 delta = prevAlloc.currentMagnitude - allocateParams.newMagnitudes[i]; + function assert_Snap_Deallocated_Magnitude( + User operator, + IStrategy[] memory strategies, + string memory err + ) internal { + Magnitudes[] memory curMagnitudes = _getMagnitudes(operator, strategies); + Magnitudes[] memory prevMagnitudes = _getPrevMagnitudes(operator, strategies); - // if deallocated, and completed - if (completed) { - assertEq( - curMagnitude.encumbered - delta, - prevMagnitude.encumbered, - string.concat(err, " (encumbered magnitude)") - ); + /// Check: + /// allocatable increased + /// encumbered decreased + for (uint i = 0; i < strategies.length; i++) { + assertGt(curMagnitudes[i].allocatable, prevMagnitudes[i].allocatable, err); + assertLt(curMagnitudes[i].encumbered, prevMagnitudes[i].encumbered, err); + } + } - assertEq( - curMagnitude.allocatable, - prevMagnitude.allocatable + delta, - string.concat(err, " (allocatable magnitude)") - ); - } else { - assertEq( - curMagnitude.encumbered, - prevMagnitude.encumbered, - string.concat(err, " (encumbered magnitude)") - ); + function assert_Snap_Set_CurrentMagnitude( + User operator, + AllocateParams memory params, + string memory err + ) internal { + Allocation[] memory curAllocations = _getAllocations(operator, params.operatorSet, params.strategies); + Allocation[] memory prevAllocations = _getPrevAllocations(operator, params.operatorSet, params.strategies); + + /// Prev allocation.currentMagnitude should NOT equal newly-set magnitude + /// Cur allocation.currentMagnitude SHOULD + for (uint i = 0; i < params.strategies.length; i++) { + assertTrue(prevAllocations[i].currentMagnitude != params.newMagnitudes[i], err); + assertEq(curAllocations[i].currentMagnitude, params.newMagnitudes[i], err); + } + } - assertEq( - curMagnitude.allocatable, - prevMagnitude.allocatable, - string.concat(err, " (allocatable magnitude)") - ); - } - } + function assert_Snap_Unchanged_MaxMagnitude( + User operator, + IStrategy[] memory strategies, + string memory err + ) internal { + Magnitudes[] memory curMagnitudes = _getMagnitudes(operator, strategies); + Magnitudes[] memory prevMagnitudes = _getPrevMagnitudes(operator, strategies); - // Max magnitude should not have mutated. - assertEq( - curMagnitude.max, - prevMagnitude.max, - string.concat(err, " (max magnitude)") - ); + for (uint i = 0; i < strategies.length; i++) { + assertEq(curMagnitudes[i].max, prevMagnitudes[i].max, err); } } function assert_Snap_Allocations_Slashed( - IAllocationManagerTypes.SlashingParams memory slashingParams, + SlashingParams memory slashingParams, OperatorSet memory operatorSet, bool completed, string memory err ) internal { User op = User(payable(slashingParams.operator)); - IAllocationManagerTypes.Allocation[] memory curAllocs = _getAllocations(op, operatorSet, slashingParams.strategies); - IAllocationManagerTypes.Allocation[] memory prevAllocs = _getPrevAllocations(op, operatorSet, slashingParams.strategies); + Allocation[] memory curAllocs = _getAllocations(op, operatorSet, slashingParams.strategies); + Allocation[] memory prevAllocs = _getPrevAllocations(op, operatorSet, slashingParams.strategies); Magnitudes[] memory curMagnitudes = _getMagnitudes(op, slashingParams.strategies); Magnitudes[] memory prevMagnitudes = _getPrevMagnitudes(op, slashingParams.strategies); - (, uint32 delay) = allocationManager.getAllocationDelay(slashingParams.operator); + uint32 delay = _getExistingAllocationDelay(User(payable(slashingParams.operator))); for (uint i = 0; i < slashingParams.strategies.length; i++) { - IAllocationManagerTypes.Allocation memory curAlloc = curAllocs[i]; - IAllocationManagerTypes.Allocation memory prevAlloc = prevAllocs[i]; + Allocation memory curAlloc = curAllocs[i]; + Allocation memory prevAlloc = prevAllocs[i]; uint64 slashedMagnitude = uint64(uint256(prevAlloc.currentMagnitude).mulWadRoundUp(slashingParams.wadsToSlash[i])); @@ -491,8 +1107,8 @@ abstract contract IntegrationBase is IntegrationDeployer { function assert_HasUnderlyingTokenBalances_AfterSlash( User staker, - IAllocationManagerTypes.AllocateParams memory allocateParams, - IAllocationManagerTypes.SlashingParams memory slashingParams, + AllocateParams memory allocateParams, + SlashingParams memory slashingParams, uint[] memory expectedBalances, string memory err ) internal view { @@ -518,8 +1134,8 @@ abstract contract IntegrationBase is IntegrationDeployer { function assert_Snap_StakerWithdrawableShares_AfterSlash( User staker, - IAllocationManagerTypes.AllocateParams memory allocateParams, - IAllocationManagerTypes.SlashingParams memory slashingParams, + AllocateParams memory allocateParams, + SlashingParams memory slashingParams, string memory err ) internal { uint[] memory curShares = _getWithdrawableShares(staker, allocateParams.strategies); @@ -912,7 +1528,7 @@ abstract contract IntegrationBase is IntegrationDeployer { function assert_Snap_Added_QueuedWithdrawals( User staker, - IDelegationManagerTypes.Withdrawal[] memory withdrawals, + Withdrawal[] memory withdrawals, string memory err ) internal { uint curQueuedWithdrawals = _getCumulativeWithdrawals(staker); @@ -924,7 +1540,7 @@ abstract contract IntegrationBase is IntegrationDeployer { function assert_Snap_Added_QueuedWithdrawal( User staker, - IDelegationManagerTypes.Withdrawal memory /*withdrawal*/, + Withdrawal memory /*withdrawal*/, string memory err ) internal { uint curQueuedWithdrawal = _getCumulativeWithdrawals(staker); @@ -977,12 +1593,12 @@ abstract contract IntegrationBase is IntegrationDeployer { ) internal { bytes32[] memory pubkeyHashes = beaconChain.getPubkeyHashes(addedValidators); - IEigenPodTypes.VALIDATOR_STATUS[] memory curStatuses = _getValidatorStatuses(staker, pubkeyHashes); - IEigenPodTypes.VALIDATOR_STATUS[] memory prevStatuses = _getPrevValidatorStatuses(staker, pubkeyHashes); + VALIDATOR_STATUS[] memory curStatuses = _getValidatorStatuses(staker, pubkeyHashes); + VALIDATOR_STATUS[] memory prevStatuses = _getPrevValidatorStatuses(staker, pubkeyHashes); for (uint i = 0; i < curStatuses.length; i++) { - assertTrue(prevStatuses[i] == IEigenPodTypes.VALIDATOR_STATUS.INACTIVE, err); - assertTrue(curStatuses[i] == IEigenPodTypes.VALIDATOR_STATUS.ACTIVE, err); + assertTrue(prevStatuses[i] == VALIDATOR_STATUS.INACTIVE, err); + assertTrue(curStatuses[i] == VALIDATOR_STATUS.ACTIVE, err); } } @@ -993,12 +1609,12 @@ abstract contract IntegrationBase is IntegrationDeployer { ) internal { bytes32[] memory pubkeyHashes = beaconChain.getPubkeyHashes(exitedValidators); - IEigenPodTypes.VALIDATOR_STATUS[] memory curStatuses = _getValidatorStatuses(staker, pubkeyHashes); - IEigenPodTypes.VALIDATOR_STATUS[] memory prevStatuses = _getPrevValidatorStatuses(staker, pubkeyHashes); + VALIDATOR_STATUS[] memory curStatuses = _getValidatorStatuses(staker, pubkeyHashes); + VALIDATOR_STATUS[] memory prevStatuses = _getPrevValidatorStatuses(staker, pubkeyHashes); for (uint i = 0; i < curStatuses.length; i++) { - assertTrue(prevStatuses[i] == IEigenPodTypes.VALIDATOR_STATUS.ACTIVE, err); - assertTrue(curStatuses[i] == IEigenPodTypes.VALIDATOR_STATUS.WITHDRAWN, err); + assertTrue(prevStatuses[i] == VALIDATOR_STATUS.ACTIVE, err); + assertTrue(curStatuses[i] == VALIDATOR_STATUS.WITHDRAWN, err); } } @@ -1093,6 +1709,127 @@ abstract contract IntegrationBase is IntegrationDeployer { UTILITY METHODS *******************************************************************************/ + /// @dev Fetches the opreator's allocation delay; asserts that it is set + function _getExistingAllocationDelay(User operator) internal view returns (uint32) { + (bool isSet, uint32 delay) = allocationManager.getAllocationDelay(address(operator)); + assertTrue(isSet, "_getExistingAllocationDelay: expected allocation delay to be set"); + + return delay; + } + + /// @dev Generate params to allocate all available magnitude to each strategy in the operator set + function _genAllocation_AllAvailable( + User operator, + OperatorSet memory operatorSet + ) internal view returns (AllocateParams memory params) { + return _genAllocation_AllAvailable({ + operator: operator, + operatorSet: operatorSet, + strategies: allocationManager.getStrategiesInOperatorSet(operatorSet) + }); + } + + /// @dev Generate params to allocate all available magnitude to each strategy in the operator set + function _genAllocation_AllAvailable( + User operator, + OperatorSet memory operatorSet, + IStrategy[] memory strategies + ) internal view returns (AllocateParams memory params) { + params.operatorSet = operatorSet; + params.strategies = strategies; + params.newMagnitudes = new uint64[](params.strategies.length); + + for (uint i = 0; i < params.strategies.length; i++) { + IStrategy strategy = params.strategies[i]; + params.newMagnitudes[i] = allocationManager.getMaxMagnitude(address(operator), strategy); + } + } + + /// @dev Gen params to allocate half of available magnitude to each strategy in the operator set + /// returns the params to complete this allocation + function _genAllocation_HalfAvailable( + User operator, + OperatorSet memory operatorSet + ) internal view returns (AllocateParams memory params) { + return _genAllocation_HalfAvailable({ + operator: operator, + operatorSet: operatorSet, + strategies: allocationManager.getStrategiesInOperatorSet(operatorSet) + }); + } + + /// @dev Gen params to allocate half of available magnitude to each strategy in the operator set + /// returns the params to complete this allocation + function _genAllocation_HalfAvailable( + User operator, + OperatorSet memory operatorSet, + IStrategy[] memory strategies + ) internal view returns (AllocateParams memory params) { + params.operatorSet = operatorSet; + params.strategies = strategies; + params.newMagnitudes = new uint64[](params.strategies.length); + + Allocation[] memory allocations = _getAllocations(operator, operatorSet, strategies); + Magnitudes[] memory magnitudes = _getMagnitudes(operator, strategies); + + for (uint i = 0; i < params.strategies.length; i++) { + IStrategy strategy = params.strategies[i]; + uint64 halfAvailable = uint64(magnitudes[i].allocatable) / 2; + params.newMagnitudes[i] = allocations[i].currentMagnitude + halfAvailable; + } + } + + /// @dev Generates params for a half deallocation from all strategies the operator is allocated to in the operator set + function _genDeallocation_HalfRemaining( + User operator, + OperatorSet memory operatorSet + ) internal view returns (AllocateParams memory params) { + return _genDeallocation_HalfRemaining({ + operator: operator, + operatorSet: operatorSet, + strategies: allocationManager.getStrategiesInOperatorSet(operatorSet) + }); + } + + /// @dev Generates params for a half deallocation from all strategies the operator is allocated to in the operator set + function _genDeallocation_HalfRemaining( + User operator, + OperatorSet memory operatorSet, + IStrategy[] memory strategies + ) internal view returns (AllocateParams memory params) { + params.operatorSet = operatorSet; + params.strategies = strategies; + params.newMagnitudes = new uint64[](params.strategies.length); + + for (uint i = 0; i < params.strategies.length; i++) { + IStrategy strategy = params.strategies[i]; + params.newMagnitudes[i] = allocationManager.getEncumberedMagnitude(address(operator), strategy) / 2; + } + } + + /// @dev Generates params for a full deallocation from all strategies the operator is allocated to in the operator set + function _genDeallocation_Full( + User operator, + OperatorSet memory operatorSet + ) internal view returns (AllocateParams memory params) { + return _genDeallocation_Full({ + operator: operator, + operatorSet: operatorSet, + strategies: allocationManager.getStrategiesInOperatorSet(operatorSet) + }); + } + + /// @dev Generates params for a full deallocation from all strategies the operator is allocated to in the operator set + function _genDeallocation_Full( + User operator, + OperatorSet memory operatorSet, + IStrategy[] memory strategies + ) internal view returns (AllocateParams memory params) { + params.operatorSet = operatorSet; + params.strategies = strategies; + params.newMagnitudes = new uint64[](params.strategies.length); + } + function _randWadToSlash() internal returns (uint) { return _randUint({ min: 0.01 ether, max: 1 ether }); } @@ -1143,7 +1880,7 @@ abstract contract IntegrationBase is IntegrationDeployer { strategies = allocationManager.getStrategiesInOperatorSet(operatorSet); // Randomly select a subset of strategies to slash. - uint len = _randUint({ min: 1, max: strategies.length-1 }); + uint len = _randUint({ min: 1, max: strategies.length }); // Update length of strategies array. assembly { @@ -1341,7 +2078,7 @@ abstract contract IntegrationBase is IntegrationDeployer { } function _getWithdrawalHashes( - IDelegationManagerTypes.Withdrawal[] memory withdrawals + Withdrawal[] memory withdrawals ) internal view returns (bytes32[] memory) { bytes32[] memory withdrawalRoots = new bytes32[](withdrawals.length); @@ -1376,7 +2113,7 @@ abstract contract IntegrationBase is IntegrationDeployer { } /// @dev Rolls forward by the minimum withdrawal delay blocks. - function _rollBlocksForCompleteWithdrawals(IDelegationManagerTypes.Withdrawal[] memory withdrawals) internal { + function _rollBlocksForCompleteWithdrawals(Withdrawal[] memory withdrawals) internal { uint256 latest; for (uint i = 0; i < withdrawals.length; ++i) { if (withdrawals[i].startBlock > latest) latest = withdrawals[i].startBlock; @@ -1384,6 +2121,24 @@ abstract contract IntegrationBase is IntegrationDeployer { cheats.roll(latest + delegationManager.minWithdrawalDelayBlocks() + 1); } + function _rollForward_AllocationDelay(User operator) internal { + uint32 delay = _getExistingAllocationDelay(operator); + rollForward(delay); + } + + function _rollBackward_AllocationDelay(User operator) internal { + uint32 delay = _getExistingAllocationDelay(operator); + rollBackward(delay); + } + + function _rollForward_DeallocationDelay() internal { + rollForward(allocationManager.DEALLOCATION_DELAY() + 1); + } + + function _rollBackward_DeallocationDelay() internal { + rollBackward(allocationManager.DEALLOCATION_DELAY() + 1); + } + /// @dev Rolls forward by the default allocation delay blocks. function _rollBlocksForCompleteAllocation( User operator, @@ -1419,7 +2174,7 @@ abstract contract IntegrationBase is IntegrationDeployer { User operator, OperatorSet memory operatorSet, IStrategy[] memory strategies - ) internal timewarp() returns (IAllocationManagerTypes.Allocation[] memory) { + ) internal timewarp() returns (Allocation[] memory) { return _getAllocations(operator, operatorSet, strategies); } @@ -1428,13 +2183,63 @@ abstract contract IntegrationBase is IntegrationDeployer { User operator, OperatorSet memory operatorSet, IStrategy[] memory strategies - ) internal view returns (IAllocationManagerTypes.Allocation[] memory allocations) { - allocations = new IAllocationManagerTypes.Allocation[](strategies.length); + ) internal view returns (Allocation[] memory allocations) { + allocations = new Allocation[](strategies.length); for (uint i = 0; i < strategies.length; ++i) { allocations[i] = allocationManager.getAllocation(address(operator), operatorSet, strategies[i]); } } + function _getPrevAllocatedStrats( + User operator, + OperatorSet memory operatorSet + ) internal timewarp() returns (IStrategy[] memory) { + return _getAllocatedStrats(operator, operatorSet); + } + + function _getAllocatedStrats( + User operator, + OperatorSet memory operatorSet + ) internal view returns (IStrategy[] memory) { + return allocationManager.getAllocatedStrategies(address(operator), operatorSet); + } + + function _getPrevAllocatedSets( + User operator + ) internal timewarp() returns (OperatorSet[] memory) { + return _getAllocatedSets(operator); + } + + function _getAllocatedSets( + User operator + ) internal view returns (OperatorSet[] memory) { + return allocationManager.getAllocatedSets(address(operator)); + } + + function _getPrevRegisteredSets( + User operator + ) internal timewarp() returns (OperatorSet[] memory) { + return _getRegisteredSets(operator); + } + + function _getRegisteredSets( + User operator + ) internal view returns (OperatorSet[] memory) { + return allocationManager.getRegisteredSets(address(operator)); + } + + function _getPrevMembers( + OperatorSet memory operatorSet + ) internal timewarp returns (address[] memory) { + return _getMembers(operatorSet); + } + + function _getMembers( + OperatorSet memory operatorSet + ) internal view returns (address[] memory) { + return allocationManager.getMembers(operatorSet); + } + struct Magnitudes { uint256 encumbered; uint256 allocatable; @@ -1462,6 +2267,90 @@ abstract contract IntegrationBase is IntegrationDeployer { } } + function _getMaxMagnitudes( + User operator, + IStrategy[] memory strategies + ) internal view returns (uint64[] memory) { + return allocationManager.getMaxMagnitudes(address(operator), strategies); + } + + function _getMaxMagnitudes( + User operator, + IStrategy[] memory strategies, + uint32 blockNum + ) internal view returns (uint64[] memory) { + return allocationManager.getMaxMagnitudesAtBlock(address(operator), strategies, blockNum); + } + + function _getPrevMinSlashableStake( + User operator, + OperatorSet memory operatorSet, + IStrategy[] memory strategies + ) internal timewarp() returns (uint[] memory) { + return _getMinSlashableStake(operator, operatorSet, strategies); + } + + function _getMinSlashableStake( + User operator, + OperatorSet memory operatorSet, + IStrategy[] memory strategies + ) internal view returns (uint[] memory) { + return allocationManager.getMinimumSlashableStake({ + operatorSet: operatorSet, + operators: address(operator).toArray(), + strategies: strategies, + futureBlock: uint32(block.number) + })[0]; + } + + function _getPrevAllocatedStake( + User operator, + OperatorSet memory operatorSet, + IStrategy[] memory strategies + ) internal timewarp() returns (uint[] memory) { + return _getAllocatedStake(operator, operatorSet, strategies); + } + + function _getAllocatedStake( + User operator, + OperatorSet memory operatorSet, + IStrategy[] memory strategies + ) internal view returns (uint[] memory) { + return allocationManager.getAllocatedStake({ + operatorSet: operatorSet, + operators: address(operator).toArray(), + strategies: strategies + })[0]; + } + + function _getPrevIsSlashable( + User operator, + OperatorSet memory operatorSet + ) internal timewarp() returns (bool) { + return _getIsSlashable(operator, operatorSet); + } + + function _getIsSlashable( + User operator, + OperatorSet memory operatorSet + ) internal view returns (bool) { + return allocationManager.isOperatorSlashable(address(operator), operatorSet); + } + + function _getPrevIsMemberOfSet( + User operator, + OperatorSet memory operatorSet + ) internal timewarp() returns (bool) { + return _getIsMemberOfSet(operator, operatorSet); + } + + function _getIsMemberOfSet( + User operator, + OperatorSet memory operatorSet + ) internal view returns (bool) { + return allocationManager.isMemberOfOperatorSet(address(operator), operatorSet); + } + /// @dev Uses timewarp modifier to get operator shares at the last snapshot function _getPrevOperatorShares( User operator, @@ -1619,9 +2508,9 @@ abstract contract IntegrationBase is IntegrationDeployer { return _getActiveValidatorCount(staker); } - function _getValidatorStatuses(User staker, bytes32[] memory pubkeyHashes) internal view returns (IEigenPodTypes.VALIDATOR_STATUS[] memory) { + function _getValidatorStatuses(User staker, bytes32[] memory pubkeyHashes) internal view returns (VALIDATOR_STATUS[] memory) { EigenPod pod = staker.pod(); - IEigenPodTypes.VALIDATOR_STATUS[] memory statuses = new IEigenPodTypes.VALIDATOR_STATUS[](pubkeyHashes.length); + VALIDATOR_STATUS[] memory statuses = new VALIDATOR_STATUS[](pubkeyHashes.length); for (uint i = 0; i < statuses.length; i++) { statuses[i] = pod.validatorStatus(pubkeyHashes[i]); @@ -1630,7 +2519,7 @@ abstract contract IntegrationBase is IntegrationDeployer { return statuses; } - function _getPrevValidatorStatuses(User staker, bytes32[] memory pubkeyHashes) internal timewarp() returns (IEigenPodTypes.VALIDATOR_STATUS[] memory) { + function _getPrevValidatorStatuses(User staker, bytes32[] memory pubkeyHashes) internal timewarp() returns (VALIDATOR_STATUS[] memory) { return _getValidatorStatuses(staker, pubkeyHashes); } diff --git a/src/test/integration/IntegrationChecks.t.sol b/src/test/integration/IntegrationChecks.t.sol index 10ed4c758b..a9188c2c04 100644 --- a/src/test/integration/IntegrationChecks.t.sol +++ b/src/test/integration/IntegrationChecks.t.sol @@ -10,6 +10,7 @@ import "src/test/integration/users/User_M2.t.sol"; contract IntegrationCheckUtils is IntegrationBase { using ArrayLib for IStrategy[]; using SlashingLib for *; + using StdStyle for *; /******************************************************************************* EIGENPOD CHECKS @@ -197,7 +198,7 @@ contract IntegrationCheckUtils is IntegrationBase { User operator, IStrategy[] memory strategies, uint[] memory shares, - IDelegationManagerTypes.Withdrawal[] memory withdrawals, + Withdrawal[] memory withdrawals, bytes32[] memory withdrawalRoots ) internal { // The staker will queue one or more withdrawals for the selected strategies and shares @@ -223,7 +224,7 @@ contract IntegrationCheckUtils is IntegrationBase { function check_Undelegate_State( User staker, User operator, - IDelegationManagerTypes.Withdrawal[] memory withdrawals, + Withdrawal[] memory withdrawals, bytes32[] memory withdrawalRoots, IStrategy[] memory strategies, uint[] memory shares @@ -262,7 +263,7 @@ contract IntegrationCheckUtils is IntegrationBase { function check_Withdrawal_AsTokens_State( User staker, User operator, - IDelegationManagerTypes.Withdrawal memory withdrawal, + Withdrawal memory withdrawal, IStrategy[] memory strategies, uint[] memory shares, IERC20[] memory tokens, @@ -287,7 +288,7 @@ contract IntegrationCheckUtils is IntegrationBase { function check_Withdrawal_AsShares_State( User staker, User operator, - IDelegationManagerTypes.Withdrawal memory withdrawal, + Withdrawal memory withdrawal, IStrategy[] memory strategies, uint[] memory shares ) internal { @@ -310,7 +311,7 @@ contract IntegrationCheckUtils is IntegrationBase { function check_Withdrawal_AsShares_Undelegated_State( User staker, User operator, - IDelegationManagerTypes.Withdrawal memory withdrawal, + Withdrawal memory withdrawal, IStrategy[] memory strategies, uint[] memory shares ) internal { @@ -329,17 +330,504 @@ contract IntegrationCheckUtils is IntegrationBase { } /******************************************************************************* - ALLOCATION MANAGER CHECKS + ALM - BASIC INVARIANTS + *******************************************************************************/ + + /// @dev Run a method as if the user's allocation delay had passed + /// When done, reset block number so other tests are not affected + modifier activateAllocation(User operator) { + _rollForward_AllocationDelay(operator); + + _; + + _rollBackward_AllocationDelay(operator); + } + + /// @dev Run a method as if the deallocation delay has passed + /// When done, reset block number so other tests are not affected + modifier activateDeallocation() { + _rollForward_DeallocationDelay(); + + _; + + _rollBackward_DeallocationDelay(); + } + + /// @dev Run a method ONLY IF the operator has a nonzero activation delay + modifier skipIfInstantAlloc(User operator) { + /// Note: if the ALM says the allocation delay is "not set", this will revert + uint32 delay = _getExistingAllocationDelay(operator); + + if (delay != 0) { + _; + } else { + console.log("%s", "skipping checks for operator with allocation delay of 0".italic()); + } + } + + /// @dev Check global max magnitude invariants - these should ALWAYS hold + function check_MaxMag_Invariants( + User operator + ) internal { + assert_MaxMagsEqualMaxMagsAtCurrentBlock(operator, allStrats, "max magnitudes should equal upperlookup at current block"); + assert_MaxEqualsAllocatablePlusEncumbered(operator, "max magnitude should equal encumbered plus allocatable"); + } + + /// @dev Check that the last call to modifyAllocations resulted in a non-pending modification + function check_ActiveModification_State( + User operator, + AllocateParams memory params + ) internal { + OperatorSet memory operatorSet = params.operatorSet; + IStrategy[] memory strategies = params.strategies; + + assert_CurrentMagnitude(operator, params, "current magnitude should match allocate params"); + assert_NoPendingModification(operator, operatorSet, strategies, "there should not be a pending modification for any strategy"); + } + + function check_IsSlashable_State( + User operator, + OperatorSet memory operatorSet, + IStrategy[] memory strategies + ) internal { + assert_IsSlashable(operator, operatorSet, "operator should be slashable for operator set"); + assert_CurMinSlashableEqualsMinAllocated(operator, operatorSet, strategies, "minimum slashable stake should equal allocated stake at current block"); + } + + function check_NotSlashable_State( + User operator, + OperatorSet memory operatorSet + ) internal { + assert_NotSlashable(operator, operatorSet, "operator should not be slashable for operator set"); + assert_NoSlashableStake(operator, operatorSet, "operator should not have any slashable stake"); + } + + /******************************************************************************* + ALM - REGISTRATION *******************************************************************************/ + /// @dev Basic invariants that should hold after EVERY call to `registerForOperatorSets` + /// NOTE: These are only slightly modified from check_Base_Deregistration_State + /// If you add invariants here, consider adding them there (and vice-versa) + function check_Base_Registration_State( + User operator, + OperatorSet memory operatorSet + ) internal { + check_MaxMag_Invariants(operator); + check_IsSlashable_State(operator, operatorSet, allocationManager.getStrategiesInOperatorSet(operatorSet)); + + // Registration SHOULD register the operator, making them slashable and adding them as a member of the set + assert_Snap_Became_Registered(operator, operatorSet, "operator should not have been registered before, and is now registered"); + assert_Snap_Became_Slashable(operator, operatorSet, "operator should not have been slashable before, and is now slashable"); + assert_Snap_Added_RegisteredSet(operator, operatorSet, "should have added operator sets to list of registered sets"); + assert_Snap_Added_MemberOfSet(operator, operatorSet, "should have added operator to list of set members"); + + // Registration should NOT change anything about magnitude, allocations, or allocated sets + assert_Snap_Unchanged_AllocatedSets(operator, "should not have updated allocated sets"); + assert_Snap_Unchanged_AllocatedStrats(operator, operatorSet, "should not have updated allocated strategies"); + assert_Snap_Unchanged_MaxMagnitude(operator, allStrats, "should not have updated max magnitudes in any way"); + assert_Snap_Unchanged_AllocatedStake(operator, operatorSet, allStrats, "should not have updated allocated stake in any way"); + assert_Snap_Unchanged_StrategyAllocations(operator, operatorSet, allStrats, "should not have updated any individual allocations"); + assert_Snap_Unchanged_EncumberedMagnitude(operator, allStrats, "should not have updated encumbered magnitude"); + assert_Snap_Unchanged_AllocatableMagnitude(operator, allStrats, "should not have updated allocatable magnitude"); + } + + // /// @dev Checks invariants for registration for a variety of allocation states + // /// + // function check_Registration_State( + // User operator, + // OperatorSet memory operatorSet, + // IStrategy[] memory unallocated, + // AllocateParams memory pending, + // AllocateParams memory active + // ) internal { + // check_Base_Registration_State(operator, operatorSet); + // } + + /// @dev Check invariants for registerForOperatorSets given a set of strategies + /// for which NO allocation exists (currentMag/pendingDiff are 0) + /// @param unallocated For the given operatorSet, a list of strategies for which NO allocation exists + function check_Registration_State_NoAllocation( + User operator, + OperatorSet memory operatorSet, + IStrategy[] memory unallocated + ) internal { + check_Base_Registration_State(operator, operatorSet); + + /// The operator is NOT allocated, ensure their slashable stake and magnitudes are unchanged + assert_Snap_Unchanged_AllocatedStake(operator, operatorSet, unallocated, "should not have updated allocated stake in any way"); + assert_Snap_Unchanged_SlashableStake(operator, operatorSet, unallocated, "operator should not have increased slashable stake for any given strategy"); + } + + /// @dev Check invariants for registerForOperatorSets AFTER a prior allocation becomes active + /// @param active allocation params to the last call to modifyAllocations + /// + /// ASSUMES: + /// - the effect block for `params` has already passed + /// - params.newMagnitudes does NOT contain any `0` entries + function check_Registration_State_ActiveAllocation( + User operator, + AllocateParams memory active + ) internal { + OperatorSet memory operatorSet = active.operatorSet; + IStrategy[] memory strategies = active.strategies; + + /// Basic registerForOperatorSets invariants + check_Base_Registration_State(operator, operatorSet); + + /// Given an active allocation, check that the allocation is reflected in state + assert_IsAllocatedToSet(operator, operatorSet, "operatorSet should be included in allocatedSets"); + assert_IsAllocatedToSetStrats(operator, operatorSet, strategies, "strategies should be included in allocatedStrategies"); + assert_CurrentMagnitude(operator, active, "queried allocation should equal active allocation"); + + /// Check that additional stake just became slashable + assert_Snap_Unchanged_AllocatedStake(operator, operatorSet, strategies, "should not have updated allocated stake in any way"); + assert_Snap_StakeBecameSlashable(operator, operatorSet, strategies, "registration should make entirety of active allocation slashable"); + } + + /// @dev Check registration invariants. Assumes the operator has a PENDING allocation + /// to the set, but that the allocation's effect block has not yet been reached + function check_Registration_State_PendingAllocation( + User operator, + AllocateParams memory params + ) internal { + OperatorSet memory operatorSet = params.operatorSet; + IStrategy[] memory strategies = params.strategies; + + check_Base_Registration_State(operator, operatorSet); + + assert_IsAllocatedToSet(operator, operatorSet, "operator should be allocated to set, even while pending"); + assert_IsAllocatedToSetStrats(operator, operatorSet, strategies, "strategies should be included in allocatedStrategies"); + + /// Skip pending checks if operator has no allocation delay + uint32 delay = _getExistingAllocationDelay(operator); + if (delay == 0) { + return; + } + + assert_Snap_Unchanged_AllocatedStake(operator, operatorSet, strategies, "should not have updated allocated stake in any way"); + assert_Snap_Unchanged_SlashableStake(operator, operatorSet, allStrats, "operator should not have increased slashable stake"); + } + + /******************************************************************************* + ALM - DEREGISTRATION + *******************************************************************************/ + + /// @dev Basic invariants that should hold after EVERY call to `deregisterFromOperatorSets` + /// NOTE: These are only slightly modified from check_Base_Registration_State + /// If you add invariants here, consider adding them there (and vice-versa) + function check_Base_Deregistration_State( + User operator, + OperatorSet memory operatorSet + ) internal { + check_MaxMag_Invariants(operator); + + // Deregistration SHOULD remove the operator as a member of the set + assert_Snap_Became_Deregistered(operator, operatorSet, "operator should have been registered before, and is now deregistered"); + assert_Snap_Removed_RegisteredSet(operator, operatorSet, "should have removed operator set from list of registered sets"); + assert_Snap_Removed_MemberOfSet(operator, operatorSet, "should have removed operator from list of set members"); + + // Deregistration should NOT change slashability, magnitude, allocations, or allocated sets + assert_Snap_Remains_Slashable(operator, operatorSet, "operator should have been slashable already, and should still be slashable"); + assert_Snap_Unchanged_AllocatedSets(operator, "should not have updated allocated sets"); + assert_Snap_Unchanged_AllocatedStrats(operator, operatorSet, "should not have updated allocated strategies"); + assert_Snap_Unchanged_MaxMagnitude(operator, allStrats, "should not have updated max magnitudes in any way"); + assert_Snap_Unchanged_AllocatedStake(operator, operatorSet, allStrats, "should not have updated allocated stake in any way"); + assert_Snap_Unchanged_StrategyAllocations(operator, operatorSet, allStrats, "should not have updated any individual allocations"); + assert_Snap_Unchanged_EncumberedMagnitude(operator, allStrats, "should not have updated encumbered magnitude"); + assert_Snap_Unchanged_AllocatableMagnitude(operator, allStrats, "should not have updated allocatable magnitude"); + + _rollForward_DeallocationDelay(); + { + check_NotSlashable_State(operator, operatorSet); + } + _rollBackward_DeallocationDelay(); + } + + function check_Deregistration_State_NoAllocation( + User operator, + OperatorSet memory operatorSet + ) internal { + check_Base_Deregistration_State(operator, operatorSet); + + assert_Snap_Unchanged_AllocatedStake(operator, operatorSet, allStrats, "should not have updated allocated stake in any way"); + assert_Snap_Unchanged_SlashableStake(operator, operatorSet, allStrats, "operator should not have increased slashable stake for any given strategy"); + } + + function check_Deregistration_State_ActiveAllocation( + User operator, + OperatorSet memory operatorSet + ) internal { + check_Base_Deregistration_State(operator, operatorSet); + + assert_Snap_Unchanged_AllocatedStake(operator, operatorSet, allStrats, "should not have updated allocated stake in any way"); + assert_Snap_Unchanged_SlashableStake(operator, operatorSet, allStrats, "operator should not have increased slashable stake for any given strategy"); + } + + function check_Deregistration_State_PendingAllocation( + User operator, + OperatorSet memory operatorSet + ) internal { + check_Base_Deregistration_State(operator, operatorSet); + + assert_Snap_Unchanged_AllocatedStake(operator, operatorSet, allStrats, "should not have updated allocated stake in any way"); + assert_Snap_Unchanged_SlashableStake(operator, operatorSet, allStrats, "operator should not have increased slashable stake for any given strategy"); + } + + /******************************************************************************* + ALM - INCREASE ALLOCATION + *******************************************************************************/ + + /// @dev Basic invariants that should hold after all calls to `modifyAllocations` + /// where the input `params` represent an _increase_ in magnitude + function check_Base_IncrAlloc_State( + User operator, + AllocateParams memory params + ) internal { + check_MaxMag_Invariants(operator); + + OperatorSet memory operatorSet = params.operatorSet; + IStrategy[] memory strategies = params.strategies; + uint64[] memory newMagnitudes = params.newMagnitudes; + + // Increasing Allocation should NOT change operator set registration, max magnitude + assert_Snap_Unchanged_Registration(operator, operatorSet, "operator registration status should be unchanged"); + assert_Snap_Unchanged_Slashability(operator, operatorSet, "operator slashability should be unchanged"); + assert_Snap_Unchanged_RegisteredSet(operator, "list of registered sets should remain unchanged"); + assert_Snap_Unchanged_MemberOfSet(operatorSet, "list of set members should remain unchanged"); + assert_Snap_Unchanged_MaxMagnitude(operator, allStrats, "should not have updated max magnitudes in any way"); + + // Increasing Allocation SHOULD consume magnitude and mark the operator as being allocated to the set + assert_IsAllocatedToSet(operator, operatorSet, "operator should be allocated to set"); + assert_IsAllocatedToSetStrats(operator, operatorSet, strategies, "operator should be allocated to strategies for set"); + assert_Snap_Allocated_Magnitude(operator, strategies, "operator should have allocated magnitude"); + } + + /// @dev Invariants for modifyAllocations. Use when: + /// - operator is NOT slashable for this operator set + /// - last call to modifyAllocations created an INCREASE in allocation + function check_IncrAlloc_State_NotSlashable( + User operator, + AllocateParams memory params + ) internal { + check_Base_IncrAlloc_State(operator, params); + check_NotSlashable_State(operator, params.operatorSet); + + /// Run checks on pending allocation, if the operator has a nonzero delay + check_IncrAlloc_State_NotSlashable_Pending(operator, params); + + /// Run checks on active allocation + check_IncrAlloc_State_NotSlashable_Active(operator, params); + } + + /// @dev Invariants for modifyAllocations. Used when: + /// - operator is NOT slashable for this operator set + /// - last call to modifyAllocations created an INCREASE in allocation + /// - effectBlock for the increase HAS NOT been reached + function check_IncrAlloc_State_NotSlashable_Pending( + User operator, + AllocateParams memory params + ) private skipIfInstantAlloc(operator) { + // Validate operator allocation is pending + assert_HasPendingIncrease(operator, params, "params should reflect a pending modification"); + + // Should not have allocated magnitude + assert_Snap_Unchanged_AllocatedStake(operator, params.operatorSet, params.strategies, "should not have updated allocated stake in any way"); + assert_Snap_Unchanged_SlashableStake(operator, params.operatorSet, params.strategies, "should not have updated allocated stake in any way"); + } + + /// @dev Invariants for modifyAllocations. Used when: + /// - operator is NOT slashable for this operator set + /// - last call to modifyAllocations created an INCREASE in allocation + /// - effectBlock for the increase HAS been reached + function check_IncrAlloc_State_NotSlashable_Active( + User operator, + AllocateParams memory params + ) private activateAllocation(operator) { + // Validate allocation is active + check_ActiveModification_State(operator, params); + + // SHOULD set current magnitude and increase allocated stake + assert_Snap_Set_CurrentMagnitude(operator, params, "should have updated the operator's magnitude"); + assert_HasAllocatedStake(operator, params, "operator should have expected allocated stake for each strategy"); + assert_Snap_StakeBecameAllocated(operator, params.operatorSet, params.strategies, "allocated stake should have increased"); + + // Should NOT change slashable stake + assert_Snap_Unchanged_SlashableStake(operator, params.operatorSet, params.strategies, "slashable stake should not be changed"); + } + + /// @dev Invariants for modifyAllocations. Use when: + /// - operator IS slashable for this operator set + /// - last call to modifyAllocations created an INCREASE in allocation + function check_IncrAlloc_State_Slashable( + User operator, + AllocateParams memory params + ) internal { + check_Base_IncrAlloc_State(operator, params); + check_IsSlashable_State(operator, params.operatorSet, params.strategies); + + /// Run checks on pending allocation, if the operator has a nonzero delay + check_IncrAlloc_State_Slashable_Pending(operator, params); + + /// Run checks on active allocation + check_IncrAlloc_State_Slashable_Active(operator, params); + } + + /// @dev Invariants for modifyAllocations. Used when: + /// - operator IS slashable for this operator set + /// - last call to modifyAllocations created an INCREASE in allocation + /// - effectBlock for the increase HAS NOT been reached + function check_IncrAlloc_State_Slashable_Pending( + User operator, + AllocateParams memory params + ) private skipIfInstantAlloc(operator) { + OperatorSet memory operatorSet = params.operatorSet; + IStrategy[] memory strategies = params.strategies; + + // Validate operator has pending allocation and unchanged allocated/slashable stake + assert_HasPendingIncrease(operator, params, "params should reflect a pending modification"); + + // Should not have allocated magnitude + assert_Snap_Unchanged_AllocatedStake(operator, operatorSet, strategies, "should not have updated allocated stake in any way"); + assert_Snap_Unchanged_SlashableStake(operator, operatorSet, strategies, "should not have updated allocated stake in any way"); + } + + /// @dev Invariants for modifyAllocations. Used when: + /// - operator IS slashable for this operator set + /// - last call to modifyAllocations created an INCREASE in allocation + /// - effectBlock for the increase HAS been reached + function check_IncrAlloc_State_Slashable_Active( + User operator, + AllocateParams memory params + ) private activateAllocation(operator) { + // Validate operator does not have a pending modification, and has expected slashable stake + check_ActiveModification_State(operator, params); + + // SHOULD set current magnitude and increase slashable/allocated stake + assert_Snap_Set_CurrentMagnitude(operator, params, "should have updated the operator's magnitude"); + assert_HasAllocatedStake(operator, params, "operator should have expected allocated stake for each strategy"); + assert_HasSlashableStake(operator, params, "operator should have expected slashable stake for each strategy"); + assert_Snap_StakeBecameAllocated(operator, params.operatorSet, params.strategies, "allocated stake should have increased"); + assert_Snap_StakeBecameSlashable(operator, params.operatorSet, params.strategies, "slashable stake should have increased"); + } + + /******************************************************************************* + ALM - DECREASE ALLOCATION + *******************************************************************************/ + + /// @dev Basic invariants that should hold after all calls to `modifyAllocations` + /// where the input `params` represent a decrease in magnitude + function check_Base_DecrAlloc_State( + User operator, + AllocateParams memory params + ) internal { + check_MaxMag_Invariants(operator); + + OperatorSet memory operatorSet = params.operatorSet; + IStrategy[] memory strategies = params.strategies; + uint64[] memory newMagnitudes = params.newMagnitudes; + + // Decreasing Allocation should NOT change operator set registration, max magnitude + assert_Snap_Unchanged_Registration(operator, operatorSet, "operator registration status should be unchanged"); + assert_Snap_Unchanged_Slashability(operator, operatorSet, "operator slashability should be unchanged"); + assert_Snap_Unchanged_RegisteredSet(operator, "list of registered sets should remain unchanged"); + assert_Snap_Unchanged_MemberOfSet(operatorSet, "list of set members should remain unchanged"); + assert_Snap_Unchanged_MaxMagnitude(operator, allStrats, "should not have updated max magnitudes in any way"); + } + + function check_DecrAlloc_State_NotSlashable( + User operator, + AllocateParams memory params + ) internal { + OperatorSet memory operatorSet = params.operatorSet; + IStrategy[] memory strategies = params.strategies; + + check_Base_DecrAlloc_State(operator, params); + check_NotSlashable_State(operator, operatorSet); + check_ActiveModification_State(operator, params); + + // SHOULD set current magnitude and decrease allocated stake + assert_HasAllocatedStake(operator, params, "operator should have expected allocated stake for each strategy"); + assert_Snap_Set_CurrentMagnitude(operator, params, "should have updated the operator's magnitude"); + assert_Snap_StakeBecameDeallocated(operator, operatorSet, strategies, "allocated stake should have increased"); + assert_Snap_Deallocated_Magnitude(operator, strategies, "should have deallocated magnitude"); + } + + function check_DecrAlloc_State_Slashable( + User operator, + AllocateParams memory params + ) internal { + check_Base_DecrAlloc_State(operator, params); + check_IsSlashable_State(operator, params.operatorSet, params.strategies); + + // Run checks on pending deallocation + check_DecrAlloc_State_Slashable_Pending(operator, params); + + // Run checks on active deallocation + check_DecrAlloc_State_Slashable_Active(operator, params); + } + + function check_DecrAlloc_State_Slashable_Pending( + User operator, + AllocateParams memory params + ) private { + // Validate deallocation is pending + assert_HasPendingDecrease(operator, params, "params should reflect a pending modification"); + + // Should NOT have changed allocated magnitude or stake + assert_Snap_Unchanged_EncumberedMagnitude(operator, params.strategies, "should not have changed encumbered magnitude"); + assert_Snap_Unchanged_AllocatableMagnitude(operator, params.strategies, "should not have changed allocatable magnitude"); + assert_Snap_Unchanged_AllocatedSets(operator, "should not have removed operator set from allocated sets"); + assert_Snap_Unchanged_AllocatedStake(operator, params.operatorSet, params.strategies, "should not have updated allocated stake in any way"); + assert_Snap_Unchanged_SlashableStake(operator, params.operatorSet, params.strategies, "should not have updated allocated stake in any way"); + } + + function check_DecrAlloc_State_Slashable_Active( + User operator, + AllocateParams memory params + ) private activateDeallocation() { + OperatorSet memory operatorSet = params.operatorSet; + IStrategy[] memory strategies = params.strategies; + + check_ActiveModification_State(operator, params); + + // SHOULD set current magnitude and decrease allocated stake + assert_Snap_Set_CurrentMagnitude(operator, params, "should have updated the operator's magnitude"); + assert_HasAllocatedStake(operator, params, "operator should have expected allocated stake for each strategy"); + assert_HasSlashableStake(operator, params, "operator should have expected slashable stake for each strategy"); + + assert_Snap_StakeBecomeUnslashable(operator, operatorSet, strategies, "slashable stake should have decreased"); + assert_Snap_StakeBecameDeallocated(operator, params.operatorSet, params.strategies, "allocated stake should have decreased"); + assert_Snap_Deallocated_Magnitude(operator, strategies, "should have deallocated magnitude"); + } + + function check_FullyDeallocated_State( + User operator, + AllocateParams memory allocateParams, + AllocateParams memory deallocateParams + ) internal { + OperatorSet memory operatorSet = allocateParams.operatorSet; + assert_NoSlashableStake(operator, operatorSet, "should not have any slashable stake"); + // TODO - broken; do we want to fix this? + // assert_Snap_Removed_AllocatedSet(operator, operatorSet, "should have removed operator set from allocated sets"); + + // Any instant deallocation + assert_Snap_Removed_EncumberedMagnitude(operator, allocateParams.strategies, allocateParams.newMagnitudes, "should have removed allocation from encumbered magnitude"); + assert_Snap_Added_AllocatableMagnitude(operator, allocateParams.strategies, allocateParams.newMagnitudes, "should have added allocation to allocatable magnitude"); + assert_Snap_Unchanged_MaxMagnitude(operator, allStrats, "max magnitude should not have changed"); + + assert_MaxEqualsAllocatablePlusEncumbered(operator, "max magnitude should equal encumbered plus allocatable"); + check_ActiveModification_State(operator, deallocateParams); + } + // TODO: improvement needed function check_Withdrawal_AsTokens_State_AfterSlash( User staker, User operator, - IDelegationManagerTypes.Withdrawal memory withdrawal, - IAllocationManagerTypes.AllocateParams memory allocateParams, - IAllocationManagerTypes.SlashingParams memory slashingParams, + Withdrawal memory withdrawal, + AllocateParams memory allocateParams, + SlashingParams memory slashingParams, uint[] memory expectedTokens ) internal { IERC20[] memory tokens = new IERC20[](withdrawal.strategies.length); @@ -388,9 +876,9 @@ contract IntegrationCheckUtils is IntegrationBase { function check_Withdrawal_AsShares_State_AfterSlash( User staker, User operator, - IDelegationManagerTypes.Withdrawal memory withdrawal, - IAllocationManagerTypes.AllocateParams memory, // TODO - was this needed? - IAllocationManagerTypes.SlashingParams memory slashingParams + Withdrawal memory withdrawal, + AllocateParams memory allocateParams, // TODO - was this needed? + SlashingParams memory slashingParams ) internal { IERC20[] memory tokens = new IERC20[](withdrawal.strategies.length); diff --git a/src/test/integration/IntegrationDeployer.t.sol b/src/test/integration/IntegrationDeployer.t.sol index f3f758f004..1ef129d89e 100644 --- a/src/test/integration/IntegrationDeployer.t.sol +++ b/src/test/integration/IntegrationDeployer.t.sol @@ -58,6 +58,7 @@ abstract contract IntegrationDeployer is ExistingDeploymentParser { IStrategy[] ethStrats; // only has one strat tbh IStrategy[] allStrats; // just a combination of the above 2 lists IERC20[] allTokens; // `allStrats`, but contains all of the underlying tokens instead + uint maxUniqueAssetsHeld; // If a token is in this mapping, then we will ignore this LST as it causes issues with reading balanceOf mapping(address => bool) public tokensNotTested; @@ -159,7 +160,7 @@ abstract contract IntegrationDeployer is ExistingDeploymentParser { } /// Deploy EigenLayer locally - function _setUpLocal() public virtual { + function _setUpLocal() public noTracing virtual { console.log("Setting up `%s` integration tests:", "LOCAL".yellow().bold()); // Deploy ProxyAdmin @@ -201,6 +202,7 @@ abstract contract IntegrationDeployer is ExistingDeploymentParser { ethStrats.push(BEACONCHAIN_ETH_STRAT); allStrats.push(BEACONCHAIN_ETH_STRAT); allTokens.push(NATIVE_ETH); + maxUniqueAssetsHeld = allStrats.length; // Create time machine and beacon chain. Set block time to beacon chain genesis time BEACON_GENESIS_TIME = GENESIS_TIME_LOCAL; @@ -210,7 +212,7 @@ abstract contract IntegrationDeployer is ExistingDeploymentParser { } /// Parse existing contracts from mainnet - function _setUpMainnet() public virtual { + function _setUpMainnet() public noTracing virtual { console.log("Setting up `%s` integration tests:", "MAINNET_FORK".green().bold()); console.log("RPC:", cheats.rpcUrl("mainnet")); console.log("Block:", mainnetForkBlock); @@ -235,6 +237,8 @@ abstract contract IntegrationDeployer is ExistingDeploymentParser { allStrats.push(strategy); allTokens.push(strategy.underlyingToken()); } + + maxUniqueAssetsHeld = allStrats.length; // Create time machine and mock beacon chain BEACON_GENESIS_TIME = GENESIS_TIME_MAINNET; @@ -279,6 +283,7 @@ abstract contract IntegrationDeployer is ExistingDeploymentParser { ethStrats.push(BEACONCHAIN_ETH_STRAT); allStrats.push(BEACONCHAIN_ETH_STRAT); allTokens.push(NATIVE_ETH); + maxUniqueAssetsHeld = allStrats.length; } function _deployProxies() public { @@ -311,7 +316,7 @@ abstract contract IntegrationDeployer is ExistingDeploymentParser { } /// Deploy an implementation contract for each contract in the system - function _deployImplementations() public { + function _deployImplementations() public noTracing { allocationManagerImplementation = new AllocationManager(delegationManager, eigenLayerPauserReg, permissionController, DEALLOCATION_DELAY, ALLOCATION_CONFIGURATION_DELAY); permissionControllerImplementation = new PermissionController(); delegationManagerImplementation = new DelegationManager(strategyManager, eigenPodManager, allocationManager, eigenLayerPauserReg, permissionController, DELEGATION_MANAGER_MIN_WITHDRAWAL_DELAY_BLOCKS); @@ -345,7 +350,7 @@ abstract contract IntegrationDeployer is ExistingDeploymentParser { // TODO - need to update ExistingDeploymentParser } - function _upgradeProxies() public { + function _upgradeProxies() public noTracing { // DelegationManager eigenLayerProxyAdmin.upgrade( ITransparentUpgradeableProxy(payable(address(delegationManager))), @@ -410,7 +415,7 @@ abstract contract IntegrationDeployer is ExistingDeploymentParser { } } - function _initializeProxies() public { + function _initializeProxies() public noTracing { delegationManager.initialize({ initialOwner: executorMultisig, initialPausedStatus: 0 @@ -452,7 +457,7 @@ abstract contract IntegrationDeployer is ExistingDeploymentParser { uint initialSupply, address owner, bool useFactory - ) internal { + ) internal noTracing { IERC20 underlyingToken = new ERC20PresetFixedSupply(tokenName, tokenSymbol, initialSupply, owner); StrategyBase strategy; @@ -484,7 +489,7 @@ abstract contract IntegrationDeployer is ExistingDeploymentParser { allTokens.push(underlyingToken); } - function _configRand(uint24 _randomSeed, uint _assetTypes, uint _userTypes) private { + function _configRand(uint24 _randomSeed, uint _assetTypes, uint _userTypes) private noTracing { // Using uint24 for the seed type so that if a test fails, it's easier // to manually use the seed to replay the same test. random = _hash(_randomSeed); @@ -499,6 +504,15 @@ abstract contract IntegrationDeployer is ExistingDeploymentParser { assertTrue(assetTypes.length != 0, "_configRand: no asset types selected"); } + function _configAssetAmounts(uint _maxUniqueAssetsHeld) internal { + if (_maxUniqueAssetsHeld > allStrats.length) { + _maxUniqueAssetsHeld = allStrats.length; + } + + maxUniqueAssetsHeld = _maxUniqueAssetsHeld; + require(maxUniqueAssetsHeld != 0, "_configAssetAmounts: invalid 0"); + } + function _configUserTypes(uint _userTypes) internal { userTypes = _bitmapToBytes(_userTypes); assertTrue(userTypes.length != 0, "_configRand: no user types selected"); @@ -511,7 +525,7 @@ abstract contract IntegrationDeployer is ExistingDeploymentParser { */ function _randUser( string memory name - ) internal returns (User, IStrategy[] memory, uint[] memory) { + ) internal noTracing returns (User, IStrategy[] memory, uint[] memory) { // For the new user, select what type of assets they'll have and whether // they'll use `xWithSignature` methods. // @@ -533,7 +547,7 @@ abstract contract IntegrationDeployer is ExistingDeploymentParser { /// @dev Create a new user without native ETH. See _randUser above for standard usage function _randUser_NoETH( string memory name - ) internal returns (User, IStrategy[] memory, uint[] memory) { + ) internal noTracing returns (User, IStrategy[] memory, uint[] memory) { // For the new user, select what type of assets they'll have and whether // they'll use `xWithSignature` methods. // @@ -560,6 +574,23 @@ abstract contract IntegrationDeployer is ExistingDeploymentParser { return (user, strategies, tokenBalances); } + /// @dev Creates a new user without any assets + function _randUser_NoAssets( + string memory name + ) internal noTracing returns (User) { + // For the new user, select what type of assets they'll have and whether + // they'll use `xWithSignature` methods. + // + // The values selected here are in the ranges configured via `_configRand` + uint userType = _randUserType(); + + // Deploy new User contract + User user = _genRandUser(name, userType); + + print.user(name, NO_ASSETS, userType, new IStrategy[](0), new uint[](0)); + return user; + } + function _genRandUser(string memory name, uint userType) internal returns (User user) { // Create User contract based on userType: if (forkType == LOCAL) { @@ -607,7 +638,7 @@ abstract contract IntegrationDeployer is ExistingDeploymentParser { /// `tokenBalances` will contain the user's eth balance /// HOLDS_ALL - `strategies` will contain ALL initialized strategies AND BEACONCHAIN_ETH_STRAT, and /// `tokenBalances` will contain random token/eth balances accordingly - function _dealRandAssets(User user, uint assetType) internal returns (IStrategy[] memory, uint[] memory) { + function _dealRandAssets(User user, uint assetType) internal noTracing returns (IStrategy[] memory, uint[] memory) { IStrategy[] memory strategies; uint[] memory tokenBalances; if (assetType == NO_ASSETS) { @@ -616,7 +647,12 @@ abstract contract IntegrationDeployer is ExistingDeploymentParser { } else if (assetType == HOLDS_LST) { assetType = HOLDS_LST; // Select a random number of assets - uint numAssets = _randUint({min: 1, max: lstStrats.length}); + uint max = lstStrats.length; + if (max > maxUniqueAssetsHeld) { + max = maxUniqueAssetsHeld; + } + uint numAssets = _randUint({min: 1, max: max}); + strategies = new IStrategy[](numAssets); tokenBalances = new uint[](numAssets); @@ -642,7 +678,8 @@ abstract contract IntegrationDeployer is ExistingDeploymentParser { strategies[0] = BEACONCHAIN_ETH_STRAT; tokenBalances[0] = amount; } else if (assetType == HOLDS_ALL || assetType == HOLDS_MAX) { - uint numLSTs = assetType == HOLDS_MAX ? lstStrats.length : 5; + uint randHeld = _randUint({min: 1, max: maxUniqueAssetsHeld-1}); + uint numLSTs = assetType == HOLDS_MAX ? lstStrats.length : randHeld; strategies = new IStrategy[](numLSTs + 1); tokenBalances = new uint[](numLSTs + 1); @@ -739,8 +776,7 @@ abstract contract IntegrationDeployer is ExistingDeploymentParser { for (uint i; i < numOpSets; ++i) { IStrategy[] memory randomStrategies = _shuffle(allStrats); - - uint numStrategies = _randUint({ min: 1, max: allStrats.length }); + uint numStrategies = _randUint({ min: 1, max: maxUniqueAssetsHeld }); // Modify the length of the array in memory (thus ignoring remaining elements). assembly { diff --git a/src/test/integration/TimeMachine.t.sol b/src/test/integration/TimeMachine.t.sol index 506147bfb2..798abcd999 100644 --- a/src/test/integration/TimeMachine.t.sol +++ b/src/test/integration/TimeMachine.t.sol @@ -25,7 +25,7 @@ contract TimeMachine is Test, Logger { // to warp so we don't accidentally prevent our own births. assertTrue(pastExists(), "Global.warpToPast: invalid usage, past does not exist"); uint256 last = lastSnapshot(); - print.method("travelToLast", cheats.toString(last)); + // print.method("travelToLast", cheats.toString(last)); currentSnapshot = createSnapshot(); cheats.revertToState(last); } @@ -33,7 +33,7 @@ contract TimeMachine is Test, Logger { function travel( uint256 snapshot ) public { - print.method("travel", cheats.toString(snapshot)); + // print.method("travel", cheats.toString(snapshot)); cheats.revertToState(snapshot); } diff --git a/src/test/integration/TypeImporter.t.sol b/src/test/integration/TypeImporter.t.sol new file mode 100644 index 0000000000..0364da6f24 --- /dev/null +++ b/src/test/integration/TypeImporter.t.sol @@ -0,0 +1,26 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.27; + +import "src/contracts/interfaces/IAllocationManager.sol"; +import "src/contracts/interfaces/IAVSDirectory.sol"; +import "src/contracts/interfaces/IDelegationManager.sol"; +import "src/contracts/interfaces/IEigenPod.sol"; +import "src/contracts/interfaces/IEigenPodManager.sol"; +import "src/contracts/interfaces/IStrategyManager.sol"; + + +/// @dev A master interface contract that imports types defined in our +/// contract interfaces so they can be used without needing to refer to +/// the interface, e.g: +/// +/// `AllocateParams memory params;` +/// vs +/// `IAllocationManagerTypes.AllocateParams memory params;` +interface TypeImporter is + IAllocationManagerTypes, + IAVSDirectoryTypes, + IDelegationManagerTypes, + IEigenPodManagerTypes, + IEigenPodTypes +{ +} \ No newline at end of file diff --git a/src/test/integration/tests/ALM_Multi.t.sol b/src/test/integration/tests/ALM_Multi.t.sol new file mode 100644 index 0000000000..12c47fd137 --- /dev/null +++ b/src/test/integration/tests/ALM_Multi.t.sol @@ -0,0 +1,431 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.27; + +import "src/test/integration/IntegrationChecks.t.sol"; + +contract Integration_ALM_Multi is IntegrationCheckUtils { + + using StdStyle for *; + + enum Action { + REGISTER, + DEREGISTER, + INCR_ALLOC, + INCR_ALLOC_FULL, + DECR_ALLOC, + DECR_ALLOC_FULL + } + + enum State { + NONE, + REGISTERED, + ALLOCATED, + FULLY_ALLOCATED, + REG_ALLOC, + REG_FULLY_ALLOC + } + + AVS avs; + OperatorSet operatorSet; + + IStrategy[] strategies; + + /// iteration idx -> list of operators in each state + mapping(uint => mapping(State => User[])) operators; + + /// operator -> list of strategies they have delegated assets in + mapping(User => IStrategy[]) allocatedStrats; + /// Last modifyAllocations params made by the operator + mapping(User => AllocateParams) lastModifyParams; + + uint constant NUM_UNIQUE_ASSETS = 3; + uint constant NUM_OPERATORS = 5; + uint constant NUM_ITERATIONS = 20; + + function _init() internal virtual override { + _configAssetAmounts(NUM_UNIQUE_ASSETS); + + (avs,) = _newRandomAVS(); + operatorSet = avs.createOperatorSet(allStrats); + + for (uint i = 0; i < NUM_OPERATORS; i++) { + (User staker, IStrategy[] memory _strategies, uint[] memory initTokenBalances) + = _newRandomStaker(); + + User operator = _newRandomOperator_NoAssets(); + + // 1. Deposit into strategies + staker.depositIntoEigenlayer(_strategies, initTokenBalances); + uint[] memory initDepositShares = _calculateExpectedShares(_strategies, initTokenBalances); + check_Deposit_State(staker, _strategies, initDepositShares); + + // 2. Delegate to operator + staker.delegateTo(operator); + check_Delegation_State(staker, operator, _strategies, initDepositShares); + + allocatedStrats[operator] = _strategies; + // Add operator to NONE state for the 0th iteration + operators[0][State.NONE].push(operator); + } + } + + /// Reduce fuzz runs because this test is thiccc: + /// + /// forge-config: default.fuzz.runs = 10 + /// forge-config: forktest.fuzz.runs = 3 + function test_Multi(uint24 _r) public rand(_r) { + // Do 20 iterations + for (uint i = 1; i <= NUM_ITERATIONS; i++) { + console.log("%s: %d", "iter".green().italic(), i-1); + + _dispatchNone(i); + _dispatchRegistered(i); + _dispatchAllocated(i); + _dispatchFullyAllocated(i); + _dispatchRegAlloc(i); + _dispatchRegFullyAlloc(i); + + // Ensure all pending actions are completed for the next iteration + _rollForward_DeallocationDelay(); + } + } + + /// @dev NONE operators can: + /// [REGISTER, INCR_ALLOC, INCR_ALLOC_FULL] + function _dispatchNone(uint iter) internal { + // Fetch all NONE operators from previous iteration + User[] memory _operators = operators[iter - 1][State.NONE]; + Action[3] memory actions = [ + Action.REGISTER, + Action.INCR_ALLOC, + Action.INCR_ALLOC_FULL + ]; + + if (_operators.length == 0) { + return; + } + + console.log("%s: %d operators", "_dispatchNone".green(), _operators.length); + + for (uint i = 0; i < _operators.length; i++) { + // Get operator and allocated strategies + User operator = _operators[i]; + IStrategy[] memory _strats = allocatedStrats[operator]; + + // Get action + uint aI = _randUint(0, actions.length-1); + Action action = actions[aI]; + + // Process action + if (action == Action.REGISTER) { + operator.registerForOperatorSet(operatorSet); + check_Registration_State_NoAllocation(operator, operatorSet, allStrats); + + operators[iter][State.REGISTERED].push(operator); + } else if (action == Action.INCR_ALLOC) { + AllocateParams memory params = _genAllocation_HalfAvailable(operator, operatorSet, _strats); + operator.modifyAllocations(params); + check_IncrAlloc_State_NotSlashable(operator, params); + + lastModifyParams[operator] = params; + operators[iter][State.ALLOCATED].push(operator); + } else if (action == Action.INCR_ALLOC_FULL) { + AllocateParams memory params = _genAllocation_AllAvailable(operator, operatorSet, _strats); + operator.modifyAllocations(params); + check_IncrAlloc_State_NotSlashable(operator, params); + + lastModifyParams[operator] = params; + operators[iter][State.FULLY_ALLOCATED].push(operator); + } + } + } + + /// @dev REGISTERED operators can: + /// [DEREGISTER, INCR_ALLOC, INCR_ALLOC_FULL] + function _dispatchRegistered(uint iter) internal { + // Fetch all REGISTERED operators from previous iteration + User[] memory _operators = operators[iter - 1][State.REGISTERED]; + Action[3] memory actions = [ + Action.DEREGISTER, + Action.INCR_ALLOC, + Action.INCR_ALLOC_FULL + ]; + + if (_operators.length == 0) { + return; + } + + console.log("%s: %d operators", "_dispatchRegistered".green(), _operators.length); + + for (uint i = 0; i < _operators.length; i++) { + // Get operator + User operator = _operators[i]; + IStrategy[] memory _strats = allocatedStrats[operator]; + + // Get action + uint aI = _randUint(0, actions.length-1); + Action action = actions[aI]; + + // Process action + if (action == Action.DEREGISTER) { + operator.deregisterFromOperatorSet(operatorSet); + check_Deregistration_State_NoAllocation(operator, operatorSet); + + operators[iter][State.NONE].push(operator); + } else if (action == Action.INCR_ALLOC) { + AllocateParams memory params = _genAllocation_HalfAvailable(operator, operatorSet, _strats); + operator.modifyAllocations(params); + check_IncrAlloc_State_Slashable(operator, params); + + lastModifyParams[operator] = params; + operators[iter][State.REG_ALLOC].push(operator); + } else if (action == Action.INCR_ALLOC_FULL) { + AllocateParams memory params = _genAllocation_AllAvailable(operator, operatorSet, _strats); + operator.modifyAllocations(params); + check_IncrAlloc_State_Slashable(operator, params); + // check_FullyAllocated_State(operator, operatorSet, params.strategies); TODO + + lastModifyParams[operator] = params; + operators[iter][State.REG_FULLY_ALLOC].push(operator); + } + } + } + + /// @dev ALLOCATED operators can: + /// [REGISTER, INCR_ALLOC, INCR_ALLOC_FULL, DECR_ALLOC, DECR_ALLOC_FULL] + function _dispatchAllocated(uint iter) internal { + // Fetch all ALLOCATED operators from previous iteration + User[] memory _operators = operators[iter - 1][State.ALLOCATED]; + Action[5] memory actions = [ + Action.REGISTER, + Action.INCR_ALLOC, + Action.INCR_ALLOC_FULL, + Action.DECR_ALLOC, + Action.DECR_ALLOC_FULL + ]; + + if (_operators.length == 0) { + return; + } + + console.log("%s: %d operators", "_dispatchAllocated".green(), _operators.length); + + for (uint i = 0; i < _operators.length; i++) { + // Get operator + User operator = _operators[i]; + IStrategy[] memory _strats = allocatedStrats[operator]; + + // Get action + uint aI = _randUint(0, actions.length-1); + Action action = actions[aI]; + + // Process action + if (action == Action.REGISTER) { + operator.registerForOperatorSet(operatorSet); + check_Registration_State_ActiveAllocation(operator, lastModifyParams[operator]); + + operators[iter][State.REG_ALLOC].push(operator); + } else if (action == Action.INCR_ALLOC) { + AllocateParams memory params = _genAllocation_HalfAvailable(operator, operatorSet, _strats); + operator.modifyAllocations(params); + check_IncrAlloc_State_NotSlashable(operator, params); + + lastModifyParams[operator] = params; + operators[iter][State.ALLOCATED].push(operator); + } else if (action == Action.INCR_ALLOC_FULL) { + AllocateParams memory params = _genAllocation_AllAvailable(operator, operatorSet, _strats); + operator.modifyAllocations(params); + check_IncrAlloc_State_NotSlashable(operator, params); + // check_FullyAllocated_State(operator); TODO + + lastModifyParams[operator] = params; + operators[iter][State.FULLY_ALLOCATED].push(operator); + } else if (action == Action.DECR_ALLOC) { + AllocateParams memory params = _genDeallocation_HalfRemaining(operator, operatorSet, _strats); + operator.modifyAllocations(params); + check_DecrAlloc_State_NotSlashable(operator, params); + + lastModifyParams[operator] = params; + operators[iter][State.ALLOCATED].push(operator); + } else if (action == Action.DECR_ALLOC_FULL) { + AllocateParams memory params = _genDeallocation_Full(operator, operatorSet, _strats); + operator.modifyAllocations(params); + check_DecrAlloc_State_NotSlashable(operator, params); + // check_FullyDeallocated_State(operator); TODO + + lastModifyParams[operator] = params; + operators[iter][State.NONE].push(operator); + } + } + } + + /// @dev FULLY_ALLOCATED operators can: + /// [REGISTER, DECR_ALLOC, DECR_ALLOC_FULL] + function _dispatchFullyAllocated(uint iter) internal { + // Fetch all FULLY_ALLOCATED operators from previous iteration + User[] memory _operators = operators[iter - 1][State.FULLY_ALLOCATED]; + Action[3] memory actions = [ + Action.REGISTER, + Action.DECR_ALLOC, + Action.DECR_ALLOC_FULL + ]; + + if (_operators.length == 0) { + return; + } + + console.log("%s: %d operators", "_dispatchFullyAllocated".green(), _operators.length); + + for (uint i = 0; i < _operators.length; i++) { + // Get operator + User operator = _operators[i]; + IStrategy[] memory _strats = allocatedStrats[operator]; + + // Get action + uint aI = _randUint(0, actions.length-1); + Action action = actions[aI]; + + // Process action + if (action == Action.REGISTER) { + operator.registerForOperatorSet(operatorSet); + check_Registration_State_ActiveAllocation(operator, lastModifyParams[operator]); + + operators[iter][State.REG_FULLY_ALLOC].push(operator); + } else if (action == Action.DECR_ALLOC) { + AllocateParams memory params = _genDeallocation_HalfRemaining(operator, operatorSet, _strats); + operator.modifyAllocations(params); + check_DecrAlloc_State_NotSlashable(operator, params); + + lastModifyParams[operator] = params; + operators[iter][State.ALLOCATED].push(operator); + } else if (action == Action.DECR_ALLOC_FULL) { + AllocateParams memory params = _genDeallocation_Full(operator, operatorSet, _strats); + operator.modifyAllocations(params); + check_DecrAlloc_State_NotSlashable(operator, params); + // check_FullyDeallocated_State(operator); TODO + + lastModifyParams[operator] = params; + operators[iter][State.NONE].push(operator); + } + } + } + + /// @dev REG_ALLOC operators can: + /// [DEREGISTER, INCR_ALLOC, INCR_ALLOC_FULL, DECR_ALLOC, DECR_ALLOC_FULL] + function _dispatchRegAlloc(uint iter) internal { + // Fetch all REG_ALLOC operators from previous iteration + User[] memory _operators = operators[iter - 1][State.REG_ALLOC]; + Action[5] memory actions = [ + Action.DEREGISTER, + Action.INCR_ALLOC, + Action.INCR_ALLOC_FULL, + Action.DECR_ALLOC, + Action.DECR_ALLOC_FULL + ]; + + if (_operators.length == 0) { + return; + } + + console.log("%s: %d operators", "_dispatchRegAlloc".green(), _operators.length); + + for (uint i = 0; i < _operators.length; i++) { + // Get operator + User operator = _operators[i]; + IStrategy[] memory _strats = allocatedStrats[operator]; + + // Get action + uint aI = _randUint(0, actions.length-1); + Action action = actions[aI]; + + // Process action + if (action == Action.DEREGISTER) { + operator.deregisterFromOperatorSet(operatorSet); + check_Deregistration_State_ActiveAllocation(operator, operatorSet); + + operators[iter][State.ALLOCATED].push(operator); + } else if (action == Action.INCR_ALLOC) { + AllocateParams memory params = _genAllocation_HalfAvailable(operator, operatorSet, _strats); + operator.modifyAllocations(params); + check_IncrAlloc_State_Slashable(operator, params); + + lastModifyParams[operator] = params; + operators[iter][State.REG_ALLOC].push(operator); + } else if (action == Action.INCR_ALLOC_FULL) { + AllocateParams memory params = _genAllocation_AllAvailable(operator, operatorSet, _strats); + operator.modifyAllocations(params); + check_IncrAlloc_State_Slashable(operator, params); + // check_FullyAllocated_State(operator); TODO + + lastModifyParams[operator] = params; + operators[iter][State.REG_FULLY_ALLOC].push(operator); + } else if (action == Action.DECR_ALLOC) { + AllocateParams memory params = _genDeallocation_HalfRemaining(operator, operatorSet, _strats); + operator.modifyAllocations(params); + check_DecrAlloc_State_Slashable(operator, params); + + lastModifyParams[operator] = params; + operators[iter][State.REG_ALLOC].push(operator); + } else if (action == Action.DECR_ALLOC_FULL) { + AllocateParams memory params = _genDeallocation_Full(operator, operatorSet, _strats); + operator.modifyAllocations(params); + check_DecrAlloc_State_Slashable(operator, params); + // check_FullyDeallocated_State(operator); TODO + + lastModifyParams[operator] = params; + operators[iter][State.REGISTERED].push(operator); + } + } + } + + /// @dev REG_FULLY_ALLOC operators can: + /// [DEREGISTER, DECR_ALLOC, DECR_ALLOC_FULL] + function _dispatchRegFullyAlloc(uint iter) internal { + // Fetch all REG_FULLY_ALLOC operators from previous iteration + User[] memory _operators = operators[iter - 1][State.REG_FULLY_ALLOC]; + Action[3] memory actions = [ + Action.DEREGISTER, + Action.DECR_ALLOC, + Action.DECR_ALLOC_FULL + ]; + + if (_operators.length == 0) { + return; + } + + console.log("%s: %d operators", "_dispatchRegFullyAlloc".green(), _operators.length); + + for (uint i = 0; i < _operators.length; i++) { + // Get operator + User operator = _operators[i]; + IStrategy[] memory _strats = allocatedStrats[operator]; + + // Get action + uint aI = _randUint(0, actions.length-1); + Action action = actions[aI]; + + // Process action + if (action == Action.DEREGISTER) { + operator.deregisterFromOperatorSet(operatorSet); + check_Deregistration_State_ActiveAllocation(operator, operatorSet); + + operators[iter][State.FULLY_ALLOCATED].push(operator); + } else if (action == Action.DECR_ALLOC) { + AllocateParams memory params = _genDeallocation_HalfRemaining(operator, operatorSet, _strats); + operator.modifyAllocations(params); + check_DecrAlloc_State_Slashable(operator, params); + + lastModifyParams[operator] = params; + operators[iter][State.REG_ALLOC].push(operator); + } else if (action == Action.DECR_ALLOC_FULL) { + AllocateParams memory params = _genDeallocation_Full(operator, operatorSet, _strats); + operator.modifyAllocations(params); + check_DecrAlloc_State_Slashable(operator, params); + // check_FullyDeallocated_State(operator); TODO + + lastModifyParams[operator] = params; + operators[iter][State.REGISTERED].push(operator); + } + } + } +} \ No newline at end of file diff --git a/src/test/integration/tests/ALM_RegisterAndModify.t.sol b/src/test/integration/tests/ALM_RegisterAndModify.t.sol new file mode 100644 index 0000000000..20816e88ba --- /dev/null +++ b/src/test/integration/tests/ALM_RegisterAndModify.t.sol @@ -0,0 +1,229 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.27; + +import "src/test/integration/IntegrationChecks.t.sol"; + +contract Integration_ALMBase is IntegrationCheckUtils { + + AVS avs; + OperatorSet operatorSet; + + User operator; + AllocateParams allocateParams; + + User staker; + IStrategy[] strategies; + uint[] initTokenBalances; + uint[] initDepositShares; + + /// Shared setup: + /// + /// 1. Generate staker with deposited assets, operator, and AVS + /// 2. Deposit asssets and delegate to operator + /// 3. AVS creates an operator set containing the strategies held by the staker + function _init() internal virtual override { + (staker, strategies, initTokenBalances) = _newRandomStaker(); + operator = _newRandomOperator_NoAssets(); + (avs,) = _newRandomAVS(); + + // 1. Deposit Into Strategies + staker.depositIntoEigenlayer(strategies, initTokenBalances); + initDepositShares = _calculateExpectedShares(strategies, initTokenBalances); + check_Deposit_State(staker, strategies, initDepositShares); + + // 2. Delegate to an operator + staker.delegateTo(operator); + check_Delegation_State(staker, operator, strategies, initDepositShares); + + // 3. Create an operator set containing the strategies held by the staker + operatorSet = avs.createOperatorSet(strategies); + } +} + +contract Integration_InitRegistered is Integration_ALMBase { + + /// @dev Integration test variants that start with the operator being registered + /// for the operator set + function _init() internal virtual override { + super._init(); + + // Register for operator set before allocating to any strategies + operator.registerForOperatorSet(operatorSet); + check_Registration_State_NoAllocation(operator, operatorSet, allStrats); + } + + function testFuzz_allocate_deallocate_deregister( + uint24 _random + ) public rand(_random) { + // 1. Allocate to the operator set + allocateParams = _genAllocation_AllAvailable(operator, operatorSet); + operator.modifyAllocations(allocateParams); + check_IncrAlloc_State_Slashable(operator, allocateParams); + + // 2. Roll to the allocation's effect block + _rollForward_AllocationDelay(operator); + + // 3. Deallocate fully from the operator set + AllocateParams memory deallocateParams = _genDeallocation_Full(operator, operatorSet); + operator.modifyAllocations(deallocateParams); + check_DecrAlloc_State_Slashable(operator, deallocateParams); + + // 4. Deregister from operator set + operator.deregisterFromOperatorSet(operatorSet); + check_Deregistration_State_PendingAllocation(operator, operatorSet); + + // 5. Check the operator is fully deallocated after the deallocation delay + _rollForward_DeallocationDelay(); + check_FullyDeallocated_State(operator, allocateParams, deallocateParams); + } + + function testFuzz_allocate_deallocate_waitDeallocate_deregister( + uint24 _random + ) public rand(_random) { + // 1. Allocate to the operator set + allocateParams = _genAllocation_AllAvailable(operator, operatorSet); + operator.modifyAllocations(allocateParams); + check_IncrAlloc_State_Slashable(operator, allocateParams); + + // 2. Roll to the allocation's effect block + _rollForward_AllocationDelay(operator); + + // 3. Deallocate fully from the operator set + AllocateParams memory deallocateParams = _genDeallocation_Full(operator, operatorSet); + operator.modifyAllocations(deallocateParams); + check_DecrAlloc_State_Slashable(operator, deallocateParams); + + // 4. Check the operator is fully deallocated after the deallocation delay + _rollForward_DeallocationDelay(); + check_FullyDeallocated_State(operator, allocateParams, deallocateParams); + + // 5. Deregister from operator set + operator.deregisterFromOperatorSet(operatorSet); + check_Deregistration_State_NoAllocation(operator, operatorSet); + } + + function testFuzz_deregister_waitDeregister_allocate_deallocate(uint24 _r) public rand(_r) { + // 1. Deregister from operator set + operator.deregisterFromOperatorSet(operatorSet); + check_Deregistration_State_NoAllocation(operator, operatorSet); + + // 2. Wait for deallocation delay. Operator is no longer slashable + _rollForward_DeallocationDelay(); + + // 3. Allocate to operator set + allocateParams = _genAllocation_AllAvailable(operator, operatorSet); + operator.modifyAllocations(allocateParams); + check_IncrAlloc_State_NotSlashable(operator, allocateParams); + + // 3. Wait for allocation delay + _rollForward_AllocationDelay(operator); + + // 4. Deallocate operator from operator set + AllocateParams memory deallocateParams = _genDeallocation_Full(operator, operatorSet); + operator.modifyAllocations(deallocateParams); + check_DecrAlloc_State_NotSlashable(operator, deallocateParams); + check_FullyDeallocated_State(operator, allocateParams, deallocateParams); + } + + function testFuzz_deregister_allocate_waitAllocate_deallocate(uint24 _r) public rand(_r) { + // 1. Deregister from operator set + operator.deregisterFromOperatorSet(operatorSet); + check_Deregistration_State_NoAllocation(operator, operatorSet); + + // 2. Before deregistration is complete, allocate to operator set + // The operator should be slashable after the allocation delay + allocateParams = _genAllocation_AllAvailable(operator, operatorSet); + operator.modifyAllocations(allocateParams); + check_IncrAlloc_State_Slashable(operator, allocateParams); + + // 3. Wait for allocation delay. Operator remains slashable + _rollForward_AllocationDelay(operator); + + // 4. Deallocate operator from operator set + AllocateParams memory deallocateParams = _genDeallocation_Full(operator, operatorSet); + operator.modifyAllocations(deallocateParams); + check_DecrAlloc_State_Slashable(operator, deallocateParams); + + // 5. Check the operator is fully deallocated after the deallocation delay + _rollForward_DeallocationDelay(); + check_FullyDeallocated_State(operator, allocateParams, deallocateParams); + } + + function testFuzz_deregister_allocate_waitDeregister_deallocate(uint24 _r) public rand(_r) { + // 1. Deregister from operator set + operator.deregisterFromOperatorSet(operatorSet); + check_Deregistration_State_NoAllocation(operator, operatorSet); + + // 2. Before deregistration is complete, allocate to operator set + // The operator should be slashable after the allocation delay + allocateParams = _genAllocation_AllAvailable(operator, operatorSet); + operator.modifyAllocations(allocateParams); + check_IncrAlloc_State_Slashable(operator, allocateParams); + + // 3. Wait for deallocation delay so operator is no longer slashable + _rollForward_DeallocationDelay(); + + // 4. Instant-deallocate operator from operator set + AllocateParams memory deallocateParams = _genDeallocation_Full(operator, operatorSet); + operator.modifyAllocations(deallocateParams); + check_DecrAlloc_State_NotSlashable(operator, deallocateParams); + check_FullyDeallocated_State(operator, allocateParams, deallocateParams); + } +} + +contract Integration_InitAllocated is Integration_ALMBase { + + /// @dev Integration test variants that start with the operator being allocated + /// for the operator set + function _init() internal virtual override { + super._init(); + + // Allocate fully to operator set + allocateParams = _genAllocation_AllAvailable(operator, operatorSet); + operator.modifyAllocations(allocateParams); + check_IncrAlloc_State_NotSlashable(operator, allocateParams); + } + + function testFuzz_register_deallocate_deregister( + uint24 _random + ) public rand(_random) { + // 1. Register for the operator set + operator.registerForOperatorSet(operatorSet); + check_Registration_State_PendingAllocation(operator, allocateParams); + + // 2. Roll to the allocation's effect block + _rollForward_AllocationDelay(operator); + + // 3. Deallocate fully from the operator set + AllocateParams memory deallocateParams = _genDeallocation_Full(operator, operatorSet); + operator.modifyAllocations(deallocateParams); + check_DecrAlloc_State_Slashable(operator, deallocateParams); + + // 4. Deregister from operator set + operator.deregisterFromOperatorSet(operatorSet); + check_Deregistration_State_PendingAllocation(operator, operatorSet); + + // 5. Roll forward to the deallocation's effect block and check the operator is fully deallocated + _rollForward_DeallocationDelay(); + check_FullyDeallocated_State(operator, allocateParams, deallocateParams); + } + + function testFuzz_waitAllocation_register_deallocate( + uint24 _random + ) public rand(_random) { + _rollForward_AllocationDelay(operator); + + // 1. Register for the operator set. The allocation immediately becomes slashable + operator.registerForOperatorSet(operatorSet); + check_Registration_State_ActiveAllocation(operator, allocateParams); + + // 2. Deallocate fully from the operator set + AllocateParams memory deallocateParams = _genDeallocation_Full(operator, operatorSet); + operator.modifyAllocations(deallocateParams); + check_DecrAlloc_State_Slashable(operator, deallocateParams); + + // 3. Roll forward to the deallocation's effect block and check the operator is fully deallocated + _rollForward_DeallocationDelay(); + check_FullyDeallocated_State(operator, allocateParams, deallocateParams); + } +} \ No newline at end of file diff --git a/src/test/integration/tests/Delegate_Deposit_Queue_Complete.t.sol b/src/test/integration/tests/Delegate_Deposit_Queue_Complete.t.sol index ad4fe205eb..b58269e028 100644 --- a/src/test/integration/tests/Delegate_Deposit_Queue_Complete.t.sol +++ b/src/test/integration/tests/Delegate_Deposit_Queue_Complete.t.sol @@ -24,7 +24,7 @@ contract Integration_Delegate_Deposit_Queue_Complete is IntegrationCheckUtils { assert_Snap_Added_OperatorShares(operator, strategies, shares, "operator should have received shares"); // 3. Queue Withdrawal - IDelegationManagerTypes.Withdrawal[] memory withdrawals = staker.queueWithdrawals(strategies, shares); + Withdrawal[] memory withdrawals = staker.queueWithdrawals(strategies, shares); bytes32[] memory withdrawalRoots = _getWithdrawalHashes(withdrawals); check_QueuedWithdrawal_State(staker, operator, strategies, shares, withdrawals, withdrawalRoots); @@ -55,7 +55,7 @@ contract Integration_Delegate_Deposit_Queue_Complete is IntegrationCheckUtils { assert_Snap_Added_OperatorShares(operator, strategies, shares, "operator should have received shares"); // 3. Queue Withdrawal - IDelegationManagerTypes.Withdrawal[] memory withdrawals = staker.queueWithdrawals(strategies, shares); + Withdrawal[] memory withdrawals = staker.queueWithdrawals(strategies, shares); bytes32[] memory withdrawalRoots = _getWithdrawalHashes(withdrawals); check_QueuedWithdrawal_State(staker, operator, strategies, shares, withdrawals, withdrawalRoots); diff --git a/src/test/integration/tests/Deposit_Delegate_Allocate_Slash_Queue_Redeposit.t.sol b/src/test/integration/tests/Deposit_Delegate_Allocate_Slash_Queue_Redeposit.t.sol index b85b22ccdc..e38bc43ecb 100644 --- a/src/test/integration/tests/Deposit_Delegate_Allocate_Slash_Queue_Redeposit.t.sol +++ b/src/test/integration/tests/Deposit_Delegate_Allocate_Slash_Queue_Redeposit.t.sol @@ -5,27 +5,41 @@ import "src/test/integration/IntegrationChecks.t.sol"; import "src/test/integration/users/User.t.sol"; import {console} from "forge-std/console.sol"; -contract Integration_Deposit_Delegate_Allocate_Slash_Queue_Redeposit is IntegrationCheckUtils, IDelegationManagerTypes { +contract Integration_Deposit_Delegate_Allocate_Slash_Queue_Redeposit is IntegrationCheckUtils { + + AVS avs; + OperatorSet operatorSet; + + User operator; + AllocateParams allocateParams; + + User staker; + IStrategy[] strategies; + uint[] initTokenBalances; + uint[] initDepositShares; + + uint[] numTokensRemaining; function _init() internal override { // TODO: Partial deposits don't work when beacon chain eth balance is initialized to < 64 ETH, need to write _newRandomStaker variant that ensures beacon chain ETH balance // greater than or equal to 64 _configAssetTypes(HOLDS_LST); _configUserTypes(DEFAULT); - } - - function testFuzz_deposit_delegate_allocate_fullSlash_queue_complete_redeposit( - uint24 _random - ) public rand(_random) { - (User staker, IStrategy[] memory strategies, uint256[] memory tokenBalances) = _newRandomStaker(); - (User operator,,) = _newRandomOperator(); - (AVS avs,) = _newRandomAVS(); - - uint256[] memory tokensToDeposit = new uint256[](tokenBalances.length); - uint256[] memory numTokensRemaining = new uint256[](tokenBalances.length); - for (uint256 i = 0; i < tokenBalances.length; i++) { - tokensToDeposit[i] = tokenBalances[i]/2; - numTokensRemaining[i] = tokenBalances[i] - tokensToDeposit[i]; + + (staker, strategies, initTokenBalances) = _newRandomStaker(); + (operator,,) = _newRandomOperator(); + (avs,) = _newRandomAVS(); + + uint256[] memory tokensToDeposit = new uint256[](initTokenBalances.length); + numTokensRemaining = new uint256[](initTokenBalances.length); + for (uint256 i = 0; i < initTokenBalances.length; i++) { + if (strategies[i] == BEACONCHAIN_ETH_STRAT) { + tokensToDeposit[i] = initTokenBalances[i]; + continue; + } + + tokensToDeposit[i] = initTokenBalances[i]/2; + numTokensRemaining[i] = initTokenBalances[i] - tokensToDeposit[i]; } uint256[] memory shares = _calculateExpectedShares(strategies, tokensToDeposit); @@ -39,31 +53,23 @@ contract Integration_Deposit_Delegate_Allocate_Slash_Queue_Redeposit is Integrat check_Delegation_State(staker, operator, strategies, shares); // Create operator set and register operator - OperatorSet memory operatorSet = avs.createOperatorSet(strategies); + operatorSet = avs.createOperatorSet(strategies); operator.registerForOperatorSet(operatorSet); + check_Registration_State_NoAllocation(operator, operatorSet, allStrats); // 3. Allocate to operator set - IAllocationManagerTypes.AllocateParams memory allocateParams = - operator.modifyAllocations(operatorSet, _maxMagnitudes(operatorSet, operator)); - - assert_Snap_Allocations_Modified( - operator, - allocateParams, - false, - "operator allocations should be updated before delay" - ); + allocateParams = _genAllocation_AllAvailable(operator, operatorSet); + operator.modifyAllocations(allocateParams); + check_IncrAlloc_State_Slashable(operator, allocateParams); _rollBlocksForCompleteAllocation(operator, operatorSet, strategies); - - assert_Snap_Allocations_Modified( - operator, - allocateParams, - true, - "operator allocations should be updated after delay" - ); - + } + + function testFuzz_fullSlash_queue_complete_redeposit( + uint24 _random + ) public rand(_random) { // 4. Fully slash operator - IAllocationManagerTypes.SlashingParams memory slashingParams; + SlashingParams memory slashingParams; { (IStrategy[] memory strategiesToSlash, uint256[] memory wadsToSlash) = _strategiesAndWadsForFullSlash(operatorSet); @@ -75,7 +81,7 @@ contract Integration_Deposit_Delegate_Allocate_Slash_Queue_Redeposit is Integrat } // 5. Undelegate from an operator - IDelegationManagerTypes.Withdrawal[] memory withdrawals = staker.undelegate(); + Withdrawal[] memory withdrawals = staker.undelegate(); bytes32[] memory withdrawalRoots = _getWithdrawalHashes(withdrawals); // 6. Complete withdrawal @@ -88,7 +94,7 @@ contract Integration_Deposit_Delegate_Allocate_Slash_Queue_Redeposit is Integrat } // 7. Redeposit - shares = _calculateExpectedShares(strategies, numTokensRemaining); + uint[] memory shares = _calculateExpectedShares(strategies, numTokensRemaining); staker.depositIntoEigenlayer(strategies, numTokensRemaining); check_Deposit_State(staker, strategies, shares); @@ -97,60 +103,15 @@ contract Integration_Deposit_Delegate_Allocate_Slash_Queue_Redeposit is Integrat assert_NoWithdrawalsPending(withdrawalRoots, "all withdrawals should be removed from pending"); } - function testFuzz_deposit_delegate_allocate_queue_fullSlash_complete_redeposit( + function testFuzz_undelegate_fullSlash_complete_redeposit( uint24 _random ) public rand(_random) { - (User staker, IStrategy[] memory strategies, uint256[] memory tokenBalances) = _newRandomStaker(); - (User operator,,) = _newRandomOperator(); - (AVS avs,) = _newRandomAVS(); - - uint256[] memory tokensToDeposit = new uint256[](tokenBalances.length); - uint256[] memory numTokensRemaining = new uint256[](tokenBalances.length); - for (uint256 i = 0; i < tokenBalances.length; i++) { - tokensToDeposit[i] = tokenBalances[i]/2; - numTokensRemaining[i] = tokenBalances[i] - tokensToDeposit[i]; - } - - uint256[] memory shares = _calculateExpectedShares(strategies, tokensToDeposit); - - // 1. Deposit Into Strategies - staker.depositIntoEigenlayer(strategies, tokensToDeposit); - check_Deposit_State_PartialDeposit(staker, strategies, shares, numTokensRemaining); - - // 2. Delegate to operator - staker.delegateTo(operator); - check_Delegation_State(staker, operator, strategies, shares); - - // Create operator set and register operator - OperatorSet memory operatorSet = avs.createOperatorSet(strategies); - operator.registerForOperatorSet(operatorSet); - - // 3. Allocate to operator set - IAllocationManagerTypes.AllocateParams memory allocateParams = - operator.modifyAllocations(operatorSet, _maxMagnitudes(operatorSet, operator)); - - assert_Snap_Allocations_Modified( - operator, - allocateParams, - false, - "operator allocations should be updated before delay" - ); - - _rollBlocksForCompleteAllocation(operator, operatorSet, strategies); - - assert_Snap_Allocations_Modified( - operator, - allocateParams, - true, - "operator allocations should be updated after delay" - ); - // 4. Undelegate from an operator - IDelegationManagerTypes.Withdrawal[] memory withdrawals = staker.undelegate(); + Withdrawal[] memory withdrawals = staker.undelegate(); bytes32[] memory withdrawalRoots = _getWithdrawalHashes(withdrawals); // 5. Fully slash operator - IAllocationManagerTypes.SlashingParams memory slashingParams; + SlashingParams memory slashingParams; { (IStrategy[] memory strategiesToSlash, uint256[] memory wadsToSlash) = _strategiesAndWadsForFullSlash(operatorSet); @@ -171,7 +132,7 @@ contract Integration_Deposit_Delegate_Allocate_Slash_Queue_Redeposit is Integrat } // 7. Redeposit - shares = _calculateExpectedShares(strategies, numTokensRemaining); + uint[] memory shares = _calculateExpectedShares(strategies, numTokensRemaining); staker.depositIntoEigenlayer(strategies, numTokensRemaining); check_Deposit_State(staker, strategies, shares); @@ -180,133 +141,15 @@ contract Integration_Deposit_Delegate_Allocate_Slash_Queue_Redeposit is Integrat assert_NoWithdrawalsPending(withdrawalRoots, "all withdrawals should be removed from pending"); } - function testFuzz_deposit_delegate_allocateMultSets_fullSlash_queue_complete_redeposit( + function testFuzz_depositFull_fullSlash_undelegate_completeAsShares( uint24 _random ) public rand(_random) { - (User staker, IStrategy[] memory strategies, uint256[] memory tokenBalances) = _newRandomStaker(); - (User operator,,) = _newRandomOperator(); - (AVS avs,) = _newRandomAVS(); - OperatorSet memory operatorSet; - - uint256[] memory tokensToDeposit = new uint256[](tokenBalances.length); - uint256[] memory numTokensRemaining = new uint256[](tokenBalances.length); - for (uint256 i = 0; i < tokenBalances.length; i++) { - tokensToDeposit[i] = tokenBalances[i]/2; - numTokensRemaining[i] = tokenBalances[i] - tokensToDeposit[i]; - } - - uint256[] memory shares = _calculateExpectedShares(strategies, tokensToDeposit); - - // 1. Deposit Into Strategies - staker.depositIntoEigenlayer(strategies, tokensToDeposit); - check_Deposit_State_PartialDeposit(staker, strategies, shares, numTokensRemaining); - - // 2. Delegate to operator - staker.delegateTo(operator); - check_Delegation_State(staker, operator, strategies, shares); - - // Create operator sets and register operator - { - uint numOpSets = _randUint({min: 2, max: 4}); - OperatorSet[] memory operatorSets = new OperatorSet[](numOpSets); - for (uint i = 0; i < numOpSets; i++){ - operatorSets[i] = avs.createOperatorSet(strategies); - } - operatorSet = operatorSets[_randUint({min: 0, max: numOpSets-1})]; - } - - operator.registerForOperatorSet(operatorSet); - - // 3. Allocate to operator set - IAllocationManagerTypes.AllocateParams memory allocateParams = - operator.modifyAllocations(operatorSet, _maxMagnitudes(operatorSet, operator)); - - assert_Snap_Allocations_Modified( - operator, - allocateParams, - false, - "operator allocations should be updated before delay" - ); - - _rollBlocksForCompleteAllocation(operator, operatorSet, strategies); - - assert_Snap_Allocations_Modified( - operator, - allocateParams, - true, - "operator allocations should be updated after delay" - ); - - // 4. Fully slash operator - IAllocationManagerTypes.SlashingParams memory slashingParams; - { - (IStrategy[] memory strategiesToSlash, uint256[] memory wadsToSlash) = - _strategiesAndWadsForFullSlash(operatorSet); - - slashingParams = avs.slashOperator(operator, operatorSet.id, strategiesToSlash, wadsToSlash); - assert_Snap_Allocations_Slashed(slashingParams, operatorSet, true, "operator allocations should be slashed"); - assert_Snap_Unchanged_Staker_DepositShares(staker, "staker deposit shares should be unchanged after slashing"); - assert_Snap_StakerWithdrawableShares_AfterSlash(staker, allocateParams, slashingParams, "staker deposit shares should be slashed"); - } - - // 5. Undelegate from an operator - IDelegationManagerTypes.Withdrawal[] memory withdrawals = staker.undelegate(); - bytes32[] memory withdrawalRoots = _getWithdrawalHashes(withdrawals); - - // 6. Complete withdrawal - _rollBlocksForCompleteWithdrawals(withdrawals); - for (uint256 i = 0; i < withdrawals.length; ++i) { - uint256[] memory expectedTokens = - _calculateExpectedTokens(withdrawals[i].strategies, withdrawals[i].scaledShares); - staker.completeWithdrawalAsTokens(withdrawals[i]); - check_Withdrawal_AsTokens_State_AfterSlash(staker, operator, withdrawals[i], allocateParams, slashingParams, expectedTokens); - } - - // 7. Redeposit - shares = _calculateExpectedShares(strategies, numTokensRemaining); + uint[] memory shares = _calculateExpectedShares(strategies, numTokensRemaining); staker.depositIntoEigenlayer(strategies, numTokensRemaining); check_Deposit_State(staker, strategies, shares); - // Final state checks - assert_HasExpectedShares(staker, strategies, shares, "staker should have expected shares after redeposit"); - assert_NoWithdrawalsPending(withdrawalRoots, "all withdrawals should be removed from pending"); - } - - function testFuzz_deposit_delegate_allocate_fullSlash_undelegate_completeAsShares( - uint24 _random - ) public rand(_random) { - _configAssetTypes(HOLDS_ALL); - - (User staker, IStrategy[] memory strategies, uint256[] memory tokenBalances) = _newRandomStaker(); - (User operator,,) = _newRandomOperator(); - (AVS avs,) = _newRandomAVS(); - - - // 1. Deposit Into Strategies - staker.depositIntoEigenlayer(strategies, tokenBalances); - uint256[] memory shares = _calculateExpectedShares(strategies, tokenBalances); - // TODO - post-deposit and post-delegate checks? - - // 2. Delegate to an operator - staker.delegateTo(operator); - - // Create an operator set and register an operator. - OperatorSet memory operatorSet = avs.createOperatorSet(strategies); - operator.registerForOperatorSet(operatorSet); - - // 3. Allocate to operator set. - IAllocationManagerTypes.AllocateParams memory allocateParams = - operator.modifyAllocations(operatorSet, _maxMagnitudes(operatorSet, operator)); - assert_Snap_Allocations_Modified( - operator, allocateParams, false, "operator allocations should be updated before delay" - ); - _rollBlocksForCompleteAllocation(operator, operatorSet, strategies); - assert_Snap_Allocations_Modified( - operator, allocateParams, true, "operator allocations should be updated after delay" - ); - // 4. Fully slash random proper subset of operators strategies - IAllocationManagerTypes.SlashingParams memory slashingParams; + SlashingParams memory slashingParams; { (IStrategy[] memory strategiesToSlash, uint256[] memory wadsToSlash) = _strategiesAndWadsForRandFullSlash(operatorSet); @@ -317,7 +160,7 @@ contract Integration_Deposit_Delegate_Allocate_Slash_Queue_Redeposit is Integrat } // 5. Undelegate from an operator - IDelegationManagerTypes.Withdrawal[] memory withdrawals = staker.undelegate(); + Withdrawal[] memory withdrawals = staker.undelegate(); bytes32[] memory withdrawalRoots = _getWithdrawalHashes(withdrawals); // 6. Complete withdrawal as shares @@ -330,7 +173,7 @@ contract Integration_Deposit_Delegate_Allocate_Slash_Queue_Redeposit is Integrat } // Check final state: - assert_HasNoUnderlyingTokenBalance(staker, strategies, "staker not have any underlying tokens"); + assert_HasNoUnderlyingTokenBalance(staker, slashingParams.strategies, "staker not have any underlying tokens"); assert_NoWithdrawalsPending(withdrawalRoots, "all withdrawals should be removed from pending"); } } \ No newline at end of file diff --git a/src/test/integration/tests/Deposit_Delegate_Queue_Complete.t.sol b/src/test/integration/tests/Deposit_Delegate_Queue_Complete.t.sol index c1184a8d46..2245f53a90 100644 --- a/src/test/integration/tests/Deposit_Delegate_Queue_Complete.t.sol +++ b/src/test/integration/tests/Deposit_Delegate_Queue_Complete.t.sol @@ -43,7 +43,7 @@ contract Integration_Deposit_Delegate_Queue_Complete is IntegrationCheckUtils { check_Delegation_State(staker, operator, strategies, shares); // 3. Queue Withdrawals - IDelegationManagerTypes.Withdrawal[] memory withdrawals = staker.queueWithdrawals(strategies, shares); + Withdrawal[] memory withdrawals = staker.queueWithdrawals(strategies, shares); bytes32[] memory withdrawalRoots = _getWithdrawalHashes(withdrawals); check_QueuedWithdrawal_State(staker, operator, strategies, shares, withdrawals, withdrawalRoots); @@ -96,7 +96,7 @@ contract Integration_Deposit_Delegate_Queue_Complete is IntegrationCheckUtils { check_Delegation_State(staker, operator, strategies, shares); // 3. Queue Withdrawals - IDelegationManagerTypes.Withdrawal[] memory withdrawals = staker.queueWithdrawals(strategies, shares); + Withdrawal[] memory withdrawals = staker.queueWithdrawals(strategies, shares); bytes32[] memory withdrawalRoots = _getWithdrawalHashes(withdrawals); check_QueuedWithdrawal_State(staker, operator, strategies, shares, withdrawals, withdrawalRoots); @@ -158,7 +158,7 @@ contract Integration_Deposit_Delegate_Queue_Complete is IntegrationCheckUtils { uint[] memory withdrawShares ) = _randWithdrawal(strategies, shares); - IDelegationManagerTypes.Withdrawal[] memory withdrawals = staker.queueWithdrawals(withdrawStrats, withdrawShares); + Withdrawal[] memory withdrawals = staker.queueWithdrawals(withdrawStrats, withdrawShares); bytes32[] memory withdrawalRoots = _getWithdrawalHashes(withdrawals); check_QueuedWithdrawal_State(staker, operator, withdrawStrats, withdrawShares, withdrawals, withdrawalRoots); @@ -214,7 +214,7 @@ contract Integration_Deposit_Delegate_Queue_Complete is IntegrationCheckUtils { uint[] memory withdrawShares ) = _randWithdrawal(strategies, shares); - IDelegationManagerTypes.Withdrawal[] memory withdrawals = staker.queueWithdrawals(withdrawStrats, withdrawShares); + Withdrawal[] memory withdrawals = staker.queueWithdrawals(withdrawStrats, withdrawShares); bytes32[] memory withdrawalRoots = _getWithdrawalHashes(withdrawals); check_QueuedWithdrawal_State(staker, operator, withdrawStrats, withdrawShares, withdrawals, withdrawalRoots); 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 ff558d79d7..b3a3a40b49 100644 --- a/src/test/integration/tests/Deposit_Delegate_Redelegate_Complete.t.sol +++ b/src/test/integration/tests/Deposit_Delegate_Redelegate_Complete.t.sol @@ -44,7 +44,7 @@ contract Integration_Deposit_Delegate_Redelegate_Complete is IntegrationCheckUti check_Delegation_State(staker, operator1, strategies, shares); // 3. Undelegate from an operator - IDelegationManagerTypes.Withdrawal[] memory withdrawals = staker.undelegate(); + Withdrawal[] memory withdrawals = staker.undelegate(); bytes32[] memory withdrawalRoots = _getWithdrawalHashes(withdrawals); check_Undelegate_State(staker, operator1, withdrawals, withdrawalRoots, strategies, shares); @@ -107,7 +107,7 @@ contract Integration_Deposit_Delegate_Redelegate_Complete is IntegrationCheckUti check_Delegation_State(staker, operator1, strategies, shares); // 3. Undelegate from an operator - IDelegationManagerTypes.Withdrawal[] memory withdrawals = staker.undelegate(); + Withdrawal[] memory withdrawals = staker.undelegate(); bytes32[] memory withdrawalRoots = _getWithdrawalHashes(withdrawals); check_Undelegate_State(staker, operator1, withdrawals, withdrawalRoots, strategies, shares); @@ -195,7 +195,7 @@ contract Integration_Deposit_Delegate_Redelegate_Complete is IntegrationCheckUti check_Delegation_State(staker, operator1, strategies, halfShares); // 3. Undelegate from an operator - IDelegationManagerTypes.Withdrawal[] memory withdrawals = staker.undelegate(); + Withdrawal[] memory withdrawals = staker.undelegate(); bytes32[] memory withdrawalRoots = _getWithdrawalHashes(withdrawals); check_Undelegate_State(staker, operator1, withdrawals, withdrawalRoots, strategies, halfShares); @@ -222,7 +222,7 @@ contract Integration_Deposit_Delegate_Redelegate_Complete is IntegrationCheckUti { // 7. Queue Withdrawal shares = _calculateExpectedShares(strategies, tokenBalances); - IDelegationManagerTypes.Withdrawal[] memory newWithdrawals = staker.queueWithdrawals(strategies, shares); + Withdrawal[] memory newWithdrawals = staker.queueWithdrawals(strategies, shares); bytes32[] memory newWithdrawalRoots = _getWithdrawalHashes(newWithdrawals); check_QueuedWithdrawal_State(staker, operator2, strategies, shares, newWithdrawals, newWithdrawalRoots); @@ -280,7 +280,7 @@ contract Integration_Deposit_Delegate_Redelegate_Complete is IntegrationCheckUti check_Delegation_State(staker, operator1, strategies, sharesFromFirstDeposit); // 3. Undelegate from an operator - IDelegationManagerTypes.Withdrawal[] memory withdrawals = staker.undelegate(); + Withdrawal[] memory withdrawals = staker.undelegate(); bytes32[] memory withdrawalRoots = _getWithdrawalHashes(withdrawals); check_Undelegate_State(staker, operator1, withdrawals, withdrawalRoots, strategies, sharesFromFirstDeposit); @@ -311,7 +311,7 @@ contract Integration_Deposit_Delegate_Redelegate_Complete is IntegrationCheckUti { // 7. Queue Withdrawal totalShares = _calculateExpectedShares(strategies, tokenBalances); - IDelegationManagerTypes.Withdrawal[] memory newWithdrawals = staker.queueWithdrawals(strategies, totalShares); + Withdrawal[] memory newWithdrawals = staker.queueWithdrawals(strategies, totalShares); bytes32[] memory newWithdrawalRoots = _getWithdrawalHashes(newWithdrawals); check_QueuedWithdrawal_State(staker, operator2, strategies, totalShares, newWithdrawals, newWithdrawalRoots); @@ -353,7 +353,7 @@ contract Integration_Deposit_Delegate_Redelegate_Complete is IntegrationCheckUti check_Delegation_State(staker, operator1, strategies, shares); // 3. Undelegate from an operator - IDelegationManagerTypes.Withdrawal[] memory withdrawals = staker.undelegate(); + Withdrawal[] memory withdrawals = staker.undelegate(); bytes32[] memory withdrawalRoots = _getWithdrawalHashes(withdrawals); check_Undelegate_State(staker, operator1, withdrawals, withdrawalRoots, strategies, shares); @@ -418,7 +418,7 @@ contract Integration_Deposit_Delegate_Redelegate_Complete is IntegrationCheckUti check_Delegation_State(staker, operator1, strategies, shares); // 3. Undelegate from an operator - IDelegationManagerTypes.Withdrawal[] memory withdrawals = staker.undelegate(); + Withdrawal[] memory withdrawals = staker.undelegate(); bytes32[] memory withdrawalRoots = _getWithdrawalHashes(withdrawals); check_Undelegate_State(staker, operator1, withdrawals, withdrawalRoots, strategies, shares); 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 41b61cff31..0ce9894f9b 100644 --- a/src/test/integration/tests/Deposit_Delegate_Undelegate_Complete.t.sol +++ b/src/test/integration/tests/Deposit_Delegate_Undelegate_Complete.t.sol @@ -38,7 +38,7 @@ contract Integration_Deposit_Delegate_Undelegate_Complete is IntegrationCheckUti check_Delegation_State(staker, operator, strategies, shares); // 3. Undelegate from an operator - IDelegationManagerTypes.Withdrawal[] memory withdrawals = staker.undelegate(); + Withdrawal[] memory withdrawals = staker.undelegate(); bytes32[] memory withdrawalRoots = _getWithdrawalHashes(withdrawals); check_Undelegate_State(staker, operator, withdrawals, withdrawalRoots, strategies, shares); @@ -92,7 +92,7 @@ contract Integration_Deposit_Delegate_Undelegate_Complete is IntegrationCheckUti check_Delegation_State(staker, operator, strategies, shares); // 3. Undelegate from an operator - IDelegationManagerTypes.Withdrawal[] memory withdrawals = staker.undelegate(); + Withdrawal[] memory withdrawals = staker.undelegate(); bytes32[] memory withdrawalRoots = _getWithdrawalHashes(withdrawals); check_Undelegate_State(staker, operator, withdrawals, withdrawalRoots, strategies, shares); @@ -139,7 +139,7 @@ contract Integration_Deposit_Delegate_Undelegate_Complete is IntegrationCheckUti check_Delegation_State(staker, operator, strategies, shares); // 3. Force undelegate - IDelegationManagerTypes.Withdrawal[] memory withdrawals = operator.forceUndelegate(staker); + Withdrawal[] memory withdrawals = operator.forceUndelegate(staker); bytes32[] memory withdrawalRoots = _getWithdrawalHashes(withdrawals); check_Undelegate_State(staker, operator, withdrawals, withdrawalRoots, strategies, shares); @@ -187,7 +187,7 @@ contract Integration_Deposit_Delegate_Undelegate_Complete is IntegrationCheckUti check_Delegation_State(staker, operator, strategies, shares); // 3. Force undelegate - IDelegationManagerTypes.Withdrawal[] memory withdrawals = operator.forceUndelegate(staker); + Withdrawal[] memory withdrawals = operator.forceUndelegate(staker); bytes32[] memory withdrawalRoots = _getWithdrawalHashes(withdrawals); check_Undelegate_State(staker, operator, withdrawals, withdrawalRoots, strategies, shares); @@ -229,7 +229,7 @@ contract Integration_Deposit_Delegate_Undelegate_Complete is IntegrationCheckUti check_Delegation_State(staker, operator, strategies, shares); // 3. Undelegate from an operator - IDelegationManagerTypes.Withdrawal[] memory withdrawals = staker.undelegate(); + Withdrawal[] memory withdrawals = staker.undelegate(); bytes32[] memory withdrawalRoots = _getWithdrawalHashes(withdrawals); check_Undelegate_State(staker, operator, withdrawals, withdrawalRoots, strategies, shares); diff --git a/src/test/integration/tests/Deposit_Delegate_UpdateBalance.t.sol b/src/test/integration/tests/Deposit_Delegate_UpdateBalance.t.sol index bcbdd6d86b..359ed44d06 100644 --- a/src/test/integration/tests/Deposit_Delegate_UpdateBalance.t.sol +++ b/src/test/integration/tests/Deposit_Delegate_UpdateBalance.t.sol @@ -43,7 +43,7 @@ contract Integration_Deposit_Delegate_UpdateBalance is IntegrationCheckUtils { // check_Delegation_State(staker, operator, strategies, shares); // /// 3. Queue withdrawals for ALL shares - // IDelegationManagerTypes.Withdrawal[] memory withdrawals = staker.queueWithdrawals(strategies, shares); + // Withdrawal[] memory withdrawals = staker.queueWithdrawals(strategies, shares); // bytes32[] memory withdrawalRoots = _getWithdrawalHashes(withdrawals); // check_QueuedWithdrawal_State(staker, operator, strategies, shares, withdrawals, withdrawalRoots); diff --git a/src/test/integration/tests/Deposit_Queue_Complete.t.sol b/src/test/integration/tests/Deposit_Queue_Complete.t.sol index c119c7e1ba..3fb7eab532 100644 --- a/src/test/integration/tests/Deposit_Queue_Complete.t.sol +++ b/src/test/integration/tests/Deposit_Queue_Complete.t.sol @@ -22,7 +22,7 @@ contract Integration_Deposit_QueueWithdrawal_Complete is IntegrationCheckUtils { assertFalse(delegationManager.isDelegated(address(staker)), "Staker should not be delegated after deposit"); // 2. Queue Withdrawal - IDelegationManagerTypes.Withdrawal[] memory withdrawals = staker.queueWithdrawals(strategies, shares); + Withdrawal[] memory withdrawals = staker.queueWithdrawals(strategies, shares); // 3. Complete Queued Withdrawal _rollBlocksForCompleteWithdrawals(withdrawals); @@ -49,7 +49,7 @@ contract Integration_Deposit_QueueWithdrawal_Complete is IntegrationCheckUtils { assertFalse(delegationManager.isDelegated(address(staker)), "Staker should not be delegated after deposit"); // 2. Queue Withdrawal - IDelegationManagerTypes.Withdrawal[] memory withdrawals = staker.queueWithdrawals(strategies, shares); + Withdrawal[] memory withdrawals = staker.queueWithdrawals(strategies, shares); // 3. Complete Queued Withdrawal _rollBlocksForCompleteWithdrawals(withdrawals); diff --git a/src/test/integration/tests/Deposit_Register_QueueWithdrawal_Complete.t.sol b/src/test/integration/tests/Deposit_Register_QueueWithdrawal_Complete.t.sol index 1875cf0b27..20c4ccbcaf 100644 --- a/src/test/integration/tests/Deposit_Register_QueueWithdrawal_Complete.t.sol +++ b/src/test/integration/tests/Deposit_Register_QueueWithdrawal_Complete.t.sol @@ -19,7 +19,7 @@ contract Integration_Deposit_Register_QueueWithdrawal_Complete is IntegrationChe assertTrue(delegationManager.isOperator(address(staker)), "Staker should be registered as an operator"); // 3. Queue Withdrawal - IDelegationManagerTypes.Withdrawal[] memory withdrawals = staker.queueWithdrawals(strategies, shares); + Withdrawal[] memory withdrawals = staker.queueWithdrawals(strategies, shares); bytes32[] memory withdrawalRoots = _getWithdrawalHashes(withdrawals); check_QueuedWithdrawal_State(staker, staker, strategies, shares, withdrawals, withdrawalRoots); @@ -44,7 +44,7 @@ contract Integration_Deposit_Register_QueueWithdrawal_Complete is IntegrationChe assertTrue(delegationManager.isOperator(address(staker)), "Staker should be registered as an operator"); // 3. Queue Withdrawal - IDelegationManagerTypes.Withdrawal[] memory withdrawals = staker.queueWithdrawals(strategies, shares); + Withdrawal[] memory withdrawals = staker.queueWithdrawals(strategies, shares); bytes32[] memory withdrawalRoots = _getWithdrawalHashes(withdrawals); check_QueuedWithdrawal_State(staker, staker, strategies, shares, withdrawals, withdrawalRoots); diff --git a/src/test/integration/tests/SlashingWithdrawals.t.sol b/src/test/integration/tests/SlashingWithdrawals.t.sol index fb2cff0927..2dcca1d732 100644 --- a/src/test/integration/tests/SlashingWithdrawals.t.sol +++ b/src/test/integration/tests/SlashingWithdrawals.t.sol @@ -3,61 +3,81 @@ pragma solidity ^0.8.27; import "src/test/integration/IntegrationChecks.t.sol"; -contract SlashingWithdrawals is IntegrationCheckUtils { +contract Integration_SlashingWithdrawals is IntegrationCheckUtils { AVS avs; OperatorSet operatorSet; User operator; - IAllocationManagerTypes.AllocateParams allocateParams; + AllocateParams allocateParams; User staker; IStrategy[] strategies; uint[] initTokenBalances; + uint[] initDepositShares; + + /** + * Current test setup uses a single operator set and multiple strategies. Slashes + * are simple, done on that single operator set. + * -- good for testing full slashes where 100% of a strategy's magnitude is impacted + * -- could have a separate setup with multiple operator sets and one strategy + * to test "full slashes" that don't hit 100% of a strategy's magnitude (but are + * 100% of allocated magnitude for that operator set) + */ /// Shared setup: /// /// 1. Generate staker, operator, and AVS /// 2. Staker deposits and delegates to operator /// 3. AVS creates an operator set containing the strategies held by the staker - /// 4. Operator registers for operator set (default allocation delay) - /// 5. Operator allocates to operator set + /// 4. Operator allocates to operator set + /// 5. Operator registers for operator set + /// NOTE: Steps 4 and 5 are done in random order, as these should not have an outcome on the test function _init() internal override { (staker, strategies, initTokenBalances) = _newRandomStaker(); - (operator,,) = _newRandomOperator(); + operator = _newRandomOperator_NoAssets(); (avs,) = _newRandomAVS(); // 1. Deposit Into Strategies staker.depositIntoEigenlayer(strategies, initTokenBalances); - uint[] memory shares = _calculateExpectedShares(strategies, initTokenBalances); - check_Deposit_State(staker, strategies, shares); + initDepositShares = _calculateExpectedShares(strategies, initTokenBalances); + check_Deposit_State(staker, strategies, initDepositShares); // 2. Delegate to an operator staker.delegateTo(operator); - check_Delegation_State(staker, operator, strategies, shares); + check_Delegation_State(staker, operator, strategies, initDepositShares); // 3. Create an operator set and register an operator. operatorSet = avs.createOperatorSet(strategies); - // TODO invariant checks here - operator.registerForOperatorSet(operatorSet); - // TODO invariant checks here - - // 4. Allocate to operator set - allocateParams = operator.modifyAllocations(operatorSet, _randMagnitudes({sum: 1 ether, len: strategies.length})); - assert_Snap_Allocations_Modified( - operator, allocateParams, false, "operator allocations should be updated before delay" - ); + + // randomly choose between: + // register -> allocate / allocate -> register + if (_randBool()) { + // register -> allocate + operator.registerForOperatorSet(operatorSet); + check_Registration_State_NoAllocation(operator, operatorSet, allStrats); + + allocateParams = _genAllocation_AllAvailable(operator, operatorSet); + operator.modifyAllocations(allocateParams); + check_IncrAlloc_State_Slashable(operator, allocateParams); + } else { + // allocate -> register + allocateParams = _genAllocation_AllAvailable(operator, operatorSet); + operator.modifyAllocations(allocateParams); + check_IncrAlloc_State_NotSlashable(operator, allocateParams); + + operator.registerForOperatorSet(operatorSet); + check_Registration_State_PendingAllocation(operator, allocateParams); + } + _rollBlocksForCompleteAllocation(operator, operatorSet, strategies); - assert_Snap_Allocations_Modified( - operator, allocateParams, true, "operator allocations should be updated after delay" - ); } function testFuzz_slash_undelegate_completeAsTokens( uint24 _random ) public rand(_random) { // 4. Slash operator - IAllocationManagerTypes.SlashingParams memory slashingParams; + SlashingParams memory slashingParams; { (IStrategy[] memory strategiesToSlash, uint256[] memory wadsToSlash) = _randStrategiesAndWadsToSlash(operatorSet); @@ -68,7 +88,7 @@ contract SlashingWithdrawals is IntegrationCheckUtils { } // 5. Undelegate from an operator - IDelegationManagerTypes.Withdrawal[] memory withdrawals = staker.undelegate(); + Withdrawal[] memory withdrawals = staker.undelegate(); bytes32[] memory withdrawalRoots = _getWithdrawalHashes(withdrawals); // 6. Complete withdrawal @@ -96,7 +116,7 @@ contract SlashingWithdrawals is IntegrationCheckUtils { uint24 _random ) public rand(_random) { // 4. Slash operator - IAllocationManagerTypes.SlashingParams memory slashingParams; + SlashingParams memory slashingParams; { (IStrategy[] memory strategiesToSlash, uint256[] memory wadsToSlash) = _randStrategiesAndWadsToSlash(operatorSet); @@ -107,7 +127,7 @@ contract SlashingWithdrawals is IntegrationCheckUtils { } // 5. Undelegate from an operator - IDelegationManagerTypes.Withdrawal[] memory withdrawals = staker.undelegate(); + Withdrawal[] memory withdrawals = staker.undelegate(); bytes32[] memory withdrawalRoots = _getWithdrawalHashes(withdrawals); // 4. Complete withdrawal @@ -128,12 +148,12 @@ contract SlashingWithdrawals is IntegrationCheckUtils { uint24 _random ) public rand(_random) { // 4. Queue withdrawal - IDelegationManagerTypes.Withdrawal[] memory withdrawals = + Withdrawal[] memory withdrawals = staker.queueWithdrawals(strategies, _calculateExpectedShares(strategies, initTokenBalances)); bytes32[] memory withdrawalRoots = _getWithdrawalHashes(withdrawals); // 5. Slash operator - IAllocationManagerTypes.SlashingParams memory slashingParams; + SlashingParams memory slashingParams; { (IStrategy[] memory strategiesToSlash, uint256[] memory wadsToSlash) = _randStrategiesAndWadsToSlash(operatorSet); @@ -170,12 +190,12 @@ contract SlashingWithdrawals is IntegrationCheckUtils { uint24 _random ) public rand(_random) { // 4. Queue withdrawal - IDelegationManagerTypes.Withdrawal[] memory withdrawals = + Withdrawal[] memory withdrawals = staker.queueWithdrawals(strategies, _calculateExpectedShares(strategies, initTokenBalances)); bytes32[] memory withdrawalRoots = _getWithdrawalHashes(withdrawals); // 5. Slash operator - IAllocationManagerTypes.SlashingParams memory slashingParams; + SlashingParams memory slashingParams; { (IStrategy[] memory strategiesToSlash, uint256[] memory wadsToSlash) = _randStrategiesAndWadsToSlash(operatorSet); @@ -203,11 +223,14 @@ contract SlashingWithdrawals is IntegrationCheckUtils { uint24 _random ) public rand(_random) { // 4. Deallocate all. - IAllocationManagerTypes.AllocateParams memory deallocateParams = operator.deallocateAll(operatorSet); - _rollBlocksForCompleteAllocation(operator, operatorSet, strategies); + AllocateParams memory deallocateParams = _genDeallocation_Full(operator, operatorSet); + operator.modifyAllocations(deallocateParams); + check_DecrAlloc_State_Slashable(operator, deallocateParams); + + _rollForward_DeallocationDelay(); // 5. Slash operator - IAllocationManagerTypes.SlashingParams memory slashingParams; + SlashingParams memory slashingParams; { (IStrategy[] memory strategiesToSlash, uint256[] memory wadsToSlash) = _randStrategiesAndWadsToSlash(operatorSet); @@ -218,7 +241,7 @@ contract SlashingWithdrawals is IntegrationCheckUtils { } // 6. Queue withdrawals - IDelegationManagerTypes.Withdrawal[] memory withdrawals = + Withdrawal[] memory withdrawals = staker.queueWithdrawals(strategies, _calculateExpectedShares(strategies, initTokenBalances)); bytes32[] memory withdrawalRoots = _getWithdrawalHashes(withdrawals); @@ -248,9 +271,10 @@ contract SlashingWithdrawals is IntegrationCheckUtils { ) public rand(_random) { // 4. Deregister. operator.deregisterFromOperatorSet(operatorSet); + check_Deregistration_State_PendingAllocation(operator, operatorSet); // 5. Slash operator - IAllocationManagerTypes.SlashingParams memory slashingParams; + SlashingParams memory slashingParams; { (IStrategy[] memory strategiesToSlash, uint256[] memory wadsToSlash) = _randStrategiesAndWadsToSlash(operatorSet); diff --git a/src/test/integration/tests/upgrade/Complete_PreSlashing_Withdrawal.t.sol b/src/test/integration/tests/upgrade/Complete_PreSlashing_Withdrawal.t.sol index 347b0543db..17d839632a 100644 --- a/src/test/integration/tests/upgrade/Complete_PreSlashing_Withdrawal.t.sol +++ b/src/test/integration/tests/upgrade/Complete_PreSlashing_Withdrawal.t.sol @@ -15,7 +15,7 @@ contract Integration_Upgrade_Complete_PreSlashing_Withdrawal is UpgradeTest { staker.depositIntoEigenlayer(strategies, tokenBalances); uint[] memory shares = _calculateExpectedShares(strategies, tokenBalances); - IDelegationManagerTypes.Withdrawal[] memory withdrawals = staker.queueWithdrawals(strategies, shares); + Withdrawal[] memory withdrawals = staker.queueWithdrawals(strategies, shares); /// Upgrade to slashing contracts _upgradeEigenLayerContracts(); @@ -40,7 +40,7 @@ contract Integration_Upgrade_Complete_PreSlashing_Withdrawal is UpgradeTest { staker.delegateTo(operator); staker.depositIntoEigenlayer(strategies, tokenBalances); uint[] memory shares = _calculateExpectedShares(strategies, tokenBalances); - IDelegationManagerTypes.Withdrawal[] memory withdrawals = staker.queueWithdrawals(strategies, shares); + Withdrawal[] memory withdrawals = staker.queueWithdrawals(strategies, shares); /// Upgrade to slashing contracts _upgradeEigenLayerContracts(); @@ -64,7 +64,7 @@ contract Integration_Upgrade_Complete_PreSlashing_Withdrawal is UpgradeTest { staker.depositIntoEigenlayer(strategies, tokenBalances); uint[] memory shares = _calculateExpectedShares(strategies, tokenBalances); uint[] memory expectedTokens = _calculateExpectedTokens(strategies, shares); - IDelegationManagerTypes.Withdrawal[] memory withdrawals = staker.queueWithdrawals(strategies, shares); + Withdrawal[] memory withdrawals = staker.queueWithdrawals(strategies, shares); /// Upgrade to slashing contracts _upgradeEigenLayerContracts(); @@ -90,7 +90,7 @@ contract Integration_Upgrade_Complete_PreSlashing_Withdrawal is UpgradeTest { staker.depositIntoEigenlayer(strategies, tokenBalances); uint[] memory shares = _calculateExpectedShares(strategies, tokenBalances); uint[] memory expectedTokens = _calculateExpectedTokens(strategies, shares); - IDelegationManagerTypes.Withdrawal[] memory withdrawals = staker.queueWithdrawals(strategies, shares); + Withdrawal[] memory withdrawals = staker.queueWithdrawals(strategies, shares); /// Upgrade to slashing contracts _upgradeEigenLayerContracts(); diff --git a/src/test/integration/tests/upgrade/Delegate_Upgrade_Allocate.t.sol b/src/test/integration/tests/upgrade/Delegate_Upgrade_Allocate.t.sol index 6c9ee61c65..8d878beec9 100644 --- a/src/test/integration/tests/upgrade/Delegate_Upgrade_Allocate.t.sol +++ b/src/test/integration/tests/upgrade/Delegate_Upgrade_Allocate.t.sol @@ -21,21 +21,20 @@ contract Integration_Upgrade_Deposit_Delegate_Allocate is UpgradeTest { // 3. Set allocation delay for operator operator.setAllocationDelay(1); - rollForward({blocks: ALLOCATION_CONFIGURATION_DELAY}); + rollForward({blocks: ALLOCATION_CONFIGURATION_DELAY + 1}); // 4. Create an operator set and register an operator. OperatorSet memory operatorSet = avs.createOperatorSet(strategies); operator.registerForOperatorSet(operatorSet); + check_Registration_State_NoAllocation(operator, operatorSet, allStrats); // 5. Allocate to operator set. - IAllocationManagerTypes.AllocateParams memory allocateParams = - operator.modifyAllocations(operatorSet, _randMagnitudes({sum: 1 ether, len: strategies.length})); - assert_Snap_Allocations_Modified( - operator, allocateParams, false, "operator allocations should be updated before delay" - ); - _rollBlocksForCompleteAllocation(operator, operatorSet, strategies); - assert_Snap_Allocations_Modified( - operator, allocateParams, true, "operator allocations should be updated after delay" - ); + AllocateParams memory allocateParams = AllocateParams({ + operatorSet: operatorSet, + strategies: strategies, + newMagnitudes: _randMagnitudes({sum: 1 ether, len: strategies.length}) + }); + operator.modifyAllocations(allocateParams); + check_IncrAlloc_State_Slashable(operator, allocateParams); } } \ No newline at end of file diff --git a/src/test/integration/users/User.t.sol b/src/test/integration/users/User.t.sol index f4a33b2b82..9b4b44be31 100644 --- a/src/test/integration/users/User.t.sol +++ b/src/test/integration/users/User.t.sol @@ -48,6 +48,8 @@ contract User is Logger, IDelegationManagerTypes, IAllocationManagerTypes { TimeMachine timeMachine; BeaconChainMock beaconChain; + uint32 public allocationDelay = 1; + string _NAME; // User's EigenPod and each of their validator indices within that pod @@ -92,44 +94,35 @@ contract User is Logger, IDelegationManagerTypes, IAllocationManagerTypes { /// @dev Allocates randomly across the operator set's strategies with a sum of `magnitudeSum`. /// NOTE: Calling more than once will lead to deallocations... function modifyAllocations( - OperatorSet memory operatorSet, - uint64[] memory magnitudes - ) public virtual createSnapshot returns (AllocateParams memory) { + AllocateParams memory params + ) public virtual createSnapshot { print.method( "modifyAllocations", string.concat( "{avs: ", - Logger(operatorSet.avs).NAME_COLORED(), + Logger(params.operatorSet.avs).NAME_COLORED(), ", operatorSetId: ", - cheats.toString(operatorSet.id), + cheats.toString(params.operatorSet.id), "}" ) ); - IStrategy[] memory strategies = allocationManager().getStrategiesInOperatorSet(operatorSet); - - require(strategies.length == magnitudes.length, "User.modifyAllocations: length mismatch"); - - AllocateParams[] memory allocateParams = AllocateParams({ - operatorSet: operatorSet, - strategies: strategies, - newMagnitudes: magnitudes - }).toArray(); - _tryPrankAppointee_AllocationManager(IAllocationManager.modifyAllocations.selector); - allocationManager().modifyAllocations(address(this), allocateParams); + allocationManager().modifyAllocations(address(this), params.toArray()); print.gasUsed(); - - return allocateParams[0]; } function deallocateAll( OperatorSet memory operatorSet ) public virtual returns (AllocateParams memory) { - return modifyAllocations( - operatorSet, - new uint64[](allocationManager().getStrategiesInOperatorSet(operatorSet).length) - ); + AllocateParams memory params; + params.operatorSet = operatorSet; + params.strategies = allocationManager().getStrategiesInOperatorSet(operatorSet); + params.newMagnitudes = new uint64[](params.strategies.length); + + modifyAllocations(params); + + return params; } function registerForOperatorSets( @@ -192,17 +185,17 @@ contract User is Logger, IDelegationManagerTypes, IAllocationManagerTypes { _tryPrankAppointee_AllocationManager(IAllocationManager.setAllocationDelay.selector); allocationManager().setAllocationDelay(address(this), delay); print.gasUsed(); + + allocationDelay = delay; } /// ----------------------------------------------------------------------- /// Delegation Manager Methods /// ----------------------------------------------------------------------- - uint32 withdrawalDelay = 1; - function registerAsOperator() public virtual createSnapshot { print.method("registerAsOperator"); - delegationManager.registerAsOperator(address(0), withdrawalDelay, "metadata"); + delegationManager.registerAsOperator(address(0), allocationDelay, "metadata"); print.gasUsed(); } @@ -316,7 +309,7 @@ contract User is Logger, IDelegationManagerTypes, IAllocationManagerTypes { function completeWithdrawalsAsShares( Withdrawal[] memory withdrawals ) public virtual createSnapshot returns (IERC20[][] memory tokens) { - print.method("completeWithdrawalAsShares"); + print.method("completeWithdrawalsAsShares"); tokens = new IERC20[][](withdrawals.length); for (uint256 i = 0; i < withdrawals.length; i++) { tokens[i] = _completeQueuedWithdrawal(withdrawals[i], false); diff --git a/src/test/unit/libraries/SnapshotsUnit.t.sol b/src/test/unit/libraries/SnapshotsUnit.t.sol index 086241c09b..be6eb40d38 100644 --- a/src/test/unit/libraries/SnapshotsUnit.t.sol +++ b/src/test/unit/libraries/SnapshotsUnit.t.sol @@ -51,6 +51,7 @@ contract SnapshotsUnitTests is Test { harness = new SnapshotsHarness(); } + /// forge-config: default.allow_internal_expect_revert = true function test_Revert_InvalidSnapshotOrdering(uint256 r) public { uint32 key = uint32(bound(r, 1, type(uint32).max)); uint32 smallerKey = uint32(bound(r, 0, key - 1)); diff --git a/src/test/unit/mixins/SignatureUtilsUnit.t.sol b/src/test/unit/mixins/SignatureUtilsUnit.t.sol index 645a2d9ec2..7600a2cabb 100644 --- a/src/test/unit/mixins/SignatureUtilsUnit.t.sol +++ b/src/test/unit/mixins/SignatureUtilsUnit.t.sol @@ -81,6 +81,7 @@ contract SignatureUtilsUnit is Test { ); } + /// forge-config: default.allow_internal_expect_revert = true function test_checkIsValidSignatureNow_Expired() public { (uint8 v, bytes32 r, bytes32 s) = vm.sign(signerPk, digest); diff --git a/src/test/utils/Logger.t.sol b/src/test/utils/Logger.t.sol index c3fd148c25..7a5aab8f99 100644 --- a/src/test/utils/Logger.t.sol +++ b/src/test/utils/Logger.t.sol @@ -46,10 +46,30 @@ abstract contract Logger is Test { /// Modifiers /// ----------------------------------------------------------------------- + // Address used to store a trace counter to allow us to use noTracing + // across any contract that inherits Logger + address constant LOG_STATE_ADDR = address(0xDEADBEEF); + bytes32 constant LOG_STATE_SLOT = bytes32(0); + modifier noTracing() { - cheats.pauseTracing(); + uint traceCounter = _getTraceCounter(); + if (traceCounter == 0) { + cheats.pauseTracing(); + } + + traceCounter++; + _setTraceCounter(traceCounter); + _; - cheats.resumeTracing(); + + traceCounter = _getTraceCounter(); + traceCounter--; + _setTraceCounter(traceCounter); + + if (traceCounter == 0) { + cheats.resumeTracing(); + } + } modifier noLogging() { @@ -77,7 +97,7 @@ abstract contract Logger is Test { /// @dev Returns `name` colored based logging its role. function colorByRole( string memory name - ) public view noTracing returns (string memory colored) { + ) public view returns (string memory colored) { bool isOperator = _contains(name, "operator"); bool isStaker = _contains(name, "staker"); bool isAVS = _contains(name, "avs"); @@ -105,8 +125,15 @@ abstract contract Logger is Test { function rollForward( uint256 blocks ) internal { - cheats.roll(block.timestamp + blocks); - console.log("%s.roll(%d)", colorByRole("cheats"), block.timestamp); + cheats.roll(block.number + blocks); + console.log("%s.roll(+ %d blocks)", colorByRole("cheats"), blocks); + } + + function rollBackward( + uint256 blocks + ) internal { + cheats.roll(block.number - blocks); + console.log("%s.roll(- %d blocks)", colorByRole("cheats"), blocks); } /// ----------------------------------------------------------------------- @@ -117,6 +144,18 @@ abstract contract Logger is Test { logging = !logging; console.log("\n%s logging %s...", NAME_COLORED(), logging ? "enabled" : "disabled"); } + + /// ----------------------------------------------------------------------- + /// Trace Counter get/set + /// ----------------------------------------------------------------------- + + function _getTraceCounter() internal view returns (uint) { + return uint(cheats.load(LOG_STATE_ADDR, LOG_STATE_SLOT)); + } + + function _setTraceCounter(uint _newValue) internal { + cheats.store(LOG_STATE_ADDR, LOG_STATE_SLOT, bytes32(_newValue)); + } } /// @dev Assumes the user is a `Logger`. From 30be88df0eb75f2bb9cbded51ece81f7bd59db55 Mon Sep 17 00:00:00 2001 From: Michael Sun <35479365+8sunyuan@users.noreply.github.com> Date: Thu, 30 Jan 2025 16:46:51 -0500 Subject: [PATCH 14/35] fix: overflow bug for pendingDiff input (#1027) * fix: overflow bug for pendingDiff input * test: add check to regression test --------- Co-authored-by: wadealexc --- src/contracts/core/AllocationManager.sol | 4 +- src/test/unit/AllocationManagerUnit.t.sol | 52 +++++++++++++++++++++++ 2 files changed, 55 insertions(+), 1 deletion(-) diff --git a/src/contracts/core/AllocationManager.sol b/src/contracts/core/AllocationManager.sol index 9d5195baf6..dc6258d808 100644 --- a/src/contracts/core/AllocationManager.sol +++ b/src/contracts/core/AllocationManager.sol @@ -21,6 +21,7 @@ contract AllocationManager is { using DoubleEndedQueue for DoubleEndedQueue.Bytes32Deque; using EnumerableSet for *; + using SafeCast for *; using Snapshots for Snapshots.DefaultWadHistory; using OperatorSetLib for OperatorSet; @@ -588,8 +589,9 @@ contract AllocationManager is return int128(uint128(newMagnitude)) - int128(uint128(currentMagnitude)); } + /// @dev Use safe casting when downcasting to uint64 function _addInt128(uint64 a, int128 b) internal pure returns (uint64) { - return uint64(uint128(int128(uint128(a)) + b)); + return uint256(int256(int128(uint128(a)) + b)).toUint64(); } /** diff --git a/src/test/unit/AllocationManagerUnit.t.sol b/src/test/unit/AllocationManagerUnit.t.sol index ebd8ca1243..5563af6836 100644 --- a/src/test/unit/AllocationManagerUnit.t.sol +++ b/src/test/unit/AllocationManagerUnit.t.sol @@ -1995,6 +1995,58 @@ contract AllocationManagerUnitTests_ModifyAllocations is AllocationManagerUnitTe allocationManager.modifyAllocations(defaultOperator, allocateParams); } + function test_revert_safeCastOverflow() public { + // setup additional operatorSets for tests + OperatorSet memory opSet1 = OperatorSet(defaultAVS, 1); + _createOperatorSet(opSet1, defaultStrategies); + _registerOperator(defaultOperator); + _setAllocationDelay(defaultOperator, DEFAULT_OPERATOR_ALLOCATION_DELAY); + _registerForOperatorSet(defaultOperator, opSet1); + + OperatorSet memory opSet2 = OperatorSet(defaultAVS, 2); + _createOperatorSet(opSet2, defaultStrategies); + _registerOperator(defaultOperator); + _setAllocationDelay(defaultOperator, DEFAULT_OPERATOR_ALLOCATION_DELAY); + _registerForOperatorSet(defaultOperator, opSet2); + + // 1. Allocate all available magnitude for the strategy (WAD) + AllocateParams[] memory allocateParams = _randAllocateParams_DefaultOpSet(); + allocateParams[0].newMagnitudes[0] = WAD; + cheats.prank(defaultOperator); + allocationManager.modifyAllocations(defaultOperator, allocateParams); + assertEq( + allocationManager.getAllocatableMagnitude(defaultOperator, strategyMock), + 0, + "Allocatable magnitude should be 0" + ); + assertEq( + allocationManager.getEncumberedMagnitude(defaultOperator, strategyMock), + WAD, + "Encumbered magnitude should be WAD" + ); + + // 2. allocate to another operatorSet for the same strategy to reset encumberedMagnitude back to 0 + allocateParams[0].operatorSet = opSet1; + allocateParams[0].newMagnitudes[0] = type(uint64).max - WAD + 1; + cheats.prank(defaultOperator); + cheats.expectRevert("SafeCast: value doesn't fit in 64 bits"); + allocationManager.modifyAllocations(defaultOperator, allocateParams); + + // 3. after resetting encumberedMagnitude, attempt to allocate to opSet2 with WAD + allocateParams[0].operatorSet = opSet2; + allocateParams[0].newMagnitudes[0] = WAD; + cheats.prank(defaultOperator); + cheats.expectRevert(InsufficientMagnitude.selector); + allocationManager.modifyAllocations(defaultOperator, allocateParams); + + // 4. after resetting encumberedMagnitude, attempt to allocate to opSet2 with 1 + allocateParams[0].operatorSet = opSet2; + allocateParams[0].newMagnitudes[0] = 1; + cheats.prank(defaultOperator); + cheats.expectRevert(InsufficientMagnitude.selector); + allocationManager.modifyAllocations(defaultOperator, allocateParams); + } + /** * @notice Tests edge cases around allocation delay: * 1. Set allocation delay to a value greater than ALLOCATION_CONFIGURATION_DELAY From 5a72af6efa7f6b75565febb7f6e21706998d0c0f Mon Sep 17 00:00:00 2001 From: Michael Sun <35479365+8sunyuan@users.noreply.github.com> Date: Thu, 30 Jan 2025 17:09:35 -0500 Subject: [PATCH 15/35] fix: overwriting existing pending modifications (#1052) * test: regression tests showing invalid state * fix: require check and update tests --- src/contracts/core/AllocationManager.sol | 2 +- .../harnesses/AllocationManagerHarness.sol | 32 +++ src/test/unit/AllocationManagerUnit.t.sol | 215 +++++++++++++++++- 3 files changed, 243 insertions(+), 6 deletions(-) create mode 100644 src/test/harnesses/AllocationManagerHarness.sol diff --git a/src/contracts/core/AllocationManager.sol b/src/contracts/core/AllocationManager.sol index dc6258d808..3b6c36b020 100644 --- a/src/contracts/core/AllocationManager.sol +++ b/src/contracts/core/AllocationManager.sol @@ -184,7 +184,7 @@ contract AllocationManager is (StrategyInfo memory info, Allocation memory allocation) = _getUpdatedAllocation(operator, operatorSet.key(), strategy); - require(allocation.pendingDiff == 0, ModificationAlreadyPending()); + require(allocation.effectBlock == 0, ModificationAlreadyPending()); // 2. Check whether the operator's allocation is slashable. If not, we allow instant // deallocation. diff --git a/src/test/harnesses/AllocationManagerHarness.sol b/src/test/harnesses/AllocationManagerHarness.sol new file mode 100644 index 0000000000..abe08266c2 --- /dev/null +++ b/src/test/harnesses/AllocationManagerHarness.sol @@ -0,0 +1,32 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.27; + +import "../../contracts/core/AllocationManager.sol"; + +contract AllocationManagerHarness is AllocationManager { + using DoubleEndedQueue for DoubleEndedQueue.Bytes32Deque; + + constructor( + IDelegationManager _delegation, + IPauserRegistry _pauserRegistry, + IPermissionController _permissionController, + uint32 _DEALLOCATION_DELAY, + uint32 _ALLOCATION_CONFIGURATION_DELAY + ) + AllocationManager( + _delegation, + _pauserRegistry, + _permissionController, + _DEALLOCATION_DELAY, + _ALLOCATION_CONFIGURATION_DELAY + ) + {} + + function deallocationQueueAtIndex( + address operator, + IStrategy strategy, + uint256 index + ) external view returns (bytes32) { + return deallocationQueue[operator][strategy].at(index); + } +} diff --git a/src/test/unit/AllocationManagerUnit.t.sol b/src/test/unit/AllocationManagerUnit.t.sol index 5563af6836..f9fa209149 100644 --- a/src/test/unit/AllocationManagerUnit.t.sol +++ b/src/test/unit/AllocationManagerUnit.t.sol @@ -1,7 +1,7 @@ // SPDX-License-Identifier: BUSL-1.1 pragma solidity ^0.8.27; -import "src/contracts/core/AllocationManager.sol"; +import "src/test/harnesses/AllocationManagerHarness.sol"; import "src/test/utils/EigenLayerUnitTestSetup.sol"; import "src/test/mocks/MockAVSRegistrar.sol"; @@ -33,7 +33,7 @@ contract AllocationManagerUnitTests is EigenLayerUnitTestSetup, IAllocationManag /// Mocks /// ----------------------------------------------------------------------- - AllocationManager allocationManager; + AllocationManagerHarness allocationManager; ERC20PresetFixedSupply tokenMock; StrategyBase strategyMock; @@ -86,12 +86,12 @@ contract AllocationManagerUnitTests is EigenLayerUnitTestSetup, IAllocationManag address _initialOwner, IPauserRegistry _pauserRegistry, uint256 _initialPausedStatus - ) internal returns (AllocationManager) { - return allocationManager = AllocationManager( + ) internal returns (AllocationManagerHarness) { + return allocationManager = AllocationManagerHarness( address( new TransparentUpgradeableProxy( address( - new AllocationManager( + new AllocationManagerHarness( IDelegationManager(address(delegationManagerMock)), _pauserRegistry, IPermissionController(address(permissionController)), @@ -254,6 +254,23 @@ contract AllocationManagerUnitTests is EigenLayerUnitTestSetup, IAllocationManag console.log("Success!".green().bold()); } + /// @dev Check that the deallocation queue is in ascending order of effectBlocks + function _checkDeallocationQueueOrder(address operator, IStrategy strategy, uint256 numDeallocations) internal view { + uint32 lastEffectBlock = 0; + + for (uint256 i = 0; i < numDeallocations; ++i) { + bytes32 operatorSetKey = allocationManager.deallocationQueueAtIndex(operator, strategy, i); + Allocation memory allocation = allocationManager.getAllocation(operator, OperatorSetLib.decode(operatorSetKey), strategy); + + assertTrue( + lastEffectBlock <= allocation.effectBlock, + "Deallocation queue is not in ascending order of effectBlocks" + ); + + lastEffectBlock = allocation.effectBlock; + } + } + function _checkSlashableStake( OperatorSet memory operatorSet, address operator, @@ -1918,6 +1935,194 @@ contract AllocationManagerUnitTests_ModifyAllocations is AllocationManagerUnitTe allocationManager.modifyAllocations(defaultOperator, allocateParams); } + /** + * @notice Regression tests for the bugfix where pending modifications were checked by + * require(allocation.pendingDiff == 0, ModificationAlreadyPending()); + * which would overwrite the effectBlock, pendingDiff if a pendingDiff + * of a deallocation was slashed to become 0. + * + * This test checks that the effectBlock, pendingDiff are not overwritten even if the pendingDiff is 0 + * when attempting to modify allocations again + */ + function test_modifyAllocations_PendingDiffZero() public { + // Step 1: Allocate to the operator set + AllocateParams[] memory allocateParams = _newAllocateParams(defaultOperatorSet, 501); + cheats.prank(defaultOperator); + allocationManager.modifyAllocations(defaultOperator, allocateParams); + + // Step 2: Roll blocks forward until the allocation effectBlock + cheats.roll(block.number + DEFAULT_OPERATOR_ALLOCATION_DELAY); + + // Step 3: Deallocate from the operator set + AllocateParams[] memory deallocateParams = _newAllocateParams(defaultOperatorSet, 500); + cheats.prank(defaultOperator); + allocationManager.modifyAllocations(defaultOperator, deallocateParams); + + Allocation memory allocation = allocationManager.getAllocation(defaultOperator, defaultOperatorSet, strategyMock); + uint32 originalEffectBlock = allocation.effectBlock; + + // Step 4: Slash the operator to adjust pendingDiff to 0, slashing rounds up the amount of magnitude to slash + // so with an existing deallocation/pendingDiff of 1, it should result in a pendingDiff of 0 + SlashingParams memory slashingParams = SlashingParams({ + operator: defaultOperator, + operatorSetId: defaultOperatorSet.id, + strategies: defaultStrategies, + wadsToSlash: 5e17.toArrayU256(), + description: "Test slashing" + }); + cheats.prank(defaultAVS); + allocationManager.slashOperator(defaultAVS, slashingParams); + allocation = allocationManager.getAllocation(defaultOperator, defaultOperatorSet, strategyMock); + assertEq(allocation.pendingDiff, 0, "Pending diff should be 0"); + assertEq(allocation.effectBlock, originalEffectBlock, "Effect block should not have changed"); + + // Step 5: Modify allocations again (Should not be called) + AllocateParams[] memory newAllocateParams = _newAllocateParams(defaultOperatorSet, 1000); + cheats.prank(defaultOperator); + cheats.expectRevert(ModificationAlreadyPending.selector); + allocationManager.modifyAllocations(defaultOperator, newAllocateParams); + + // Assert that the allocation was modified without reverting + allocation = allocationManager.getAllocation(defaultOperator, defaultOperatorSet, strategyMock); + assertEq(allocation.currentMagnitude, 250, "Allocation should be updated to 250 after slashing 50%"); + + // Note: These 2 assertions fail prior to the bugfix and if we kept the same + // require(allocation.pendingDiff == 0, ModificationAlreadyPending()); + // in the code. The effectBlock, pendingDiff would get overwritten with the new modification + // but the deallocationQueue would now be unordered(in terms of effectBlocks) with this overwrite. + assertEq(allocation.effectBlock, originalEffectBlock, "Effect block should not have changed"); + assertEq(allocation.pendingDiff, 0, "Pending diff should still be 0"); + } + + /** + * @notice Regression tests for the bugfix where pending modifications were checked by + * require(allocation.pendingDiff == 0, ModificationAlreadyPending()); + * which would overwrite the effectBlock, pendingDiff if a pendingDiff + * of a deallocation was slashed to become 0. + * + * This test checks that the deallocationQueue is ascending ordered by effectBlocks + */ + function test_modifyAllocations_PendingDiffZero_CheckOrderedDeallocationQueue() public { + // Step 1: Register the operator to multiple operator sets + OperatorSet memory operatorSet1 = OperatorSet(defaultAVS, 1); + OperatorSet memory operatorSet2 = OperatorSet(defaultAVS, 2); + _createOperatorSet(operatorSet1, defaultStrategies); + _createOperatorSet(operatorSet2, defaultStrategies); + _registerForOperatorSet(defaultOperator, operatorSet1); + _registerForOperatorSet(defaultOperator, operatorSet2); + + // Step 2: Allocate to both operator sets + AllocateParams[] memory allocateParams1 = _newAllocateParams(operatorSet1, 1001); + AllocateParams[] memory allocateParams2 = _newAllocateParams(operatorSet2, 1000); + cheats.prank(defaultOperator); + allocationManager.modifyAllocations(defaultOperator, allocateParams1); + cheats.prank(defaultOperator); + allocationManager.modifyAllocations(defaultOperator, allocateParams2); + + // Step 3: Roll blocks forward until the allocation effectBlock + cheats.roll(block.number + DEFAULT_OPERATOR_ALLOCATION_DELAY); + + // Step 4: Deallocate from both operator sets + AllocateParams[] memory deallocateParams1 = _newAllocateParams(operatorSet1, 1000); + AllocateParams[] memory deallocateParams2 = _newAllocateParams(operatorSet2, 0); + cheats.prank(defaultOperator); + allocationManager.modifyAllocations(defaultOperator, deallocateParams1); + // roll blocks forward so that deallocations have different effectBlocks + cheats.roll(block.number + 100); + cheats.prank(defaultOperator); + allocationManager.modifyAllocations(defaultOperator, deallocateParams2); + + // Step 5: Slash the first deallocation to adjust pendingDiff to 0 + SlashingParams memory slashingParams1 = SlashingParams({ + operator: defaultOperator, + operatorSetId: operatorSet1.id, + strategies: defaultStrategies, + wadsToSlash: 5e17.toArrayU256(), + description: "Test slashing" + }); + cheats.prank(defaultAVS); + allocationManager.slashOperator(defaultAVS, slashingParams1); + + // Step 6: Modify allocations again for operatorSet1 making another deallocation and + // overwriting/increasing the effectBlock + // roll blocks forward so that deallocations have different effectBlocks + cheats.roll(block.number + 100); + // Note: this should revert but previously it would not prior to the bugfix + AllocateParams[] memory newAllocateParams1 = _newAllocateParams(operatorSet1, 400); + cheats.prank(defaultOperator); + cheats.expectRevert(ModificationAlreadyPending.selector); + allocationManager.modifyAllocations(defaultOperator, newAllocateParams1); + + // Assert that the deallocationQueue is unordered for the 2 deallocations in queue + _checkDeallocationQueueOrder(defaultOperator, defaultStrategies[0], 2); + } + + /** + * @notice Regression tests for the bugfix where pending modifications were checked by + * require(allocation.pendingDiff == 0, ModificationAlreadyPending()); + * which would overwrite the effectBlock, pendingDiff if a pendingDiff + * of a deallocation was slashed to become 0. + * + * This test checks that the deallocationQueue is ascending ordered by effectBlocks + * In this case the new modifyAllocations call is an allocation + * where the effectBlock is increased and the deallocationQueue is unordered as well because the operator + * allocationDelay configured to be long enough. + */ + function test_modifyAllocations_PendingDiffZero_Allocation() public { + // Step 1: Register the operator to multiple operator sets + OperatorSet memory operatorSet1 = OperatorSet(defaultAVS, 1); + OperatorSet memory operatorSet2 = OperatorSet(defaultAVS, 2); + _createOperatorSet(operatorSet1, defaultStrategies); + _createOperatorSet(operatorSet2, defaultStrategies); + _registerForOperatorSet(defaultOperator, operatorSet1); + _registerForOperatorSet(defaultOperator, operatorSet2); + + // Step 2: Allocate to both operator sets + AllocateParams[] memory allocateParams1 = _newAllocateParams(operatorSet1, 1001); + AllocateParams[] memory allocateParams2 = _newAllocateParams(operatorSet2, 1000); + cheats.prank(defaultOperator); + allocationManager.modifyAllocations(defaultOperator, allocateParams1); + cheats.prank(defaultOperator); + allocationManager.modifyAllocations(defaultOperator, allocateParams2); + + // Step 3: Update operator allocation delay + cheats.prank(defaultOperator); + allocationManager.setAllocationDelay(defaultOperator, DEALLOCATION_DELAY + 10 days); + cheats.roll(block.number + ALLOCATION_CONFIGURATION_DELAY); + + // Step 4: Deallocate from both operator sets + AllocateParams[] memory deallocateParams1 = _newAllocateParams(operatorSet1, 1000); + AllocateParams[] memory deallocateParams2 = _newAllocateParams(operatorSet2, 0); + cheats.prank(defaultOperator); + allocationManager.modifyAllocations(defaultOperator, deallocateParams1); + // roll blocks forward so that deallocations have different effectBlocks + cheats.roll(block.number + 100); + cheats.prank(defaultOperator); + allocationManager.modifyAllocations(defaultOperator, deallocateParams2); + + // Step 5: Slash the first deallocation to adjust pendingDiff to 0 + SlashingParams memory slashingParams1 = SlashingParams({ + operator: defaultOperator, + operatorSetId: operatorSet1.id, + strategies: defaultStrategies, + wadsToSlash: 5e17.toArrayU256(), + description: "Test slashing" + }); + cheats.prank(defaultAVS); + allocationManager.slashOperator(defaultAVS, slashingParams1); + + // Step 6: Modify allocations again for operatorSet1 making an allocation and + // overwriting/increasing the effectBlock + // Note: this should revert but previously it would not prior to the bugfix + AllocateParams[] memory newAllocateParams1 = _newAllocateParams(operatorSet1, 5000); + cheats.prank(defaultOperator); + cheats.expectRevert(ModificationAlreadyPending.selector); + allocationManager.modifyAllocations(defaultOperator, newAllocateParams1); + + // Assert that the deallocationQueue is unordered for the 2 deallocations in queue + _checkDeallocationQueueOrder(defaultOperator, defaultStrategies[0], 2); + } + function test_revert_allocateZeroMagnitude() public { // Allocate exact same magnitude as initial allocation (0) AllocateParams[] memory allocateParams = _randAllocateParams_DefaultOpSet(); From becf6b343ec920193657ba0fbd98d5d7b529dc38 Mon Sep 17 00:00:00 2001 From: Yash Patil <40046473+ypatil12@users.noreply.github.com> Date: Mon, 3 Feb 2025 12:15:46 -0500 Subject: [PATCH 16/35] fix: ep negative shares bug (#1033) * fix: ep negative shares bug * fix: comments * test: add integration tests for neg shares * chore: remove logs * chore: use already calculated delta * chore: use stable foundry release in CI --- src/contracts/pods/EigenPodManager.sol | 10 +- src/test/integration/IntegrationBase.t.sol | 8 +- .../upgrade/EigenPod_Negative_Shares.t.sol | 133 ++++++++++++++++++ src/test/integration/users/User.t.sol | 6 +- src/test/integration/users/User_M2.t.sol | 2 +- src/test/unit/EigenPodManagerUnit.t.sol | 64 +++++++++ 6 files changed, 216 insertions(+), 7 deletions(-) create mode 100644 src/test/integration/tests/upgrade/EigenPod_Negative_Shares.t.sol diff --git a/src/contracts/pods/EigenPodManager.sol b/src/contracts/pods/EigenPodManager.sol index c1ffc9dea4..03d304e387 100644 --- a/src/contracts/pods/EigenPodManager.sol +++ b/src/contracts/pods/EigenPodManager.sol @@ -262,8 +262,14 @@ contract EigenPodManager is if (updatedDepositShares <= 0) { return (0, 0); } - - return (prevDepositShares < 0 ? 0 : uint256(prevDepositShares), shares); + // If we have gone from negative to positive shares, return (0, positive delta) + else if (prevDepositShares < 0) { + return (0, uint256(updatedDepositShares)); + } + // Else, return true previous shares and added shares + else { + return (uint256(prevDepositShares), shares); + } } /// @dev Calculates the proportion a pod owner's restaked balance has decreased, and diff --git a/src/test/integration/IntegrationBase.t.sol b/src/test/integration/IntegrationBase.t.sol index 95910a00e2..1afb808beb 100644 --- a/src/test/integration/IntegrationBase.t.sol +++ b/src/test/integration/IntegrationBase.t.sol @@ -2017,7 +2017,13 @@ abstract contract IntegrationBase is IntegrationDeployer, TypeImporter { } function _calcNativeETHOperatorShareDelta(User staker, int shareDelta) internal view returns (int) { - int curPodOwnerShares = eigenPodManager.podOwnerDepositShares(address(staker)); + // TODO: Maybe we update parent method to have an M2 and Slashing version? + int curPodOwnerShares; + if (!isUpgraded) { + curPodOwnerShares = IEigenPodManager_DeprecatedM2(address(eigenPodManager)).podOwnerShares(address(staker)); + } else { + curPodOwnerShares = eigenPodManager.podOwnerDepositShares(address(staker)); + } int newPodOwnerShares = curPodOwnerShares + shareDelta; if (curPodOwnerShares <= 0) { diff --git a/src/test/integration/tests/upgrade/EigenPod_Negative_Shares.t.sol b/src/test/integration/tests/upgrade/EigenPod_Negative_Shares.t.sol new file mode 100644 index 0000000000..0897123c93 --- /dev/null +++ b/src/test/integration/tests/upgrade/EigenPod_Negative_Shares.t.sol @@ -0,0 +1,133 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.27; + +import "src/test/integration/UpgradeTest.t.sol"; + +contract Integration_Upgrade_EigenPod_Negative_Shares is UpgradeTest { + function _init() internal override { + _configAssetTypes(HOLDS_ETH); + _configUserTypes(DEFAULT); + } + + function testFuzz_deposit_delegate_updateBalance_upgrade_completeAsShares( + uint24 _rand + ) public rand(_rand) { + /// 0. Create an operator and staker with some underlying assets + (User staker, IStrategy[] memory strategies, uint256[] memory tokenBalances) = _newRandomStaker(); + (User operator,,) = _newRandomOperator(); + uint256[] memory shares = _calculateExpectedShares(strategies, tokenBalances); + + /// 1. Deposit into strategies + staker.depositIntoEigenlayer(strategies, tokenBalances); + + /// 2. Delegate to operator + staker.delegateTo(operator); + + /// 3. Queue a withdrawal for all shares + IDelegationManagerTypes.Withdrawal[] memory withdrawals = staker.queueWithdrawals(strategies, shares); + IDelegationManagerTypes.Withdrawal memory withdrawal = withdrawals[0]; + + /// 4. Update balance randomly (can be positive or negative) + (int256[] memory tokenDeltas, int256[] memory balanceUpdateShareDelta,) = _randBalanceUpdate(staker, strategies); + staker.updateBalances(strategies, tokenDeltas); + + /// 5. Upgrade contracts + _upgradeEigenLayerContracts(); + + /// 6. Complete the withdrawal as shares + _rollBlocksForCompleteWithdrawals(withdrawals); + staker.completeWithdrawalAsShares(withdrawal); + + // Manually complete checks since we could still negative shares prior to the upgrade, causing a revert in the share check + (uint256[] memory expectedOperatorShareDelta, int256[] memory expectedStakerShareDelta) = + _getPostWithdrawalExpectedShareDeltas(balanceUpdateShareDelta[0], withdrawal); + assert_WithdrawalNotPending(delegationManager.calculateWithdrawalRoot(withdrawal), "staker withdrawal should no longer be pending"); + assert_Snap_Unchanged_TokenBalances(staker, "staker should not have any change in underlying token balances"); + assert_Snap_Added_OperatorShares(operator, withdrawal.strategies, expectedOperatorShareDelta, "operator should have received shares"); + assert_Snap_Delta_StakerShares(staker, strategies, expectedStakerShareDelta, "staker should have received expected shares"); + } + + function testFuzz_deposit_delegate_updateBalance_upgrade_completeAsTokens( + uint24 _rand + ) public rand(_rand) { + /// 0. Create an operator and staker with some underlying assets + (User staker, IStrategy[] memory strategies, uint256[] memory tokenBalances) = _newRandomStaker(); + (User operator,,) = _newRandomOperator(); + uint256[] memory shares = _calculateExpectedShares(strategies, tokenBalances); + + /// 1. Deposit into strategies + staker.depositIntoEigenlayer(strategies, tokenBalances); + + /// 2. Delegate to operator + staker.delegateTo(operator); + + /// 3. Queue a withdrawal for all shares + IDelegationManagerTypes.Withdrawal[] memory withdrawals = staker.queueWithdrawals(strategies, shares); + IDelegationManagerTypes.Withdrawal memory withdrawal = withdrawals[0]; + + /// 4. Update balance randomly (can be positive or negative) + (int256[] memory tokenDeltas, int256[] memory balanceUpdateShareDelta,) = _randBalanceUpdate(staker, strategies); + staker.updateBalances(strategies, tokenDeltas); + + /// 5. Upgrade contracts + _upgradeEigenLayerContracts(); + + /// 6. Complete the withdrawal as shares + _rollBlocksForCompleteWithdrawals(withdrawals); + IERC20[] memory tokens = staker.completeWithdrawalAsTokens(withdrawal); + uint256[] memory expectedTokens = _getPostWithdrawalExpectedTokenDeltas(balanceUpdateShareDelta[0], withdrawal); + + // Manually complete checks since we could still negative shares prior to the upgrade, causing a revert in the share check + assert_WithdrawalNotPending(delegationManager.calculateWithdrawalRoot(withdrawal), "staker withdrawal should no longer be pending"); + assert_Snap_Added_TokenBalances(staker, tokens, expectedTokens, "staker should have received expected tokens"); + assert_Snap_Unchanged_OperatorShares(operator, "operator shares should not have changed"); + + // If we had a positive balance update, then the staker shares should not have changed + if (balanceUpdateShareDelta[0] > 0) { + assert_Snap_Unchanged_Staker_DepositShares(staker, "staker shares should not have changed"); + } + // Else, the staker shares should have increased by the magnitude of the negative share delta + else { + int256[] memory expectedStakerShareDelta = new int256[](1); + expectedStakerShareDelta[0] = -balanceUpdateShareDelta[0]; + assert_Snap_Delta_StakerShares(staker, strategies, expectedStakerShareDelta, "staker should have received expected shares"); + } + } + + + + function _getPostWithdrawalExpectedShareDeltas( + int256 balanceUpdateShareDelta, + IDelegationManagerTypes.Withdrawal memory withdrawal + ) internal pure returns (uint256[] memory, int256[] memory) { + uint256[] memory operatorShareDelta = new uint256[](1); + int256[] memory stakerShareDelta = new int256[](1); + // The staker share delta is the withdrawal scaled shares since it can go from negative to positive + stakerShareDelta[0] = int256(withdrawal.scaledShares[0]); + + if (balanceUpdateShareDelta > 0) { + // If balanceUpdateShareDelta is positive, then the operator delta is the withdrawal scaled shares + operatorShareDelta[0] = withdrawal.scaledShares[0]; + } else { + // Operator shares never went negative, so we can just add the withdrawal scaled shares and the negative share delta + operatorShareDelta[0] = uint256(int256(withdrawal.scaledShares[0]) + balanceUpdateShareDelta); + } + + return (operatorShareDelta, stakerShareDelta); + } + + function _getPostWithdrawalExpectedTokenDeltas( + int256 balanceUpdateShareDelta, + IDelegationManagerTypes.Withdrawal memory withdrawal + ) internal pure returns (uint256[] memory) { + uint256[] memory expectedTokenDeltas = new uint256[](1); + if (balanceUpdateShareDelta > 0) { + // If we had a positive balance update, then the expected token delta is the withdrawal scaled shares + expectedTokenDeltas[0] = withdrawal.scaledShares[0]; + } else { + // If we had a negative balance update, then the expected token delta is the withdrawal scaled shares plus the negative share delta + expectedTokenDeltas[0] = uint256(int256(withdrawal.scaledShares[0]) + balanceUpdateShareDelta); + } + return expectedTokenDeltas; + } +} diff --git a/src/test/integration/users/User.t.sol b/src/test/integration/users/User.t.sol index 9b4b44be31..d24daf723e 100644 --- a/src/test/integration/users/User.t.sol +++ b/src/test/integration/users/User.t.sol @@ -458,9 +458,9 @@ contract User is Logger, IDelegationManagerTypes, IAllocationManagerTypes { if (strat == BEACONCHAIN_ETH_STRAT) { tokens[i] = NATIVE_ETH; - // If we're withdrawing native ETH as tokens, stop ALL validators - // and complete a checkpoint - if (receiveAsTokens) { + // If we're withdrawing native ETH as tokens && do not have negative shares + // stop ALL validators and complete a checkpoint + if (receiveAsTokens && eigenPodManager.podOwnerDepositShares(address(this)) >= 0) { console.log("- exiting all validators and completing checkpoint"); _exitValidators(getActiveValidators()); diff --git a/src/test/integration/users/User_M2.t.sol b/src/test/integration/users/User_M2.t.sol index 3fd7d2c2b7..0afdf0211b 100644 --- a/src/test/integration/users/User_M2.t.sol +++ b/src/test/integration/users/User_M2.t.sol @@ -137,7 +137,7 @@ contract User_M2 is User { // If any balance update has occurred, a checkpoint will pick it up _startCheckpoint(); if (pod.activeValidatorCount() != 0) { - _completeCheckpoint(); + _completeCheckpoint_M2(); } } else { uint256 tokens = uint256(delta); diff --git a/src/test/unit/EigenPodManagerUnit.t.sol b/src/test/unit/EigenPodManagerUnit.t.sol index 4cb3d3ec97..6aa8282ce5 100644 --- a/src/test/unit/EigenPodManagerUnit.t.sol +++ b/src/test/unit/EigenPodManagerUnit.t.sol @@ -185,6 +185,22 @@ contract EigenPodManagerUnitTests_StakeTests is EigenPodManagerUnitTests { contract EigenPodManagerUnitTests_ShareUpdateTests is EigenPodManagerUnitTests { + // Wrapper contract that exposes the internal `_calculateChangeInDelegatableShares` function + EigenPodManagerWrapper public eigenPodManagerWrapper; + + function setUp() virtual override public { + super.setUp(); + + // Upgrade eigenPodManager to wrapper + eigenPodManagerWrapper = new EigenPodManagerWrapper( + ethPOSMock, + eigenPodBeacon, + IDelegationManager(address(delegationManagerMock)), + pauserRegistry + ); + eigenLayerProxyAdmin.upgrade(ITransparentUpgradeableProxy(payable(address(eigenPodManager))), address(eigenPodManagerWrapper)); + } + /******************************************************************************* Add Shares Tests *******************************************************************************/ @@ -223,6 +239,54 @@ contract EigenPodManagerUnitTests_ShareUpdateTests is EigenPodManagerUnitTests { assertEq(eigenPodManager.podOwnerDepositShares(defaultStaker), int256(shares), "Incorrect number of shares added"); } + function test_addShares_negativeInitial() public { + _initializePodWithShares(defaultStaker, -1); + + cheats.prank(address(delegationManagerMock)); + + (uint256 prevDepositShares, uint256 addedShares) = eigenPodManager.addShares( + defaultStaker, + beaconChainETHStrategy, + 5 + ); + + assertEq(prevDepositShares, 0); + assertEq(addedShares, 4); + } + + function testFuzz_addShares_negativeSharesInitial(int256 sharesToStart, int256 sharesToAdd) public { + cheats.assume(sharesToStart < 0); + cheats.assume(sharesToAdd >= 0); + + _initializePodWithShares(defaultStaker, sharesToStart); + int256 expectedDepositShares = sharesToStart + sharesToAdd; + + cheats.prank(address(delegationManagerMock)); + + cheats.expectEmit(true, true, true, true, address(eigenPodManager)); + emit PodSharesUpdated(defaultStaker, sharesToAdd); + cheats.expectEmit(true, true, true, true, address(eigenPodManager)); + emit NewTotalShares(defaultStaker, expectedDepositShares); + + (uint256 prevDepositShares, uint256 addedShares) = eigenPodManager.addShares( + defaultStaker, + beaconChainETHStrategy, + uint256(sharesToAdd) + ); + + // validate that prev shares return 0 since we started from a negative balance + assertEq(prevDepositShares, 0); + + // If we now have positive shares, expect return + if (expectedDepositShares > 0) { + assertEq(addedShares, uint256(expectedDepositShares)); + } + // We still have negative shares, return 0 + else { + assertEq(addedShares, 0); + } + } + /******************************************************************************* Remove Shares Tests ******************************************************************************/ From 3d8f6804dd6f8a098c1064f95e214de8acc3fd0e Mon Sep 17 00:00:00 2001 From: Bowen Li Date: Tue, 4 Feb 2025 15:09:17 -0800 Subject: [PATCH 17/35] feat: add OperatorSharesSlashed event to track shares slashed per operator (#1051) * feat: add OperatorSharesSlashed event to track shares slashed per operator * feat: add unit tests * fix: add more tests --- src/contracts/core/DelegationManager.sol | 3 ++ .../interfaces/IDelegationManager.sol | 3 ++ src/test/unit/DelegationUnit.t.sol | 44 +++++++++++++++++++ 3 files changed, 50 insertions(+) diff --git a/src/contracts/core/DelegationManager.sol b/src/contracts/core/DelegationManager.sol index 658b3e9999..17a99031b4 100644 --- a/src/contracts/core/DelegationManager.sol +++ b/src/contracts/core/DelegationManager.sol @@ -307,6 +307,9 @@ contract DelegationManager is sharesToDecrease: operatorSharesSlashed }); + // Emit event for operator shares being slashed + emit OperatorSharesSlashed(operator, strategy, totalDepositSharesToBurn); + IShareManager shareManager = _getShareManager(strategy); // NOTE: for beaconChainETHStrategy, increased burnable shares currently have no mechanism for burning shareManager.increaseBurnableShares(strategy, totalDepositSharesToBurn); diff --git a/src/contracts/interfaces/IDelegationManager.sol b/src/contracts/interfaces/IDelegationManager.sol index ce57304d64..80bd59418c 100644 --- a/src/contracts/interfaces/IDelegationManager.sol +++ b/src/contracts/interfaces/IDelegationManager.sol @@ -170,6 +170,9 @@ interface IDelegationManagerEvents is IDelegationManagerTypes { /// @notice Emitted when a queued withdrawal is completed event SlashingWithdrawalCompleted(bytes32 withdrawalRoot); + + /// @notice Emitted whenever an operator's shares are slashed for a given strategy + event OperatorSharesSlashed(address indexed operator, IStrategy strategy, uint256 totalSlashedShares); } /** diff --git a/src/test/unit/DelegationUnit.t.sol b/src/test/unit/DelegationUnit.t.sol index da504d2637..846c232e79 100644 --- a/src/test/unit/DelegationUnit.t.sol +++ b/src/test/unit/DelegationUnit.t.sol @@ -6910,6 +6910,11 @@ contract DelegationManagerUnitTests_slashingShares is DelegationManagerUnitTests sharesToBurn: sharesToBurn }) ); + + // Assert OperatorSharesSlashed event was emitted with correct params + cheats.expectEmit(true, true, true, true, address(delegationManager)); + emit OperatorSharesSlashed(operator, strategyMock, sharesToBurn); + cheats.prank(address(allocationManagerMock)); delegationManager.slashOperatorShares({ operator: operator, @@ -6994,6 +6999,11 @@ contract DelegationManagerUnitTests_slashingShares is DelegationManagerUnitTests sharesToBurn: sharesToBurn }) ); + + // Assert OperatorSharesSlashed event was emitted with correct params + cheats.expectEmit(true, true, true, true, address(delegationManager)); + emit OperatorSharesSlashed(operator, strategyMock, sharesToBurn); + cheats.prank(address(allocationManagerMock)); delegationManager.slashOperatorShares({ operator: operator, @@ -7072,6 +7082,11 @@ contract DelegationManagerUnitTests_slashingShares is DelegationManagerUnitTests sharesToBurn: sharesToBurn }) ); + + // Assert OperatorSharesSlashed event was emitted with correct params + cheats.expectEmit(true, true, true, true, address(delegationManager)); + emit OperatorSharesSlashed(operator, strategyMock, sharesToBurn); + cheats.prank(address(allocationManagerMock)); delegationManager.slashOperatorShares({ operator: operator, @@ -7163,6 +7178,11 @@ contract DelegationManagerUnitTests_slashingShares is DelegationManagerUnitTests sharesToBurn: sharesToBurn }) ); + + // Assert OperatorSharesSlashed event was emitted with correct params + cheats.expectEmit(true, true, true, true, address(delegationManager)); + emit OperatorSharesSlashed(operator, strategyMock, sharesToBurn); + cheats.prank(address(allocationManagerMock)); delegationManager.slashOperatorShares({ operator: operator, @@ -7237,6 +7257,11 @@ contract DelegationManagerUnitTests_slashingShares is DelegationManagerUnitTests sharesToBurn: sharesToBurn }) ); + + // Assert OperatorSharesSlashed event was emitted with correct params + cheats.expectEmit(true, true, true, true, address(delegationManager)); + emit OperatorSharesSlashed(operator, strategyMock, sharesToBurn); + cheats.prank(address(allocationManagerMock)); delegationManager.slashOperatorShares({ operator: operator, @@ -7294,6 +7319,11 @@ contract DelegationManagerUnitTests_slashingShares is DelegationManagerUnitTests sharesToBurn: sharesToBurn }) ); + + // Assert OperatorSharesSlashed event was emitted with correct params + cheats.expectEmit(true, true, true, true, address(delegationManager)); + emit OperatorSharesSlashed(operator, strategyMock, sharesToBurn); + cheats.prank(address(allocationManagerMock)); delegationManager.slashOperatorShares({ operator: operator, @@ -7399,6 +7429,11 @@ contract DelegationManagerUnitTests_slashingShares is DelegationManagerUnitTests sharesToBurn: 0 }) ); + + // Assert OperatorSharesSlashed event was emitted with correct params + cheats.expectEmit(true, true, true, true, address(delegationManager)); + emit OperatorSharesSlashed(operator, strategyMock, 0); + cheats.prank(address(allocationManagerMock)); delegationManager.slashOperatorShares({ operator: operator, @@ -7474,6 +7509,11 @@ contract DelegationManagerUnitTests_slashingShares is DelegationManagerUnitTests _setOperatorMagnitude(operator, beaconChainETHStrategy, newMagnitude); cheats.expectEmit(true, true, true, true, address(delegationManager)); emit OperatorSharesDecreased(operator, address(0), beaconChainETHStrategy, sharesToDecrease); + + // Assert OperatorSharesSlashed event was emitted with correct params + cheats.expectEmit(true, true, true, true, address(delegationManager)); + emit OperatorSharesSlashed(operator, beaconChainETHStrategy, sharesToDecrease); + cheats.prank(address(allocationManagerMock)); delegationManager.slashOperatorShares({ operator: operator, @@ -7518,6 +7558,10 @@ contract DelegationManagerUnitTests_slashingShares is DelegationManagerUnitTests newOperatorMagnitude -= slashMagnitude; _setOperatorMagnitude(defaultOperator, strategyMock, newOperatorMagnitude); + // Assert OperatorSharesSlashed event was emitted with correct params + cheats.expectEmit(true, true, true, true, address(delegationManager)); + emit OperatorSharesSlashed(defaultOperator, strategyMock, 44440000449046438731194137360795695); + cheats.prank(address(allocationManagerMock)); delegationManager.slashOperatorShares( defaultOperator, From 271234efadf4e618807f422f14d191e6371321f5 Mon Sep 17 00:00:00 2001 From: "clandestine.eth" <96172957+0xClandestine@users.noreply.github.com> Date: Thu, 13 Feb 2025 09:38:48 -0500 Subject: [PATCH 18/35] feat: add `getSharesFromQueuedWithdrawal` (#1078) * feat: add `getSharesFromQueuedWithdrawal` * test: passing * refactor(review): improve natspec * refactor(review): maintain original interface * test(review): add unit tests * refactor(review): test empty * refactor(review): test empty * refactor(review): remove returned `Withdrawal` * fix: use operator from `Withdrawal` * test: use operator from `Withdrawal` * chore: forge fmt --- src/contracts/core/DelegationManager.sol | 72 ++++---- .../interfaces/IDelegationManager.sol | 18 +- src/test/unit/DelegationUnit.t.sol | 158 ++++++++++++++++++ 3 files changed, 217 insertions(+), 31 deletions(-) diff --git a/src/contracts/core/DelegationManager.sol b/src/contracts/core/DelegationManager.sol index 17a99031b4..347a2311b6 100644 --- a/src/contracts/core/DelegationManager.sol +++ b/src/contracts/core/DelegationManager.sol @@ -776,6 +776,40 @@ contract DelegationManager is } } + /// @dev Get the shares from a queued withdrawal. + function _getSharesByWithdrawalRoot( + bytes32 withdrawalRoot + ) internal view returns (Withdrawal memory withdrawal, uint256[] memory shares) { + withdrawal = queuedWithdrawals[withdrawalRoot]; + shares = new uint256[](withdrawal.strategies.length); + + uint32 slashableUntil = withdrawal.startBlock + MIN_WITHDRAWAL_DELAY_BLOCKS; + + // If the slashableUntil block is in the past, read the slashing factors at that block. + // Otherwise, read the current slashing factors. Note that if the slashableUntil block is the current block + // or in the future, then the slashing factors are still subject to change before the withdrawal is completable, + // which may result in fewer shares being withdrawn. + uint256[] memory slashingFactors = slashableUntil < uint32(block.number) + ? _getSlashingFactorsAtBlock({ + staker: withdrawal.staker, + operator: withdrawal.delegatedTo, + strategies: withdrawal.strategies, + blockNumber: slashableUntil + }) + : _getSlashingFactors({ + staker: withdrawal.staker, + operator: withdrawal.delegatedTo, + strategies: withdrawal.strategies + }); + + for (uint256 j; j < withdrawal.strategies.length; ++j) { + shares[j] = SlashingLib.scaleForCompleteWithdrawal({ + scaledShares: withdrawal.scaledShares[j], + slashingFactor: slashingFactors[j] + }); + } + } + /// @dev Depending on the strategy used, determine which ShareManager contract to make external calls to function _getShareManager( IStrategy strategy @@ -914,6 +948,13 @@ contract DelegationManager is return queuedWithdrawals[withdrawalRoot]; } + /// @inheritdoc IDelegationManager + function getSharesFromQueuedWithdrawal( + bytes32 withdrawalRoot + ) external view returns (uint256[] memory shares) { + (, shares) = _getSharesByWithdrawalRoot(withdrawalRoot); + } + /// @inheritdoc IDelegationManager function getQueuedWithdrawals( address staker @@ -924,37 +965,8 @@ contract DelegationManager is withdrawals = new Withdrawal[](totalQueued); shares = new uint256[][](totalQueued); - address operator = delegatedTo[staker]; - for (uint256 i; i < totalQueued; ++i) { - withdrawals[i] = queuedWithdrawals[withdrawalRoots[i]]; - shares[i] = new uint256[](withdrawals[i].strategies.length); - - uint32 slashableUntil = withdrawals[i].startBlock + MIN_WITHDRAWAL_DELAY_BLOCKS; - - uint256[] memory slashingFactors; - // If slashableUntil block is in the past, read the slashing factors at that block - // Otherwise read the current slashing factors. Note that if the slashableUntil block is the current block - // or in the future then the slashing factors are still subject to change before the withdrawal is completable - // and the shares withdrawn to be less - if (slashableUntil < uint32(block.number)) { - slashingFactors = _getSlashingFactorsAtBlock({ - staker: staker, - operator: operator, - strategies: withdrawals[i].strategies, - blockNumber: slashableUntil - }); - } else { - slashingFactors = - _getSlashingFactors({staker: staker, operator: operator, strategies: withdrawals[i].strategies}); - } - - for (uint256 j; j < withdrawals[i].strategies.length; ++j) { - shares[i][j] = SlashingLib.scaleForCompleteWithdrawal({ - scaledShares: withdrawals[i].scaledShares[j], - slashingFactor: slashingFactors[j] - }); - } + (withdrawals[i], shares[i]) = _getSharesByWithdrawalRoot(withdrawalRoots[i]); } } diff --git a/src/contracts/interfaces/IDelegationManager.sol b/src/contracts/interfaces/IDelegationManager.sol index 80bd59418c..ce3496c483 100644 --- a/src/contracts/interfaces/IDelegationManager.sol +++ b/src/contracts/interfaces/IDelegationManager.sol @@ -477,11 +477,27 @@ interface IDelegationManager is ISignatureUtils, IDelegationManagerErrors, IDele bytes32 withdrawalRoot ) external view returns (Withdrawal memory); - /// @notice Returns a list of pending queued withdrawals for a `staker`, and the `shares` to be withdrawn. + /** + * @notice Returns all queued withdrawals and their corresponding shares for a staker. + * @param staker The address of the staker to query withdrawals for. + * @return withdrawals Array of Withdrawal structs containing details about each queued withdrawal. + * @return shares 2D array of shares, where each inner array corresponds to the strategies in the withdrawal. + * @dev The shares are what a user would receive from completing a queued withdrawal, assuming all slashings are applied. + */ function getQueuedWithdrawals( address staker ) external view returns (Withdrawal[] memory withdrawals, uint256[][] memory shares); + /** + * @notice Returns the withdrawal details and corresponding shares for a specific queued withdrawal. + * @param withdrawalRoot The hash identifying the queued withdrawal. + * @return shares Array of shares corresponding to each strategy in the withdrawal. + * @dev The shares are what a user would receive from completing a queued withdrawal, assuming all slashings are applied. + */ + function getSharesFromQueuedWithdrawal( + bytes32 withdrawalRoot + ) external view returns (uint256[] memory shares); + /// @notice Returns a list of queued withdrawal roots for the `staker`. /// NOTE that this only returns withdrawals queued AFTER the slashing release. function getQueuedWithdrawalRoots( diff --git a/src/test/unit/DelegationUnit.t.sol b/src/test/unit/DelegationUnit.t.sol index 846c232e79..434705a775 100644 --- a/src/test/unit/DelegationUnit.t.sol +++ b/src/test/unit/DelegationUnit.t.sol @@ -8813,4 +8813,162 @@ contract DelegationManagerUnitTests_getQueuedWithdrawals is DelegationManagerUni "block.number should be the completableBlock" ); } + + function test_getQueuedWithdrawals_UsesCorrectOperatorMagnitude() public { + // Alice deposits 100 shares into strategy + uint256 depositAmount = 100e18; + _depositIntoStrategies(defaultStaker, strategyMock.toArray(), depositAmount.toArrayU256()); + + // Register operator with magnitude of 0.5 and delegate Alice to them + _registerOperatorWithBaseDetails(defaultOperator); + _delegateToOperatorWhoAcceptsAllStakers(defaultStaker, defaultOperator); + _setOperatorMagnitude(defaultOperator, strategyMock, 0.5 ether); + + // Alice queues withdrawal of all 100 shares while operator magnitude is 0.5 + // This means she should get back 50 shares (100 * 0.5) + ( + QueuedWithdrawalParams[] memory queuedWithdrawalParams, + Withdrawal memory withdrawal, + bytes32 withdrawalRoot + ) = _setUpQueueWithdrawalsSingleStrat({ + staker: defaultStaker, + strategy: strategyMock, + depositSharesToWithdraw: depositAmount + }); + + cheats.prank(defaultStaker); + delegationManager.queueWithdrawals(queuedWithdrawalParams); + + // Alice undelegates, which would normally update operator's magnitude to 1.0 + // This tests that the withdrawal still uses the original 0.5 magnitude from when it was queued + cheats.prank(defaultStaker); + delegationManager.undelegate(defaultStaker); + + // Get shares from withdrawal - should return 50 shares (100 * 0.5) using original magnitude + // rather than incorrectly returning 100 shares (100 * 1.0) using new magnitude + uint256[] memory shares = delegationManager.getSharesFromQueuedWithdrawal(withdrawalRoot); + assertEq(shares[0], 50e18, "shares should be 50e18 (100e18 * 0.5) using original magnitude"); + } +} + +contract DelegationManagerUnitTests_getSharesFromQueuedWithdrawal is DelegationManagerUnitTests { + using ArrayLib for *; + using SlashingLib for *; + + function test_getSharesFromQueuedWithdrawal_Correctness(Randomness r) public rand(r) { + // Set up initial deposit + uint256 depositAmount = r.Uint256(1 ether, 100 ether); + _depositIntoStrategies(defaultStaker, strategyMock.toArray(), depositAmount.toArrayU256()); + + // Register operator and delegate + _registerOperatorWithBaseDetails(defaultOperator); + _delegateToOperatorWhoAcceptsAllStakers(defaultStaker, defaultOperator); + + // Queue withdrawal + ( + QueuedWithdrawalParams[] memory queuedWithdrawalParams, + Withdrawal memory withdrawal, + bytes32 withdrawalRoot + ) = _setUpQueueWithdrawalsSingleStrat({ + staker: defaultStaker, + strategy: strategyMock, + depositSharesToWithdraw: depositAmount + }); + + cheats.prank(defaultStaker); + delegationManager.queueWithdrawals(queuedWithdrawalParams); + + // Get shares from queued withdrawal + uint256[] memory shares = delegationManager.getSharesFromQueuedWithdrawal(withdrawalRoot); + + // Verify withdrawal details match + assertEq(shares.length, 1, "incorrect shares array length"); + assertEq(shares[0], depositAmount, "incorrect shares amount"); + } + + function test_getSharesFromQueuedWithdrawal_AfterSlashing(Randomness r) public rand(r) { + // Set up initial deposit + uint256 depositAmount = r.Uint256(1 ether, 100 ether); + _depositIntoStrategies(defaultStaker, strategyMock.toArray(), depositAmount.toArrayU256()); + + // Register operator and delegate + _registerOperatorWithBaseDetails(defaultOperator); + _delegateToOperatorWhoAcceptsAllStakers(defaultStaker, defaultOperator); + + // Queue withdrawal + ( + QueuedWithdrawalParams[] memory queuedWithdrawalParams, + Withdrawal memory withdrawal, + bytes32 withdrawalRoot + ) = _setUpQueueWithdrawalsSingleStrat({ + staker: defaultStaker, + strategy: strategyMock, + depositSharesToWithdraw: depositAmount + }); + + cheats.prank(defaultStaker); + delegationManager.queueWithdrawals(queuedWithdrawalParams); + + // Slash operator by 50% + _setOperatorMagnitude(defaultOperator, strategyMock, 0.5 ether); + cheats.prank(address(allocationManagerMock)); + delegationManager.slashOperatorShares(defaultOperator, strategyMock, WAD, 0.5 ether); + + // Get shares from queued withdrawal + uint256[] memory shares = delegationManager.getSharesFromQueuedWithdrawal(withdrawalRoot); + + // Verify withdrawal details match and shares are slashed + assertEq(shares.length, 1, "incorrect shares array length"); + assertEq(shares[0], depositAmount / 2, "shares not properly slashed"); + } + + function test_getSharesFromQueuedWithdrawal_NonexistentWithdrawal() public { + bytes32 nonexistentRoot = bytes32(uint256(1)); + uint256[] memory shares = delegationManager.getSharesFromQueuedWithdrawal(nonexistentRoot); + assertEq(shares.length, 0, "shares array should be empty"); + } + + function test_getSharesFromQueuedWithdrawal_MultipleStrategies(Randomness r) public rand(r) { + // Set up multiple strategies with deposits + uint256 numStrategies = r.Uint256(2, 5); + uint256[] memory depositShares = r.Uint256Array({ + len: numStrategies, + min: 1 ether, + max: 100 ether + }); + + IStrategy[] memory strategies = _deployAndDepositIntoStrategies(defaultStaker, depositShares, false); + + // Register operator and delegate + _registerOperatorWithBaseDetails(defaultOperator); + _delegateToOperatorWhoAcceptsAllStakers(defaultStaker, defaultOperator); + + // Queue withdrawals for multiple strategies + ( + QueuedWithdrawalParams[] memory queuedWithdrawalParams, + Withdrawal memory withdrawal, + bytes32 withdrawalRoot + ) = _setUpQueueWithdrawals({ + staker: defaultStaker, + strategies: strategies, + depositWithdrawalAmounts: depositShares + }); + + cheats.prank(defaultStaker); + delegationManager.queueWithdrawals(queuedWithdrawalParams); + + // Get shares from queued withdrawal + uint256[] memory shares = delegationManager.getSharesFromQueuedWithdrawal(withdrawalRoot); + + // Verify withdrawal details and shares for each strategy + assertEq(shares.length, numStrategies, "incorrect shares array length"); + for (uint256 i = 0; i < numStrategies; i++) { + assertEq(shares[i], depositShares[i], "incorrect shares amount for strategy"); + } + } + + function testFuzz_getSharesFromQueuedWithdrawal_EmptyWithdrawal(bytes32 withdrawalRoot) public { + uint256[] memory shares = delegationManager.getSharesFromQueuedWithdrawal(withdrawalRoot); + assertEq(shares.length, 0, "sanity check"); + } } From d95267237c7ecd4fa16edb80f44d83e26cf2775b Mon Sep 17 00:00:00 2001 From: "clandestine.eth" <96172957+0xClandestine@users.noreply.github.com> Date: Thu, 13 Feb 2025 10:37:49 -0500 Subject: [PATCH 19/35] docs: slashing factors rounding (#1089) * docs: slashing factors rounding * chore: forge fmt --- src/contracts/core/DelegationManager.sol | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/contracts/core/DelegationManager.sol b/src/contracts/core/DelegationManager.sol index 347a2311b6..59042cd900 100644 --- a/src/contracts/core/DelegationManager.sol +++ b/src/contracts/core/DelegationManager.sol @@ -681,7 +681,10 @@ contract DelegationManager is }); } - /// @dev Calculate the amount of slashing to apply to the staker's shares + /// @dev Calculate the amount of slashing to apply to the staker's shares. + /// @dev Be mindful of rounding in `mulWad()`, it's possible for the slashing factor to round down to 0 + /// even when both operatorMaxMagnitude and beaconChainSlashingFactor are non-zero. This is only possible + /// in an edge case where the operator has a very low maxMagnitude. function _getSlashingFactor( address staker, IStrategy strategy, From cf5e79d27229efc19dadff41b89d6008a58f1b7d Mon Sep 17 00:00:00 2001 From: "clandestine.eth" <96172957+0xClandestine@users.noreply.github.com> Date: Thu, 13 Feb 2025 11:05:58 -0500 Subject: [PATCH 20/35] fix: funny syntax (#1091) --- src/contracts/core/AllocationManager.sol | 2 +- src/contracts/libraries/OperatorSetLib.sol | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/contracts/core/AllocationManager.sol b/src/contracts/core/AllocationManager.sol index 3b6c36b020..408bd90e4c 100644 --- a/src/contracts/core/AllocationManager.sol +++ b/src/contracts/core/AllocationManager.sol @@ -227,7 +227,7 @@ contract AllocationManager is // 6. Emit an event for the updated allocation emit AllocationUpdated( operator, - OperatorSetLib.decode(operatorSet.key()), + operatorSet, strategy, _addInt128(allocation.currentMagnitude, allocation.pendingDiff), allocation.effectBlock diff --git a/src/contracts/libraries/OperatorSetLib.sol b/src/contracts/libraries/OperatorSetLib.sol index eb761b0b45..0b1ae4808d 100644 --- a/src/contracts/libraries/OperatorSetLib.sol +++ b/src/contracts/libraries/OperatorSetLib.sol @@ -1,6 +1,8 @@ // SPDX-License-Identifier: BUSL-1.1 pragma solidity ^0.8.27; +using OperatorSetLib for OperatorSet global; + /** * @notice An operator set identified by the AVS address and an identifier * @param avs The address of the AVS this operator set belongs to From b874648f4b2f87a7d93832a0b6823cae5e598403 Mon Sep 17 00:00:00 2001 From: "clandestine.eth" <96172957+0xClandestine@users.noreply.github.com> Date: Thu, 13 Feb 2025 11:10:36 -0500 Subject: [PATCH 21/35] docs: small slash amounts (#1088) * docs: small slash amounts * docs: update contract docs --------- Co-authored-by: wadealexc --- docs/core/AllocationManager.md | 21 ++++++++++++++++++- .../interfaces/IAllocationManager.sol | 21 ++++++++++++++++++- 2 files changed, 40 insertions(+), 2 deletions(-) diff --git a/docs/core/AllocationManager.md b/docs/core/AllocationManager.md index 5787b4a544..194d8b9dab 100644 --- a/docs/core/AllocationManager.md +++ b/docs/core/AllocationManager.md @@ -585,7 +585,26 @@ struct SlashingParams { } /** - * @notice Called by an AVS to slash an operator in a given operator set + * @notice Called by an AVS to slash an operator in a given operator set. The operator must be registered + * and have slashable stake allocated to the operator set. + * + * @param avs The AVS address initiating the slash. + * @param params The slashing parameters, containing: + * - operator: The operator to slash. + * - operatorSetId: The ID of the operator set the operator is being slashed from. + * - strategies: Array of strategies to slash allocations from (must be in ascending order). + * - wadsToSlash: Array of proportions to slash from each strategy (must be between 0 and 1e18). + * - description: Description of why the operator was slashed. + * + * @dev For each strategy: + * 1. Reduces the operator's current allocation magnitude by wadToSlash proportion. + * 2. Reduces the strategy's max and encumbered magnitudes proportionally. + * 3. If there is a pending deallocation, reduces it proportionally. + * 4. Updates the operator's shares in the DelegationManager. + * + * @dev Small slashing amounts may not result in actual token burns due to + * rounding, which will result in small amounts of tokens locked in the contract + * rather than fully burning through the burn mechanism. */ function slashOperator( address avs, diff --git a/src/contracts/interfaces/IAllocationManager.sol b/src/contracts/interfaces/IAllocationManager.sol index 8676869a88..1a24333c14 100644 --- a/src/contracts/interfaces/IAllocationManager.sol +++ b/src/contracts/interfaces/IAllocationManager.sol @@ -220,7 +220,26 @@ interface IAllocationManager is IAllocationManagerErrors, IAllocationManagerEven function initialize(address initialOwner, uint256 initialPausedStatus) external; /** - * @notice Called by an AVS to slash an operator in a given operator set + * @notice Called by an AVS to slash an operator in a given operator set. The operator must be registered + * and have slashable stake allocated to the operator set. + * + * @param avs The AVS address initiating the slash. + * @param params The slashing parameters, containing: + * - operator: The operator to slash. + * - operatorSetId: The ID of the operator set the operator is being slashed from. + * - strategies: Array of strategies to slash allocations from (must be in ascending order). + * - wadsToSlash: Array of proportions to slash from each strategy (must be between 0 and 1e18). + * - description: Description of why the operator was slashed. + * + * @dev For each strategy: + * 1. Reduces the operator's current allocation magnitude by wadToSlash proportion. + * 2. Reduces the strategy's max and encumbered magnitudes proportionally. + * 3. If there is a pending deallocation, reduces it proportionally. + * 4. Updates the operator's shares in the DelegationManager. + * + * @dev Small slashing amounts may not result in actual token burns due to + * rounding, which will result in small amounts of tokens locked in the contract + * rather than fully burning through the burn mechanism. */ function slashOperator(address avs, SlashingParams calldata params) external; From d58c2ac1ca495d9906f0e882092f0bfd5b0bc2a5 Mon Sep 17 00:00:00 2001 From: "clandestine.eth" <96172957+0xClandestine@users.noreply.github.com> Date: Thu, 13 Feb 2025 11:39:29 -0500 Subject: [PATCH 22/35] fix: beaconchain slashable shares in queue (#1087) --- src/contracts/core/DelegationManager.sol | 12 +++++------- src/test/unit/DelegationUnit.t.sol | 11 ++++++----- 2 files changed, 11 insertions(+), 12 deletions(-) diff --git a/src/contracts/core/DelegationManager.sol b/src/contracts/core/DelegationManager.sol index 59042cd900..f0a7f927e8 100644 --- a/src/contracts/core/DelegationManager.sol +++ b/src/contracts/core/DelegationManager.sol @@ -770,13 +770,11 @@ contract DelegationManager is /// @dev Add to the cumulative withdrawn scaled shares from an operator for a given strategy function _addQueuedSlashableShares(address operator, IStrategy strategy, uint256 scaledShares) internal { - if (strategy != beaconChainETHStrategy) { - uint256 currCumulativeScaledShares = _cumulativeScaledSharesHistory[operator][strategy].latest(); - _cumulativeScaledSharesHistory[operator][strategy].push({ - key: uint32(block.number), - value: currCumulativeScaledShares + scaledShares - }); - } + uint256 currCumulativeScaledShares = _cumulativeScaledSharesHistory[operator][strategy].latest(); + _cumulativeScaledSharesHistory[operator][strategy].push({ + key: uint32(block.number), + value: currCumulativeScaledShares + scaledShares + }); } /// @dev Get the shares from a queued withdrawal. diff --git a/src/test/unit/DelegationUnit.t.sol b/src/test/unit/DelegationUnit.t.sol index 434705a775..6350ea2ade 100644 --- a/src/test/unit/DelegationUnit.t.sol +++ b/src/test/unit/DelegationUnit.t.sol @@ -7491,8 +7491,8 @@ contract DelegationManagerUnitTests_slashingShares is DelegationManagerUnitTests delegationManager.queueWithdrawals(queuedWithdrawalParams); assertEq( delegationManager.getSlashableSharesInQueue(operator, beaconChainETHStrategy), - 0, - "there should be 0 withdrawAmount slashable shares in queue since this is beaconChainETHStrategy" + withdrawAmount, + "there should be withdrawAmount slashable shares in queue" ); } @@ -7504,6 +7504,7 @@ contract DelegationManagerUnitTests_slashingShares is DelegationManagerUnitTests // Therefore amount of shares to burn should be what the staker still has remaining + staker1 shares and then // divided by 2 since the operator was slashed 50% uint256 sharesToDecrease = (shares + depositAmount - withdrawAmount) * 3 / 4; + uint256 sharesToBurn = sharesToDecrease + (delegationManager.getSlashableSharesInQueue(operator, beaconChainETHStrategy) * 3 / 4); // 4. Burn shares _setOperatorMagnitude(operator, beaconChainETHStrategy, newMagnitude); @@ -7512,7 +7513,7 @@ contract DelegationManagerUnitTests_slashingShares is DelegationManagerUnitTests // Assert OperatorSharesSlashed event was emitted with correct params cheats.expectEmit(true, true, true, true, address(delegationManager)); - emit OperatorSharesSlashed(operator, beaconChainETHStrategy, sharesToDecrease); + emit OperatorSharesSlashed(operator, beaconChainETHStrategy, sharesToBurn); cheats.prank(address(allocationManagerMock)); delegationManager.slashOperatorShares({ @@ -7525,8 +7526,8 @@ contract DelegationManagerUnitTests_slashingShares is DelegationManagerUnitTests // 5. Assert expected values uint256 queuedSlashableSharesAfter = delegationManager.getSlashableSharesInQueue(operator, beaconChainETHStrategy); uint256 operatorSharesAfter = delegationManager.operatorShares(operator, beaconChainETHStrategy); - assertEq(queuedSlashableSharesBefore, 0, "Slashable shares in queue should be 0 for beaconChainStrategy"); - assertEq(queuedSlashableSharesAfter, 0, "Slashable shares in queue should be 0 for beaconChainStrategy"); + assertEq(queuedSlashableSharesBefore, withdrawAmount, "Slashable shares in queue should be full withdraw amount"); + assertEq(queuedSlashableSharesAfter, withdrawAmount / 4, "Slashable shares in queue should be 1/4 withdraw amount after slashing"); assertEq(operatorSharesAfter, operatorSharesBefore - sharesToDecrease, "operator shares should be decreased by sharesToDecrease"); } From b44f0369a4fe141567a4cab3d1d05e596f000ebc Mon Sep 17 00:00:00 2001 From: Michael Sun <35479365+8sunyuan@users.noreply.github.com> Date: Thu, 13 Feb 2025 12:52:43 -0500 Subject: [PATCH 23/35] docs: rounding clarification (#1093) --- .../accounting/SharesAccountingEdgeCases.md | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/docs/core/accounting/SharesAccountingEdgeCases.md b/docs/core/accounting/SharesAccountingEdgeCases.md index b74881b081..d8e99b1c38 100644 --- a/docs/core/accounting/SharesAccountingEdgeCases.md +++ b/docs/core/accounting/SharesAccountingEdgeCases.md @@ -145,6 +145,28 @@ Since the operatorShares are simply incrementing by the exact depositShares, the Granted the initial deposit amount was `4.418e28` which is magnitudes larger than the discrepancy here but this its important to note the side effects of the redesigned accounting model. Instead of purely incremented/decremented amounts, we have introduced magnitudes and scaling factor variables which now result in small amounts of rounding error from division in several places. We deem this rounding behavior to be tolerable given the costs associated for the number of transactions to emulate this and the proportional error is very small. +### Slashing and Rounding Up Operator Shares and Rounding down on Staker Withdrawable Shares + +As can be observed in the `SlashingLib.sol` library, we round up on the operatorShares when slashing and round down on the staker's withdrawableShares. If we look at a core invariant of the shares accounting model, we ideally want to preserve the following: + +$$ +op_n = \sum_{i=1}^{k} a_{n,i} +$$ + +where $op_n$ is the operatorShares at time $n$ and $a_{n,i}$ is the staker's withdrawableShares at time $n$ for the $i^{th}$ staker. + +However due to rounding limitations, there will be some error introduced in calculating the amount of operator shares to slash above and also in calculating the staker's withdrawableShares. To prevent a situation where all stakers were to attempt to withdraw and the operatorShares underflows, we round up on the operatorShares when slashing and round down on the staker's withdrawableShares. + +So in practice, the above invariant becomes. + +$$ +op_n \geq \sum_{i=1}^{k} a_{n,i} +$$ + +Upwards rounding on calculating the amount of operatorShares to give to an operator after slashing is intentionally performed in `SlashingLib.calcSlashedAmount`. +For calculating a staker's withdrawableShares, there are many different factors to consider such as calculating their depositScalingFactor, their slashingFactor, and calculating the amount of withdrawable shares altogether with their depositShares. These variables are all by default rounded down in calculation and is expected behavior for stakers. + + ## Upper bound on Residual Operator Shares Related to the above rounding error on deposits, we want to calculate what is the worst case rounding error for a staker depositing shares into EigenLayer. From 4b1f0f632a6dbee28099e23ec01d529b02ff48a4 Mon Sep 17 00:00:00 2001 From: eigenmikem Date: Thu, 13 Feb 2025 17:45:05 -0500 Subject: [PATCH 24/35] fix: delegate shares (#1045) **Motivation:** Fixes an issue where stakers delegating Beacon Chain ETH from slashed Eigen Pods were able to delegate more shares than they should. Specifically, operators now are delegated a staker's `withdrawableShares` rather than their `depositShares`. **Modifications:** - Changed accounting logic on delegation in `DelegationManger.sol` - `DepositScalingFactor` now resets when a staker withdraws all their shares, whether through undelegation, redelegation, or a simple withdrawal - Changes in `StrategyManager.sol`, `IShareManager.sol`, `SlashingLib.sol`, and `EigenPodManager.sol` to accommodate new accounting - New test files and changes to others to reflect new accounting and invariants - Updated `docs/SharesAccounting.md` **Result:** System is now robust to stakers with arbitrary EigenPod states --------- Co-authored-by: Michael Co-authored-by: Michael Sun Co-authored-by: wadealexc Co-authored-by: Yash Patil <40046473+ypatil12@users.noreply.github.com> Co-authored-by: clandestine.eth <96172957+0xClandestine@users.noreply.github.com> --- docs/core/accounting/SharesAccounting.md | 63 + src/contracts/core/DelegationManager.sol | 35 +- src/contracts/core/StrategyManager.sol | 12 +- src/contracts/interfaces/IShareManager.sol | 7 +- src/contracts/libraries/SlashingLib.sol | 19 +- src/contracts/pods/EigenPodManager.sol | 4 +- src/test/integration/IntegrationBase.t.sol | 22 +- src/test/integration/IntegrationChecks.t.sol | 75 +- .../integration/IntegrationDeployer.t.sol | 4 +- .../integration/mocks/BeaconChainMock.t.sol | 5 + ...Deposit_Delegate_Redelegate_Complete.t.sol | 86 +- ...Deposit_Delegate_Undelegate_Complete.t.sol | 21 +- .../integration/tests/Slashed_Eigenpod.t.sol | 306 ++ src/test/integration/users/User.t.sol | 43 +- src/test/mocks/EigenPodManagerMock.sol | 6 +- src/test/mocks/StrategyManagerMock.sol | 6 +- src/test/unit/DelegationUnit.t.sol | 2540 ++++++++--------- src/test/unit/mixins/SignatureUtilsUnit.t.sol | 7 +- 18 files changed, 1777 insertions(+), 1484 deletions(-) create mode 100644 src/test/integration/tests/Slashed_Eigenpod.t.sol diff --git a/docs/core/accounting/SharesAccounting.md b/docs/core/accounting/SharesAccounting.md index 940dfab0a1..7e17cfbaf1 100644 --- a/docs/core/accounting/SharesAccounting.md +++ b/docs/core/accounting/SharesAccounting.md @@ -162,6 +162,67 @@ See implementation in: * [`StrategyManager.depositIntoStrategy`](../../../src/contracts/core/StrategyManager.sol) * [`EigenPodManager.recordBeaconChainETHBalanceUpdate`](../../../src/contracts/pods/EigenPodManager.sol) + +--- + +### Delegation + +Suppose we have an undelegated staker who decides to delegate to an operator. +We have the following properties that should be preserved. + +#### Operator Level + +Operator shares should be increased by the amount of delegatable shares the staker has, this is synonymous to their withdrawable shares $a_n$. Therefore, + +$$ +op_{n+1} = op_{n} + a_n +$$ + +$$ += op_{n} + s_n k_n l_n m_n +$$ + + +#### Staker Level + +withdrawable shares should remain unchanged + +$$ +a_{n+1} = a_n +$$ + +deposit shares should remain unchanged + +$$ +s_{n+1} = s_n +$$ + +beaconChainSlashingFactor and maxMagnitude should also remain unchanged. In this case, since the staker is not delegated, then their maxMagnitude should by default be equal to 1. + +$$ +l_{n+1} = l_n +$$ + +Now the question is what is the new depositScalingFactor equal to? + +$$ +a_{n+1} = a_n +$$ + +$$ +=> s_{n+1} k_{n+1} l_{n+1} m_{n+1} = s_n k_n l_n m_n +$$ + +$$ +=> s_{n} k_{n+1} l_{n} m_{n+1} = s_n k_n l_n m_n +$$ + +$$ +=> k_{n+1} = \frac {k_n m_n} { m_{n+1} } +$$ + +Notice how the staker variables that update $k_{n+1}$ and $m_{n+1}$ do not affect previously queued withdrawals and shares received upon withdrawal completion. This is because the maxMagnitude that is looked up is dependent on the operator at the time of the queued withdrawal and the $k_n$ is effectively stored in the scaled shares field. + --- ### Slashing @@ -297,6 +358,8 @@ $$ Note that when a withdrawal is queued, a `Withdrawal` struct is created with _scaled shares_ defined as $q_t = x_t k_t$ where $t$ is the time of the queuing. The reason we define and store scaled shares like this will be clearer in [Complete Withdrawal](#complete-withdrawal) below. +Additionally, we reset the depositScalingFactor when a user queues a withdrawal for all their shares, either through un/redelegation or directly. This is because the DSF at the time of withdrawal is stored in the scaled shares, and any "new" deposits or delegations by the staker should be considered as new. Note that withdrawal completion is treated as a kind of deposit when done as shares, which again will be clearer below. + See implementation in: * `DelegationManager.queueWithdrawals` * `SlashingLib.scaleForQueueWithdrawal` diff --git a/src/contracts/core/DelegationManager.sol b/src/contracts/core/DelegationManager.sol index f0a7f927e8..c131a7039f 100644 --- a/src/contracts/core/DelegationManager.sol +++ b/src/contracts/core/DelegationManager.sol @@ -343,24 +343,37 @@ contract DelegationManager is * 1) new delegations are not paused (PAUSED_NEW_DELEGATION) */ function _delegate(address staker, address operator) internal onlyWhenNotPaused(PAUSED_NEW_DELEGATION) { - // record the delegation relation between the staker and operator, and emit an event + // When a staker is not delegated to an operator, their deposit shares are equal to their + // withdrawable shares -- except for the beaconChainETH strategy, which is handled below + (IStrategy[] memory strategies, uint256[] memory withdrawableShares) = getDepositedShares(staker); + + // Retrieve the amount of slashing experienced by the operator in each strategy so far. + // When delegating, we "forgive" the staker for this slashing by adjusting their + // deposit scaling factor. + uint256[] memory operatorSlashingFactors = _getSlashingFactors(address(0), operator, strategies); + + // Delegate to the operator delegatedTo[staker] = operator; emit StakerDelegated(staker, operator); - // read staker's deposited shares and strategies to add to operator's shares - // and also update the staker depositScalingFactor for each strategy - (IStrategy[] memory strategies, uint256[] memory depositedShares) = getDepositedShares(staker); - uint256[] memory slashingFactors = _getSlashingFactors(staker, operator, strategies); - for (uint256 i = 0; i < strategies.length; ++i) { + // Special case for beacon chain slashing - ensure the staker's beacon chain slashing is + // reflected in the number of shares they delegate. + if (strategies[i] == beaconChainETHStrategy) { + uint64 stakerBeaconChainSlashing = eigenPodManager.beaconChainSlashingFactor(staker); + + DepositScalingFactor memory dsf = _depositScalingFactor[staker][strategies[i]]; + withdrawableShares[i] = dsf.calcWithdrawable(withdrawableShares[i], stakerBeaconChainSlashing); + } + // forgefmt: disable-next-item _increaseDelegation({ operator: operator, staker: staker, strategy: strategies[i], prevDepositShares: uint256(0), - addedShares: depositedShares[i], - slashingFactor: slashingFactors[i] + addedShares: withdrawableShares[i], + slashingFactor: operatorSlashingFactors[i] }); } } @@ -481,7 +494,11 @@ contract DelegationManager is } // Remove deposit shares from EigenPodManager/StrategyManager - shareManager.removeDepositShares(staker, strategies[i], depositSharesToWithdraw[i]); + uint256 sharesAfter = shareManager.removeDepositShares(staker, strategies[i], depositSharesToWithdraw[i]); + + if (sharesAfter == 0) { + _depositScalingFactor[staker][strategies[i]].reset(); + } } // Create queue entry and increment withdrawal nonce diff --git a/src/contracts/core/StrategyManager.sol b/src/contracts/core/StrategyManager.sol index 42afaa99eb..49ed6c5e87 100644 --- a/src/contracts/core/StrategyManager.sol +++ b/src/contracts/core/StrategyManager.sol @@ -116,8 +116,9 @@ contract StrategyManager is address staker, IStrategy strategy, uint256 depositSharesToRemove - ) external onlyDelegationManager { - _removeDepositShares(staker, strategy, depositSharesToRemove); + ) external onlyDelegationManager returns (uint256) { + (, uint256 sharesAfter) = _removeDepositShares(staker, strategy, depositSharesToRemove); + return sharesAfter; } /// @inheritdoc IShareManager @@ -265,12 +266,13 @@ contract StrategyManager is * @param depositSharesToRemove The amount of deposit shares to decrement * @dev If the amount of shares represents all of the staker`s shares in said strategy, * then the strategy is removed from stakerStrategyList[staker] and 'true' is returned. Otherwise 'false' is returned. + * Also returns the user's udpated deposit shares after decrement. */ function _removeDepositShares( address staker, IStrategy strategy, uint256 depositSharesToRemove - ) internal returns (bool) { + ) internal returns (bool, uint256) { // sanity checks on inputs require(depositSharesToRemove != 0, SharesAmountZero()); @@ -290,10 +292,10 @@ contract StrategyManager is _removeStrategyFromStakerStrategyList(staker, strategy); // return true in the event that the strategy was removed from stakerStrategyList[staker] - return true; + return (true, userDepositShares); } // return false in the event that the strategy was *not* removed from stakerStrategyList[staker] - return false; + return (false, userDepositShares); } /** diff --git a/src/contracts/interfaces/IShareManager.sol b/src/contracts/interfaces/IShareManager.sol index a188ff7d7b..e7c9501baf 100644 --- a/src/contracts/interfaces/IShareManager.sol +++ b/src/contracts/interfaces/IShareManager.sol @@ -14,7 +14,12 @@ import "./IStrategy.sol"; interface IShareManager { /// @notice Used by the DelegationManager to remove a Staker's shares from a particular strategy when entering the withdrawal queue /// @dev strategy must be beaconChainETH when talking to the EigenPodManager - function removeDepositShares(address staker, IStrategy strategy, uint256 depositSharesToRemove) external; + /// @return updatedShares the staker's deposit shares after decrement + function removeDepositShares( + address staker, + IStrategy strategy, + uint256 depositSharesToRemove + ) external returns (uint256); /// @notice Used by the DelegationManager to award a Staker some shares that have passed through the withdrawal queue /// @dev strategy must be beaconChainETH when talking to the EigenPodManager diff --git a/src/contracts/libraries/SlashingLib.sol b/src/contracts/libraries/SlashingLib.sol index 7063a6d3e5..f608480f08 100644 --- a/src/contracts/libraries/SlashingLib.sol +++ b/src/contracts/libraries/SlashingLib.sol @@ -94,10 +94,11 @@ library SlashingLib { uint256 addedShares, uint256 slashingFactor ) internal { - // If this is the staker's first deposit, set the scaling factor to - // the inverse of slashingFactor if (prevDepositShares == 0) { - dsf._scalingFactor = uint256(WAD).divWad(slashingFactor); + // If this is the staker's first deposit or they are delegating to an operator, + // the slashing factor is inverted and applied to the existing DSF. This has the + // effect of "forgiving" prior slashing for any subsequent deposits. + dsf._scalingFactor = dsf.scalingFactor().divWad(slashingFactor); return; } @@ -136,6 +137,18 @@ library SlashingLib { dsf._scalingFactor = newDepositScalingFactor; } + /// @dev Reset the staker's DSF for a strategy by setting it to 0. This is the same + /// as setting it to WAD (see the `scalingFactor` getter above). + /// + /// A DSF is reset when a staker reduces their deposit shares to 0, either by queueing + /// a withdrawal, or undelegating from their operator. This ensures that subsequent + /// delegations/deposits do not use a stale DSF (e.g. from a prior operator). + function reset( + DepositScalingFactor storage dsf + ) internal { + dsf._scalingFactor = 0; + } + // CONVERSION function calcWithdrawable( diff --git a/src/contracts/pods/EigenPodManager.sol b/src/contracts/pods/EigenPodManager.sol index 03d304e387..35be0ac084 100644 --- a/src/contracts/pods/EigenPodManager.sol +++ b/src/contracts/pods/EigenPodManager.sol @@ -135,18 +135,20 @@ contract EigenPodManager is * result in the `podOwner` incurring a "share deficit". This behavior prevents a Staker from queuing a withdrawal which improperly removes excessive * shares from the operator to whom the staker is delegated. * @dev The delegation manager validates that the podOwner is not address(0) + * @return updatedShares the staker's deposit shares after decrement */ function removeDepositShares( address staker, IStrategy strategy, uint256 depositSharesToRemove - ) external onlyDelegationManager { + ) external onlyDelegationManager returns (uint256) { require(strategy == beaconChainETHStrategy, InvalidStrategy()); int256 updatedShares = podOwnerDepositShares[staker] - int256(depositSharesToRemove); require(updatedShares >= 0, SharesNegative()); podOwnerDepositShares[staker] = updatedShares; emit NewTotalShares(staker, updatedShares); + return uint256(updatedShares); } /** diff --git a/src/test/integration/IntegrationBase.t.sol b/src/test/integration/IntegrationBase.t.sol index 1afb808beb..6f825a647d 100644 --- a/src/test/integration/IntegrationBase.t.sol +++ b/src/test/integration/IntegrationBase.t.sol @@ -1193,7 +1193,7 @@ abstract contract IntegrationBase is IntegrationDeployer, TypeImporter { // For each strategy, check (prev - removed == cur) for (uint i = 0; i < strategies.length; i++) { - assertEq(prevShares[i] - removedShares[i], curShares[i], err); + assertEq(prevShares[i], curShares[i] + removedShares[i], err); } } @@ -1313,7 +1313,7 @@ abstract contract IntegrationBase is IntegrationDeployer, TypeImporter { } } - /// @dev Check that the staker's withdrawable shares have decreased by `removedShares` + /// @dev Check that the staker's withdrawable shares have increased by `addedShares` function assert_Snap_Added_Staker_WithdrawableShares( User staker, IStrategy[] memory strategies, @@ -1347,6 +1347,19 @@ abstract contract IntegrationBase is IntegrationDeployer, TypeImporter { } } + /// @dev Check that all the staker's withdrawable shares have been removed + function assert_Snap_RemovedAll_Staker_WithdrawableShares( + User staker, + IStrategy[] memory strategies, + string memory err + ) internal { + uint[] memory curShares = _getStakerWithdrawableShares(staker, strategies); + // For each strategy, check all shares have been withdrawn + for (uint i = 0; i < strategies.length; i++) { + assertEq(0, curShares[i], err); + } + } + function assert_Snap_Removed_Staker_WithdrawableShares( User staker, IStrategy strat, @@ -1357,7 +1370,8 @@ abstract contract IntegrationBase is IntegrationDeployer, TypeImporter { } /// @dev Check that the staker's withdrawable shares have decreased by `removedShares` - function assert_Snap_Unchanged_Staker_WithdrawableShares( + /// FIX THIS WHEN WORKING ON ROUNDING ISSUES + function assert_Snap_Unchanged_Staker_WithdrawableShares_Delegation( User staker, string memory err ) internal { @@ -1369,7 +1383,7 @@ abstract contract IntegrationBase is IntegrationDeployer, TypeImporter { // For each strategy, check (prev - removed == cur) for (uint i = 0; i < strategies.length; i++) { - assertEq(prevShares[i], curShares[i], err); + assertApproxEqAbs(prevShares[i], curShares[i], 100000, err); } } diff --git a/src/test/integration/IntegrationChecks.t.sol b/src/test/integration/IntegrationChecks.t.sol index a9188c2c04..7b021dda54 100644 --- a/src/test/integration/IntegrationChecks.t.sol +++ b/src/test/integration/IntegrationChecks.t.sol @@ -104,8 +104,9 @@ contract IntegrationCheckUtils is IntegrationBase { assert_Snap_Unchanged_Staker_DepositShares(staker, "staker shares should not have decreased"); assert_Snap_Removed_Staker_WithdrawableShares_AtLeast(staker, BEACONCHAIN_ETH_STRAT, slashedAmountGwei * GWEI_TO_WEI, "should have decreased withdrawable shares by at least slashed amount"); - assert_Snap_Removed_ActiveValidatorCount(staker, slashedValidators.length, "should have decreased active validator count"); - assert_Snap_Removed_ActiveValidators(staker, slashedValidators, "exited validators should each be WITHDRAWN"); + // TODO - currently only used after a `NoWithdrawNoRewards` action. Investigate re-adding in future. + // assert_Snap_Removed_ActiveValidatorCount(staker, slashedValidators.length, "should have decreased active validator count"); + // assert_Snap_Removed_ActiveValidators(staker, slashedValidators, "exited validators should each be WITHDRAWN"); } function check_CompleteCheckpoint_WithCLSlashing_HandleRoundDown_State( @@ -189,8 +190,9 @@ contract IntegrationCheckUtils is IntegrationBase { assertEq(address(operator), delegationManager.delegatedTo(address(staker)), "staker should be delegated to operator"); assert_HasExpectedShares(staker, strategies, shares, "staker should still have expected shares after delegating"); assert_Snap_Unchanged_Staker_DepositShares(staker, "staker shares should be unchanged after delegating"); - assert_Snap_Unchanged_Staker_WithdrawableShares(staker, "withdrawable shares should be unchanged after delegating"); - assert_Snap_Added_OperatorShares(operator, strategies, shares, "operator should have received shares"); + assert_Snap_Unchanged_Staker_WithdrawableShares_Delegation(staker, "withdrawable shares should be unchanged after delegating"); + uint256[] memory delegatableShares = _getPrevStakerWithdrawableShares(staker, strategies); + assert_Snap_Added_OperatorShares(operator, strategies, delegatableShares, "operator should have received shares"); } function check_QueuedWithdrawal_State( @@ -227,26 +229,57 @@ contract IntegrationCheckUtils is IntegrationBase { Withdrawal[] memory withdrawals, bytes32[] memory withdrawalRoots, IStrategy[] memory strategies, - uint[] memory shares + uint[] memory stakerDepositShares, + uint[] memory stakerDelegatedShares ) internal { /// Undelegate from an operator // - // ... check that the staker is undelegated, all strategies from which the staker is deposited are unqeuued, + // ... check that the staker is undelegated, all strategies from which the staker is deposited are unqueued, // that the returned root matches the hashes for each strategy and share amounts, and that the staker // and operator have reduced shares assertFalse(delegationManager.isDelegated(address(staker)), "check_Undelegate_State: staker should not be delegated"); assert_ValidWithdrawalHashes(withdrawals, withdrawalRoots, - "check_Undelegate_State: calculated withdrawals should match returned roots"); + "check_Undelegate_State: calculated withdrawal should match returned root"); assert_AllWithdrawalsPending(withdrawalRoots, "check_Undelegate_State: stakers withdrawal should now be pending"); assert_Snap_Added_QueuedWithdrawals(staker, withdrawals, "check_Undelegate_State: staker should have increased nonce by withdrawals.length"); - assert_Snap_Removed_OperatorShares(operator, strategies, shares, + assert_Snap_Removed_OperatorShares(operator, strategies, stakerDelegatedShares, "check_Undelegate_State: failed to remove operator shares"); - assert_Snap_Removed_Staker_DepositShares(staker, strategies, shares, + assert_Snap_Removed_Staker_DepositShares(staker, strategies, stakerDepositShares, "check_Undelegate_State: failed to remove staker shares"); - assert_Snap_Removed_Staker_WithdrawableShares(staker, strategies, shares, + assert_Snap_RemovedAll_Staker_WithdrawableShares(staker, strategies, + "check_QueuedWithdrawal_State: failed to remove staker withdrawable shares"); + } + + function check_Redelegate_State( + User staker, + User operator, + IDelegationManagerTypes.Withdrawal[] memory withdrawals, + bytes32[] memory withdrawalRoots, + IStrategy[] memory strategies, + uint[] memory stakerDepositShares, + uint[] memory stakerDelegatedShares + ) internal { + /// Redelegate to a new operator + // + // ... check that the staker is delegated to new operator, all strategies from which the staker is deposited are unqueued, + // that the returned root matches the hashes for each strategy and share amounts, and that the staker + // and operator have reduced shares + assertTrue(delegationManager.isDelegated(address(staker)), + "check_Redelegate_State: staker should not be delegated"); + assert_ValidWithdrawalHashes(withdrawals, withdrawalRoots, + "check_Redelegate_State: calculated withdrawl should match returned root"); + assert_AllWithdrawalsPending(withdrawalRoots, + "check_Redelegate_State: stakers withdrawal should now be pending"); + assert_Snap_Added_QueuedWithdrawals(staker, withdrawals, + "check_Redelegate_State: staker should have increased nonce by withdrawals.length"); + assert_Snap_Removed_OperatorShares(operator, strategies, stakerDelegatedShares, + "check_Redelegate_State: failed to remove operator shares"); + assert_Snap_Removed_Staker_DepositShares(staker, strategies, stakerDepositShares, + "check_Redelegate_State: failed to remove staker shares"); + assert_Snap_RemovedAll_Staker_WithdrawableShares(staker, strategies, "check_QueuedWithdrawal_State: failed to remove staker withdrawable shares"); } @@ -329,6 +362,28 @@ contract IntegrationCheckUtils is IntegrationBase { assert_Snap_Unchanged_StrategyShares(strategies, "strategies should have total shares unchanged"); } + function check_Withdrawal_AsShares_Redelegated_State( + User staker, + User operator, + User newOperator, + IDelegationManagerTypes.Withdrawal memory withdrawal, + IStrategy[] memory strategies, + uint[] memory shares + ) internal { + /// Complete withdrawal(s): + // The staker will complete the withdrawal as shares + // + // ... check that the withdrawal is not pending, that the token balances of the staker and operator are unchanged, + // that the withdrawer received the expected shares, and that that the total shares of each o + // strategy withdrawn remains unchanged + assert_WithdrawalNotPending(delegationManager.calculateWithdrawalRoot(withdrawal), "staker withdrawal should no longer be pending"); + assert_Snap_Unchanged_TokenBalances(staker, "staker should not have any change in underlying token balances"); + assert_Snap_Unchanged_TokenBalances(operator, "operator should not have any change in underlying token balances"); + assert_Snap_Added_Staker_DepositShares(staker, strategies, shares, "staker should have received expected shares"); + assert_Snap_Unchanged_OperatorShares(operator, "operator should have shares unchanged"); + assert_Snap_Unchanged_StrategyShares(strategies, "strategies should have total shares unchanged"); + } + /******************************************************************************* ALM - BASIC INVARIANTS *******************************************************************************/ diff --git a/src/test/integration/IntegrationDeployer.t.sol b/src/test/integration/IntegrationDeployer.t.sol index 1ef129d89e..88d03c9a09 100644 --- a/src/test/integration/IntegrationDeployer.t.sol +++ b/src/test/integration/IntegrationDeployer.t.sol @@ -593,7 +593,7 @@ abstract contract IntegrationDeployer is ExistingDeploymentParser { function _genRandUser(string memory name, uint userType) internal returns (User user) { // Create User contract based on userType: - if (forkType == LOCAL) { + if (forkType == LOCAL || (forkType == MAINNET && isUpgraded)) { user = new User(name); if (userType == DEFAULT) { @@ -604,7 +604,7 @@ abstract contract IntegrationDeployer is ExistingDeploymentParser { } else { revert("_randUser: unimplemented userType"); } - } else if (forkType == MAINNET) { + } else if (forkType == MAINNET && !isUpgraded) { if (userType == DEFAULT) { user = User(new User_M2(name)); } else if (userType == ALT_METHODS) { diff --git a/src/test/integration/mocks/BeaconChainMock.t.sol b/src/test/integration/mocks/BeaconChainMock.t.sol index 5f4fdfcc41..4f93f54739 100644 --- a/src/test/integration/mocks/BeaconChainMock.t.sol +++ b/src/test/integration/mocks/BeaconChainMock.t.sol @@ -289,6 +289,11 @@ contract BeaconChainMock is Logger { _advanceEpoch(); } + function advanceEpoch_NoWithdrawNoRewards() public { + print.method("advanceEpoch_NoWithdrawNoRewards"); + _advanceEpoch(); + } + /// @dev Iterate over all validators. If the validator is still active, /// add CONSENSUS_REWARD_AMOUNT_GWEI to its current balance function _generateRewards() internal { diff --git a/src/test/integration/tests/Deposit_Delegate_Redelegate_Complete.t.sol b/src/test/integration/tests/Deposit_Delegate_Redelegate_Complete.t.sol index b3a3a40b49..48b37cad8b 100644 --- a/src/test/integration/tests/Deposit_Delegate_Redelegate_Complete.t.sol +++ b/src/test/integration/tests/Deposit_Delegate_Redelegate_Complete.t.sol @@ -31,6 +31,8 @@ contract Integration_Deposit_Delegate_Redelegate_Complete is IntegrationCheckUti (User operator2, ,) = _newRandomOperator(); uint[] memory shares = _calculateExpectedShares(strategies, tokenBalances); + //delegatable shares equals deposit shares here because no bc slashing + uint[] memory delegatableShares = shares; assert_HasNoDelegatableShares(staker, "staker should not have delegatable shares before depositing"); assertFalse(delegationManager.isDelegated(address(staker)), "staker should not be delegated"); @@ -46,7 +48,7 @@ contract Integration_Deposit_Delegate_Redelegate_Complete is IntegrationCheckUti // 3. Undelegate from an operator Withdrawal[] memory withdrawals = staker.undelegate(); bytes32[] memory withdrawalRoots = _getWithdrawalHashes(withdrawals); - check_Undelegate_State(staker, operator1, withdrawals, withdrawalRoots, strategies, shares); + check_Undelegate_State(staker, operator1, withdrawals, withdrawalRoots, strategies, shares, delegatableShares); // 4. Complete withdrawal as shares // Fast forward to when we can complete the withdrawal @@ -94,6 +96,8 @@ contract Integration_Deposit_Delegate_Redelegate_Complete is IntegrationCheckUti (User operator2, ,) = _newRandomOperator(); uint[] memory shares = _calculateExpectedShares(strategies, tokenBalances); + //delegatable shares equals deposit shares here because no bc slashing + uint[] memory delegatableShares = shares; assert_HasNoDelegatableShares(staker, "staker should not have delegatable shares before depositing"); assertFalse(delegationManager.isDelegated(address(staker)), "staker should not be delegated"); @@ -109,7 +113,7 @@ contract Integration_Deposit_Delegate_Redelegate_Complete is IntegrationCheckUti // 3. Undelegate from an operator Withdrawal[] memory withdrawals = staker.undelegate(); bytes32[] memory withdrawalRoots = _getWithdrawalHashes(withdrawals); - check_Undelegate_State(staker, operator1, withdrawals, withdrawalRoots, strategies, shares); + check_Undelegate_State(staker, operator1, withdrawals, withdrawalRoots, strategies, shares, delegatableShares); // 4. Complete withdrawal as shares // Fast forward to when we can complete the withdrawal @@ -185,6 +189,8 @@ contract Integration_Deposit_Delegate_Redelegate_Complete is IntegrationCheckUti numTokensRemaining[i] = tokenBalances[i] - numTokensToDeposit[i]; } uint[] memory halfShares = _calculateExpectedShares(strategies, numTokensToDeposit); + //delegatable shares equals deposit shares here because no bc slashing + uint[] memory delegatableShares = halfShares; /// 1. Deposit Into Strategies staker.depositIntoEigenlayer(strategies, numTokensToDeposit); @@ -197,7 +203,7 @@ contract Integration_Deposit_Delegate_Redelegate_Complete is IntegrationCheckUti // 3. Undelegate from an operator Withdrawal[] memory withdrawals = staker.undelegate(); bytes32[] memory withdrawalRoots = _getWithdrawalHashes(withdrawals); - check_Undelegate_State(staker, operator1, withdrawals, withdrawalRoots, strategies, halfShares); + check_Undelegate_State(staker, operator1, withdrawals, withdrawalRoots, strategies, halfShares, delegatableShares); // 4. Complete withdrawal as shares // Fast forward to when we can complete the withdrawal @@ -269,39 +275,43 @@ contract Integration_Deposit_Delegate_Redelegate_Complete is IntegrationCheckUti numTokensToDeposit[i] = tokenBalances[i] / 2; numTokensRemaining[i] = tokenBalances[i] - numTokensToDeposit[i]; } - uint[] memory sharesFromFirstDeposit = _calculateExpectedShares(strategies, numTokensToDeposit); - - /// 1. Deposit Into Strategies - staker.depositIntoEigenlayer(strategies, numTokensToDeposit); - check_Deposit_State_PartialDeposit(staker, strategies, sharesFromFirstDeposit, numTokensRemaining); - - // 2. Delegate to an operator - staker.delegateTo(operator1); - check_Delegation_State(staker, operator1, strategies, sharesFromFirstDeposit); - - // 3. Undelegate from an operator - Withdrawal[] memory withdrawals = staker.undelegate(); - bytes32[] memory withdrawalRoots = _getWithdrawalHashes(withdrawals); - check_Undelegate_State(staker, operator1, withdrawals, withdrawalRoots, strategies, sharesFromFirstDeposit); - - // 4. Complete withdrawal as shares - // Fast forward to when we can complete the withdrawal - _rollBlocksForCompleteWithdrawals(withdrawals); - for (uint256 i = 0; i < withdrawals.length; ++i) { - staker.completeWithdrawalAsShares(withdrawals[i]); - check_Withdrawal_AsShares_Undelegated_State(staker, operator1, withdrawals[i], withdrawals[i].strategies, withdrawals[i].scaledShares); + { + uint[] memory sharesFromFirstDeposit = _calculateExpectedShares(strategies, numTokensToDeposit); + //delegatable shares equals deposit shares here because no bc slashing + uint[] memory delegatableShares = sharesFromFirstDeposit; + + /// 1. Deposit Into Strategies + staker.depositIntoEigenlayer(strategies, numTokensToDeposit); + check_Deposit_State_PartialDeposit(staker, strategies, sharesFromFirstDeposit, numTokensRemaining); + + // 2. Delegate to an operator + staker.delegateTo(operator1); + check_Delegation_State(staker, operator1, strategies, sharesFromFirstDeposit); + + // 3. Undelegate from an operator + Withdrawal[] memory withdrawals = staker.undelegate(); + bytes32[] memory withdrawalRoots = _getWithdrawalHashes(withdrawals); + check_Undelegate_State(staker, operator1, withdrawals, withdrawalRoots, strategies, sharesFromFirstDeposit, delegatableShares); + + // 4. Complete withdrawal as shares + // Fast forward to when we can complete the withdrawal + _rollBlocksForCompleteWithdrawals(withdrawals); + for (uint256 i = 0; i < withdrawals.length; ++i) { + staker.completeWithdrawalAsShares(withdrawals[i]); + check_Withdrawal_AsShares_Undelegated_State(staker, operator1, withdrawals[i], withdrawals[i].strategies, withdrawals[i].scaledShares); + } + + // 5. Deposit into Strategies + uint[] memory sharesFromSecondDeposit = _calculateExpectedShares(strategies, numTokensRemaining); + for (uint i = 0; i < strategies.length; i++) { + totalShares[i] = sharesFromFirstDeposit[i] + sharesFromSecondDeposit[i]; + } + + staker.depositIntoEigenlayer(strategies, numTokensRemaining); + tokenBalances = _calculateExpectedTokens(strategies, totalShares); + check_Deposit_State(staker, strategies, sharesFromSecondDeposit); } - // 5. Deposit into Strategies - uint[] memory sharesFromSecondDeposit = _calculateExpectedShares(strategies, numTokensRemaining); - for (uint i = 0; i < strategies.length; i++) { - totalShares[i] = sharesFromFirstDeposit[i] + sharesFromSecondDeposit[i]; - } - - staker.depositIntoEigenlayer(strategies, numTokensRemaining); - tokenBalances = _calculateExpectedTokens(strategies, totalShares); - check_Deposit_State(staker, strategies, sharesFromSecondDeposit); - // 6. Delegate to a new operator staker.delegateTo(operator2); check_Delegation_State(staker, operator2, strategies, totalShares); @@ -339,6 +349,8 @@ contract Integration_Deposit_Delegate_Redelegate_Complete is IntegrationCheckUti (User operator2, ,) = _newRandomOperator(); uint[] memory shares = _calculateExpectedShares(strategies, tokenBalances); + //delegatable shares equals deposit shares here because no bc slashing + uint[] memory delegatableShares = shares; assert_HasNoDelegatableShares(staker, "staker should not have delegatable shares before depositing"); assertFalse(delegationManager.isDelegated(address(staker)), "staker should not be delegated"); @@ -355,7 +367,7 @@ contract Integration_Deposit_Delegate_Redelegate_Complete is IntegrationCheckUti // 3. Undelegate from an operator Withdrawal[] memory withdrawals = staker.undelegate(); bytes32[] memory withdrawalRoots = _getWithdrawalHashes(withdrawals); - check_Undelegate_State(staker, operator1, withdrawals, withdrawalRoots, strategies, shares); + check_Undelegate_State(staker, operator1, withdrawals, withdrawalRoots, strategies, shares, delegatableShares); // 4. Complete withdrawal as tokens // Fast forward to when we can complete the withdrawal @@ -404,6 +416,8 @@ contract Integration_Deposit_Delegate_Redelegate_Complete is IntegrationCheckUti (User operator2, ,) = _newRandomOperator(); uint[] memory shares = _calculateExpectedShares(strategies, tokenBalances); + //delegatable shares equals deposit shares here because no bc slashing + uint[] memory delegatableShares = shares; assert_HasNoDelegatableShares(staker, "staker should not have delegatable shares before depositing"); assertFalse(delegationManager.isDelegated(address(staker)), "staker should not be delegated"); @@ -420,7 +434,7 @@ contract Integration_Deposit_Delegate_Redelegate_Complete is IntegrationCheckUti // 3. Undelegate from an operator Withdrawal[] memory withdrawals = staker.undelegate(); bytes32[] memory withdrawalRoots = _getWithdrawalHashes(withdrawals); - check_Undelegate_State(staker, operator1, withdrawals, withdrawalRoots, strategies, shares); + check_Undelegate_State(staker, operator1, withdrawals, withdrawalRoots, strategies, shares, delegatableShares); // 4. Complete withdrawal as Tokens // Fast forward to when we can complete the withdrawal 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 0ce9894f9b..4979ee1672 100644 --- a/src/test/integration/tests/Deposit_Delegate_Undelegate_Complete.t.sol +++ b/src/test/integration/tests/Deposit_Delegate_Undelegate_Complete.t.sol @@ -25,6 +25,8 @@ contract Integration_Deposit_Delegate_Undelegate_Complete is IntegrationCheckUti (User operator, ,) = _newRandomOperator(); uint[] memory shares = _calculateExpectedShares(strategies, tokenBalances); + //delegatable shares equals deposit shares here because no bc slashing + uint[] memory delegatableShares = shares; assert_HasNoDelegatableShares(staker, "staker should not have delegatable shares before depositing"); assertFalse(delegationManager.isDelegated(address(staker)), "staker should not be delegated"); @@ -40,7 +42,7 @@ contract Integration_Deposit_Delegate_Undelegate_Complete is IntegrationCheckUti // 3. Undelegate from an operator Withdrawal[] memory withdrawals = staker.undelegate(); bytes32[] memory withdrawalRoots = _getWithdrawalHashes(withdrawals); - check_Undelegate_State(staker, operator, withdrawals, withdrawalRoots, strategies, shares); + check_Undelegate_State(staker, operator, withdrawals, withdrawalRoots, strategies, shares, delegatableShares); // 4. Complete withdrawal // Fast forward to when we can complete the withdrawal @@ -79,6 +81,8 @@ contract Integration_Deposit_Delegate_Undelegate_Complete is IntegrationCheckUti (User operator, ,) = _newRandomOperator(); uint[] memory shares = _calculateExpectedShares(strategies, tokenBalances); + //delegatable shares equals deposit shares here because no bc slashing + uint[] memory delegatableShares = shares; assert_HasNoDelegatableShares(staker, "staker should not have delegatable shares before depositing"); assertFalse(delegationManager.isDelegated(address(staker)), "staker should not be delegated"); @@ -94,7 +98,7 @@ contract Integration_Deposit_Delegate_Undelegate_Complete is IntegrationCheckUti // 3. Undelegate from an operator Withdrawal[] memory withdrawals = staker.undelegate(); bytes32[] memory withdrawalRoots = _getWithdrawalHashes(withdrawals); - check_Undelegate_State(staker, operator, withdrawals, withdrawalRoots, strategies, shares); + check_Undelegate_State(staker, operator, withdrawals, withdrawalRoots, strategies, shares, delegatableShares); // 4. Complete withdrawal // Fast forward to when we can complete the withdrawal @@ -126,6 +130,9 @@ contract Integration_Deposit_Delegate_Undelegate_Complete is IntegrationCheckUti (User operator, ,) = _newRandomOperator(); uint[] memory shares = _calculateExpectedShares(strategies, tokenBalances); + //delegatable shares equals deposit shares here because no bc slashing + uint[] memory delegatableShares = shares; + assert_HasNoDelegatableShares(staker, "staker should not have delegatable shares before depositing"); assertFalse(delegationManager.isDelegated(address(staker)), "staker should not be delegated"); @@ -141,7 +148,7 @@ contract Integration_Deposit_Delegate_Undelegate_Complete is IntegrationCheckUti // 3. Force undelegate Withdrawal[] memory withdrawals = operator.forceUndelegate(staker); bytes32[] memory withdrawalRoots = _getWithdrawalHashes(withdrawals); - check_Undelegate_State(staker, operator, withdrawals, withdrawalRoots, strategies, shares); + check_Undelegate_State(staker, operator, withdrawals, withdrawalRoots, strategies, shares, delegatableShares); // 4. Complete withdrawal // Fast forward to when we can complete the withdrawal @@ -174,6 +181,8 @@ contract Integration_Deposit_Delegate_Undelegate_Complete is IntegrationCheckUti (User operator, ,) = _newRandomOperator(); uint[] memory shares = _calculateExpectedShares(strategies, tokenBalances); + //delegatable shares equals deposit shares here because no bc slashing + uint[] memory delegatableShares = shares; assert_HasNoDelegatableShares(staker, "staker should not have delegatable shares before depositing"); assertFalse(delegationManager.isDelegated(address(staker)), "staker should not be delegated"); @@ -189,7 +198,7 @@ contract Integration_Deposit_Delegate_Undelegate_Complete is IntegrationCheckUti // 3. Force undelegate Withdrawal[] memory withdrawals = operator.forceUndelegate(staker); bytes32[] memory withdrawalRoots = _getWithdrawalHashes(withdrawals); - check_Undelegate_State(staker, operator, withdrawals, withdrawalRoots, strategies, shares); + check_Undelegate_State(staker, operator, withdrawals, withdrawalRoots, strategies, shares, delegatableShares); // 4. Complete withdrawal // Fast forward to when we can complete the withdrawal @@ -216,6 +225,8 @@ contract Integration_Deposit_Delegate_Undelegate_Complete is IntegrationCheckUti if (forkType == LOCAL) assertEq(strategies.length, 33, "sanity"); uint[] memory shares = _calculateExpectedShares(strategies, tokenBalances); + //delegatable shares equals deposit shares here because no bc slashing + uint[] memory delegatableShares = shares; assert_HasNoDelegatableShares(staker, "staker should not have delegatable shares before depositing"); assertFalse(delegationManager.isDelegated(address(staker)), "staker should not be delegated"); @@ -231,7 +242,7 @@ contract Integration_Deposit_Delegate_Undelegate_Complete is IntegrationCheckUti // 3. Undelegate from an operator Withdrawal[] memory withdrawals = staker.undelegate(); bytes32[] memory withdrawalRoots = _getWithdrawalHashes(withdrawals); - check_Undelegate_State(staker, operator, withdrawals, withdrawalRoots, strategies, shares); + check_Undelegate_State(staker, operator, withdrawals, withdrawalRoots, strategies, shares, delegatableShares); // 4. Complete withdrawal // Fast forward to when we can complete the withdrawal diff --git a/src/test/integration/tests/Slashed_Eigenpod.t.sol b/src/test/integration/tests/Slashed_Eigenpod.t.sol new file mode 100644 index 0000000000..d901cad05c --- /dev/null +++ b/src/test/integration/tests/Slashed_Eigenpod.t.sol @@ -0,0 +1,306 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.27; + +import "src/test/integration/IntegrationChecks.t.sol"; + +contract Integration_SlashedEigenpod is IntegrationCheckUtils { + using ArrayLib for *; + + AVS avs; + OperatorSet operatorSet; + + User operator; + IAllocationManagerTypes.AllocateParams allocateParams; + + User staker; + IStrategy[] strategies; + uint[] initTokenBalances; + uint64 slashedGwei; + + function _init() internal override { + _configAssetTypes(HOLDS_ETH); + (staker, strategies, initTokenBalances) = _newRandomStaker(); + (operator,,) = _newRandomOperator(); + (avs,) = _newRandomAVS(); + + cheats.assume(initTokenBalances[0] >= 64 ether); + + //Slash on Beacon chain + (uint40[] memory validators,) = staker.startValidators(); + beaconChain.advanceEpoch_NoRewards(); + staker.verifyWithdrawalCredentials(validators); + + uint[] memory shares = _calculateExpectedShares(strategies, initTokenBalances); + check_Deposit_State(staker, strategies, shares); + + uint40[] memory slashedValidators = _choose(validators); + slashedGwei = beaconChain.slashValidators(slashedValidators); + console.log(slashedGwei); + beaconChain.advanceEpoch_NoWithdrawNoRewards(); + + staker.startCheckpoint(); + staker.completeCheckpoint(); + check_CompleteCheckpoint_WithSlashing_HandleRoundDown_State(staker, slashedValidators, slashedGwei); + } + + function testFuzz_delegateSlashedStaker_dsfWad(uint24 _random) public rand(_random) { + + uint256[] memory initDelegatableShares = _getWithdrawableShares(staker, strategies); + uint256[] memory initDepositShares = _getStakerDepositShares(staker, strategies); + + // Delegate to an operator + staker.delegateTo(operator); + check_Delegation_State(staker, operator, strategies, initDepositShares); + + // Create an operator set and register an operator. + operatorSet = avs.createOperatorSet(strategies); + operator.registerForOperatorSet(operatorSet); + check_Registration_State_NoAllocation(operator, operatorSet, strategies); + + // Allocate to operator set + allocateParams = _genAllocation_AllAvailable(operator, operatorSet, strategies); + operator.modifyAllocations(allocateParams); + check_IncrAlloc_State_Slashable(operator, allocateParams); + _rollBlocksForCompleteAllocation(operator, operatorSet, strategies); + + (uint256[] memory withdrawableSharesBefore, ) = delegationManager.getWithdrawableShares(address(staker), strategies); + + // Undelegate from an operator + IDelegationManagerTypes.Withdrawal[] memory withdrawals = staker.undelegate(); + bytes32[] memory withdrawalRoots = _getWithdrawalHashes(withdrawals); + check_Undelegate_State(staker, operator, withdrawals, withdrawalRoots, strategies, initDepositShares, initDelegatableShares); + + // Complete withdrawal as shares + // Fast forward to when we can complete the withdrawal + _rollBlocksForCompleteWithdrawals(withdrawals); + for (uint256 i = 0; i < withdrawals.length; ++i) { + staker.completeWithdrawalAsShares(withdrawals[i]); + check_Withdrawal_AsShares_Undelegated_State(staker, operator, withdrawals[i], withdrawals[i].strategies, initDelegatableShares); + } + + (uint256[] memory withdrawableSharesAfter, uint256[] memory depositSharesAfter) = delegationManager.getWithdrawableShares(address(staker), strategies); + assertEq(depositSharesAfter[0], initDelegatableShares[0], "Deposit shares should reset to reflect slash(es)"); + assertApproxEqAbs(withdrawableSharesAfter[0], depositSharesAfter[0], 100, "Withdrawable shares should equal deposit shares after withdrawal"); + } + + function testFuzz_delegateSlashedStaker_dsfNonWad(uint24 _random) public rand(_random) { + + //Additional deposit on beacon chain so dsf is nonwad + uint amount = 32 ether * _randUint({min: 1, max: 5}); + cheats.deal(address(staker), amount); + (uint40[] memory validators,) = staker.startValidators(); + beaconChain.advanceEpoch_NoWithdrawNoRewards(); + staker.verifyWithdrawalCredentials(validators); + + staker.startCheckpoint(); + staker.completeCheckpoint(); + + + uint256[] memory initDelegatableShares = _getWithdrawableShares(staker, strategies); + uint256[] memory initDepositShares = _getStakerDepositShares(staker, strategies); + // Delegate to an operator + staker.delegateTo(operator); + check_Delegation_State(staker, operator, strategies, initDepositShares); + + uint256[] memory withdrawableSharesAfterDelegation = _getWithdrawableShares(staker, strategies); + + // Create an operator set and register an operator. + operatorSet = avs.createOperatorSet(strategies); + operator.registerForOperatorSet(operatorSet); + check_Registration_State_NoAllocation(operator, operatorSet, strategies); + + // Allocate to operator set + allocateParams = _genAllocation_AllAvailable(operator, operatorSet, strategies); + operator.modifyAllocations(allocateParams); + check_IncrAlloc_State_Slashable(operator, allocateParams); + _rollBlocksForCompleteAllocation(operator, operatorSet, strategies); + + (uint256[] memory withdrawableSharesBefore, ) = delegationManager.getWithdrawableShares(address(staker), strategies); + // Undelegate from an operator + IDelegationManagerTypes.Withdrawal[] memory withdrawals = staker.undelegate(); + bytes32[] memory withdrawalRoots = _getWithdrawalHashes(withdrawals); + check_Undelegate_State(staker, operator, withdrawals, withdrawalRoots, strategies, initDepositShares, initDelegatableShares); + + // Complete withdrawal as shares + // Fast forward to when we can complete the withdrawal + _rollBlocksForCompleteWithdrawals(withdrawals); + for (uint256 i = 0; i < withdrawals.length; ++i) { + staker.completeWithdrawalAsShares(withdrawals[i]); + check_Withdrawal_AsShares_Undelegated_State(staker, operator, withdrawals[i], withdrawals[i].strategies, initDelegatableShares); + } + + (uint256[] memory withdrawableSharesAfter, uint256[] memory depositSharesAfter) = delegationManager.getWithdrawableShares(address(staker), strategies); + assertEq(depositSharesAfter[0], initDelegatableShares[0], "Deposit shares should reset to reflect slash(es)"); + assertApproxEqAbs(withdrawableSharesAfter[0], depositSharesAfter[0], 100, "Withdrawable shares should equal deposit shares after withdrawal"); + } + + function testFuzz_delegateSlashedStaker_slashedOperator(uint24 _random) public rand(_random) { + + + (User staker2,,) = _newRandomStaker(); + (uint40[] memory validators2,) = staker2.startValidators(); + beaconChain.advanceEpoch_NoWithdrawNoRewards(); + staker2.verifyWithdrawalCredentials(validators2); + staker2.startCheckpoint(); + staker2.completeCheckpoint(); + staker2.delegateTo(operator); + + //randomize additional deposit to eigenpod + if(_randBool()){ + uint amount = 32 ether * _randUint({min: 1, max: 5}); + cheats.deal(address(staker), amount); + (uint40[] memory validators,) = staker.startValidators(); + beaconChain.advanceEpoch_NoWithdrawNoRewards(); + staker.verifyWithdrawalCredentials(validators); + + staker.startCheckpoint(); + staker.completeCheckpoint(); + } + + // Create an operator set and register an operator. + operatorSet = avs.createOperatorSet(strategies); + operator.registerForOperatorSet(operatorSet); + check_Registration_State_NoAllocation(operator, operatorSet, strategies); + + // Allocate to operator set + allocateParams = _genAllocation_AllAvailable(operator, operatorSet, strategies); + operator.modifyAllocations(allocateParams); + check_IncrAlloc_State_Slashable(operator, allocateParams); + _rollBlocksForCompleteAllocation(operator, operatorSet, strategies); + + //Slash operator before delegation + IAllocationManagerTypes.SlashingParams memory slashingParams; + uint wadToSlash = _randWadToSlash(); + slashingParams = avs.slashOperator(operator, operatorSet.id, strategies, wadToSlash.toArrayU256()); + assert_Snap_Allocations_Slashed(slashingParams, operatorSet, true, "operator allocations should be slashed"); + + uint256[] memory initDelegatableShares = _getWithdrawableShares(staker, strategies); + uint256[] memory initDepositShares = _getStakerDepositShares(staker, strategies); + + // Delegate to an operator + staker.delegateTo(operator); + (uint256[] memory delegatedShares, ) = delegationManager.getWithdrawableShares(address(staker), strategies); + check_Delegation_State(staker, operator, strategies, initDepositShares); + + // Undelegate from an operator + IDelegationManagerTypes.Withdrawal[] memory withdrawals = staker.undelegate(); + bytes32[] memory withdrawalRoots = _getWithdrawalHashes(withdrawals); + check_Undelegate_State(staker, operator, withdrawals, withdrawalRoots, strategies, initDepositShares, delegatedShares); + + // Complete withdrawal as shares + // Fast forward to when we can complete the withdrawal + _rollBlocksForCompleteWithdrawals(withdrawals); + for (uint256 i = 0; i < withdrawals.length; ++i) { + staker.completeWithdrawalAsShares(withdrawals[i]); + check_Withdrawal_AsShares_Undelegated_State(staker, operator, withdrawals[i], withdrawals[i].strategies, delegatedShares); + } + + (uint256[] memory withdrawableSharesAfter, uint256[] memory depositSharesAfter) = delegationManager.getWithdrawableShares(address(staker), strategies); + assertEq(depositSharesAfter[0], delegatedShares[0], "Deposit shares should reset to reflect slash(es)"); + assertApproxEqAbs(withdrawableSharesAfter[0], depositSharesAfter[0], 100, "Withdrawable shares should equal deposit shares after withdrawal"); + } + + function testFuzz_delegateSlashedStaker_redelegate_complete(uint24 _random) public rand(_random){ + + (User operator2, ,) = _newRandomOperator(); + + //Additional deposit on beacon chain so dsf is nonwad + uint amount = 32 ether * _randUint({min: 1, max: 5}); + cheats.deal(address(staker), amount); + (uint40[] memory validators,) = staker.startValidators(); + beaconChain.advanceEpoch_NoWithdrawNoRewards(); + staker.verifyWithdrawalCredentials(validators); + + staker.startCheckpoint(); + staker.completeCheckpoint(); + + + uint256[] memory initDepositShares = _getStakerDepositShares(staker, strategies); + + // Delegate to an operator + staker.delegateTo(operator); + check_Delegation_State(staker, operator, strategies, initDepositShares); + (uint256[] memory delegatedShares, ) = delegationManager.getWithdrawableShares(address(staker), strategies); + + // Create an operator set and register an operator. + operatorSet = avs.createOperatorSet(strategies); + operator.registerForOperatorSet(operatorSet); + check_Registration_State_NoAllocation(operator, operatorSet, strategies); + + // Allocate to operator set + allocateParams = _genAllocation_AllAvailable(operator, operatorSet, strategies); + operator.modifyAllocations(allocateParams); + check_IncrAlloc_State_Slashable(operator, allocateParams); + _rollBlocksForCompleteAllocation(operator, operatorSet, strategies); + + // Undelegate from an operator + IDelegationManagerTypes.Withdrawal[] memory withdrawals = staker.redelegate(operator2); + bytes32[] memory withdrawalRoots = _getWithdrawalHashes(withdrawals); + check_Redelegate_State(staker, operator, withdrawals, withdrawalRoots, strategies, initDepositShares, delegatedShares); + + // Complete withdrawal as shares + // Fast forward to when we can complete the withdrawal + _rollBlocksForCompleteWithdrawals(withdrawals); + for (uint256 i = 0; i < withdrawals.length; ++i) { + staker.completeWithdrawalAsShares(withdrawals[i]); + check_Withdrawal_AsShares_Redelegated_State(staker, operator, operator2, withdrawals[i], withdrawals[i].strategies, delegatedShares); + } + + (uint256[] memory withdrawableSharesAfter, uint256[] memory depositSharesAfter) = delegationManager.getWithdrawableShares(address(staker), strategies); + assertEq(depositSharesAfter[0], delegatedShares[0], "Deposit shares should reset to reflect slash(es)"); + assertApproxEqAbs(withdrawableSharesAfter[0], depositSharesAfter[0], 100, "Withdrawable shares should equal deposit shares after withdrawal"); + } + + + function testFuzz_delegateSlashedStaker_slashedOperator_withdrawAllShares_complete(uint24 _random) public rand(_random){ + //Additional deposit on beacon chain so dsf is nonwad + uint amount = 32 ether * _randUint({min: 1, max: 5}); + cheats.deal(address(staker), amount); + (uint40[] memory validators,) = staker.startValidators(); + beaconChain.advanceEpoch_NoWithdrawNoRewards(); + staker.verifyWithdrawalCredentials(validators); + + staker.startCheckpoint(); + staker.completeCheckpoint(); + + uint256[] memory initDepositShares = _getStakerDepositShares(staker, strategies); + + // Create an operator set and register an operator. + operatorSet = avs.createOperatorSet(strategies); + operator.registerForOperatorSet(operatorSet); + check_Registration_State_NoAllocation(operator, operatorSet, strategies); + + //Slash operator before delegation + IAllocationManagerTypes.SlashingParams memory slashingParams; + uint wadToSlash = _randWadToSlash(); + slashingParams = avs.slashOperator(operator, operatorSet.id, strategies, wadToSlash.toArrayU256()); + assert_Snap_Allocations_Slashed(slashingParams, operatorSet, true, "operator allocations should be slashed"); + + // Delegate to an operator + staker.delegateTo(operator); + check_Delegation_State(staker, operator, strategies, initDepositShares); + (uint256[] memory delegatedShares, ) = delegationManager.getWithdrawableShares(address(staker), strategies); + + // Allocate to operator set + allocateParams = _genAllocation_AllAvailable(operator, operatorSet, strategies); + operator.modifyAllocations(allocateParams); + check_IncrAlloc_State_Slashable(operator, allocateParams); + _rollBlocksForCompleteAllocation(operator, operatorSet, strategies); + + //Withdraw all shares + IDelegationManagerTypes.Withdrawal[] memory withdrawals = staker.queueWithdrawals(strategies, initDepositShares); + bytes32[] memory withdrawalRoots = _getWithdrawalHashes(withdrawals); + + // Complete withdrawal as shares + // Fast forward to when we can complete the withdrawal + _rollBlocksForCompleteWithdrawals(withdrawals); + for (uint256 i = 0; i < withdrawals.length; ++i) { + staker.completeWithdrawalAsShares(withdrawals[i]); + } + + (uint256[] memory withdrawableSharesAfter, uint256[] memory depositSharesAfter) = delegationManager.getWithdrawableShares(address(staker), strategies); + assertEq(depositSharesAfter[0], delegatedShares[0], "Deposit shares should reset to reflect slash(es)"); + assertApproxEqAbs(withdrawableSharesAfter[0], depositSharesAfter[0], 100, "Withdrawable shares should equal deposit shares after withdrawal"); + } + +} \ No newline at end of file diff --git a/src/test/integration/users/User.t.sol b/src/test/integration/users/User.t.sol index d24daf723e..0d1e96589e 100644 --- a/src/test/integration/users/User.t.sol +++ b/src/test/integration/users/User.t.sol @@ -237,6 +237,34 @@ contract User is Logger, IDelegationManagerTypes, IAllocationManagerTypes { return expectedWithdrawals; } + /// @dev Redelegate to a new operator + function redelegate( + User newOperator + ) public virtual createSnapshot returns (Withdrawal[] memory) { + print.method("redelegate", newOperator.NAME_COLORED()); + Withdrawal[] memory expectedWithdrawals = _getExpectedWithdrawalStructsForStaker(address(this)); + ISignatureUtils.SignatureWithExpiry memory emptySig; + _tryPrankAppointee_DelegationManager(IDelegationManager.redelegate.selector); + delegationManager.redelegate(address(newOperator), emptySig, bytes32(0)); + print.gasUsed(); + + for (uint256 i = 0; i < expectedWithdrawals.length; i++) { + IStrategy strat = expectedWithdrawals[i].strategies[0]; + + string memory name = strat == beaconChainETHStrategy + ? "Native ETH" + : IERC20Metadata(address(strat.underlyingToken())).name(); + + console.log( + " Expecting withdrawal with nonce %s of %s for %s scaled shares.", + expectedWithdrawals[i].nonce, + name, + expectedWithdrawals[i].scaledShares[0] + ); + } + return expectedWithdrawals; + } + /// @dev Force undelegate staker function forceUndelegate( User staker @@ -268,6 +296,15 @@ contract User is Logger, IDelegationManagerTypes, IAllocationManagerTypes { __deprecated_withdrawer: address(0) }); + uint256[] memory scaledSharesForWithdrawal = new uint256[](strategies.length); + for (uint256 i = 0; i < strategies.length; ++i) { + DepositScalingFactor memory dsf = DepositScalingFactor( + delegationManager.depositScalingFactor(address(this), strategies[i]) + ); + + scaledSharesForWithdrawal[i] = dsf.scaleForQueueWithdrawal(depositShares[i]); + } + // Create Withdrawal struct using same info Withdrawal[] memory withdrawals = new Withdrawal[](1); withdrawals[0] = Withdrawal({ @@ -277,7 +314,7 @@ contract User is Logger, IDelegationManagerTypes, IAllocationManagerTypes { nonce: nonce, startBlock: uint32(block.number), strategies: strategies, - scaledShares: depositShares // TODO: convert depositShares to shares and then scale in withdrawal + scaledShares: scaledSharesForWithdrawal }); bytes32[] memory withdrawalRoots = delegationManager.queueWithdrawals(params); @@ -643,10 +680,6 @@ contract User is Logger, IDelegationManagerTypes, IAllocationManagerTypes { uint256 scaledShares = dsf.scaleForQueueWithdrawal(depositShares[i]); - if (strategies[i] == beaconChainETHStrategy) { - scaledShares -= scaledShares % 1 gwei; - } - expectedWithdrawals[i] = Withdrawal({ staker: staker, delegatedTo: delegatedTo, diff --git a/src/test/mocks/EigenPodManagerMock.sol b/src/test/mocks/EigenPodManagerMock.sol index d59d77ff4d..d9b5f29242 100644 --- a/src/test/mocks/EigenPodManagerMock.sol +++ b/src/test/mocks/EigenPodManagerMock.sol @@ -50,8 +50,10 @@ contract EigenPodManagerMock is Test, Pausable { address podOwner, IStrategy, // strategy uint256 shares - ) external { - podOwnerDepositShares[podOwner] -= int256(shares); + ) external returns (uint256) { + int256 updatedShares = podOwnerDepositShares[podOwner] - int256(shares); + podOwnerDepositShares[podOwner] = updatedShares; + return uint256(updatedShares); } function denebForkTimestamp() external pure returns (uint64) { diff --git a/src/test/mocks/StrategyManagerMock.sol b/src/test/mocks/StrategyManagerMock.sol index e47feacdcb..74ec746fdb 100644 --- a/src/test/mocks/StrategyManagerMock.sol +++ b/src/test/mocks/StrategyManagerMock.sol @@ -83,9 +83,11 @@ contract StrategyManagerMock is Test { function removeDepositShares( address staker, IStrategy strategy, uint256 sharesToRemove - ) external { + ) external returns (uint256) { uint256 strategyIndex = _getStrategyIndex(staker, strategy); - sharesToReturn[staker][strategyIndex] -= sharesToRemove; + uint256 updatedShares = sharesToReturn[staker][strategyIndex] - sharesToRemove; + sharesToReturn[staker][strategyIndex] = updatedShares; + return updatedShares; } function removeStrategiesFromDepositWhitelist(IStrategy[] calldata /*strategiesToRemoveFromWhitelist*/) external pure {} diff --git a/src/test/unit/DelegationUnit.t.sol b/src/test/unit/DelegationUnit.t.sol index 6350ea2ade..9a0458281e 100644 --- a/src/test/unit/DelegationUnit.t.sol +++ b/src/test/unit/DelegationUnit.t.sol @@ -18,7 +18,7 @@ import "src/test/harnesses/DelegationManagerHarness.sol"; * Contracts not mocked: StrategyBase, PauserRegistry */ contract DelegationManagerUnitTests is EigenLayerUnitTestSetup, IDelegationManagerEvents, IDelegationManagerErrors { - using SlashingLib for *; + using SlashingLib for *; using ArrayLib for *; using Math for *; @@ -58,7 +58,9 @@ contract DelegationManagerUnitTests is EigenLayerUnitTestSetup, IDelegationManag uint256 delegationSignerPrivateKey = uint256(0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80); address defaultApprover = cheats.addr(delegationSignerPrivateKey); uint256 stakerPrivateKey = uint256(123_456_789); + uint256 staker2PrivateKey = uint256(234_567_891); address defaultStaker = cheats.addr(stakerPrivateKey); + address defaultStaker2 = cheats.addr(staker2PrivateKey); address defaultOperator = address(this); address defaultOperator2 = address(0x123); address defaultAVS = address(this); @@ -175,7 +177,7 @@ contract DelegationManagerUnitTests is EigenLayerUnitTestSetup, IDelegationManag } /** - * @notice internal function to deploy mock tokens and strategies and have the staker deposit into them. + * @notice internal function to deploy mock tokens and strategies and have the staker deposit into them. * Since we are mocking the strategyManager we call strategyManagerMock.setDeposits so that when * DelegationManager calls getDeposits, we can have these share amounts returned. */ @@ -191,7 +193,7 @@ contract DelegationManagerUnitTests is EigenLayerUnitTestSetup, IDelegationManag if (strategies[i] == beaconChainETHStrategy) { eigenPodManagerMock.setPodOwnerShares(staker, int256(sharesAmounts[i])); } else { - strategyManagerMock.addDeposit(staker, strategies[i], sharesAmounts[i]); + strategyManagerMock.addDeposit(staker, strategies[i], sharesAmounts[i]); } } } @@ -210,11 +212,7 @@ contract DelegationManagerUnitTests is EigenLayerUnitTestSetup, IDelegationManag approverSignatureAndExpiry.expiry = expiry; { bytes32 digestHash = delegationManager.calculateDelegationApprovalDigestHash( - staker, - operator, - delegationManager.delegationApprover(operator), - salt, - expiry + staker, operator, delegationManager.delegationApprover(operator), salt, expiry ); (uint8 v, bytes32 r, bytes32 s) = cheats.sign(_delegationSignerPrivateKey, digestHash); approverSignatureAndExpiry.signature = abi.encodePacked(r, s, v); @@ -231,13 +229,8 @@ contract DelegationManagerUnitTests is EigenLayerUnitTestSetup, IDelegationManag function _delegateToOperatorWhoRequiresSig(address staker, address operator, bytes32 salt) internal { uint256 expiry = type(uint256).max; - ISignatureUtils.SignatureWithExpiry memory approverSignatureAndExpiry = _getApproverSignature( - delegationSignerPrivateKey, - staker, - operator, - salt, - expiry - ); + ISignatureUtils.SignatureWithExpiry memory approverSignatureAndExpiry = + _getApproverSignature(delegationSignerPrivateKey, staker, operator, salt, expiry); cheats.prank(staker); delegationManager.delegateTo(operator, approverSignatureAndExpiry, salt); } @@ -246,15 +239,21 @@ contract DelegationManagerUnitTests is EigenLayerUnitTestSetup, IDelegationManag _delegateToOperatorWhoRequiresSig(staker, operator, emptySalt); } - function _registerOperatorWithBaseDetails(address operator) internal { + function _registerOperatorWithBaseDetails( + address operator + ) internal { _registerOperator(operator, address(0), emptyStringForMetadataURI); } - function _registerOperatorWithDelegationApprover(address operator) internal { + function _registerOperatorWithDelegationApprover( + address operator + ) internal { _registerOperator(operator, defaultApprover, emptyStringForMetadataURI); } - function _registerOperatorWith1271DelegationApprover(address operator) internal returns (ERC1271WalletMock) { + function _registerOperatorWith1271DelegationApprover( + address operator + ) internal returns (ERC1271WalletMock) { address delegationSigner = defaultApprover; /** * deploy a ERC1271WalletMock contract with the `delegationSigner` address as the owner, @@ -282,12 +281,15 @@ contract DelegationManagerUnitTests is EigenLayerUnitTestSetup, IDelegationManag function _fuzzDepositWithdrawalAmounts( Randomness r, uint32 numStrategies - ) internal returns ( - uint256[] memory depositAmounts, - uint256[] memory withdrawalAmounts, - uint64[] memory prevMagnitudes, - uint64[] memory newMagnitudes - ) { + ) + internal + returns ( + uint256[] memory depositAmounts, + uint256[] memory withdrawalAmounts, + uint64[] memory prevMagnitudes, + uint64[] memory newMagnitudes + ) + { withdrawalAmounts = new uint256[](numStrategies); depositAmounts = new uint256[](numStrategies); prevMagnitudes = new uint64[](numStrategies); @@ -297,7 +299,6 @@ contract DelegationManagerUnitTests is EigenLayerUnitTestSetup, IDelegationManag // generate withdrawal amount within range s.t withdrawAmount <= depositAmount withdrawalAmounts[i] = r.Uint256(1, depositAmounts[i]); - prevMagnitudes[i] = r.Uint64(2, WAD); newMagnitudes[i] = r.Uint64(1, prevMagnitudes[i]); } @@ -308,11 +309,7 @@ contract DelegationManagerUnitTests is EigenLayerUnitTestSetup, IDelegationManag address staker, IStrategy strategy, uint256 depositSharesToWithdraw - ) internal view returns ( - QueuedWithdrawalParams[] memory, - Withdrawal memory, - bytes32 - ) { + ) internal view returns (QueuedWithdrawalParams[] memory, Withdrawal memory, bytes32) { IStrategy[] memory strategyArray = strategy.toArray(); QueuedWithdrawalParams[] memory queuedWithdrawalParams = new QueuedWithdrawalParams[](1); { @@ -345,11 +342,7 @@ contract DelegationManagerUnitTests is EigenLayerUnitTestSetup, IDelegationManag address staker, IStrategy[] memory strategies, uint256[] memory depositWithdrawalAmounts - ) internal view returns ( - QueuedWithdrawalParams[] memory, - Withdrawal memory, - bytes32 - ) { + ) internal view returns (QueuedWithdrawalParams[] memory, Withdrawal memory, bytes32) { QueuedWithdrawalParams[] memory queuedWithdrawalParams = new QueuedWithdrawalParams[](1); { queuedWithdrawalParams[0] = QueuedWithdrawalParams({ @@ -364,7 +357,7 @@ contract DelegationManagerUnitTests is EigenLayerUnitTestSetup, IDelegationManag for (uint256 i = 0; i < strategies.length; i++) { scaledSharesArray[i] = _getScaledShares(staker, strategies[i], depositWithdrawalAmounts[i]); } - + Withdrawal memory withdrawal = Withdrawal({ staker: staker, delegatedTo: delegationManager.delegatedTo(staker), @@ -391,9 +384,14 @@ contract DelegationManagerUnitTests is EigenLayerUnitTestSetup, IDelegationManag delegationManager.queueWithdrawals(queuedWithdrawalParams); } - function _getScaledShares(address staker, IStrategy strategy, uint256 depositSharesToWithdraw) internal view returns (uint256) { - DepositScalingFactor memory _dsf = DepositScalingFactor(delegationManager.depositScalingFactor(staker, strategy)); - + function _getScaledShares( + address staker, + IStrategy strategy, + uint256 depositSharesToWithdraw + ) internal view returns (uint256) { + DepositScalingFactor memory _dsf = + DepositScalingFactor(delegationManager.depositScalingFactor(staker, strategy)); + return _dsf.scaleForQueueWithdrawal(depositSharesToWithdraw); } @@ -445,11 +443,8 @@ contract DelegationManagerUnitTests is EigenLayerUnitTestSetup, IDelegationManag uint256[] memory depositAmounts = new uint256[](1); depositAmounts[0] = depositAmount; IStrategy[] memory strategies = _deployAndDepositIntoStrategies(staker, depositAmounts, isBeaconChainStrategy); - ( - QueuedWithdrawalParams[] memory queuedWithdrawalParams, - Withdrawal memory withdrawal, - bytes32 withdrawalRoot - ) = _setUpQueueWithdrawalsSingleStrat({ + (QueuedWithdrawalParams[] memory queuedWithdrawalParams, Withdrawal memory withdrawal, bytes32 withdrawalRoot) = + _setUpQueueWithdrawalsSingleStrat({ staker: staker, strategy: strategies[0], depositSharesToWithdraw: withdrawalAmount @@ -462,7 +457,7 @@ contract DelegationManagerUnitTests is EigenLayerUnitTestSetup, IDelegationManag strategyManagerMock.setDeposits(staker, strategies, currentAmounts); IERC20[] memory tokens = new IERC20[](strategies.length); - for (uint i = 0; i < tokens.length; i++) { + for (uint256 i = 0; i < tokens.length; i++) { tokens[i] = strategies[i].underlyingToken(); } @@ -471,7 +466,7 @@ contract DelegationManagerUnitTests is EigenLayerUnitTestSetup, IDelegationManag /** * Deploy and deposit staker into a single strategy, then set up multiple queued withdrawals for the staker - * Assumptions: + * Assumptions: * - operator is already a registered operator. * - total deposit amount = depositAmount * numWithdrawals * - this will fully withdraw from the single strategy @@ -480,11 +475,7 @@ contract DelegationManagerUnitTests is EigenLayerUnitTestSetup, IDelegationManag address staker, uint256 depositAmount, uint256 numWithdrawals - ) internal returns ( - Withdrawal[] memory withdrawals, - IERC20[][] memory tokens, - bytes32[] memory withdrawalRoots - ) { + ) internal returns (Withdrawal[] memory withdrawals, IERC20[][] memory tokens, bytes32[] memory withdrawalRoots) { uint256[] memory depositAmounts = new uint256[](1); depositAmounts[0] = depositAmount * numWithdrawals; IStrategy[] memory strategies = _deployAndDepositIntoStrategies(staker, depositAmounts, false); @@ -493,7 +484,7 @@ contract DelegationManagerUnitTests is EigenLayerUnitTestSetup, IDelegationManag tokens = new IERC20[][](numWithdrawals); withdrawalRoots = new bytes32[](numWithdrawals); - for (uint i = 0; i < numWithdrawals; i++) { + for (uint256 i = 0; i < numWithdrawals; i++) { ( QueuedWithdrawalParams[] memory queuedWithdrawalParams, Withdrawal memory withdrawal, @@ -519,7 +510,6 @@ contract DelegationManagerUnitTests is EigenLayerUnitTestSetup, IDelegationManag currentAmounts[0] = 0; strategyManagerMock.setDeposits(staker, strategies, currentAmounts); } - return (withdrawals, tokens, withdrawalRoots); } @@ -536,22 +526,16 @@ contract DelegationManagerUnitTests is EigenLayerUnitTestSetup, IDelegationManag uint256[] memory withdrawalAmounts, bool depositBeaconChainShares ) internal returns (Withdrawal memory, IERC20[] memory, bytes32) { - IStrategy[] memory strategies = _deployAndDepositIntoStrategies(staker, depositAmounts, depositBeaconChainShares); + IStrategy[] memory strategies = + _deployAndDepositIntoStrategies(staker, depositAmounts, depositBeaconChainShares); IERC20[] memory tokens = new IERC20[](strategies.length); for (uint256 i = 0; i < strategies.length; i++) { tokens[i] = strategies[i].underlyingToken(); } - ( - QueuedWithdrawalParams[] memory queuedWithdrawalParams, - Withdrawal memory withdrawal, - bytes32 withdrawalRoot - ) = _setUpQueueWithdrawals({ - staker: staker, - strategies: strategies, - depositWithdrawalAmounts: withdrawalAmounts - }); + (QueuedWithdrawalParams[] memory queuedWithdrawalParams, Withdrawal memory withdrawal, bytes32 withdrawalRoot) = + _setUpQueueWithdrawals({staker: staker, strategies: strategies, depositWithdrawalAmounts: withdrawalAmounts}); cheats.prank(staker); delegationManager.queueWithdrawals(queuedWithdrawalParams); @@ -559,11 +543,7 @@ contract DelegationManagerUnitTests is EigenLayerUnitTestSetup, IDelegationManag return (withdrawal, tokens, withdrawalRoot); } - function _setOperatorMagnitude( - address operator, - IStrategy strategy, - uint64 magnitude - ) internal { + function _setOperatorMagnitude(address operator, IStrategy strategy, uint64 magnitude) internal { allocationManagerMock.setMaxMagnitude(operator, strategy, magnitude); } @@ -571,10 +551,7 @@ contract DelegationManagerUnitTests is EigenLayerUnitTestSetup, IDelegationManag address staker, int256 beaconShares, uint256 sharesDecrease - ) internal returns ( - uint64 prevBeaconSlashingFactor, - uint64 newBeaconSlashingFactor - ) { + ) internal returns (uint64 prevBeaconSlashingFactor, uint64 newBeaconSlashingFactor) { uint256 newRestakedBalanceWei = uint256(beaconShares) - sharesDecrease; prevBeaconSlashingFactor = eigenPodManagerMock.beaconChainSlashingFactor(staker); newBeaconSlashingFactor = uint64(prevBeaconSlashingFactor.mulDiv(newRestakedBalanceWei, uint256(beaconShares))); @@ -586,10 +563,8 @@ contract DelegationManagerUnitTests is EigenLayerUnitTestSetup, IDelegationManag int256 beaconShares, uint256 sharesDecrease ) internal returns (uint64 prevBeaconSlashingFactor, uint64 newBeaconSlashingFactor) { - ( - prevBeaconSlashingFactor, - newBeaconSlashingFactor - ) = _setNewBeaconChainSlashingFactor(staker, beaconShares, sharesDecrease); + (prevBeaconSlashingFactor, newBeaconSlashingFactor) = + _setNewBeaconChainSlashingFactor(staker, beaconShares, sharesDecrease); cheats.prank(address(eigenPodManagerMock)); delegationManager.decreaseDelegatedShares({ @@ -609,7 +584,9 @@ contract DelegationManagerUnitTests is EigenLayerUnitTestSetup, IDelegationManag string metadataURI; } - function _registerOperator_expectEmit(RegisterAsOperatorEmitStruct memory params) internal { + function _registerOperator_expectEmit( + RegisterAsOperatorEmitStruct memory params + ) internal { cheats.expectEmit(true, true, true, true, address(delegationManager)); emit DelegationApproverUpdated(params.operator, params.delegationApprover); cheats.expectEmit(true, true, true, true, address(delegationManager)); @@ -628,7 +605,9 @@ contract DelegationManagerUnitTests is EigenLayerUnitTestSetup, IDelegationManag uint256[] depositScalingFactors; } - function _delegateTo_expectEmit(DelegateToEmitStruct memory params) internal { + function _delegateTo_expectEmit( + DelegateToEmitStruct memory params + ) internal { cheats.expectEmit(true, true, true, true, address(delegationManager)); emit StakerDelegated(params.staker, params.operator); for (uint256 i = 0; i < params.strategies.length; i++) { @@ -647,7 +626,9 @@ contract DelegationManagerUnitTests is EigenLayerUnitTestSetup, IDelegationManag uint256 depositScalingFactor; } - function _delegateTo_expectEmit_singleStrat(DelegateToSingleStratEmitStruct memory params) internal { + function _delegateTo_expectEmit_singleStrat( + DelegateToSingleStratEmitStruct memory params + ) internal { cheats.expectEmit(true, true, true, true, address(delegationManager)); emit StakerDelegated(params.staker, params.operator); if (params.depositShares > 0) { @@ -684,9 +665,13 @@ contract DelegationManagerUnitTests is EigenLayerUnitTestSetup, IDelegationManag if (address(params.strategy) != address(0)) { cheats.expectEmit(true, true, true, true, address(delegationManager)); - emit OperatorSharesDecreased(params.operator, params.staker, params.strategy, params.operatorSharesDecreased); + emit OperatorSharesDecreased( + params.operator, params.staker, params.strategy, params.operatorSharesDecreased + ); cheats.expectEmit(true, true, true, true, address(delegationManager)); - emit SlashingWithdrawalQueued(params.withdrawalRoot, params.withdrawal, params.operatorSharesDecreased.toArrayU256()); + emit SlashingWithdrawalQueued( + params.withdrawalRoot, params.withdrawal, params.operatorSharesDecreased.toArrayU256() + ); } } @@ -698,7 +683,9 @@ contract DelegationManagerUnitTests is EigenLayerUnitTestSetup, IDelegationManag uint256 depositScalingFactor; } - function _increaseDelegatedShares_expectEmit(IncreaseDelegatedSharesEmitStruct memory params) internal { + function _increaseDelegatedShares_expectEmit( + IncreaseDelegatedSharesEmitStruct memory params + ) internal { cheats.expectEmit(true, true, true, true, address(delegationManager)); emit DepositScalingFactorUpdated(params.staker, params.strategy, params.depositScalingFactor); cheats.expectEmit(true, true, true, true, address(delegationManager)); @@ -711,7 +698,9 @@ contract DelegationManagerUnitTests is EigenLayerUnitTestSetup, IDelegationManag uint256 sharesToDecrease; } - function _decreaseDelegatedShares_expectEmit(DecreaseDelegatedSharesEmitStruct memory params) internal { + function _decreaseDelegatedShares_expectEmit( + DecreaseDelegatedSharesEmitStruct memory params + ) internal { cheats.expectEmit(true, true, true, true, address(delegationManager)); emit OperatorSharesDecreased(params.operator, params.staker, beaconChainETHStrategy, params.sharesToDecrease); } @@ -724,24 +713,25 @@ contract DelegationManagerUnitTests is EigenLayerUnitTestSetup, IDelegationManag bytes32 withdrawalRoot; } - function _queueWithdrawals_expectEmit(QueueWithdrawalsEmitStruct memory params) internal { + function _queueWithdrawals_expectEmit( + QueueWithdrawalsEmitStruct memory params + ) internal { for (uint256 i = 0; i < params.queuedWithdrawalParams.length; i++) { uint256[] memory sharesToWithdraw = new uint256[](params.queuedWithdrawalParams[i].strategies.length); for (uint256 j = 0; j < params.queuedWithdrawalParams[i].strategies.length; j++) { - uint256 depositScalingFactor = delegationManager.depositScalingFactor(defaultStaker, params.queuedWithdrawalParams[i].strategies[j]); - uint256 newMaxMagnitude = allocationManagerMock.getMaxMagnitudes(params.operator, params.queuedWithdrawalParams[i].strategies)[j]; + uint256 depositScalingFactor = delegationManager.depositScalingFactor( + defaultStaker, params.queuedWithdrawalParams[i].strategies[j] + ); + uint256 newMaxMagnitude = allocationManagerMock.getMaxMagnitudes( + params.operator, params.queuedWithdrawalParams[i].strategies + )[j]; sharesToWithdraw[j] = _calcWithdrawableShares( - params.queuedWithdrawalParams[i].depositShares[j], - depositScalingFactor, - newMaxMagnitude + params.queuedWithdrawalParams[i].depositShares[j], depositScalingFactor, newMaxMagnitude ); cheats.expectEmit(true, true, true, true, address(delegationManager)); emit OperatorSharesDecreased( - params.operator, - params.staker, - params.queuedWithdrawalParams[i].strategies[j], - sharesToWithdraw[j] + params.operator, params.staker, params.queuedWithdrawalParams[i].strategies[j], sharesToWithdraw[j] ); } cheats.expectEmit(true, true, true, true, address(delegationManager)); @@ -755,7 +745,9 @@ contract DelegationManagerUnitTests is EigenLayerUnitTestSetup, IDelegationManag bool receiveAsTokens; } - function _completeQueuedWithdrawal_expectEmit(CompleteQueuedWithdrawalEmitStruct memory params) internal { + function _completeQueuedWithdrawal_expectEmit( + CompleteQueuedWithdrawalEmitStruct memory params + ) internal { if (!params.receiveAsTokens) { address operator = delegationManager.delegatedTo(params.withdrawal.staker); uint64[] memory slashingFactors = new uint64[](params.withdrawal.strategies.length); @@ -766,47 +758,45 @@ contract DelegationManagerUnitTests is EigenLayerUnitTestSetup, IDelegationManag // Get updated deposit scaling factor uint256 curDepositShares; if (params.withdrawal.strategies[i] == beaconChainETHStrategy) { - curDepositShares = uint256(eigenPodManagerMock.stakerDepositShares(params.withdrawal.staker, address(0))); - slashingFactors[i] = uint64(slashingFactors[i] - .mulWad(eigenPodManagerMock.beaconChainSlashingFactor(params.withdrawal.staker)) + curDepositShares = + uint256(eigenPodManagerMock.stakerDepositShares(params.withdrawal.staker, address(0))); + slashingFactors[i] = uint64( + slashingFactors[i].mulWad( + eigenPodManagerMock.beaconChainSlashingFactor(params.withdrawal.staker) + ) ); } else { - curDepositShares = strategyManagerMock.stakerDepositShares(params.withdrawal.staker, params.withdrawal.strategies[i]); + curDepositShares = strategyManagerMock.stakerDepositShares( + params.withdrawal.staker, params.withdrawal.strategies[i] + ); } - uint256 sharesToWithdraw = _calcCompletedWithdrawnShares( - params.withdrawal.scaledShares[i], - slashingFactors[i] - ); + uint256 sharesToWithdraw = + _calcCompletedWithdrawnShares(params.withdrawal.scaledShares[i], slashingFactors[i]); uint256 expectedDepositScalingFactor = _calcDepositScalingFactor({ - prevDsf: delegationManager.depositScalingFactor(params.withdrawal.staker, params.withdrawal.strategies[i]), + prevDsf: delegationManager.depositScalingFactor( + params.withdrawal.staker, params.withdrawal.strategies[i] + ), prevDepositShares: curDepositShares, addedDepositShares: sharesToWithdraw, slashingFactor: slashingFactors[i] }); cheats.expectEmit(true, true, true, true, address(delegationManager)); emit DepositScalingFactorUpdated( - params.withdrawal.staker, - params.withdrawal.strategies[i], - expectedDepositScalingFactor + params.withdrawal.staker, params.withdrawal.strategies[i], expectedDepositScalingFactor ); if (operator != address(0)) { cheats.expectEmit(true, true, true, true, address(delegationManager)); emit OperatorSharesIncreased( - operator, - params.withdrawal.staker, - params.withdrawal.strategies[i], - sharesToWithdraw - ); + operator, params.withdrawal.staker, params.withdrawal.strategies[i], sharesToWithdraw + ); } } } - emit SlashingWithdrawalCompleted( - delegationManager.calculateWithdrawalRoot(params.withdrawal) - ); + emit SlashingWithdrawalCompleted(delegationManager.calculateWithdrawalRoot(params.withdrawal)); } struct CompleteQueuedWithdrawalsEmitStruct { @@ -836,7 +826,9 @@ contract DelegationManagerUnitTests is EigenLayerUnitTestSetup, IDelegationManag uint256 sharesToBurn; } - function _slashOperatorShares_expectEmit(SlashOperatorSharesEmitStruct memory params) internal { + function _slashOperatorShares_expectEmit( + SlashOperatorSharesEmitStruct memory params + ) internal { cheats.expectEmit(true, true, true, true, address(delegationManager)); emit OperatorSharesDecreased(params.operator, address(0), params.strategy, params.sharesToDecrease); } @@ -853,9 +845,7 @@ contract DelegationManagerUnitTests is EigenLayerUnitTestSetup, IDelegationManag uint256 depositScalingFactor, uint256 slashingFactor ) internal pure returns (uint256) { - return depositShares - .mulWad(depositScalingFactor) - .mulWad(slashingFactor); + return depositShares.mulWad(depositScalingFactor).mulWad(slashingFactor); } function _calcCompletedWithdrawnShares( @@ -874,17 +864,11 @@ contract DelegationManagerUnitTests is EigenLayerUnitTestSetup, IDelegationManag ) internal pure returns (uint256) { if (prevDepositShares == 0) return uint256(WAD).divWad(slashingFactor); - uint256 currWithdrawableShares = _calcWithdrawableShares( - prevDepositShares, - prevDsf, - slashingFactor - ); + uint256 currWithdrawableShares = _calcWithdrawableShares(prevDepositShares, prevDsf, slashingFactor); uint256 newWithdrawableShares = currWithdrawableShares + addedDepositShares; - uint256 newDsf = newWithdrawableShares - .divWad(prevDepositShares + addedDepositShares) - .divWad(slashingFactor); + uint256 newDsf = newWithdrawableShares.divWad(prevDepositShares + addedDepositShares).divWad(slashingFactor); return newDsf; } @@ -913,10 +897,8 @@ contract DelegationManagerUnitTests is EigenLayerUnitTestSetup, IDelegationManag uint256 prevDsf, uint256 depositAmount ) internal view { - ( - uint256[] memory withdrawableShares, - uint256[] memory depositShares - ) = delegationManager.getWithdrawableShares(staker, strategy.toArray()); + (uint256[] memory withdrawableShares, uint256[] memory depositShares) = + delegationManager.getWithdrawableShares(staker, strategy.toArray()); // Check deposit shares added correctly assertEq( depositShares[0], @@ -936,17 +918,9 @@ contract DelegationManagerUnitTests is EigenLayerUnitTestSetup, IDelegationManag { uint64 maxMagnitude = allocationManagerMock.getMaxMagnitude(operator, strategy); uint256 slashingFactor = _getSlashingFactor(staker, strategy, maxMagnitude); - expectedDsf = _calcDepositScalingFactor( - prevDsf, - depositSharesBefore, - depositAmount, - slashingFactor - ); - expectedWithdrawableShares = _calcWithdrawableShares( - depositSharesBefore + depositAmount, - expectedDsf, - slashingFactor - ); + expectedDsf = _calcDepositScalingFactor(prevDsf, depositSharesBefore, depositAmount, slashingFactor); + expectedWithdrawableShares = + _calcWithdrawableShares(depositSharesBefore + depositAmount, expectedDsf, slashingFactor); } // Check the new dsf is accurate assertEq( @@ -970,6 +944,63 @@ contract DelegationManagerUnitTests is EigenLayerUnitTestSetup, IDelegationManag ); } + /// @notice Asserts for depositShares, withdrawableShares, and depositScalingFactor after a delegation + function _assertDelegation( + address staker, + address operator, + IStrategy strategy, + uint256 operatorSharesBefore, + uint256 withdrawableSharesBefore, + uint256 depositSharesBefore, + uint256 prevDsf + ) internal view { + (uint256[] memory withdrawableShares, uint256[] memory depositShares) = + delegationManager.getWithdrawableShares(staker, strategy.toArray()); + // Check deposit shares don't change + assertEq( + depositShares[0], + depositSharesBefore, + "depositShares should be equal to depositSharesBefore" + ); + // Check withdrawable shares don't change + assertApproxEqRel( + withdrawableShares[0], + withdrawableSharesBefore, + APPROX_REL_DIFF, + "withdrawableShares should be equal to withdrawableSharesBefore" + ); + // Check the new dsf is accurate + uint256 expectedWithdrawableShares; + uint256 expectedDsf; + { + uint64 maxMagnitude = allocationManagerMock.getMaxMagnitude(operator, strategy); + expectedDsf = prevDsf.divWad(maxMagnitude); + uint256 slashingFactor = _getSlashingFactor(staker, strategy, maxMagnitude); + expectedWithdrawableShares = + _calcWithdrawableShares(depositSharesBefore, expectedDsf, slashingFactor); + } + // Check the new dsf is accurate + assertEq( + expectedDsf, + delegationManager.depositScalingFactor(staker, strategy), + "depositScalingFactor should be equal to expectedDsf" + ); + // Check new operatorShares increased correctly + if (operator != address(0)) { + assertEq( + operatorSharesBefore + withdrawableSharesBefore, + delegationManager.operatorShares(operator, strategy), + "OperatorShares not increased correctly" + ); + } + // Check the newly calculated withdrawable shares are correct + assertEq( + withdrawableShares[0], + expectedWithdrawableShares, + "withdrawableShares should be equal to expectedWithdrawableShares" + ); + } + /// @notice Asserts for depositShares, and operatorShares decremented properly after a withdrawal function _assertWithdrawal( address staker, @@ -981,10 +1012,8 @@ contract DelegationManagerUnitTests is EigenLayerUnitTestSetup, IDelegationManag uint256 depositScalingFactor, uint256 slashingFactor ) internal view { - ( - uint256[] memory withdrawableShares, - uint256[] memory depositShares - ) = delegationManager.getWithdrawableShares(staker, strategy.toArray()); + (uint256[] memory withdrawableShares, uint256[] memory depositShares) = + delegationManager.getWithdrawableShares(staker, strategy.toArray()); // Check deposit shares decreased correctly assertEq( depositShares[0], @@ -992,22 +1021,16 @@ contract DelegationManagerUnitTests is EigenLayerUnitTestSetup, IDelegationManag "depositShares should be equal to depositSharesBefore - depositSharesWithdrawn" ); // Check withdrawable shares are decreased, with rounding error - uint256 expectedWithdrawableShares = _calcWithdrawableShares( - depositSharesBefore - depositSharesWithdrawn, - depositScalingFactor, - slashingFactor - ); + uint256 expectedWithdrawableShares = + _calcWithdrawableShares(depositSharesBefore - depositSharesWithdrawn, depositScalingFactor, slashingFactor); assertEq( withdrawableShares[0], expectedWithdrawableShares, "withdrawableShares should be equal to expectedWithdrawableShares" ); // Check operatorShares decreased properly - uint256 expectedWithdrawnShares = _calcWithdrawableShares( - depositSharesWithdrawn, - depositScalingFactor, - slashingFactor - ); + uint256 expectedWithdrawnShares = + _calcWithdrawableShares(depositSharesWithdrawn, depositScalingFactor, slashingFactor); assertEq( operatorSharesBefore - expectedWithdrawnShares, delegationManager.operatorShares(operator, strategy), @@ -1048,10 +1071,8 @@ contract DelegationManagerUnitTests is EigenLayerUnitTestSetup, IDelegationManag for (uint256 i = 0; i < params.withdrawal.strategies.length; i++) { { // assert deposit and withdrawable shares unchanged - ( - uint256[] memory withdrawableShares, - uint256[] memory depositShares - ) = delegationManager.getWithdrawableShares(params.staker, params.withdrawal.strategies[i].toArray()); + (uint256[] memory withdrawableShares, uint256[] memory depositShares) = delegationManager + .getWithdrawableShares(params.staker, params.withdrawal.strategies[i].toArray()); assertEq( params.withdrawableSharesBefore[i], withdrawableShares[0], @@ -1080,12 +1101,11 @@ contract DelegationManagerUnitTests is EigenLayerUnitTestSetup, IDelegationManag for (uint256 i = 0; i < params.withdrawal.strategies.length; i++) { // calculate shares to complete withdraw and add back as shares if (params.withdrawal.strategies[i] == beaconChainETHStrategy) { - params.slashingFactors[i] = uint64(params.slashingFactors[i].mulWad(params.beaconChainSlashingFactor)); + params.slashingFactors[i] = + uint64(params.slashingFactors[i].mulWad(params.beaconChainSlashingFactor)); } - uint256 sharesToAddBack = _calcCompletedWithdrawnShares( - params.withdrawal.scaledShares[i], - params.slashingFactors[i] - ); + uint256 sharesToAddBack = + _calcCompletedWithdrawnShares(params.withdrawal.scaledShares[i], params.slashingFactors[i]); // assert deposit shares, withdrawable shares, and operator shares, and depositScalingFactor _assertDeposit({ staker: params.staker, @@ -1102,19 +1122,13 @@ contract DelegationManagerUnitTests is EigenLayerUnitTestSetup, IDelegationManag } /// @notice assert withdrawals completed are reflected as completed in storage for the withdrawal root and staker - function _assertWithdrawalRootsComplete( - address staker, - Withdrawal[] memory withdrawals - ) internal view { + function _assertWithdrawalRootsComplete(address staker, Withdrawal[] memory withdrawals) internal view { for (uint256 i = 0; i < withdrawals.length; ++i) { // Check the withdrawal root is no longer pending // and also doesn't exist in storage for the staker bytes32 withdrawalRootToCheck = delegationManager.calculateWithdrawalRoot(withdrawals[i]); - assertFalse( - delegationManager.pendingWithdrawals(withdrawalRootToCheck), - "withdrawalRoot not pending" - ); - (Withdrawal[] memory withdrawalsInStorage, ) = delegationManager.getQueuedWithdrawals(staker); + assertFalse(delegationManager.pendingWithdrawals(withdrawalRootToCheck), "withdrawalRoot not pending"); + (Withdrawal[] memory withdrawalsInStorage,) = delegationManager.getQueuedWithdrawals(staker); for (uint256 j = 0; j < withdrawalsInStorage.length; ++j) { assertTrue( withdrawalRootToCheck != delegationManager.calculateWithdrawalRoot(withdrawalsInStorage[j]), @@ -1157,7 +1171,7 @@ contract DelegationManagerUnitTests is EigenLayerUnitTestSetup, IDelegationManag uint256 prevMaxMagnitude, uint256 currMaxMagnitude ) internal view { - (uint256[] memory withdrawableShares, ) = delegationManager.getWithdrawableShares(staker, strategy.toArray()); + (uint256[] memory withdrawableShares,) = delegationManager.getWithdrawableShares(staker, strategy.toArray()); assertApproxEqRel( uint256(withdrawableSharesBefore).mulDiv(currMaxMagnitude, prevMaxMagnitude), @@ -1179,7 +1193,8 @@ contract DelegationManagerUnitTests is EigenLayerUnitTestSetup, IDelegationManag uint256 expectedWithdrawableShares, uint256 prevBeaconSlashingFactor ) internal view { - (uint256[] memory withdrawableShares, ) = delegationManager.getWithdrawableShares(staker, beaconChainETHStrategy.toArray()); + (uint256[] memory withdrawableShares,) = + delegationManager.getWithdrawableShares(staker, beaconChainETHStrategy.toArray()); uint256 currBeaconSlashingFactor = eigenPodManagerMock.beaconChainSlashingFactor(defaultStaker); assertEq( withdrawableShares[0], @@ -1195,26 +1210,17 @@ contract DelegationManagerUnitTests is EigenLayerUnitTestSetup, IDelegationManag } /// @notice Due to rounding, withdrawable shares and operator shares may not align even if the operator - /// only has the single staker with deposits. + /// only has the single staker with deposits. function _assertWithdrawableAndOperatorShares( uint256 withdrawableShares, uint256 operatorShares, string memory errorMessage ) internal pure { - if (withdrawableShares > 0 ) { - assertApproxEqRel( - withdrawableShares, - operatorShares, - APPROX_REL_DIFF, - errorMessage - ); - } else { - - } + if (withdrawableShares > 0) { + assertApproxEqRel(withdrawableShares, operatorShares, APPROX_REL_DIFF, errorMessage); + } else {} assertLe( - withdrawableShares, - operatorShares, - "withdrawableShares should be less than or equal to operatorShares" + withdrawableShares, operatorShares, "withdrawableShares should be less than or equal to operatorShares" ); } @@ -1227,49 +1233,22 @@ contract DelegationManagerUnitTests is EigenLayerUnitTestSetup, IDelegationManag address staker ) internal view { for (uint256 i = 0; i < stakerQueuedWithdrawals[staker].length; ++i) { - Withdrawal memory withdrawal = stakerQueuedWithdrawals[staker][i]; + Withdrawal memory withdrawal = stakerQueuedWithdrawals[staker][i]; bytes32 withdrawalRootToCheck = delegationManager.calculateWithdrawalRoot(withdrawal); - assertTrue( - delegationManager.pendingWithdrawals(withdrawalRootToCheck), - "withdrawalRoot not pending" - ); + assertTrue(delegationManager.pendingWithdrawals(withdrawalRootToCheck), "withdrawalRoot not pending"); - (Withdrawal[] memory withdrawals, ) = delegationManager.getQueuedWithdrawals(staker); + (Withdrawal[] memory withdrawals,) = delegationManager.getQueuedWithdrawals(staker); for (uint256 j = 0; j < withdrawals.length; ++j) { if (withdrawalRootToCheck == delegationManager.calculateWithdrawalRoot(withdrawals[j])) { - assertEq( - withdrawals[j].staker, - withdrawal.staker - ); - assertEq( - withdrawals[j].withdrawer, - withdrawal.withdrawer - ); - assertEq( - withdrawals[j].delegatedTo, - withdrawal.delegatedTo - ); - assertEq( - withdrawals[j].nonce, - withdrawal.nonce - ); - assertEq( - withdrawals[j].startBlock, - withdrawal.startBlock - ); - assertEq( - withdrawals[j].scaledShares.length, - withdrawal.scaledShares.length - ); + assertEq(withdrawals[j].staker, withdrawal.staker); + assertEq(withdrawals[j].withdrawer, withdrawal.withdrawer); + assertEq(withdrawals[j].delegatedTo, withdrawal.delegatedTo); + assertEq(withdrawals[j].nonce, withdrawal.nonce); + assertEq(withdrawals[j].startBlock, withdrawal.startBlock); + assertEq(withdrawals[j].scaledShares.length, withdrawal.scaledShares.length); for (uint256 k = 0; k < withdrawal.scaledShares.length; ++k) { - assertEq( - withdrawals[j].scaledShares[k], - withdrawal.scaledShares[k] - ); - assertEq( - address(withdrawals[j].strategies[k]), - address(withdrawal.strategies[k]) - ); + assertEq(withdrawals[j].scaledShares[k], withdrawal.scaledShares[k]); + assertEq(address(withdrawals[j].strategies[k]), address(withdrawal.strategies[k])); } } } @@ -1281,51 +1260,21 @@ contract DelegationManagerUnitTests is EigenLayerUnitTestSetup, IDelegationManag * - Asserts exact match of Withdrawal struct exists in storage * - Asserts Withdrawal root is pending */ - function _assertQueuedWithdrawalExists( - address staker, - Withdrawal memory withdrawal - ) internal view { + function _assertQueuedWithdrawalExists(address staker, Withdrawal memory withdrawal) internal view { bytes32 withdrawalRootToCheck = delegationManager.calculateWithdrawalRoot(withdrawal); - assertTrue( - delegationManager.pendingWithdrawals(withdrawalRootToCheck), - "withdrawalRoot not pending" - ); + assertTrue(delegationManager.pendingWithdrawals(withdrawalRootToCheck), "withdrawalRoot not pending"); - (Withdrawal[] memory withdrawals, ) = delegationManager.getQueuedWithdrawals(staker); + (Withdrawal[] memory withdrawals,) = delegationManager.getQueuedWithdrawals(staker); for (uint256 i = 0; i < withdrawals.length; ++i) { - assertEq( - withdrawals[i].staker, - withdrawal.staker - ); - assertEq( - withdrawals[i].withdrawer, - withdrawal.withdrawer - ); - assertEq( - withdrawals[i].delegatedTo, - withdrawal.delegatedTo - ); - assertEq( - withdrawals[i].nonce, - withdrawal.nonce - ); - assertEq( - withdrawals[i].startBlock, - withdrawal.startBlock - ); - assertEq( - withdrawals[i].scaledShares.length, - withdrawal.scaledShares.length - ); + assertEq(withdrawals[i].staker, withdrawal.staker); + assertEq(withdrawals[i].withdrawer, withdrawal.withdrawer); + assertEq(withdrawals[i].delegatedTo, withdrawal.delegatedTo); + assertEq(withdrawals[i].nonce, withdrawal.nonce); + assertEq(withdrawals[i].startBlock, withdrawal.startBlock); + assertEq(withdrawals[i].scaledShares.length, withdrawal.scaledShares.length); for (uint256 j = 0; j < withdrawal.scaledShares.length; ++j) { - assertEq( - withdrawals[i].scaledShares[j], - withdrawal.scaledShares[j] - ); - assertEq( - address(withdrawals[i].strategies[j]), - address(withdrawal.strategies[j]) - ); + assertEq(withdrawals[i].scaledShares[j], withdrawal.scaledShares[j]); + assertEq(address(withdrawals[i].strategies[j]), address(withdrawal.strategies[j])); } } } @@ -1372,7 +1321,7 @@ contract DelegationManagerUnitTests_Initialization_Setters is DelegationManagerU contract DelegationManagerUnitTests_RegisterModifyOperator is DelegationManagerUnitTests { using ArrayLib for *; - + function test_registerAsOperator_revert_paused() public { // set the pausing flag cheats.prank(pauser); @@ -1422,9 +1371,7 @@ contract DelegationManagerUnitTests_RegisterModifyOperator is DelegationManagerU // Storage checks assertEq( - delegationApprover, - delegationManager.delegationApprover(operator), - "delegationApprover not set correctly" + delegationApprover, delegationManager.delegationApprover(operator), "delegationApprover not set correctly" ); assertEq(delegationManager.delegatedTo(operator), operator, "operator not delegated to self"); } @@ -1455,17 +1402,10 @@ contract DelegationManagerUnitTests_RegisterModifyOperator is DelegationManagerU }) ); _registerOperator(operator2, delegationApprover2, emptyStringForMetadataURI); - assertTrue( - delegationManager.isOperator(operator1), - "operator1 not registered" - ); - assertTrue( - delegationManager.isOperator(operator2), - "operator2 not registered" - ); + assertTrue(delegationManager.isOperator(operator1), "operator1 not registered"); + assertTrue(delegationManager.isOperator(operator2), "operator2 not registered"); } - // @notice Verifies that a staker who is actively delegated to an operator cannot register as an operator (without first undelegating, at least) function testFuzz_Revert_registerAsOperator_cannotRegisterWhileDelegated( address staker, @@ -1487,12 +1427,14 @@ contract DelegationManagerUnitTests_RegisterModifyOperator is DelegationManagerU cheats.stopPrank(); } - + /// @notice Add test for registerAsOperator where the operator has existing deposits in strategies /// Assert: /// depositShares == operatorShares == withdrawableShares /// check operatorDetails hash encode matches the operatorDetails hash stored (call view function) - function testFuzz_registerAsOperator_withDeposits(Randomness r) public rand(r) { + function testFuzz_registerAsOperator_withDeposits( + Randomness r + ) public rand(r) { uint256 shares = r.Uint256(1, MAX_STRATEGY_SHARES); // Set staker shares in StrategyManager IStrategy[] memory strategiesToReturn = strategyMock.toArray(); @@ -1513,12 +1455,9 @@ contract DelegationManagerUnitTests_RegisterModifyOperator is DelegationManagerU // check depositShares == operatorShares == withdrawableShares assertEq(operatorSharesAfter, shares, "operator shares not set correctly"); - (uint256[] memory withdrawableShares, ) = delegationManager.getWithdrawableShares(defaultOperator, strategiesToReturn); - assertEq( - withdrawableShares[0], - shares, - "withdrawable shares not set correctly" - ); + (uint256[] memory withdrawableShares,) = + delegationManager.getWithdrawableShares(defaultOperator, strategiesToReturn); + assertEq(withdrawableShares[0], shares, "withdrawable shares not set correctly"); assertEq( strategyManagerMock.stakerDepositShares(defaultOperator, strategyMock), shares, @@ -1535,10 +1474,7 @@ contract DelegationManagerUnitTests_RegisterModifyOperator is DelegationManagerU * Reverts if operator tries to decrease their `stakerOptOutWindowBlocks` parameter * @param delegationApprover1 and @param delegationApprover2 are fuzzed inputs */ - function testFuzz_modifyOperatorParameters( - address delegationApprover1, - address delegationApprover2 - ) public { + function testFuzz_modifyOperatorParameters(address delegationApprover1, address delegationApprover2) public { _registerOperator_expectEmit( RegisterAsOperatorEmitStruct({ operator: defaultOperator, @@ -1574,7 +1510,6 @@ contract DelegationManagerUnitTests_RegisterModifyOperator is DelegationManagerU delegationManager.updateOperatorMetadataURI(defaultOperator, emptyStringForMetadataURI); } - function test_Revert_updateOperatorMetadataUri_notOperator() public { cheats.expectRevert(OperatorNotRegistered.selector); delegationManager.modifyOperatorDetails(defaultOperator, defaultOperator); @@ -1585,7 +1520,9 @@ contract DelegationManagerUnitTests_RegisterModifyOperator is DelegationManagerU * @dev This is an important check to ensure that our definition of 'operator' remains consistent, in particular for preserving the * invariant that 'operators' are always delegated to themselves */ - function testFuzz_UpdateOperatorMetadataURI(string memory metadataURI) public { + function testFuzz_UpdateOperatorMetadataURI( + string memory metadataURI + ) public { _registerOperatorWithBaseDetails(defaultOperator); // call `updateOperatorMetadataURI` and check for event @@ -1622,7 +1559,9 @@ contract DelegationManagerUnitTests_RegisterModifyOperator is DelegationManagerU ); } - function testFuzz_UAM_updateOperatorMetadataURI(string memory metadataURI) public { + function testFuzz_UAM_updateOperatorMetadataURI( + string memory metadataURI + ) public { // Set admin cheats.prank(defaultOperator); permissionController.setAppointee( @@ -1647,11 +1586,7 @@ contract DelegationManagerUnitTests_delegateTo is DelegationManagerUnitTests { function test_Revert_WhenPaused() public { cheats.prank(defaultOperator); - delegationManager.registerAsOperator( - address(0), - 0, - emptyStringForMetadataURI - ); + delegationManager.registerAsOperator(address(0), 0, emptyStringForMetadataURI); // set the pausing flag cheats.prank(pauser); @@ -1685,7 +1620,9 @@ contract DelegationManagerUnitTests_delegateTo is DelegationManagerUnitTests { } /// @notice Verifies that `staker` cannot delegate to an unregistered `operator` - function testFuzz_Revert_WhenDelegateToUnregisteredOperator(Randomness r) public rand(r) { + function testFuzz_Revert_WhenDelegateToUnregisteredOperator( + Randomness r + ) public rand(r) { address staker = r.Address(); address operator = r.Address(); assertFalse(delegationManager.isOperator(operator), "incorrect test input?"); @@ -1721,10 +1658,7 @@ contract DelegationManagerUnitTests_delegateTo is DelegationManagerUnitTests { // verify that the salt hasn't been used before assertFalse( - delegationManager.delegationApproverSaltIsSpent( - delegationManager.delegationApprover(defaultOperator), - salt - ), + delegationManager.delegationApproverSaltIsSpent(delegationManager.delegationApprover(defaultOperator), salt), "salt somehow spent too early?" ); // Set staker shares in StrategyManager @@ -1757,10 +1691,7 @@ contract DelegationManagerUnitTests_delegateTo is DelegationManagerUnitTests { assertFalse(delegationManager.isOperator(staker), "staker incorrectly registered as operator"); // verify that the salt is still marked as unused (since it wasn't checked or used) assertFalse( - delegationManager.delegationApproverSaltIsSpent( - delegationManager.delegationApprover(defaultOperator), - salt - ), + delegationManager.delegationApproverSaltIsSpent(delegationManager.delegationApprover(defaultOperator), salt), "salt somehow spent too early?" ); } @@ -1792,10 +1723,7 @@ contract DelegationManagerUnitTests_delegateTo is DelegationManagerUnitTests { // verify that the salt hasn't been used before assertFalse( - delegationManager.delegationApproverSaltIsSpent( - delegationManager.delegationApprover(defaultOperator), - salt - ), + delegationManager.delegationApproverSaltIsSpent(delegationManager.delegationApprover(defaultOperator), salt), "salt somehow spent too early?" ); // Set staker shares in BeaconChainStrategy @@ -1829,13 +1757,11 @@ contract DelegationManagerUnitTests_delegateTo is DelegationManagerUnitTests { assertFalse(delegationManager.isOperator(staker), "staker incorrectly registered as operator"); // verify that the salt is still marked as unused (since it wasn't checked or used) assertFalse( - delegationManager.delegationApproverSaltIsSpent( - delegationManager.delegationApprover(defaultOperator), - salt - ), + delegationManager.delegationApproverSaltIsSpent(delegationManager.delegationApprover(defaultOperator), salt), "salt somehow spent too early?" ); - (uint256[] memory withdrawableShares, ) = delegationManager.getWithdrawableShares(staker, beaconChainETHStrategy.toArray()); + (uint256[] memory withdrawableShares,) = + delegationManager.getWithdrawableShares(staker, beaconChainETHStrategy.toArray()); _assertWithdrawableAndOperatorShares( withdrawableShares[0], delegationManager.operatorShares(defaultOperator, beaconChainETHStrategy), @@ -1873,14 +1799,15 @@ contract DelegationManagerUnitTests_delegateTo is DelegationManagerUnitTests { cheats.expectRevert(FullySlashed.selector); delegationManager.delegateTo(defaultOperator, emptyApproverSignatureAndExpiry, emptySalt); - assertTrue(delegationManager.delegatedTo(staker) != defaultOperator, "staker should not be delegated to the operator"); + assertTrue( + delegationManager.delegatedTo(staker) != defaultOperator, "staker should not be delegated to the operator" + ); assertFalse(delegationManager.isDelegated(staker), "staker should not be delegated"); assertFalse(delegationManager.isOperator(staker), "staker incorrectly registered as operator"); // verify that the salt is still marked as unused (since it wasn't checked or used) assertFalse( delegationManager.delegationApproverSaltIsSpent( - delegationManager.delegationApprover(defaultOperator), - emptySalt + delegationManager.delegationApprover(defaultOperator), emptySalt ), "salt somehow spent too early?" ); @@ -1909,10 +1836,7 @@ contract DelegationManagerUnitTests_delegateTo is DelegationManagerUnitTests { // verify that the salt hasn't been used before assertFalse( - delegationManager.delegationApproverSaltIsSpent( - delegationManager.delegationApprover(defaultOperator), - salt - ), + delegationManager.delegationApproverSaltIsSpent(delegationManager.delegationApprover(defaultOperator), salt), "salt somehow spent too early?" ); // Set staker shares in BeaconChainStrategy @@ -1933,15 +1857,14 @@ contract DelegationManagerUnitTests_delegateTo is DelegationManagerUnitTests { beaconSharesAfter, "operator beaconchain shares should not have increased with negative shares" ); - assertTrue(delegationManager.delegatedTo(staker) != defaultOperator, "staker should not be delegated to the operator"); + assertTrue( + delegationManager.delegatedTo(staker) != defaultOperator, "staker should not be delegated to the operator" + ); assertFalse(delegationManager.isDelegated(staker), "staker should not be delegated"); assertFalse(delegationManager.isOperator(staker), "staker incorrectly registered as operator"); // verify that the salt is still marked as unused (since it wasn't checked or used) assertFalse( - delegationManager.delegationApproverSaltIsSpent( - delegationManager.delegationApprover(defaultOperator), - salt - ), + delegationManager.delegationApproverSaltIsSpent(delegationManager.delegationApprover(defaultOperator), salt), "salt somehow spent too early?" ); } @@ -2001,13 +1924,12 @@ contract DelegationManagerUnitTests_delegateTo is DelegationManagerUnitTests { // verify that the salt is still marked as unused (since it wasn't checked or used) assertFalse( delegationManager.delegationApproverSaltIsSpent( - delegationManager.delegationApprover(defaultOperator), - emptySalt + delegationManager.delegationApprover(defaultOperator), emptySalt ), "salt somehow spent too early?" ); - (uint256[] memory withdrawableShares, ) = delegationManager.getWithdrawableShares(staker, strategyMock.toArray()); + (uint256[] memory withdrawableShares,) = delegationManager.getWithdrawableShares(staker, strategyMock.toArray()); _assertWithdrawableAndOperatorShares( withdrawableShares[0], delegationManager.operatorShares(defaultOperator, strategyMock), @@ -2070,15 +1992,13 @@ contract DelegationManagerUnitTests_delegateTo is DelegationManagerUnitTests { // verify that the salt is still marked as unused (since it wasn't checked or used) assertFalse( delegationManager.delegationApproverSaltIsSpent( - delegationManager.delegationApprover(defaultOperator), - emptySalt + delegationManager.delegationApprover(defaultOperator), emptySalt ), "salt somehow spent too early?" ); - ( - uint256[] memory withdrawableShares, - ) = delegationManager.getWithdrawableShares(staker, beaconChainETHStrategy.toArray()); + (uint256[] memory withdrawableShares,) = + delegationManager.getWithdrawableShares(staker, beaconChainETHStrategy.toArray()); _assertWithdrawableAndOperatorShares( withdrawableShares[0], delegationManager.operatorShares(defaultOperator, beaconChainETHStrategy), @@ -2095,7 +2015,7 @@ contract DelegationManagerUnitTests_delegateTo is DelegationManagerUnitTests { * - depositShares incremented for staker correctly * - withdrawableShares are correct * - depositScalingFactor is updated correctly - * - operatorShares increase by depositShares amount + * - operatorShares increase by withdrawableShares amount * - defaultOperator is an operator, staker is delegated to defaultOperator, staker is not an operator * - That the staker withdrawableShares is <= operatorShares (less due to rounding from non-WAD maxMagnitude) */ @@ -2113,6 +2033,7 @@ contract DelegationManagerUnitTests_delegateTo is DelegationManagerUnitTests { eigenPodManagerMock.setBeaconChainSlashingFactor(staker, beaconChainSlashingFactor); // Set staker shares in BeaconChainStrategy eigenPodManagerMock.setPodOwnerShares(staker, beaconShares); + (uint256[] memory withdrawableShares,) = delegationManager.getWithdrawableShares(staker, beaconChainETHStrategy.toArray()); // delegate from the `staker` to the operator, check for events emitted cheats.startPrank(staker); @@ -2121,21 +2042,20 @@ contract DelegationManagerUnitTests_delegateTo is DelegationManagerUnitTests { staker: staker, operator: defaultOperator, strategy: beaconChainETHStrategy, - depositShares: beaconShares > 0 ? uint256(beaconShares) : 0, - depositScalingFactor: uint256(WAD).divWad(maxMagnitude.mulWad(beaconChainSlashingFactor)) + depositShares: beaconShares > 0 ? withdrawableShares[0] : 0, + depositScalingFactor: uint256(WAD).divWad(maxMagnitude) }) ); delegationManager.delegateTo(defaultOperator, emptyApproverSignatureAndExpiry, emptySalt); - _assertDeposit({ + _assertDelegation({ staker: staker, operator: defaultOperator, strategy: beaconChainETHStrategy, operatorSharesBefore: 0, - withdrawableSharesBefore: 0, - depositSharesBefore: 0, - prevDsf: WAD, - depositAmount: uint256(beaconShares) + withdrawableSharesBefore: withdrawableShares[0], + depositSharesBefore: uint256(beaconShares), + prevDsf: WAD }); assertTrue(delegationManager.isOperator(defaultOperator), "staker not registered as operator"); assertEq(delegationManager.delegatedTo(staker), defaultOperator, "staker delegated to the wrong address"); @@ -2143,17 +2063,15 @@ contract DelegationManagerUnitTests_delegateTo is DelegationManagerUnitTests { // verify that the salt is still marked as unused (since it wasn't checked or used) assertFalse( delegationManager.delegationApproverSaltIsSpent( - delegationManager.delegationApprover(defaultOperator), - emptySalt + delegationManager.delegationApprover(defaultOperator), emptySalt ), "salt somehow spent too early?" ); - ( - uint256[] memory withdrawableShares, - ) = delegationManager.getWithdrawableShares(staker, beaconChainETHStrategy.toArray()); + (uint256[] memory withdrawableSharesAfter,) = + delegationManager.getWithdrawableShares(staker, beaconChainETHStrategy.toArray()); _assertWithdrawableAndOperatorShares( - withdrawableShares[0], + withdrawableSharesAfter[0], delegationManager.operatorShares(defaultOperator, beaconChainETHStrategy), "withdrawableShares not set correctly" ); @@ -2185,19 +2103,14 @@ contract DelegationManagerUnitTests_delegateTo is DelegationManagerUnitTests { // verify that the salt hasn't been used before assertFalse( - delegationManager.delegationApproverSaltIsSpent( - delegationManager.delegationApprover(defaultOperator), - salt - ), + delegationManager.delegationApproverSaltIsSpent(delegationManager.delegationApprover(defaultOperator), salt), "salt somehow spent too early?" ); // Set staker shares in BeaconChainStrategy and StrategyManager strategyManagerMock.addDeposit(staker, strategyMock, shares); eigenPodManagerMock.setPodOwnerShares(staker, beaconShares); - ( - IStrategy[] memory strategiesToReturn, - uint256[] memory sharesToReturn - ) = delegationManager.getDepositedShares(staker); + (IStrategy[] memory strategiesToReturn, uint256[] memory sharesToReturn) = + delegationManager.getDepositedShares(staker); uint256[] memory depositScalingFactors = new uint256[](2); depositScalingFactors[0] = uint256(WAD); depositScalingFactors[1] = uint256(WAD); @@ -2235,7 +2148,7 @@ contract DelegationManagerUnitTests_delegateTo is DelegationManagerUnitTests { prevDsf: WAD, depositAmount: shares }); - (uint256[] memory withdrawableShares, ) = delegationManager.getWithdrawableShares(staker, strategiesToReturn); + (uint256[] memory withdrawableShares,) = delegationManager.getWithdrawableShares(staker, strategiesToReturn); _assertWithdrawableAndOperatorShares( withdrawableShares[0], delegationManager.operatorShares(defaultOperator, strategyMock), @@ -2252,10 +2165,7 @@ contract DelegationManagerUnitTests_delegateTo is DelegationManagerUnitTests { assertFalse(delegationManager.isOperator(staker), "staker incorrectly registered as operator"); // verify that the salt is still marked as unused (since it wasn't checked or used) assertFalse( - delegationManager.delegationApproverSaltIsSpent( - delegationManager.delegationApprover(defaultOperator), - salt - ), + delegationManager.delegationApproverSaltIsSpent(delegationManager.delegationApprover(defaultOperator), salt), "salt somehow spent too early?" ); } @@ -2289,10 +2199,8 @@ contract DelegationManagerUnitTests_delegateTo is DelegationManagerUnitTests { // 2. Set staker shares in BeaconChainStrategy and StrategyManager strategyManagerMock.addDeposit(defaultStaker, strategyMock, shares); eigenPodManagerMock.setPodOwnerShares(defaultStaker, beaconShares); - ( - IStrategy[] memory strategiesToReturn, - uint256[] memory sharesToReturn - ) = delegationManager.getDepositedShares(defaultStaker); + (IStrategy[] memory strategiesToReturn, uint256[] memory sharesToReturn) = + delegationManager.getDepositedShares(defaultStaker); // 3. delegate from the `staker` to the operator with expected emitted events cheats.startPrank(defaultStaker); @@ -2333,17 +2241,21 @@ contract DelegationManagerUnitTests_delegateTo is DelegationManagerUnitTests { depositAmount: shares }); assertTrue(delegationManager.isOperator(defaultOperator), "defaultStaker not registered as operator"); - assertEq(delegationManager.delegatedTo(defaultStaker), defaultOperator, "defaultStaker delegated to the wrong address"); + assertEq( + delegationManager.delegatedTo(defaultStaker), + defaultOperator, + "defaultStaker delegated to the wrong address" + ); assertFalse(delegationManager.isOperator(defaultStaker), "staker incorrectly registered as operator"); // verify that the salt is still marked as unused (since it wasn't checked or used) assertFalse( delegationManager.delegationApproverSaltIsSpent( - delegationManager.delegationApprover(defaultOperator), - emptySalt + delegationManager.delegationApprover(defaultOperator), emptySalt ), "salt somehow spent too early?" ); - (uint256[] memory withdrawableShares, ) = delegationManager.getWithdrawableShares(defaultStaker, strategiesToReturn); + (uint256[] memory withdrawableShares,) = + delegationManager.getWithdrawableShares(defaultStaker, strategiesToReturn); _assertWithdrawableAndOperatorShares( withdrawableShares[0], delegationManager.operatorShares(defaultOperator, strategyMock), @@ -2371,10 +2283,7 @@ contract DelegationManagerUnitTests_delegateTo is DelegationManagerUnitTests { // verify that the salt hasn't been used before assertFalse( - delegationManager.delegationApproverSaltIsSpent( - delegationManager.delegationApprover(defaultOperator), - salt - ), + delegationManager.delegationApproverSaltIsSpent(delegationManager.delegationApprover(defaultOperator), salt), "salt somehow spent too early?" ); @@ -2390,10 +2299,7 @@ contract DelegationManagerUnitTests_delegateTo is DelegationManagerUnitTests { assertFalse(delegationManager.isOperator(staker), "staker incorrectly registered as operator"); // verify that the salt is still marked as unused (since it wasn't checked or used) assertFalse( - delegationManager.delegationApproverSaltIsSpent( - delegationManager.delegationApprover(defaultOperator), - salt - ), + delegationManager.delegationApproverSaltIsSpent(delegationManager.delegationApprover(defaultOperator), salt), "salt somehow spent too early?" ); } @@ -2413,13 +2319,8 @@ contract DelegationManagerUnitTests_delegateTo is DelegationManagerUnitTests { _registerOperatorWithDelegationApprover(defaultOperator); // calculate the delegationSigner's signature - ISignatureUtils.SignatureWithExpiry memory approverSignatureAndExpiry = _getApproverSignature( - delegationSignerPrivateKey, - staker, - defaultOperator, - salt, - expiry - ); + ISignatureUtils.SignatureWithExpiry memory approverSignatureAndExpiry = + _getApproverSignature(delegationSignerPrivateKey, staker, defaultOperator, salt, expiry); // delegate from the `staker` to the operator cheats.startPrank(staker); @@ -2443,30 +2344,19 @@ contract DelegationManagerUnitTests_delegateTo is DelegationManagerUnitTests { // verify that the salt hasn't been used before assertFalse( - delegationManager.delegationApproverSaltIsSpent( - delegationManager.delegationApprover(defaultOperator), - salt - ), + delegationManager.delegationApproverSaltIsSpent(delegationManager.delegationApprover(defaultOperator), salt), "salt somehow spent too early?" ); // calculate the delegationSigner's signature - ISignatureUtils.SignatureWithExpiry memory approverSignatureAndExpiry = _getApproverSignature( - delegationSignerPrivateKey, - staker, - defaultOperator, - salt, - expiry - ); + 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 - ), + delegationManager.delegationApproverSaltIsSpent(delegationManager.delegationApprover(defaultOperator), salt), "salt somehow spent not spent?" ); delegationManager.undelegate(staker); @@ -2491,11 +2381,7 @@ contract DelegationManagerUnitTests_delegateTo is DelegationManagerUnitTests { approverSignatureAndExpiry.expiry = expiry; { bytes32 digestHash = delegationManager.calculateDelegationApprovalDigestHash( - staker, - defaultOperator, - delegationManager.delegationApprover(defaultOperator), - emptySalt, - expiry + staker, defaultOperator, delegationManager.delegationApprover(defaultOperator), emptySalt, expiry ); (uint8 v, bytes32 r, bytes32 s) = cheats.sign(delegationSignerPrivateKey, digestHash); // mess up the signature by flipping v's parity @@ -2519,7 +2405,9 @@ contract DelegationManagerUnitTests_delegateTo is DelegationManagerUnitTests { * Reverts if the staker is already delegated (to the operator or to anyone else) * Reverts if the ‘operator’ is not actually registered as an operator */ - function testFuzz_OperatorWhoRequiresECDSASignature(Randomness r) public rand(r) { + function testFuzz_OperatorWhoRequiresECDSASignature( + Randomness r + ) public rand(r) { address staker = r.Address(); bytes32 salt = r.Bytes32(); uint256 expiry = r.Uint256(block.timestamp, type(uint256).max); @@ -2528,20 +2416,12 @@ contract DelegationManagerUnitTests_delegateTo is DelegationManagerUnitTests { // verify that the salt hasn't been used before assertFalse( - delegationManager.delegationApproverSaltIsSpent( - delegationManager.delegationApprover(defaultOperator), - salt - ), + delegationManager.delegationApproverSaltIsSpent(delegationManager.delegationApprover(defaultOperator), salt), "salt somehow spent too early?" ); // calculate the delegationSigner's signature - ISignatureUtils.SignatureWithExpiry memory approverSignatureAndExpiry = _getApproverSignature( - delegationSignerPrivateKey, - staker, - defaultOperator, - salt, - expiry - ); + ISignatureUtils.SignatureWithExpiry memory approverSignatureAndExpiry = + _getApproverSignature(delegationSignerPrivateKey, staker, defaultOperator, salt, expiry); // delegate from the `staker` to the operator cheats.startPrank(staker); @@ -2558,8 +2438,7 @@ contract DelegationManagerUnitTests_delegateTo is DelegationManagerUnitTests { // verify that the salt is still marked as unused (since it wasn't checked or used) assertFalse( delegationManager.delegationApproverSaltIsSpent( - delegationManager.delegationApprover(defaultOperator), - salt + delegationManager.delegationApprover(defaultOperator), salt ), "salt somehow spent too incorrectly?" ); @@ -2567,8 +2446,7 @@ contract DelegationManagerUnitTests_delegateTo is DelegationManagerUnitTests { // verify that the salt is marked as used assertTrue( delegationManager.delegationApproverSaltIsSpent( - delegationManager.delegationApprover(defaultOperator), - salt + delegationManager.delegationApprover(defaultOperator), salt ), "salt somehow spent not spent?" ); @@ -2597,20 +2475,12 @@ contract DelegationManagerUnitTests_delegateTo is DelegationManagerUnitTests { // verify that the salt hasn't been used before assertFalse( - delegationManager.delegationApproverSaltIsSpent( - delegationManager.delegationApprover(defaultOperator), - salt - ), + delegationManager.delegationApproverSaltIsSpent(delegationManager.delegationApprover(defaultOperator), salt), "salt somehow spent too early?" ); // calculate the delegationSigner's signature - ISignatureUtils.SignatureWithExpiry memory approverSignatureAndExpiry = _getApproverSignature( - delegationSignerPrivateKey, - staker, - defaultOperator, - salt, - expiry - ); + ISignatureUtils.SignatureWithExpiry memory approverSignatureAndExpiry = + _getApproverSignature(delegationSignerPrivateKey, staker, defaultOperator, salt, expiry); // Set staker shares in StrategyManager strategyManagerMock.addDeposit(staker, strategyMock, shares); @@ -2640,7 +2510,7 @@ contract DelegationManagerUnitTests_delegateTo is DelegationManagerUnitTests { assertFalse(delegationManager.isOperator(staker), "staker incorrectly registered as operator"); assertEq(delegationManager.delegatedTo(staker), defaultOperator, "staker delegated to the wrong address"); assertFalse(delegationManager.isOperator(staker), "staker incorrectly registered as operator"); - (uint256[] memory withdrawableShares, ) = delegationManager.getWithdrawableShares(staker, strategyMock.toArray()); + (uint256[] memory withdrawableShares,) = delegationManager.getWithdrawableShares(staker, strategyMock.toArray()); _assertWithdrawableAndOperatorShares( withdrawableShares[0], delegationManager.operatorShares(defaultOperator, strategyMock), @@ -2651,8 +2521,7 @@ contract DelegationManagerUnitTests_delegateTo is DelegationManagerUnitTests { // verify that the salt is still marked as unused (since it wasn't checked or used) assertFalse( delegationManager.delegationApproverSaltIsSpent( - delegationManager.delegationApprover(defaultOperator), - salt + delegationManager.delegationApprover(defaultOperator), salt ), "salt somehow spent too incorrectly?" ); @@ -2660,8 +2529,7 @@ contract DelegationManagerUnitTests_delegateTo is DelegationManagerUnitTests { // verify that the salt is marked as used assertTrue( delegationManager.delegationApproverSaltIsSpent( - delegationManager.delegationApprover(defaultOperator), - salt + delegationManager.delegationApprover(defaultOperator), salt ), "salt somehow spent not spent?" ); @@ -2690,20 +2558,12 @@ contract DelegationManagerUnitTests_delegateTo is DelegationManagerUnitTests { // verify that the salt hasn't been used before assertFalse( - delegationManager.delegationApproverSaltIsSpent( - delegationManager.delegationApprover(defaultOperator), - salt - ), + delegationManager.delegationApproverSaltIsSpent(delegationManager.delegationApprover(defaultOperator), salt), "salt somehow spent too early?" ); // calculate the delegationSigner's signature - ISignatureUtils.SignatureWithExpiry memory approverSignatureAndExpiry = _getApproverSignature( - delegationSignerPrivateKey, - staker, - defaultOperator, - salt, - expiry - ); + ISignatureUtils.SignatureWithExpiry memory approverSignatureAndExpiry = + _getApproverSignature(delegationSignerPrivateKey, staker, defaultOperator, salt, expiry); // Set staker shares in BeaconChainStrategy eigenPodManagerMock.setPodOwnerShares(staker, beaconShares); @@ -2731,9 +2591,8 @@ contract DelegationManagerUnitTests_delegateTo is DelegationManagerUnitTests { prevDsf: WAD, depositAmount: uint256(beaconShares) }); - ( - uint256[] memory withdrawableShares, - ) = delegationManager.getWithdrawableShares(staker, beaconChainETHStrategy.toArray()); + (uint256[] memory withdrawableShares,) = + delegationManager.getWithdrawableShares(staker, beaconChainETHStrategy.toArray()); _assertWithdrawableAndOperatorShares( withdrawableShares[0], delegationManager.operatorShares(defaultOperator, beaconChainETHStrategy), @@ -2746,8 +2605,7 @@ contract DelegationManagerUnitTests_delegateTo is DelegationManagerUnitTests { // verify that the salt is still marked as unused (since it wasn't checked or used) assertFalse( delegationManager.delegationApproverSaltIsSpent( - delegationManager.delegationApprover(defaultOperator), - salt + delegationManager.delegationApprover(defaultOperator), salt ), "salt somehow spent too incorrectly?" ); @@ -2755,8 +2613,7 @@ contract DelegationManagerUnitTests_delegateTo is DelegationManagerUnitTests { // verify that the salt is marked as used assertTrue( delegationManager.delegationApproverSaltIsSpent( - delegationManager.delegationApprover(defaultOperator), - salt + delegationManager.delegationApprover(defaultOperator), salt ), "salt somehow spent not spent?" ); @@ -2788,20 +2645,12 @@ contract DelegationManagerUnitTests_delegateTo is DelegationManagerUnitTests { // verify that the salt hasn't been used before assertFalse( - delegationManager.delegationApproverSaltIsSpent( - delegationManager.delegationApprover(defaultOperator), - salt - ), + delegationManager.delegationApproverSaltIsSpent(delegationManager.delegationApprover(defaultOperator), salt), "salt somehow spent too early?" ); // calculate the delegationSigner's signature - ISignatureUtils.SignatureWithExpiry memory approverSignatureAndExpiry = _getApproverSignature( - delegationSignerPrivateKey, - staker, - defaultOperator, - salt, - expiry - ); + ISignatureUtils.SignatureWithExpiry memory approverSignatureAndExpiry = + _getApproverSignature(delegationSignerPrivateKey, staker, defaultOperator, salt, expiry); // Set staker shares in BeaconChainStrategy and StrategyManager uint256[] memory depositScalingFactors = new uint256[](2); @@ -2809,10 +2658,8 @@ contract DelegationManagerUnitTests_delegateTo is DelegationManagerUnitTests { depositScalingFactors[1] = uint256(WAD); strategyManagerMock.addDeposit(staker, strategyMock, shares); eigenPodManagerMock.setPodOwnerShares(staker, beaconShares); - ( - IStrategy[] memory strategiesToReturn, - uint256[] memory sharesToReturn - ) = delegationManager.getDepositedShares(staker); + (IStrategy[] memory strategiesToReturn, uint256[] memory sharesToReturn) = + delegationManager.getDepositedShares(staker); // delegate from the `staker` to the operator cheats.startPrank(staker); _delegateTo_expectEmit( @@ -2847,7 +2694,7 @@ contract DelegationManagerUnitTests_delegateTo is DelegationManagerUnitTests { prevDsf: WAD, depositAmount: shares }); - (uint256[] memory withdrawableShares, ) = delegationManager.getWithdrawableShares(staker, strategiesToReturn); + (uint256[] memory withdrawableShares,) = delegationManager.getWithdrawableShares(staker, strategiesToReturn); _assertWithdrawableAndOperatorShares( withdrawableShares[0], delegationManager.operatorShares(defaultOperator, strategyMock), @@ -2865,8 +2712,7 @@ contract DelegationManagerUnitTests_delegateTo is DelegationManagerUnitTests { // verify that the salt is still marked as unused (since it wasn't checked or used) assertFalse( delegationManager.delegationApproverSaltIsSpent( - delegationManager.delegationApprover(defaultOperator), - salt + delegationManager.delegationApprover(defaultOperator), salt ), "salt somehow spent too incorrectly?" ); @@ -2874,8 +2720,7 @@ contract DelegationManagerUnitTests_delegateTo is DelegationManagerUnitTests { // verify that the salt is marked as used assertTrue( delegationManager.delegationApproverSaltIsSpent( - delegationManager.delegationApprover(defaultOperator), - salt + delegationManager.delegationApprover(defaultOperator), salt ), "salt somehow spent not spent?" ); @@ -2926,13 +2771,8 @@ contract DelegationManagerUnitTests_delegateTo is DelegationManagerUnitTests { _registerOperatorWith1271DelegationApprover(defaultOperator); // calculate the delegationSigner's signature - ISignatureUtils.SignatureWithExpiry memory approverSignatureAndExpiry = _getApproverSignature( - delegationSignerPrivateKey, - staker, - defaultOperator, - salt, - expiry - ); + ISignatureUtils.SignatureWithExpiry memory approverSignatureAndExpiry = + _getApproverSignature(delegationSignerPrivateKey, staker, defaultOperator, salt, expiry); // delegate from the `staker` to the operator cheats.startPrank(staker); @@ -2990,13 +2830,8 @@ contract DelegationManagerUnitTests_delegateTo is DelegationManagerUnitTests { // calculate the delegationSigner's but this is not the correct signature from the wallet contract // since the wallet owner is address(1) - ISignatureUtils.SignatureWithExpiry memory approverSignatureAndExpiry = _getApproverSignature( - delegationSignerPrivateKey, - staker, - defaultOperator, - salt, - expiry - ); + 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); @@ -3016,7 +2851,9 @@ contract DelegationManagerUnitTests_delegateTo is DelegationManagerUnitTests { * Reverts if the staker is already delegated (to the operator or to anyone else) * Reverts if the ‘operator’ is not actually registered as an operator */ - function testFuzz_OperatorWhoRequiresEIP1271Signature(Randomness r) public rand(r) { + function testFuzz_OperatorWhoRequiresEIP1271Signature( + Randomness r + ) public rand(r) { address staker = r.Address(); bytes32 salt = r.Bytes32(); uint256 expiry = r.Uint256(block.timestamp, type(uint256).max); @@ -3025,20 +2862,12 @@ contract DelegationManagerUnitTests_delegateTo is DelegationManagerUnitTests { // verify that the salt hasn't been used before assertFalse( - delegationManager.delegationApproverSaltIsSpent( - delegationManager.delegationApprover(defaultOperator), - salt - ), + delegationManager.delegationApproverSaltIsSpent(delegationManager.delegationApprover(defaultOperator), salt), "salt somehow spent too early?" ); // calculate the delegationSigner's signature - ISignatureUtils.SignatureWithExpiry memory approverSignatureAndExpiry = _getApproverSignature( - delegationSignerPrivateKey, - staker, - defaultOperator, - salt, - expiry - ); + ISignatureUtils.SignatureWithExpiry memory approverSignatureAndExpiry = + _getApproverSignature(delegationSignerPrivateKey, staker, defaultOperator, salt, expiry); // delegate from the `staker` to the operator cheats.startPrank(staker); @@ -3056,8 +2885,7 @@ contract DelegationManagerUnitTests_delegateTo is DelegationManagerUnitTests { // verify that the salt is still marked as unused (since it wasn't checked or used) assertFalse( delegationManager.delegationApproverSaltIsSpent( - delegationManager.delegationApprover(defaultOperator), - salt + delegationManager.delegationApprover(defaultOperator), salt ), "salt somehow spent too incorrectly?" ); @@ -3065,8 +2893,7 @@ contract DelegationManagerUnitTests_delegateTo is DelegationManagerUnitTests { // verify that the salt is marked as used assertTrue( delegationManager.delegationApproverSaltIsSpent( - delegationManager.delegationApprover(defaultOperator), - salt + delegationManager.delegationApprover(defaultOperator), salt ), "salt somehow spent not spent?" ); @@ -3080,7 +2907,9 @@ contract DelegationManagerUnitTests_increaseDelegatedShares is DelegationManager using Math for *; /// @notice Verifies that `DelegationManager.increaseDelegatedShares` reverts if not called by the StrategyManager nor EigenPodManager - function testFuzz_Revert_increaseDelegatedShares_invalidCaller(Randomness r) public rand(r) { + function testFuzz_Revert_increaseDelegatedShares_invalidCaller( + Randomness r + ) public rand(r) { address invalidCaller = r.Address(); uint256 shares = r.Uint256(1, MAX_STRATEGY_SHARES); cheats.expectRevert(IDelegationManagerErrors.OnlyStrategyManagerOrEigenPodManager.selector); @@ -3100,27 +2929,19 @@ contract DelegationManagerUnitTests_increaseDelegatedShares is DelegationManager // Register operator _registerOperatorWithBaseDetails(defaultOperator); // Set operator magnitude - _setOperatorMagnitude({ - operator: defaultOperator, - strategy: strategyMock, - magnitude: 0 - }); + _setOperatorMagnitude({operator: defaultOperator, strategy: strategyMock, magnitude: 0}); // delegate from the `staker` to the operator _delegateToOperatorWhoAcceptsAllStakers(staker, defaultOperator); - uint256 _delegatedSharesBefore = delegationManager.operatorShares( - delegationManager.delegatedTo(staker), - strategyMock - ); + uint256 _delegatedSharesBefore = + delegationManager.operatorShares(delegationManager.delegatedTo(staker), strategyMock); cheats.prank(address(strategyManagerMock)); cheats.expectRevert(FullySlashed.selector); delegationManager.increaseDelegatedShares(staker, strategyMock, 0, shares); - uint256 delegatedSharesAfter = delegationManager.operatorShares( - delegationManager.delegatedTo(staker), - strategyMock - ); + uint256 delegatedSharesAfter = + delegationManager.operatorShares(delegationManager.delegatedTo(staker), strategyMock); assertEq(delegatedSharesAfter, _delegatedSharesBefore, "delegated shares incremented incorrectly"); assertEq(_delegatedSharesBefore, 0, "nonzero shares delegated to zero address!"); @@ -3143,11 +2964,7 @@ contract DelegationManagerUnitTests_increaseDelegatedShares is DelegationManager // 1. Register operator with initial operator magnitude and delegate staker to operator _registerOperatorWithBaseDetails(defaultOperator); - _setOperatorMagnitude({ - operator: defaultOperator, - strategy: strategyMock, - magnitude: initialMagnitude - }); + _setOperatorMagnitude({operator: defaultOperator, strategy: strategyMock, magnitude: initialMagnitude}); _delegateToOperatorWhoAcceptsAllStakers(staker, defaultOperator); // 2. set staker initial shares and increase delegated shares IStrategy[] memory strategiesDeposited = strategyMock.toArray(); @@ -3167,18 +2984,14 @@ contract DelegationManagerUnitTests_increaseDelegatedShares is DelegationManager prevDsf: WAD, depositAmount: existingShares }); - (uint256[] memory withdrawableShares, ) = delegationManager.getWithdrawableShares(staker, strategiesDeposited); + (uint256[] memory withdrawableShares,) = delegationManager.getWithdrawableShares(staker, strategiesDeposited); _assertWithdrawableAndOperatorShares( withdrawableShares[0], delegationManager.operatorShares(defaultOperator, strategyMock), "Shares not increased correctly" ); // 3. Now set operator magnitude to 0 (100% slashed) - _setOperatorMagnitude({ - operator: defaultOperator, - strategy: strategyMock, - magnitude: 0 - }); + _setOperatorMagnitude({operator: defaultOperator, strategy: strategyMock, magnitude: 0}); // 4. Try to "redeposit" and expect a revert since strategy is 100% slashed // staker's withdrawable shares should also be 0 now @@ -3186,16 +2999,14 @@ contract DelegationManagerUnitTests_increaseDelegatedShares is DelegationManager cheats.expectRevert(FullySlashed.selector); delegationManager.increaseDelegatedShares(staker, strategyMock, existingShares, shares); - (withdrawableShares, ) = delegationManager.getWithdrawableShares(staker, strategiesDeposited); - assertEq( - withdrawableShares[0], - 0, - "All existing shares should be slashed" - ); + (withdrawableShares,) = delegationManager.getWithdrawableShares(staker, strategiesDeposited); + assertEq(withdrawableShares[0], 0, "All existing shares should be slashed"); } /// @notice Verifies that there is no change in operatorShares if the staker is not delegated - function testFuzz_increaseDelegatedShares_noop(Randomness r) public rand(r) { + function testFuzz_increaseDelegatedShares_noop( + Randomness r + ) public rand(r) { address staker = r.Address(); _registerOperatorWithBaseDetails(defaultOperator); assertFalse(delegationManager.isDelegated(staker), "bad test setup"); @@ -3211,10 +3022,12 @@ contract DelegationManagerUnitTests_increaseDelegatedShares is DelegationManager * Asserts: * - depositScalingFactor, depositShares, withdrawableShares, operatorShares after deposit * - correct operator shares after deposit - + * * @dev Checks that there is no change if the staker is not delegated */ - function testFuzz_increaseDelegatedShares(Randomness r) public rand(r) { + function testFuzz_increaseDelegatedShares( + Randomness r + ) public rand(r) { address staker = r.Address(); uint256 shares = r.Uint256(1, MAX_STRATEGY_SHARES); bool delegateFromStakerToOperator = r.Boolean(); @@ -3225,10 +3038,8 @@ contract DelegationManagerUnitTests_increaseDelegatedShares is DelegationManager if (delegateFromStakerToOperator) { _delegateToOperatorWhoAcceptsAllStakers(staker, defaultOperator); } - uint256 delegatedSharesBefore = delegationManager.operatorShares( - delegationManager.delegatedTo(staker), - strategyMock - ); + uint256 delegatedSharesBefore = + delegationManager.operatorShares(delegationManager.delegatedTo(staker), strategyMock); // deposit and increase delegated shares strategyManagerMock.addDeposit(staker, strategyMock, shares); @@ -3258,12 +3069,10 @@ contract DelegationManagerUnitTests_increaseDelegatedShares is DelegationManager // Assert correct end state values uint256 delegatedSharesAfter = delegationManager.operatorShares(defaultOperator, strategyMock); - (uint256[] memory withdrawableShares, ) = delegationManager.getWithdrawableShares(staker, strategyMock.toArray()); + (uint256[] memory withdrawableShares,) = delegationManager.getWithdrawableShares(staker, strategyMock.toArray()); if (delegationManager.isDelegated(staker)) { _assertWithdrawableAndOperatorShares( - withdrawableShares[0], - delegatedSharesAfter, - "Invalid withdrawable shares" + withdrawableShares[0], delegatedSharesAfter, "Invalid withdrawable shares" ); } else { assertEq(delegatedSharesAfter, delegatedSharesBefore, "delegated shares incremented incorrectly"); @@ -3271,7 +3080,9 @@ contract DelegationManagerUnitTests_increaseDelegatedShares is DelegationManager } } - function testFuzz_increaseDelegatedShares_beaconChainShares(Randomness r) public rand(r) { + function testFuzz_increaseDelegatedShares_beaconChainShares( + Randomness r + ) public rand(r) { address staker = r.Address(); uint256 shares = r.Uint256(1, MAX_ETH_SUPPLY); uint64 beaconChainSlashingFactor = r.Uint64(1, WAD); @@ -3280,10 +3091,8 @@ contract DelegationManagerUnitTests_increaseDelegatedShares is DelegationManager _registerOperatorWithBaseDetails(defaultOperator); // delegate from the `staker` to the operator *if `delegateFromStakerToOperator` is 'true'* _delegateToOperatorWhoAcceptsAllStakers(staker, defaultOperator); - uint256 delegatedSharesBefore = delegationManager.operatorShares( - delegationManager.delegatedTo(staker), - beaconChainETHStrategy - ); + uint256 delegatedSharesBefore = + delegationManager.operatorShares(delegationManager.delegatedTo(staker), beaconChainETHStrategy); // deposit and increase delegated shares eigenPodManagerMock.setPodOwnerShares(staker, int256(shares)); @@ -3312,12 +3121,9 @@ contract DelegationManagerUnitTests_increaseDelegatedShares is DelegationManager // Assert correct end state values uint256 delegatedSharesAfter = delegationManager.operatorShares(defaultOperator, beaconChainETHStrategy); - (uint256[] memory withdrawableShares, ) = delegationManager.getWithdrawableShares(staker, beaconChainETHStrategy.toArray()); - _assertWithdrawableAndOperatorShares( - withdrawableShares[0], - delegatedSharesAfter, - "Invalid withdrawable shares" - ); + (uint256[] memory withdrawableShares,) = + delegationManager.getWithdrawableShares(staker, beaconChainETHStrategy.toArray()); + _assertWithdrawableAndOperatorShares(withdrawableShares[0], delegatedSharesAfter, "Invalid withdrawable shares"); } /** @@ -3325,7 +3131,9 @@ contract DelegationManagerUnitTests_increaseDelegatedShares is DelegationManager * who the `staker` is delegated to has in the strategy * @dev Checks that there is no change if the staker is not delegated */ - function testFuzz_increaseDelegatedShares_slashedOperator(Randomness r) public rand(r) { + function testFuzz_increaseDelegatedShares_slashedOperator( + Randomness r + ) public rand(r) { address staker = r.Address(); uint256 shares = r.Uint256(1, MAX_STRATEGY_SHARES); uint64 magnitude = r.Uint64(1, WAD); @@ -3333,7 +3141,7 @@ contract DelegationManagerUnitTests_increaseDelegatedShares is DelegationManager // Register operator _registerOperatorWithBaseDetails(defaultOperator); - + // Set operator magnitude _setOperatorMagnitude(defaultOperator, strategyMock, magnitude); @@ -3341,10 +3149,8 @@ contract DelegationManagerUnitTests_increaseDelegatedShares is DelegationManager if (delegateFromStakerToOperator) { _delegateToOperatorWhoAcceptsAllStakers(staker, defaultOperator); } - uint256 delegatedSharesBefore = delegationManager.operatorShares( - delegationManager.delegatedTo(staker), - strategyMock - ); + uint256 delegatedSharesBefore = + delegationManager.operatorShares(delegationManager.delegatedTo(staker), strategyMock); strategyManagerMock.addDeposit(staker, strategyMock, shares); if (delegationManager.isDelegated(staker)) { @@ -3374,13 +3180,11 @@ contract DelegationManagerUnitTests_increaseDelegatedShares is DelegationManager // Assert correct values uint256 delegatedSharesAfter = delegationManager.operatorShares(defaultOperator, strategyMock); - (uint256[] memory withdrawableShares, ) = delegationManager.getWithdrawableShares(staker, strategyMock.toArray()); + (uint256[] memory withdrawableShares,) = delegationManager.getWithdrawableShares(staker, strategyMock.toArray()); if (delegationManager.isDelegated(staker)) { _assertWithdrawableAndOperatorShares( - withdrawableShares[0], - delegatedSharesAfter, - "Invalid withdrawable shares" + withdrawableShares[0], delegatedSharesAfter, "Invalid withdrawable shares" ); } else { assertEq(delegatedSharesAfter, delegatedSharesBefore, "delegated shares incremented incorrectly"); @@ -3390,10 +3194,12 @@ contract DelegationManagerUnitTests_increaseDelegatedShares is DelegationManager /** * @notice Verifies that `DelegationManager.increaseDelegatedShares` properly increases the delegated `shares` for the - * `defaultOperator` who the staker is delegated to. Asserts for proper events emitted and correct withdrawable shares, + * `defaultOperator` who the staker is delegated to. Asserts for proper events emitted and correct withdrawable shares, * despoitScalingFactor for the staker, and operator shares after deposit. */ - function testFuzz_increaseDelegatedShares_slashedOperatorAndBeaconChainShares(Randomness r) public rand(r) { + function testFuzz_increaseDelegatedShares_slashedOperatorAndBeaconChainShares( + Randomness r + ) public rand(r) { address staker = r.Address(); uint256 shares = r.Uint256(1, MAX_ETH_SUPPLY); uint64 maxMagnitude = r.Uint64(1, WAD); @@ -3405,10 +3211,8 @@ contract DelegationManagerUnitTests_increaseDelegatedShares is DelegationManager _setOperatorMagnitude(defaultOperator, beaconChainETHStrategy, maxMagnitude); // delegate from the `staker` to the operator *if `delegateFromStakerToOperator` is 'true'* _delegateToOperatorWhoAcceptsAllStakers(staker, defaultOperator); - uint256 delegatedSharesBefore = delegationManager.operatorShares( - delegationManager.delegatedTo(staker), - beaconChainETHStrategy - ); + uint256 delegatedSharesBefore = + delegationManager.operatorShares(delegationManager.delegatedTo(staker), beaconChainETHStrategy); // deposit and increase delegated shares eigenPodManagerMock.setPodOwnerShares(staker, int256(shares)); @@ -3437,12 +3241,9 @@ contract DelegationManagerUnitTests_increaseDelegatedShares is DelegationManager // Assert correct end state values uint256 delegatedSharesAfter = delegationManager.operatorShares(defaultOperator, beaconChainETHStrategy); - (uint256[] memory withdrawableShares, ) = delegationManager.getWithdrawableShares(staker, beaconChainETHStrategy.toArray()); - _assertWithdrawableAndOperatorShares( - withdrawableShares[0], - delegatedSharesAfter, - "Invalid withdrawable shares" - ); + (uint256[] memory withdrawableShares,) = + delegationManager.getWithdrawableShares(staker, beaconChainETHStrategy.toArray()); + _assertWithdrawableAndOperatorShares(withdrawableShares[0], delegatedSharesAfter, "Invalid withdrawable shares"); } /** @@ -3461,24 +3262,14 @@ contract DelegationManagerUnitTests_increaseDelegatedShares is DelegationManager // Register operator _registerOperatorWithBaseDetails(defaultOperator); // Set operator magnitude for 100% slashed strategy - _setOperatorMagnitude({ - operator: defaultOperator, - strategy: strategyMock, - magnitude: 0 - }); + _setOperatorMagnitude({operator: defaultOperator, strategy: strategyMock, magnitude: 0}); // Set operator magnitude for non-100% slashed strategy - _setOperatorMagnitude({ - operator: defaultOperator, - strategy: strategy, - magnitude: magnitude - }); + _setOperatorMagnitude({operator: defaultOperator, strategy: strategy, magnitude: magnitude}); // delegate from the `staker` to the operator _delegateToOperatorWhoAcceptsAllStakers(staker, defaultOperator); - uint256 delegatedSharesBefore = delegationManager.operatorShares( - delegationManager.delegatedTo(staker), - strategy - ); + uint256 delegatedSharesBefore = + delegationManager.operatorShares(delegationManager.delegatedTo(staker), strategy); // deposit and increaseDelegatedShares strategyManagerMock.addDeposit(staker, strategy, shares); @@ -3508,16 +3299,9 @@ contract DelegationManagerUnitTests_increaseDelegatedShares is DelegationManager }); // Assert correct end state values - (uint256[] memory withdrawableShares, ) = delegationManager.getWithdrawableShares(staker, strategyArray); - uint256 delegatedSharesAfter = delegationManager.operatorShares( - delegationManager.delegatedTo(staker), - strategy - ); - _assertWithdrawableAndOperatorShares( - withdrawableShares[0], - delegatedSharesAfter, - "Invalid withdrawable shares" - ); + (uint256[] memory withdrawableShares,) = delegationManager.getWithdrawableShares(staker, strategyArray); + uint256 delegatedSharesAfter = delegationManager.operatorShares(delegationManager.delegatedTo(staker), strategy); + _assertWithdrawableAndOperatorShares(withdrawableShares[0], delegatedSharesAfter, "Invalid withdrawable shares"); } /** @@ -3528,13 +3312,13 @@ contract DelegationManagerUnitTests_increaseDelegatedShares is DelegationManager * The test below results in a drift difference of 4.418e13 */ function test_increaseDelegatedShares_depositRepeatedly() public { - uint64 initialMagnitude = 999999999999990009; - uint256 shares = 44182209037560531097078597505; + uint64 initialMagnitude = 999_999_999_999_990_009; + uint256 shares = 44_182_209_037_560_531_097_078_597_505; // register *this contract* as an operator _registerOperatorWithBaseDetails(defaultOperator); _setOperatorMagnitude(defaultOperator, strategyMock, initialMagnitude); - + // Set the staker deposits in the strategies IStrategy[] memory strategies = strategyMock.toArray(); strategyManagerMock.addDeposit(defaultStaker, strategyMock, shares); @@ -3554,14 +3338,12 @@ contract DelegationManagerUnitTests_increaseDelegatedShares is DelegationManager } } - ( - uint256[] memory withdrawableShares, - uint256[] memory depositShares - ) = delegationManager.getWithdrawableShares(defaultStaker, strategies); + (uint256[] memory withdrawableShares, uint256[] memory depositShares) = + delegationManager.getWithdrawableShares(defaultStaker, strategies); assertEq(depositShares[0], shares, "staker deposit shares not reset correctly"); assertEq( delegationManager.operatorShares(defaultOperator, strategyMock) - withdrawableShares[0], - 44182209037566, + 44_182_209_037_566, "drift should be 4.418e13 from previous tests" ); } @@ -3572,7 +3354,9 @@ contract DelegationManagerUnitTests_decreaseDelegatedShares is DelegationManager using SlashingLib for *; using Math for *; - function testFuzz_Revert_decreaseDelegatedShares_invalidCaller(Randomness r) public rand(r) { + function testFuzz_Revert_decreaseDelegatedShares_invalidCaller( + Randomness r + ) public rand(r) { address invalidCaller = r.Address(); address staker = r.Address(); uint256 shares = r.Uint256(1, MAX_STRATEGY_SHARES); @@ -3583,7 +3367,9 @@ contract DelegationManagerUnitTests_decreaseDelegatedShares is DelegationManager } /// @notice Verifies that there is no change in operatorShares if the staker is not delegated - function testFuzz_decreaseDelegatedShares_noop(Randomness r) public rand(r) { + function testFuzz_decreaseDelegatedShares_noop( + Randomness r + ) public rand(r) { address staker = r.Address(); uint256 shares = r.Uint256(1, MAX_STRATEGY_SHARES); uint64 beaconChainSlashingFactorDecrease = uint64(r.Uint256(0, WAD)); @@ -3603,7 +3389,9 @@ contract DelegationManagerUnitTests_decreaseDelegatedShares is DelegationManager * Ensures that after the decrease, the staker's withdrawableShares <= operatorShares, * preventing any underflow for the operator's shares if they were all to be withdrawn. */ - function testFuzz_decreaseDelegatedShares_nonSlashedOperator(Randomness r) public rand(r) { + function testFuzz_decreaseDelegatedShares_nonSlashedOperator( + Randomness r + ) public rand(r) { int256 beaconShares = int256(r.Uint256(1, MAX_ETH_SUPPLY)); uint256 sharesDecrease = r.Uint256(0, uint256(beaconShares) - 1); uint64 beaconChainSlashingFactor = r.Uint64(1, WAD); @@ -3612,30 +3400,24 @@ contract DelegationManagerUnitTests_decreaseDelegatedShares is DelegationManager _registerOperatorWithBaseDetails(defaultOperator); eigenPodManagerMock.setPodOwnerShares(defaultStaker, beaconShares); eigenPodManagerMock.setBeaconChainSlashingFactor(defaultStaker, beaconChainSlashingFactor); + (uint256[] memory withdrawableShares,) = delegationManager.getWithdrawableShares(defaultStaker, beaconChainETHStrategy.toArray()); _delegateToOperatorWhoAcceptsAllStakers(defaultStaker, defaultOperator); - _assertDeposit({ + _assertDelegation({ staker: defaultStaker, operator: defaultOperator, strategy: beaconChainETHStrategy, operatorSharesBefore: 0, - withdrawableSharesBefore: 0, - depositSharesBefore: 0, - prevDsf: WAD, - depositAmount: uint256(beaconShares) + withdrawableSharesBefore: withdrawableShares[0], + depositSharesBefore: uint256(beaconShares), + prevDsf: WAD }); // 2. Perform beaconChain slash + decreaseDelegatedShares() - ( - uint64 prevBeaconSlashingFactor, - uint64 newBeaconSlashingFactor - ) = _setNewBeaconChainSlashingFactor(defaultStaker, beaconShares, sharesDecrease); + (uint64 prevBeaconSlashingFactor, uint64 newBeaconSlashingFactor) = + _setNewBeaconChainSlashingFactor(defaultStaker, beaconShares, sharesDecrease); uint64 beaconChainSlashingFactorDecrease = prevBeaconSlashingFactor - newBeaconSlashingFactor; - assertEq( - beaconChainSlashingFactor, - prevBeaconSlashingFactor, - "Bad test setup" - ); - uint256 depositScalingFactor = uint256(WAD).divWad(beaconChainSlashingFactor); + assertEq(beaconChainSlashingFactor, prevBeaconSlashingFactor, "Bad test setup"); + uint256 depositScalingFactor = uint256(WAD); // expected operatorShares decreased for event uint256 operatorSharesToDecrease = _calcWithdrawableShares({ depositShares: uint256(beaconShares), @@ -3651,7 +3433,9 @@ contract DelegationManagerUnitTests_decreaseDelegatedShares is DelegationManager }) ); cheats.prank(address(eigenPodManagerMock)); - delegationManager.decreaseDelegatedShares(defaultStaker, uint256(beaconShares), beaconChainSlashingFactorDecrease); + delegationManager.decreaseDelegatedShares( + defaultStaker, uint256(beaconShares), beaconChainSlashingFactorDecrease + ); // 3. Assert correct values uint256 expectedWithdrawableShares = _calcWithdrawableShares({ @@ -3661,16 +3445,17 @@ contract DelegationManagerUnitTests_decreaseDelegatedShares is DelegationManager }); _assertSharesAfterBeaconSlash({ staker: defaultStaker, - withdrawableSharesBefore: uint256(beaconShares), + withdrawableSharesBefore: withdrawableShares[0], expectedWithdrawableShares: expectedWithdrawableShares, prevBeaconSlashingFactor: prevBeaconSlashingFactor }); // Assert correct end state values - (uint256[] memory withdrawableSharesAfter, ) = delegationManager.getWithdrawableShares(defaultStaker, beaconChainETHStrategy.toArray()); + (uint256[] memory withdrawableSharesAfter,) = + delegationManager.getWithdrawableShares(defaultStaker, beaconChainETHStrategy.toArray()); assertEq( delegationManager.operatorShares(defaultOperator, beaconChainETHStrategy) + operatorSharesToDecrease, - uint256(beaconShares), + withdrawableShares[0], "operator shares not decreased correctly" ); @@ -3689,7 +3474,9 @@ contract DelegationManagerUnitTests_decreaseDelegatedShares is DelegationManager * Ensures that after the decrease, the staker's withdrawableShares <= operatorShares, * preventing any underflow for the operator's shares if they were all to be withdrawn. */ - function testFuzz_decreaseDelegatedShares_slashedOperator(Randomness r) public rand(r) { + function testFuzz_decreaseDelegatedShares_slashedOperator( + Randomness r + ) public rand(r) { int256 beaconShares = int256(r.Uint256(1, MAX_ETH_SUPPLY)); uint256 sharesDecrease = r.Uint256(0, uint256(beaconShares) - 1); uint64 maxMagnitude = r.Uint64(1, WAD - 1); @@ -3700,30 +3487,24 @@ contract DelegationManagerUnitTests_decreaseDelegatedShares is DelegationManager _setOperatorMagnitude(defaultOperator, beaconChainETHStrategy, maxMagnitude); eigenPodManagerMock.setPodOwnerShares(defaultStaker, beaconShares); eigenPodManagerMock.setBeaconChainSlashingFactor(defaultStaker, beaconChainSlashingFactor); + (uint256[] memory withdrawableShares,) = delegationManager.getWithdrawableShares(defaultStaker, beaconChainETHStrategy.toArray()); _delegateToOperatorWhoAcceptsAllStakers(defaultStaker, defaultOperator); - _assertDeposit({ + _assertDelegation({ staker: defaultStaker, operator: defaultOperator, strategy: beaconChainETHStrategy, operatorSharesBefore: 0, - withdrawableSharesBefore: 0, - depositSharesBefore: 0, - prevDsf: WAD, - depositAmount: uint256(beaconShares) + withdrawableSharesBefore: withdrawableShares[0], + depositSharesBefore: uint256(beaconShares), + prevDsf: WAD }); // 2. Perform beaconChain slash + decreaseDelegatedShares() - ( - uint64 prevBeaconSlashingFactor, - uint64 newBeaconSlashingFactor - ) = _setNewBeaconChainSlashingFactor(defaultStaker, beaconShares, sharesDecrease); + (uint64 prevBeaconSlashingFactor, uint64 newBeaconSlashingFactor) = + _setNewBeaconChainSlashingFactor(defaultStaker, beaconShares, sharesDecrease); uint64 beaconChainSlashingFactorDecrease = prevBeaconSlashingFactor - newBeaconSlashingFactor; - assertEq( - beaconChainSlashingFactor, - prevBeaconSlashingFactor, - "Bad test setup" - ); - uint256 depositScalingFactor = uint256(WAD).divWad(maxMagnitude.mulWad(beaconChainSlashingFactor)); + assertEq(beaconChainSlashingFactor, prevBeaconSlashingFactor, "Bad test setup"); + uint256 depositScalingFactor = uint256(WAD).divWad(maxMagnitude); // expected operatorShares decreased for event uint256 operatorSharesToDecrease = _calcWithdrawableShares({ depositShares: uint256(beaconShares), @@ -3739,7 +3520,9 @@ contract DelegationManagerUnitTests_decreaseDelegatedShares is DelegationManager }) ); cheats.prank(address(eigenPodManagerMock)); - delegationManager.decreaseDelegatedShares(defaultStaker, uint256(beaconShares), beaconChainSlashingFactorDecrease); + delegationManager.decreaseDelegatedShares( + defaultStaker, uint256(beaconShares), beaconChainSlashingFactorDecrease + ); // 3. Assert correct values uint256 expectedWithdrawableShares = _calcWithdrawableShares({ @@ -3749,16 +3532,17 @@ contract DelegationManagerUnitTests_decreaseDelegatedShares is DelegationManager }); _assertSharesAfterBeaconSlash({ staker: defaultStaker, - withdrawableSharesBefore: uint256(beaconShares), + withdrawableSharesBefore: withdrawableShares[0], expectedWithdrawableShares: expectedWithdrawableShares, prevBeaconSlashingFactor: prevBeaconSlashingFactor }); // Assert correct end state values - (uint256[] memory withdrawableSharesAfter, ) = delegationManager.getWithdrawableShares(defaultStaker, beaconChainETHStrategy.toArray()); + (uint256[] memory withdrawableSharesAfter,) = + delegationManager.getWithdrawableShares(defaultStaker, beaconChainETHStrategy.toArray()); assertEq( delegationManager.operatorShares(defaultOperator, beaconChainETHStrategy) + operatorSharesToDecrease, - uint256(beaconShares), + withdrawableShares[0], "operator shares not decreased correctly" ); @@ -3774,7 +3558,9 @@ contract DelegationManagerUnitTests_decreaseDelegatedShares is DelegationManager * is slashed. Their withdrawable shares should be 0 afterwards and decreasing operatorShares should * not underflow and revert either. */ - function testFuzz_decreaseDelegatedShares_entireBalance(Randomness r) public rand(r) { + function testFuzz_decreaseDelegatedShares_entireBalance( + Randomness r + ) public rand(r) { int256 beaconShares = int256(r.Uint256(1, MAX_ETH_SUPPLY)); uint64 maxMagnitude = r.Uint64(1, WAD); uint64 beaconChainSlashingFactor = r.Uint64(1, WAD); @@ -3784,30 +3570,24 @@ contract DelegationManagerUnitTests_decreaseDelegatedShares is DelegationManager _setOperatorMagnitude(defaultOperator, beaconChainETHStrategy, maxMagnitude); eigenPodManagerMock.setPodOwnerShares(defaultStaker, beaconShares); eigenPodManagerMock.setBeaconChainSlashingFactor(defaultStaker, beaconChainSlashingFactor); + (uint256[] memory withdrawableShares,) = delegationManager.getWithdrawableShares(defaultStaker, beaconChainETHStrategy.toArray()); _delegateToOperatorWhoAcceptsAllStakers(defaultStaker, defaultOperator); - _assertDeposit({ + _assertDelegation({ staker: defaultStaker, operator: defaultOperator, strategy: beaconChainETHStrategy, operatorSharesBefore: 0, - withdrawableSharesBefore: 0, - depositSharesBefore: 0, - prevDsf: WAD, - depositAmount: uint256(beaconShares) + withdrawableSharesBefore: withdrawableShares[0], + depositSharesBefore: uint256(beaconShares), + prevDsf: WAD }); // 2. Perform beaconChain slash + decreaseDelegatedShares() - ( - uint64 prevBeaconSlashingFactor, - uint64 newBeaconSlashingFactor - ) = _setNewBeaconChainSlashingFactor(defaultStaker, beaconShares, uint256(beaconShares)); - assertEq( - beaconChainSlashingFactor, - prevBeaconSlashingFactor, - "Bad test setup" - ); + (uint64 prevBeaconSlashingFactor, uint64 newBeaconSlashingFactor) = + _setNewBeaconChainSlashingFactor(defaultStaker, beaconShares, uint256(beaconShares)); + assertEq(beaconChainSlashingFactor, prevBeaconSlashingFactor, "Bad test setup"); uint64 beaconChainSlashingFactorDecrease = prevBeaconSlashingFactor - newBeaconSlashingFactor; - uint256 depositScalingFactor = uint256(WAD).divWad(maxMagnitude.mulWad(beaconChainSlashingFactor)); + uint256 depositScalingFactor = uint256(WAD).divWad(maxMagnitude); // expected operatorShares decreased for event uint256 operatorSharesToDecrease = _calcWithdrawableShares({ depositShares: uint256(beaconShares), @@ -3831,25 +3611,19 @@ contract DelegationManagerUnitTests_decreaseDelegatedShares is DelegationManager depositScalingFactor: depositScalingFactor, slashingFactor: maxMagnitude.mulWad(newBeaconSlashingFactor) }); + assertEq(expectedWithdrawableShares, 0, "All shares should be slashed"); assertEq( - expectedWithdrawableShares, - 0, - "All shares should be slashed" - ); - assertEq( - eigenPodManagerMock.beaconChainSlashingFactor(defaultStaker), - 0, - "beaconChainSlashingFactor should be 0" + eigenPodManagerMock.beaconChainSlashingFactor(defaultStaker), 0, "beaconChainSlashingFactor should be 0" ); _assertSharesAfterBeaconSlash({ staker: defaultStaker, - withdrawableSharesBefore: uint256(beaconShares), + withdrawableSharesBefore: withdrawableShares[0], expectedWithdrawableShares: expectedWithdrawableShares, prevBeaconSlashingFactor: prevBeaconSlashingFactor }); assertEq( delegationManager.operatorShares(defaultOperator, beaconChainETHStrategy) + operatorSharesToDecrease, - uint256(beaconShares), + withdrawableShares[0], "operator shares not decreased correctly" ); } @@ -3861,7 +3635,9 @@ contract DelegationManagerUnitTests_undelegate is DelegationManagerUnitTests { using Math for uint256; // @notice Verifies that undelegating is not possible when the "undelegation paused" switch is flipped - function testFuzz_Revert_undelegate_paused(Randomness r) public rand(r) { + function testFuzz_Revert_undelegate_paused( + Randomness r + ) public rand(r) { address staker = r.Address(); address operator = r.Address(); _registerOperatorWithBaseDetails(operator); @@ -3875,7 +3651,9 @@ contract DelegationManagerUnitTests_undelegate is DelegationManagerUnitTests { delegationManager.undelegate(staker); } - function testFuzz_Revert_undelegate_notDelegated(Randomness r) public rand(r) { + function testFuzz_Revert_undelegate_notDelegated( + Randomness r + ) public rand(r) { address undelegatedStaker = r.Address(); assertFalse(delegationManager.isDelegated(undelegatedStaker), "bad test setup"); @@ -3885,7 +3663,9 @@ contract DelegationManagerUnitTests_undelegate is DelegationManagerUnitTests { } // @notice Verifies that an operator cannot undelegate from themself (this should always be forbidden) - function testFuzz_Revert_undelegate_stakerIsOperator(Randomness r) public rand(r) { + function testFuzz_Revert_undelegate_stakerIsOperator( + Randomness r + ) public rand(r) { address operator = r.Address(); _registerOperatorWithBaseDetails(operator); @@ -3923,7 +3703,9 @@ contract DelegationManagerUnitTests_undelegate is DelegationManagerUnitTests { * @notice Verifies that the `undelegate` function has proper access controls (can only be called by the operator who the `staker` has delegated * to or the operator's `delegationApprover`), or the staker themselves */ - function testFuzz_Revert_undelegate_invalidCaller(Randomness r) public rand(r) { + function testFuzz_Revert_undelegate_invalidCaller( + Randomness r + ) public rand(r) { address invalidCaller = r.Address(); address staker = r.Address(); @@ -3942,9 +3724,11 @@ contract DelegationManagerUnitTests_undelegate is DelegationManagerUnitTests { * Properly undelegates the staker, i.e. the staker becomes “delegated to” the zero address, and `isDelegated(staker)` returns ‘false’ * Emits a `StakerUndelegated` event */ - function testFuzz_undelegate_noDelegateableShares(Randomness r) public rand(r) { + function testFuzz_undelegate_noDelegateableShares( + Randomness r + ) public rand(r) { address staker = r.Address(); - + // register *this contract* as an operator and delegate from the `staker` to them _registerOperatorWithBaseDetails(defaultOperator); _delegateToOperatorWhoAcceptsAllStakers(staker, defaultOperator); @@ -3956,9 +3740,7 @@ contract DelegationManagerUnitTests_undelegate is DelegationManagerUnitTests { assertEq(withdrawalRoots.length, 0, "withdrawalRoot should be an empty array"); assertEq( - delegationManager.delegatedTo(staker), - address(0), - "undelegated staker should be delegated to zero address" + delegationManager.delegatedTo(staker), address(0), "undelegated staker should be delegated to zero address" ); assertFalse(delegationManager.isDelegated(staker), "staker not undelegated"); } @@ -3966,7 +3748,9 @@ contract DelegationManagerUnitTests_undelegate is DelegationManagerUnitTests { /** * @notice Verifies that the `undelegate` function allows for a force undelegation */ - function testFuzz_undelegate_forceUndelegation_noDelegateableShares(Randomness r) public rand(r) { + function testFuzz_undelegate_forceUndelegation_noDelegateableShares( + Randomness r + ) public rand(r) { address staker = r.Address(); bytes32 salt = r.Bytes32(); bool callFromOperatorOrApprover = r.Boolean(); @@ -4000,9 +3784,7 @@ contract DelegationManagerUnitTests_undelegate is DelegationManagerUnitTests { assertEq(withdrawalRoots.length, 0, "withdrawalRoot should be an empty array"); assertEq( - delegationManager.delegatedTo(staker), - address(0), - "undelegated staker should be delegated to zero address" + delegationManager.delegatedTo(staker), address(0), "undelegated staker should be delegated to zero address" ); assertFalse(delegationManager.isDelegated(staker), "staker not undelegated"); } @@ -4010,7 +3792,9 @@ contract DelegationManagerUnitTests_undelegate is DelegationManagerUnitTests { /** * @notice Verifies that the `undelegate` function properly queues a withdrawal for all shares of the staker */ - function testFuzz_undelegate_nonSlashedOperator(Randomness r) public rand(r) { + function testFuzz_undelegate_nonSlashedOperator( + Randomness r + ) public rand(r) { uint256 shares = r.Uint256(1, MAX_STRATEGY_SHARES); IStrategy[] memory strategyArray = r.StrategyArray(1); IStrategy strategy = strategyArray[0]; @@ -4034,11 +3818,7 @@ contract DelegationManagerUnitTests_undelegate is DelegationManagerUnitTests { }); // Format queued withdrawal - ( - , - Withdrawal memory withdrawal, - bytes32 withdrawalRoot - ) = _setUpQueueWithdrawalsSingleStrat({ + (, Withdrawal memory withdrawal, bytes32 withdrawalRoot) = _setUpQueueWithdrawalsSingleStrat({ staker: defaultStaker, strategy: strategy, depositSharesToWithdraw: shares @@ -4085,15 +3865,17 @@ contract DelegationManagerUnitTests_undelegate is DelegationManagerUnitTests { * @notice Verifies that the `undelegate` function properly queues a withdrawal for all shares of the staker * @notice The operator should have its shares slashed prior to the staker's deposit */ - function testFuzz_undelegate_preSlashedOperator(Randomness r) public rand(r) { + function testFuzz_undelegate_preSlashedOperator( + Randomness r + ) public rand(r) { uint256 shares = r.Uint256(1, MAX_STRATEGY_SHARES); uint64 operatorMagnitude = r.Uint64(1, WAD); - IStrategy strategy = IStrategy(r.Address()); + IStrategy strategy = IStrategy(r.Address()); // register *this contract* as an operator & set its slashed magnitude _registerOperatorWithBaseDetails(defaultOperator); _setOperatorMagnitude(defaultOperator, strategy, operatorMagnitude); - + // Set the staker deposits in the strategies strategyManagerMock.addDeposit(defaultStaker, strategy, shares); @@ -4109,13 +3891,9 @@ contract DelegationManagerUnitTests_undelegate is DelegationManagerUnitTests { prevDsf: uint256(WAD).divWad(operatorMagnitude), depositAmount: shares }); - + // Format queued withdrawal - ( - , - Withdrawal memory withdrawal, - bytes32 withdrawalRoot - ) = _setUpQueueWithdrawalsSingleStrat({ + (, Withdrawal memory withdrawal, bytes32 withdrawalRoot) = _setUpQueueWithdrawalsSingleStrat({ staker: defaultStaker, strategy: strategy, depositSharesToWithdraw: shares @@ -4124,11 +3902,7 @@ contract DelegationManagerUnitTests_undelegate is DelegationManagerUnitTests { // Calculate operatorShares decreased, may be off of shares due to rounding uint256 depositScalingFactor = delegationManager.depositScalingFactor(defaultStaker, strategy); assertTrue(depositScalingFactor > WAD, "bad test setup"); - uint256 operatorSharesDecreased = _calcWithdrawableShares( - shares, - depositScalingFactor, - operatorMagnitude - ); + uint256 operatorSharesDecreased = _calcWithdrawableShares(shares, depositScalingFactor, operatorMagnitude); assertLe(operatorSharesDecreased, shares, "operatorSharesDecreased should be <= shares"); // Undelegate the staker @@ -4167,7 +3941,8 @@ contract DelegationManagerUnitTests_undelegate is DelegationManagerUnitTests { depositScalingFactor: uint256(WAD).divWad(operatorMagnitude), slashingFactor: uint256(operatorMagnitude) }); - (uint256[] memory stakerWithdrawableShares, ) = delegationManager.getWithdrawableShares(defaultStaker, strategy.toArray()); + (uint256[] memory stakerWithdrawableShares,) = + delegationManager.getWithdrawableShares(defaultStaker, strategy.toArray()); assertEq(stakerWithdrawableShares[0], 0, "staker withdrawable shares not calculated correctly"); } @@ -4175,7 +3950,9 @@ contract DelegationManagerUnitTests_undelegate is DelegationManagerUnitTests { * @notice Verifies that the `undelegate` function properly queues a withdrawal for all shares of the staker * @notice The operator should have its shares slashed prior to the staker's deposit */ - function testFuzz_undelegate_slashedWhileStaked(Randomness r) public rand(r) { + function testFuzz_undelegate_slashedWhileStaked( + Randomness r + ) public rand(r) { uint256 shares = r.Uint256(1, MAX_STRATEGY_SHARES); uint64 prevMaxMagnitude = r.Uint64(2, WAD); uint64 newMaxMagnitude = r.Uint64(1, prevMaxMagnitude - 1); @@ -4184,10 +3961,10 @@ contract DelegationManagerUnitTests_undelegate is DelegationManagerUnitTests { // register *this contract* as an operator _registerOperatorWithBaseDetails(defaultOperator); _setOperatorMagnitude(defaultOperator, strategy, prevMaxMagnitude); - + // Set the staker deposits in the strategies strategyManagerMock.addDeposit(defaultStaker, strategy, shares); - + // delegate from the `defaultStaker` to the operator _delegateToOperatorWhoAcceptsAllStakers(defaultStaker, defaultOperator); _assertDeposit({ @@ -4209,7 +3986,8 @@ contract DelegationManagerUnitTests_undelegate is DelegationManagerUnitTests { // Set operator magnitude { - (uint256[] memory withdrawableSharesBefore, ) = delegationManager.getWithdrawableShares(defaultStaker, strategy.toArray()); + (uint256[] memory withdrawableSharesBefore,) = + delegationManager.getWithdrawableShares(defaultStaker, strategy.toArray()); uint256 delegatedSharesBefore = delegationManager.operatorShares(defaultOperator, strategy); _setOperatorMagnitude(defaultOperator, strategy, newMaxMagnitude); cheats.prank(address(allocationManagerMock)); @@ -4223,7 +4001,7 @@ contract DelegationManagerUnitTests_undelegate is DelegationManagerUnitTests { }); uint256 expectedWithdrawable = _calcWithdrawableShares( - shares, + shares, uint256(WAD).divWad(prevMaxMagnitude), _getSlashingFactor(defaultStaker, strategy, newMaxMagnitude) ); @@ -4237,8 +4015,11 @@ contract DelegationManagerUnitTests_undelegate is DelegationManagerUnitTests { }); // Get withdrawable shares - (uint256[] memory withdrawableSharesAfter, uint256[] memory depositSharesAfter) = delegationManager.getWithdrawableShares(defaultStaker, strategy.toArray()); - _assertWithdrawableAndOperatorShares(withdrawableSharesAfter[0], operatorSharesAfterSlash, "Invalid withdrawable shares"); + (uint256[] memory withdrawableSharesAfter, uint256[] memory depositSharesAfter) = + delegationManager.getWithdrawableShares(defaultStaker, strategy.toArray()); + _assertWithdrawableAndOperatorShares( + withdrawableSharesAfter[0], operatorSharesAfterSlash, "Invalid withdrawable shares" + ); assertEq(depositSharesAfter[0], shares, "Invalid deposit shares"); assertEq( delegationManager.depositScalingFactor(defaultStaker, strategy), @@ -4248,14 +4029,11 @@ contract DelegationManagerUnitTests_undelegate is DelegationManagerUnitTests { } // Format queued withdrawal - (uint256[] memory withdrawableShares, uint256[] memory depositShares) = delegationManager.getWithdrawableShares(defaultStaker, strategy.toArray()); + (uint256[] memory withdrawableShares, uint256[] memory depositShares) = + delegationManager.getWithdrawableShares(defaultStaker, strategy.toArray()); uint256 operatorSharesBefore = delegationManager.operatorShares(defaultOperator, strategy); { - ( - , - Withdrawal memory withdrawal, - bytes32 withdrawalRoot - ) = _setUpQueueWithdrawalsSingleStrat({ + (, Withdrawal memory withdrawal, bytes32 withdrawalRoot) = _setUpQueueWithdrawalsSingleStrat({ staker: defaultStaker, strategy: strategy, depositSharesToWithdraw: shares @@ -4308,7 +4086,9 @@ contract DelegationManagerUnitTests_undelegate is DelegationManagerUnitTests { * @notice Verifies that the `undelegate` function properly undelegates a staker even though their shares * were slashed entirely. */ - function testFuzz_undelegate_slashedOperator100PercentWhileStaked(Randomness r) public rand(r) { + function testFuzz_undelegate_slashedOperator100PercentWhileStaked( + Randomness r + ) public rand(r) { uint256 shares = r.Uint256(1, MAX_STRATEGY_SHARES); IStrategy[] memory strategyArray = r.StrategyArray(1); IStrategy strategy = strategyArray[0]; @@ -4343,11 +4123,7 @@ contract DelegationManagerUnitTests_undelegate is DelegationManagerUnitTests { assertEq(operatorSharesAfterSlash, 0, "operator shares not fully slashed"); } - ( - , - Withdrawal memory withdrawal, - bytes32 withdrawalRoot - ) = _setUpQueueWithdrawalsSingleStrat({ + (, Withdrawal memory withdrawal, bytes32 withdrawalRoot) = _setUpQueueWithdrawalsSingleStrat({ staker: defaultStaker, strategy: strategy, depositSharesToWithdraw: shares @@ -4357,20 +4133,10 @@ contract DelegationManagerUnitTests_undelegate is DelegationManagerUnitTests { assertEq(depositScalingFactor, WAD, "bad test setup"); // Get withdrawable and deposit shares { - ( - uint256[] memory withdrawableSharesBefore, - uint256[] memory depositSharesBefore - ) = delegationManager.getWithdrawableShares(defaultStaker, strategyArray); - assertEq( - withdrawableSharesBefore[0], - 0, - "withdrawable shares should be 0 after being slashed fully" - ); - assertEq( - depositSharesBefore[0], - shares, - "deposit shares should be unchanged after being slashed fully" - ); + (uint256[] memory withdrawableSharesBefore, uint256[] memory depositSharesBefore) = + delegationManager.getWithdrawableShares(defaultStaker, strategyArray); + assertEq(withdrawableSharesBefore[0], 0, "withdrawable shares should be 0 after being slashed fully"); + assertEq(depositSharesBefore[0], shares, "deposit shares should be unchanged after being slashed fully"); } // Undelegate the staker @@ -4410,16 +4176,18 @@ contract DelegationManagerUnitTests_undelegate is DelegationManagerUnitTests { slashingFactor: 0 }); - assertEq(delegationManager.operatorShares(defaultOperator, strategy), 0, "operator shares not decreased correctly"); - ( - uint256[] memory stakerWithdrawableShares, - uint256[] memory depositShares - ) = delegationManager.getWithdrawableShares(defaultStaker, strategyArray); + assertEq( + delegationManager.operatorShares(defaultOperator, strategy), 0, "operator shares not decreased correctly" + ); + (uint256[] memory stakerWithdrawableShares, uint256[] memory depositShares) = + delegationManager.getWithdrawableShares(defaultStaker, strategyArray); assertEq(stakerWithdrawableShares[0], 0, "staker withdrawable shares not calculated correctly"); assertEq(depositShares[0], 0, "staker deposit shares not reset correctly"); } - function testFuzz_undelegate_slashedOperatorCloseTo100(Randomness r) public rand(r) { + function testFuzz_undelegate_slashedOperatorCloseTo100( + Randomness r + ) public rand(r) { address[] memory stakers = r.StakerArray(r.Uint32(1, 8)); uint64 prevMaxMagnitude = r.Uint64(2, WAD); uint64 newMaxMagnitude = 1; @@ -4427,16 +4195,12 @@ contract DelegationManagerUnitTests_undelegate is DelegationManagerUnitTests { // 1. register *this contract* as an operator _registerOperatorWithBaseDetails(defaultOperator); _setOperatorMagnitude(defaultOperator, strategyMock, prevMaxMagnitude); - + // 2. Stakers deposits in the strategyMock { for (uint256 i = 0; i < stakers.length; ++i) { uint256 shares = r.Uint256(1, MAX_STRATEGY_SHARES); - strategyManagerMock.addDeposit( - stakers[i], - strategyMock, - shares - ); + strategyManagerMock.addDeposit(stakers[i], strategyMock, shares); stakerDepositShares[stakers[i]] = shares; } } @@ -4460,11 +4224,14 @@ contract DelegationManagerUnitTests_undelegate is DelegationManagerUnitTests { }); } - (uint256[] memory withdrawableSharesBefore, ) = delegationManager.getWithdrawableShares(stakers[i], strategyMock.toArray()); + (uint256[] memory withdrawableSharesBefore,) = + delegationManager.getWithdrawableShares(stakers[i], strategyMock.toArray()); totalWithdrawable += withdrawableSharesBefore[0]; } assertLe( - totalWithdrawable, delegationManager.operatorShares(defaultOperator, strategyMock), "should be <= op shares due to rounding" + totalWithdrawable, + delegationManager.operatorShares(defaultOperator, strategyMock), + "should be <= op shares due to rounding" ); } @@ -4487,11 +4254,7 @@ contract DelegationManagerUnitTests_undelegate is DelegationManagerUnitTests { // 5. Undelegate the stakers with expected events uint256 totalOperatorSharesDecreased = 0; for (uint256 i = 0; i < stakers.length; ++i) { - ( - , - Withdrawal memory withdrawal, - bytes32 withdrawalRoot - ) = _setUpQueueWithdrawalsSingleStrat({ + (, Withdrawal memory withdrawal, bytes32 withdrawalRoot) = _setUpQueueWithdrawalsSingleStrat({ staker: stakers[i], strategy: strategyMock, depositSharesToWithdraw: stakerDepositShares[stakers[i]] @@ -4529,10 +4292,8 @@ contract DelegationManagerUnitTests_undelegate is DelegationManagerUnitTests { ); assertFalse(delegationManager.isDelegated(defaultStaker), "staker not undelegated"); for (uint256 i = 0; i < stakers.length; ++i) { - ( - uint256[] memory stakerWithdrawableShares, - uint256[] memory stakerDepositShares - ) = delegationManager.getWithdrawableShares(stakers[i], strategyMock.toArray()); + (uint256[] memory stakerWithdrawableShares, uint256[] memory stakerDepositShares) = + delegationManager.getWithdrawableShares(stakers[i], strategyMock.toArray()); assertEq(stakerWithdrawableShares[0], 0, "staker withdrawable shares not calculated correctly"); assertEq(stakerDepositShares[0], 0, "staker deposit shares not reset correctly"); } @@ -4542,10 +4303,12 @@ contract DelegationManagerUnitTests_undelegate is DelegationManagerUnitTests { * @notice Given an operator with slashed magnitude, delegate, undelegate, and then delegate back to the same operator with * completing withdrawals as shares. This should result in the operatorShares after the second delegation being <= the shares from the first delegation. */ - function testFuzz_undelegate_delegateAgainWithRounding(Randomness r) public rand(r) { + function testFuzz_undelegate_delegateAgainWithRounding( + Randomness r + ) public rand(r) { uint256 shares = r.Uint256(1, MAX_STRATEGY_SHARES); // set magnitude to 66% to ensure rounding when calculating `toShares` - uint64 operatorMagnitude = 333333333333333333; + uint64 operatorMagnitude = 333_333_333_333_333_333; // register *this contract* as an operator & set its slashed magnitude _registerOperatorWithBaseDetails(defaultOperator); @@ -4569,11 +4332,7 @@ contract DelegationManagerUnitTests_undelegate is DelegationManagerUnitTests { uint256 operatorSharesBefore = delegationManager.operatorShares(defaultOperator, strategyMock); // Format queued withdrawal - ( - , - Withdrawal memory withdrawal, - bytes32 withdrawalRoot - ) = _setUpQueueWithdrawalsSingleStrat({ + (, Withdrawal memory withdrawal, bytes32 withdrawalRoot) = _setUpQueueWithdrawalsSingleStrat({ staker: defaultStaker, strategy: strategyMock, depositSharesToWithdraw: shares @@ -4581,9 +4340,7 @@ contract DelegationManagerUnitTests_undelegate is DelegationManagerUnitTests { uint256 slashingFactor = _getSlashingFactor(defaultStaker, strategyMock, operatorMagnitude); uint256 operatorSharesDecreased = _calcWithdrawableShares( - shares, - delegationManager.depositScalingFactor(defaultStaker, strategyMock), - slashingFactor + shares, delegationManager.depositScalingFactor(defaultStaker, strategyMock), slashingFactor ); // Undelegate the staker @@ -4621,7 +4378,8 @@ contract DelegationManagerUnitTests_undelegate is DelegationManagerUnitTests { depositScalingFactor: uint256(WAD).divWad(operatorMagnitude), slashingFactor: operatorMagnitude }); - (uint256[] memory stakerWithdrawableShares, ) = delegationManager.getWithdrawableShares(defaultStaker, strategyMock.toArray()); + (uint256[] memory stakerWithdrawableShares,) = + delegationManager.getWithdrawableShares(defaultStaker, strategyMock.toArray()); assertEq(stakerWithdrawableShares[0], 0, "staker withdrawable shares not calculated correctly"); // // Re-delegate the staker to the operator again. The shares should have increased but may be less than from before due to rounding @@ -4634,15 +4392,21 @@ contract DelegationManagerUnitTests_undelegate is DelegationManagerUnitTests { delegationManager.completeQueuedWithdrawal(withdrawal, tokens, false); uint256 operatorSharesAfter = delegationManager.operatorShares(defaultOperator, strategyMock); - assertLe(operatorSharesAfter, operatorSharesBefore, "operator shares should be less than or equal to before due to potential rounding"); + assertLe( + operatorSharesAfter, + operatorSharesBefore, + "operator shares should be less than or equal to before due to potential rounding" + ); } } -contract DelegationManagerUnitTests_redelegate is DelegationManagerUnitTests { +contract DelegationManagerUnitTests_redelegate is DelegationManagerUnitTests { using ArrayLib for *; - + // @notice Verifies that redelegating is not possible when the "delegation paused" switch is flipped - function testFuzz_Revert_redelegate_delegatePaused(Randomness r) public { + function testFuzz_Revert_redelegate_delegatePaused( + Randomness r + ) public { address staker = r.Address(); address newOperator = r.Address(); @@ -4661,7 +4425,9 @@ contract DelegationManagerUnitTests_redelegate is DelegationManagerUnitTests { } // @notice Verifies that redelegating is not possible when the "undelegation paused" switch is flipped - function testFuzz_Revert_redelegate_undelegatePaused(Randomness r) public { + function testFuzz_Revert_redelegate_undelegatePaused( + Randomness r + ) public { address staker = r.Address(); address newOperator = r.Address(); @@ -4679,7 +4445,9 @@ contract DelegationManagerUnitTests_redelegate is DelegationManagerUnitTests { delegationManager.redelegate(newOperator, emptyApproverSignatureAndExpiry, emptySalt); } - function testFuzz_Revert_redelegate_notDelegated(Randomness r) public { + function testFuzz_Revert_redelegate_notDelegated( + Randomness r + ) public { address undelegatedStaker = r.Address(); assertFalse(delegationManager.isDelegated(undelegatedStaker), "bad test setup"); @@ -4691,7 +4459,9 @@ contract DelegationManagerUnitTests_redelegate is DelegationManagerUnitTests { } // @notice Verifies that an operator cannot undelegate from themself (this should always be forbidden) - function testFuzz_Revert_redelegate_stakerIsOperator(Randomness r) public { + function testFuzz_Revert_redelegate_stakerIsOperator( + Randomness r + ) public { address operator = r.Address(); _registerOperatorWithBaseDetails(operator); _registerOperatorWithBaseDetails(defaultOperator); @@ -4702,7 +4472,9 @@ contract DelegationManagerUnitTests_redelegate is DelegationManagerUnitTests { } /// @notice Verifies that `staker` cannot redelegate to an unregistered `operator` - function testFuzz_Revert_redelegateToUnregisteredOperator(Randomness r) public { + function testFuzz_Revert_redelegateToUnregisteredOperator( + Randomness r + ) public { address staker = r.Address(); address operator = r.Address(); assertFalse(delegationManager.isOperator(operator), "incorrect test input?"); @@ -4724,7 +4496,7 @@ contract DelegationManagerUnitTests_redelegate is DelegationManagerUnitTests { address staker = r.Address(); address newOperator = r.Address(); - uint expiry = r.Uint256(0, block.timestamp - 1); + uint256 expiry = r.Uint256(0, block.timestamp - 1); bytes32 salt = r.Bytes32(); _registerOperatorWithBaseDetails(defaultOperator); @@ -4733,13 +4505,8 @@ contract DelegationManagerUnitTests_redelegate is DelegationManagerUnitTests { _registerOperatorWithDelegationApprover(newOperator); // calculate the delegationSigner's signature - ISignatureUtils.SignatureWithExpiry memory approverSignatureAndExpiry = _getApproverSignature( - delegationSignerPrivateKey, - staker, - newOperator, - salt, - expiry - ); + ISignatureUtils.SignatureWithExpiry memory approverSignatureAndExpiry = + _getApproverSignature(delegationSignerPrivateKey, staker, newOperator, salt, expiry); // delegate from the `staker` to the operator cheats.startPrank(staker); @@ -4753,7 +4520,7 @@ contract DelegationManagerUnitTests_redelegate is DelegationManagerUnitTests { ) public { address staker = r.Address(); address newOperator = r.Address(); - uint expiry = r.Uint256(block.timestamp, block.timestamp + 100); + uint256 expiry = r.Uint256(block.timestamp, block.timestamp + 100); bytes32 salt = r.Bytes32(); _registerOperatorWithBaseDetails(defaultOperator); @@ -4761,29 +4528,18 @@ contract DelegationManagerUnitTests_redelegate is DelegationManagerUnitTests { // verify that the salt hasn't been used before assertFalse( - delegationManager.delegationApproverSaltIsSpent( - delegationManager.delegationApprover(newOperator), - salt - ), + delegationManager.delegationApproverSaltIsSpent(delegationManager.delegationApprover(newOperator), salt), "salt somehow spent too early?" ); // calculate the delegationSigner's signature - ISignatureUtils.SignatureWithExpiry memory approverSignatureAndExpiry = _getApproverSignature( - delegationSignerPrivateKey, - staker, - newOperator, - salt, - expiry - ); + ISignatureUtils.SignatureWithExpiry memory approverSignatureAndExpiry = + _getApproverSignature(delegationSignerPrivateKey, staker, newOperator, salt, expiry); // Spend salt by delegating normally first cheats.startPrank(staker); delegationManager.delegateTo(newOperator, approverSignatureAndExpiry, salt); assertTrue( - delegationManager.delegationApproverSaltIsSpent( - delegationManager.delegationApprover(newOperator), - salt - ), + delegationManager.delegationApproverSaltIsSpent(delegationManager.delegationApprover(newOperator), salt), "salt somehow spent not spent?" ); @@ -4800,7 +4556,9 @@ contract DelegationManagerUnitTests_redelegate is DelegationManagerUnitTests { * @notice Verifies that the `redelegate` function properly queues a withdrawal for all shares of the staker * ... and delegates to a new operator */ - function testFuzz_redelegate_noSlashing(Randomness r) public { + function testFuzz_redelegate_noSlashing( + Randomness r + ) public { uint256 shares = r.Uint256(1, MAX_STRATEGY_SHARES); IStrategy[] memory strategyArray = r.StrategyArray(1); IStrategy strategy = strategyArray[0]; @@ -4813,13 +4571,9 @@ contract DelegationManagerUnitTests_redelegate is DelegationManagerUnitTests { _registerOperatorWithBaseDetails(defaultOperator); _delegateToOperatorWhoAcceptsAllStakers(defaultStaker, defaultOperator); _registerOperatorWithBaseDetails(newOperator); - + // Format queued withdrawal - ( - , - Withdrawal memory withdrawal, - bytes32 withdrawalRoot - ) = _setUpQueueWithdrawalsSingleStrat({ + (, Withdrawal memory withdrawal, bytes32 withdrawalRoot) = _setUpQueueWithdrawalsSingleStrat({ staker: defaultStaker, strategy: strategy, depositSharesToWithdraw: shares @@ -4860,9 +4614,16 @@ contract DelegationManagerUnitTests_redelegate is DelegationManagerUnitTests { assertTrue(delegationManager.isDelegated(defaultStaker), "staker should still be delegated"); // Checks - operator & staker shares - assertEq(delegationManager.operatorShares(defaultOperator, strategyMock), 0, "operator shares not decreased correctly"); - assertEq(delegationManager.operatorShares(newOperator, strategyMock), 0, "operator shares should not have been added"); - (uint256[] memory stakerWithdrawableShares, ) = delegationManager.getWithdrawableShares(defaultStaker, strategyArray); + assertEq( + delegationManager.operatorShares(defaultOperator, strategyMock), + 0, + "operator shares not decreased correctly" + ); + assertEq( + delegationManager.operatorShares(newOperator, strategyMock), 0, "operator shares should not have been added" + ); + (uint256[] memory stakerWithdrawableShares,) = + delegationManager.getWithdrawableShares(defaultStaker, strategyArray); assertEq(stakerWithdrawableShares[0], 0, "staker withdrawable shares not calculated correctly"); } @@ -4870,7 +4631,9 @@ contract DelegationManagerUnitTests_redelegate is DelegationManagerUnitTests { * @notice This function tests to ensure that a delegator can re-delegate to an operator after undelegating. * Asserts the shares after re-delegating are the same as originally. No slashing is done in this test. */ - function testFuzz_undelegate_redelegateWithSharesBack(Randomness r) public rand(r) { + function testFuzz_undelegate_redelegateWithSharesBack( + Randomness r + ) public rand(r) { address staker = r.Address(); address operator = r.Address(); uint256 strategyShares = r.Uint256(1, MAX_STRATEGY_SHARES); @@ -4880,9 +4643,7 @@ contract DelegationManagerUnitTests_redelegate is DelegationManagerUnitTests { // 1. Set staker shares strategyManagerMock.addDeposit(staker, strategyMock, strategyShares); eigenPodManagerMock.setPodOwnerShares(staker, beaconShares); - ( - IStrategy[] memory strategiesToReturn, - ) = delegationManager.getDepositedShares(staker); + (IStrategy[] memory strategiesToReturn,) = delegationManager.getDepositedShares(staker); // 2. register operator and delegate staker to operator _registerOperatorWithBaseDetails(operator); _delegateToOperatorWhoAcceptsAllStakers(staker, operator); @@ -4909,18 +4670,12 @@ contract DelegationManagerUnitTests_redelegate is DelegationManagerUnitTests { // 3. Setup queued withdrawals from `undelegate` // queued withdrawals done for single strat as this is how undelegate queue withdraws - ( - , - Withdrawal memory strategyWithdrawal, - ) = _setUpQueueWithdrawalsSingleStrat({ + (, Withdrawal memory strategyWithdrawal,) = _setUpQueueWithdrawalsSingleStrat({ staker: staker, strategy: strategyMock, depositSharesToWithdraw: strategyShares }); - ( - , - Withdrawal memory beaconWithdrawal, - ) = _setUpQueueWithdrawalsSingleStrat({ + (, Withdrawal memory beaconWithdrawal,) = _setUpQueueWithdrawalsSingleStrat({ staker: staker, strategy: IStrategy(address(beaconChainETHStrategy)), depositSharesToWithdraw: uint256(beaconShares) @@ -4939,30 +4694,23 @@ contract DelegationManagerUnitTests_redelegate is DelegationManagerUnitTests { // delegate first and complete withdrawal _delegateToOperatorWhoAcceptsAllStakers(staker, operator); cheats.startPrank(staker); - delegationManager.completeQueuedWithdrawal(strategyWithdrawal, strategyTokens, false); - delegationManager.completeQueuedWithdrawal(beaconWithdrawal, beaconTokens, false); + delegationManager.completeQueuedWithdrawal(strategyWithdrawal, strategyTokens, false); + delegationManager.completeQueuedWithdrawal(beaconWithdrawal, beaconTokens, false); cheats.stopPrank(); } else { // complete withdrawal first and then delegate cheats.startPrank(staker); - delegationManager.completeQueuedWithdrawal(strategyWithdrawal, strategyTokens, false); - delegationManager.completeQueuedWithdrawal(beaconWithdrawal, beaconTokens, false); + delegationManager.completeQueuedWithdrawal(strategyWithdrawal, strategyTokens, false); + delegationManager.completeQueuedWithdrawal(beaconWithdrawal, beaconTokens, false); cheats.stopPrank(); _delegateToOperatorWhoAcceptsAllStakers(staker, operator); } } // 5. assert correct shares and delegation state - assertTrue( - delegationManager.isDelegated(staker), - "staker should be delegated" - ); - assertEq( - delegationManager.delegatedTo(staker), - operator, - "staker should be delegated to operator" - ); - (uint256[] memory stakerShares, ) = delegationManager.getWithdrawableShares(staker, strategiesToReturn); + assertTrue(delegationManager.isDelegated(staker), "staker should be delegated"); + assertEq(delegationManager.delegatedTo(staker), operator, "staker should be delegated to operator"); + (uint256[] memory stakerShares,) = delegationManager.getWithdrawableShares(staker, strategiesToReturn); assertEq( delegationManager.operatorShares(operator, strategyMock), stakerShares[0], @@ -4983,7 +4731,7 @@ contract DelegationManagerUnitTests_queueWithdrawals is DelegationManagerUnitTes function test_Revert_WhenEnterQueueWithdrawalsPaused() public { cheats.prank(pauser); delegationManager.pause(2 ** PAUSED_ENTER_WITHDRAWAL_QUEUE); - (QueuedWithdrawalParams[] memory queuedWithdrawalParams, , ) = _setUpQueueWithdrawalsSingleStrat({ + (QueuedWithdrawalParams[] memory queuedWithdrawalParams,,) = _setUpQueueWithdrawalsSingleStrat({ staker: defaultStaker, strategy: strategyMock, depositSharesToWithdraw: 100 @@ -5009,9 +4757,11 @@ contract DelegationManagerUnitTests_queueWithdrawals is DelegationManagerUnitTes delegationManager.queueWithdrawals(queuedWithdrawalParams); } - function testFuzz_IgnoresWithdrawerField(address withdrawer) public { - _depositIntoStrategies(defaultStaker, strategyMock.toArray(), uint(100).toArrayU256()); - (QueuedWithdrawalParams[] memory queuedWithdrawalParams, , ) = _setUpQueueWithdrawalsSingleStrat({ + function testFuzz_IgnoresWithdrawerField( + address withdrawer + ) public { + _depositIntoStrategies(defaultStaker, strategyMock.toArray(), uint256(100).toArrayU256()); + (QueuedWithdrawalParams[] memory queuedWithdrawalParams,,) = _setUpQueueWithdrawalsSingleStrat({ staker: defaultStaker, strategy: strategyMock, depositSharesToWithdraw: 100 @@ -5051,12 +4801,15 @@ contract DelegationManagerUnitTests_queueWithdrawals is DelegationManagerUnitTes * - Asserts that staker cumulativeWithdrawalsQueued nonce is incremented * - Checks that event was emitted with correct withdrawalRoot and withdrawal */ - function testFuzz_queueWithdrawal_SingleStrat_nonSlashedOperator(Randomness r) public rand(r) { + function testFuzz_queueWithdrawal_SingleStrat_nonSlashedOperator( + Randomness r + ) public rand(r) { uint256 depositAmount = r.Uint256(1, MAX_STRATEGY_SHARES); uint256 withdrawalAmount = r.Uint256(1, depositAmount); bool depositBeaconChainShares = r.Boolean(); // sharesAmounts is single element so returns single strategy - IStrategy[] memory strategies = _deployAndDepositIntoStrategies(defaultStaker, depositAmount.toArrayU256(), depositBeaconChainShares); + IStrategy[] memory strategies = + _deployAndDepositIntoStrategies(defaultStaker, depositAmount.toArrayU256(), depositBeaconChainShares); _registerOperatorWithBaseDetails(defaultOperator); _delegateToOperatorWhoAcceptsAllStakers(defaultStaker, defaultOperator); _assertDeposit({ @@ -5069,16 +4822,15 @@ contract DelegationManagerUnitTests_queueWithdrawals is DelegationManagerUnitTes prevDsf: uint256(WAD), depositAmount: depositAmount }); - ( - QueuedWithdrawalParams[] memory queuedWithdrawalParams, - Withdrawal memory withdrawal, - bytes32 withdrawalRoot - ) = _setUpQueueWithdrawalsSingleStrat({ + (QueuedWithdrawalParams[] memory queuedWithdrawalParams, Withdrawal memory withdrawal, bytes32 withdrawalRoot) = + _setUpQueueWithdrawalsSingleStrat({ staker: defaultStaker, strategy: strategies[0], depositSharesToWithdraw: withdrawalAmount }); - assertEq(delegationManager.delegatedTo(defaultStaker), defaultOperator, "staker should be delegated to operator"); + assertEq( + delegationManager.delegatedTo(defaultStaker), defaultOperator, "staker should be delegated to operator" + ); uint256 nonceBefore = delegationManager.cumulativeWithdrawalsQueued(defaultStaker); uint256 delegatedSharesBefore = delegationManager.operatorShares(defaultOperator, strategies[0]); @@ -5118,7 +4870,9 @@ contract DelegationManagerUnitTests_queueWithdrawals is DelegationManagerUnitTes * - Asserts that staker cumulativeWithdrawalsQueued nonce is incremented * - Checks that event was emitted with correct withdrawalRoot and withdrawal */ - function testFuzz_queueWithdrawal_SingleStrat_preSlashedOperator(Randomness r) public rand(r) { + function testFuzz_queueWithdrawal_SingleStrat_preSlashedOperator( + Randomness r + ) public rand(r) { uint256 depositAmount = r.Uint256(1, MAX_STRATEGY_SHARES); uint256 withdrawalAmount = r.Uint256(1, depositAmount); uint64 maxMagnitude = r.Uint64(1, WAD); @@ -5141,17 +4895,16 @@ contract DelegationManagerUnitTests_queueWithdrawals is DelegationManagerUnitTes depositAmount: depositAmount }); - ( - QueuedWithdrawalParams[] memory queuedWithdrawalParams, - Withdrawal memory withdrawal, - bytes32 withdrawalRoot - ) = _setUpQueueWithdrawalsSingleStrat({ + (QueuedWithdrawalParams[] memory queuedWithdrawalParams, Withdrawal memory withdrawal, bytes32 withdrawalRoot) = + _setUpQueueWithdrawalsSingleStrat({ staker: defaultStaker, strategy: strategyMock, depositSharesToWithdraw: withdrawalAmount }); - assertEq(delegationManager.delegatedTo(defaultStaker), defaultOperator, "staker should be delegated to operator"); + assertEq( + delegationManager.delegatedTo(defaultStaker), defaultOperator, "staker should be delegated to operator" + ); uint256 nonceBefore = delegationManager.cumulativeWithdrawalsQueued(defaultStaker); uint256 delegatedSharesBefore = delegationManager.operatorShares(defaultOperator, strategyMock); @@ -5192,7 +4945,9 @@ contract DelegationManagerUnitTests_queueWithdrawals is DelegationManagerUnitTes * - Asserts that staker cumulativeWithdrawalsQueued nonce is incremented * - Checks that event was emitted with correct withdrawalRoot and withdrawal */ - function testFuzz_queueWithdrawal_SingleStrat_slashedWhileStaked(Randomness r) public rand(r) { + function testFuzz_queueWithdrawal_SingleStrat_slashedWhileStaked( + Randomness r + ) public rand(r) { uint256 depositAmount = r.Uint256(1, MAX_STRATEGY_SHARES); uint256 withdrawalAmount = r.Uint256(1, depositAmount); uint64 prevMaxMagnitude = r.Uint64(2, WAD); @@ -5222,7 +4977,7 @@ contract DelegationManagerUnitTests_queueWithdrawals is DelegationManagerUnitTes cheats.prank(address(allocationManagerMock)); delegationManager.slashOperatorShares(defaultOperator, strategyMock, prevMaxMagnitude, newMaxMagnitude); // Assertions on amount burned - (uint256 operatorSharesSlashed, ) = _assertOperatorSharesAfterSlash({ + (uint256 operatorSharesSlashed,) = _assertOperatorSharesAfterSlash({ operator: defaultOperator, strategy: strategyMock, operatorSharesBefore: operatorSharesBefore, @@ -5286,7 +5041,7 @@ contract DelegationManagerUnitTests_queueWithdrawals is DelegationManagerUnitTes Randomness r ) public rand(r) { uint256 depositAmount = r.Uint256(1, MAX_STRATEGY_SHARES); - + // Register operator, deposit for staker & delegate _registerOperatorWithBaseDetails(defaultOperator); strategyManagerMock.addDeposit(defaultStaker, strategyMock, depositAmount); @@ -5302,11 +5057,8 @@ contract DelegationManagerUnitTests_queueWithdrawals is DelegationManagerUnitTes depositAmount: depositAmount }); - ( - QueuedWithdrawalParams[] memory queuedWithdrawalParams, - Withdrawal memory withdrawal, - bytes32 withdrawalRoot - ) = _setUpQueueWithdrawalsSingleStrat({ + (QueuedWithdrawalParams[] memory queuedWithdrawalParams, Withdrawal memory withdrawal, bytes32 withdrawalRoot) = + _setUpQueueWithdrawalsSingleStrat({ staker: defaultStaker, strategy: strategyMock, depositSharesToWithdraw: 0 // expected 0 since slashed 100% @@ -5324,7 +5076,9 @@ contract DelegationManagerUnitTests_queueWithdrawals is DelegationManagerUnitTes prevMaxMagnitude: WAD, newMaxMagnitude: operatorMagnitude }); - assertEq(delegationManager.delegatedTo(defaultStaker), defaultOperator, "staker should be delegated to operator"); + assertEq( + delegationManager.delegatedTo(defaultStaker), defaultOperator, "staker should be delegated to operator" + ); // queueWithdrawals should result in an empty withdrawal _queueWithdrawals_expectEmit( @@ -5339,12 +5093,9 @@ contract DelegationManagerUnitTests_queueWithdrawals is DelegationManagerUnitTes cheats.prank(defaultStaker); delegationManager.queueWithdrawals(queuedWithdrawalParams); - (uint256[] memory withdrawableShares, ) = delegationManager.getWithdrawableShares(defaultStaker, strategyMock.toArray()); - assertEq( - withdrawableShares[0], - 0, - "withdrawable shares should be 0 after being slashed fully" - ); + (uint256[] memory withdrawableShares,) = + delegationManager.getWithdrawableShares(defaultStaker, strategyMock.toArray()); + assertEq(withdrawableShares[0], 0, "withdrawable shares should be 0 after being slashed fully"); _assertWithdrawal({ staker: defaultStaker, operator: defaultOperator, @@ -5374,12 +5125,10 @@ contract DelegationManagerUnitTests_queueWithdrawals is DelegationManagerUnitTes uint32 numStrategies = r.Uint32(1, 32); bool depositBeaconChainShares = r.Boolean(); - ( - uint256[] memory depositAmounts, - uint256[] memory withdrawalAmounts, - , - ) = _fuzzDepositWithdrawalAmounts({ r: r, numStrategies: numStrategies }); - IStrategy[] memory strategies = _deployAndDepositIntoStrategies(defaultStaker, depositAmounts, depositBeaconChainShares); + (uint256[] memory depositAmounts, uint256[] memory withdrawalAmounts,,) = + _fuzzDepositWithdrawalAmounts({r: r, numStrategies: numStrategies}); + IStrategy[] memory strategies = + _deployAndDepositIntoStrategies(defaultStaker, depositAmounts, depositBeaconChainShares); _registerOperatorWithBaseDetails(defaultOperator); _delegateToOperatorWhoAcceptsAllStakers(defaultStaker, defaultOperator); @@ -5396,18 +5145,17 @@ contract DelegationManagerUnitTests_queueWithdrawals is DelegationManagerUnitTes }); } - ( - QueuedWithdrawalParams[] memory queuedWithdrawalParams, - Withdrawal memory withdrawal, - bytes32 withdrawalRoot - ) = _setUpQueueWithdrawals({ + (QueuedWithdrawalParams[] memory queuedWithdrawalParams, Withdrawal memory withdrawal, bytes32 withdrawalRoot) = + _setUpQueueWithdrawals({ staker: defaultStaker, strategies: strategies, depositWithdrawalAmounts: withdrawalAmounts }); // Before queueWithdrawal state values uint256 nonceBefore = delegationManager.cumulativeWithdrawalsQueued(defaultStaker); - assertEq(delegationManager.delegatedTo(defaultStaker), defaultOperator, "staker should be delegated to operator"); + assertEq( + delegationManager.delegatedTo(defaultStaker), defaultOperator, "staker should be delegated to operator" + ); uint256[] memory delegatedSharesBefore = new uint256[](strategies.length); for (uint256 i = 0; i < strategies.length; i++) { delegatedSharesBefore[i] = delegationManager.operatorShares(defaultOperator, strategies[i]); @@ -5440,9 +5188,7 @@ contract DelegationManagerUnitTests_queueWithdrawals is DelegationManagerUnitTes }); } assertEq( - delegationManager.delegatedTo(defaultStaker), - defaultOperator, - "staker should be delegated to operator" + delegationManager.delegatedTo(defaultStaker), defaultOperator, "staker should be delegated to operator" ); uint256 nonceAfter = delegationManager.cumulativeWithdrawalsQueued(defaultStaker); assertEq(nonceBefore + 1, nonceAfter, "staker nonce should have incremented"); @@ -5464,18 +5210,15 @@ contract DelegationManagerUnitTests_queueWithdrawals is DelegationManagerUnitTes ) public rand(r) { // 1. Setup // - fuzz numbers of strategies, deposit and withdraw amounts, and prev/new magnitudes for each strategy respectively - // - deposit into strategies, delegate to operator + // - deposit into strategies, delegate to operator bool depositBeaconChainShares = r.Boolean(); IStrategy[] memory strategies = r.StrategyArray(r.Uint32(1, 32)); if (depositBeaconChainShares) { strategies[strategies.length - 1] = beaconChainETHStrategy; } - ( - uint256[] memory depositAmounts, - uint256[] memory withdrawalAmounts, - uint64[] memory prevMaxMagnitudes, - ) = _fuzzDepositWithdrawalAmounts({ r: r, numStrategies: uint32(strategies.length) }); + (uint256[] memory depositAmounts, uint256[] memory withdrawalAmounts, uint64[] memory prevMaxMagnitudes,) = + _fuzzDepositWithdrawalAmounts({r: r, numStrategies: uint32(strategies.length)}); _registerOperatorWithBaseDetails(defaultOperator); allocationManagerMock.setMaxMagnitudes(defaultOperator, strategies, prevMaxMagnitudes); _depositIntoStrategies(defaultStaker, strategies, depositAmounts); @@ -5535,9 +5278,7 @@ contract DelegationManagerUnitTests_queueWithdrawals is DelegationManagerUnitTes }); } assertEq( - delegationManager.delegatedTo(defaultStaker), - defaultOperator, - "staker should be delegated to operator" + delegationManager.delegatedTo(defaultStaker), defaultOperator, "staker should be delegated to operator" ); assertEq( nonceBefore + 1, @@ -5552,7 +5293,7 @@ contract DelegationManagerUnitTests_queueWithdrawals is DelegationManagerUnitTes * with multiple strategies and sharesAmounts. Operator has random maxMagnitudes for each strategy. * Depending on number of strategies randomized, deposits sharesAmounts into each strategy for the staker and delegates to operator. * After depositing, the operator gets slashed for each of the strategies and has new maxMagnitudes set. - * For each strategy, + * For each strategy, * - Asserts that staker is delegated to the operator * - Asserts that shares for delegatedTo operator are decreased by `depositAmount` * - Asserts that staker cumulativeWithdrawalsQueued nonce is incremented @@ -5563,7 +5304,7 @@ contract DelegationManagerUnitTests_queueWithdrawals is DelegationManagerUnitTes ) public rand(r) { // 1. Setup // - fuzz numbers of strategies, deposit and withdraw amounts, and prev/new magnitudes for each strategy respectively - // - deposit into strategies, delegate to operator + // - deposit into strategies, delegate to operator IStrategy[] memory strategies = r.StrategyArray(r.Uint32(1, 32)); bool depositBeaconChainShares = r.Boolean(); if (depositBeaconChainShares) { @@ -5574,7 +5315,7 @@ contract DelegationManagerUnitTests_queueWithdrawals is DelegationManagerUnitTes uint256[] memory withdrawalAmounts, uint64[] memory prevMaxMagnitudes, uint64[] memory newMaxMagnitudes - ) = _fuzzDepositWithdrawalAmounts({ r: r, numStrategies: uint32(strategies.length) }); + ) = _fuzzDepositWithdrawalAmounts({r: r, numStrategies: uint32(strategies.length)}); _registerOperatorWithBaseDetails(defaultOperator); allocationManagerMock.setMaxMagnitudes(defaultOperator, strategies, prevMaxMagnitudes); _depositIntoStrategies(defaultStaker, strategies, depositAmounts); @@ -5600,9 +5341,11 @@ contract DelegationManagerUnitTests_queueWithdrawals is DelegationManagerUnitTes uint256[] memory slashedOperatorShares = new uint256[](strategies.length); for (uint256 i = 0; i < strategies.length; i++) { uint256 operatorSharesBefore = delegationManager.operatorShares(defaultOperator, strategies[i]); - delegationManager.slashOperatorShares(defaultOperator, strategies[i], prevMaxMagnitudes[i], newMaxMagnitudes[i]); + delegationManager.slashOperatorShares( + defaultOperator, strategies[i], prevMaxMagnitudes[i], newMaxMagnitudes[i] + ); // Assert correct amount of shares slashed from operator - (slashedOperatorShares[i], ) = _assertOperatorSharesAfterSlash({ + (slashedOperatorShares[i],) = _assertOperatorSharesAfterSlash({ operator: defaultOperator, strategy: strategies[i], operatorSharesBefore: operatorSharesBefore, @@ -5652,9 +5395,7 @@ contract DelegationManagerUnitTests_queueWithdrawals is DelegationManagerUnitTes }); } assertEq( - delegationManager.delegatedTo(defaultStaker), - defaultOperator, - "staker should be delegated to operator" + delegationManager.delegatedTo(defaultStaker), defaultOperator, "staker should be delegated to operator" ); assertEq( nonceBefore + 1, @@ -5673,7 +5414,7 @@ contract DelegationManagerUnitTests_queueWithdrawals is DelegationManagerUnitTes ) public rand(r) { // 1. Setup // - fuzz numbers of strategies, deposit and withdraw amounts, and prev/new magnitudes for each strategy respectively - // - deposit into strategies, delegate to operator + // - deposit into strategies, delegate to operator uint32 numStrats = r.Uint32(1, 32); IStrategy[] memory strategies = r.StrategyArray(numStrats); bool depositBeaconChainShares = r.Boolean(); @@ -5685,7 +5426,7 @@ contract DelegationManagerUnitTests_queueWithdrawals is DelegationManagerUnitTes uint256[] memory withdrawalAmounts, uint64[] memory prevMaxMagnitudes, uint64[] memory newMaxMagnitudes - ) = _fuzzDepositWithdrawalAmounts({ r: r, numStrategies: numStrats }); + ) = _fuzzDepositWithdrawalAmounts({r: r, numStrategies: numStrats}); // randomly choose strategy to have 0 newMaxMagnitude uint256 zeroMagnitudeIndex = r.Uint256(0, numStrats - 1); newMaxMagnitudes[zeroMagnitudeIndex] = 0; @@ -5715,10 +5456,12 @@ contract DelegationManagerUnitTests_queueWithdrawals is DelegationManagerUnitTes cheats.startPrank(address(allocationManagerMock)); for (uint256 i = 0; i < strategies.length; i++) { uint256 operatorSharesBefore = delegationManager.operatorShares(defaultOperator, strategies[i]); - delegationManager.slashOperatorShares(defaultOperator, strategies[i], prevMaxMagnitudes[i], newMaxMagnitudes[i]); - + delegationManager.slashOperatorShares( + defaultOperator, strategies[i], prevMaxMagnitudes[i], newMaxMagnitudes[i] + ); + // Assertions on amount burned - (slashedOperatorShares[i], ) = _assertOperatorSharesAfterSlash({ + (slashedOperatorShares[i],) = _assertOperatorSharesAfterSlash({ operator: defaultOperator, strategy: strategies[i], operatorSharesBefore: operatorSharesBefore, @@ -5728,9 +5471,7 @@ contract DelegationManagerUnitTests_queueWithdrawals is DelegationManagerUnitTes // additional assertion checks for strategy that was slashed 100% if (zeroMagnitudeIndex == i) { assertEq( - slashedOperatorShares[i], - operatorSharesBefore, - "expected slashed operator shares to be full amount" + slashedOperatorShares[i], operatorSharesBefore, "expected slashed operator shares to be full amount" ); assertEq( delegationManager.operatorShares(defaultOperator, strategies[i]), @@ -5770,11 +5511,7 @@ contract DelegationManagerUnitTests_queueWithdrawals is DelegationManagerUnitTes // 5. Post queueWithdrawal state values for (uint256 i = 0; i < strategies.length; i++) { if (zeroMagnitudeIndex == i) { - assertEq( - newMaxMagnitudes[i], - 0, - "expected new max magnitude to be 0" - ); + assertEq(newMaxMagnitudes[i], 0, "expected new max magnitude to be 0"); } _assertWithdrawal({ staker: defaultStaker, @@ -5788,9 +5525,7 @@ contract DelegationManagerUnitTests_queueWithdrawals is DelegationManagerUnitTes }); } assertEq( - delegationManager.delegatedTo(defaultStaker), - defaultOperator, - "staker should be delegated to operator" + delegationManager.delegatedTo(defaultStaker), defaultOperator, "staker should be delegated to operator" ); assertEq( nonceBefore + 1, @@ -5823,7 +5558,7 @@ contract DelegationManagerUnitTests_completeQueuedWithdrawal is DelegationManage // single withdrawal interface cheats.expectRevert(IPausable.CurrentlyPaused.selector); - delegationManager.completeQueuedWithdrawal(withdrawal, tokens, false); + delegationManager.completeQueuedWithdrawal(withdrawal, tokens, false); IERC20[][] memory tokensArray = new IERC20[][](1); tokensArray[0] = tokens; @@ -5836,7 +5571,7 @@ contract DelegationManagerUnitTests_completeQueuedWithdrawal is DelegationManage // multiple Withdrawal interface cheats.expectRevert(IPausable.CurrentlyPaused.selector); - delegationManager.completeQueuedWithdrawals(withdrawals, tokensArray, receiveAsTokens); + delegationManager.completeQueuedWithdrawals(withdrawals, tokensArray, receiveAsTokens); } function test_Revert_WhenInputArrayLengthMismatch() public { @@ -5861,21 +5596,20 @@ contract DelegationManagerUnitTests_completeQueuedWithdrawal is DelegationManage cheats.prank(defaultStaker); cheats.expectRevert(InputArrayLengthMismatch.selector); - delegationManager.completeQueuedWithdrawal(withdrawal, newTokens, false); + delegationManager.completeQueuedWithdrawal(withdrawal, newTokens, false); // check that the withdrawal completes otherwise cheats.prank(defaultStaker); - delegationManager.completeQueuedWithdrawal(withdrawal, tokens, true); + delegationManager.completeQueuedWithdrawal(withdrawal, tokens, true); } - function test_Revert_WhenWithdrawerNotCaller(Randomness r) rand(r) public { + function test_Revert_WhenWithdrawerNotCaller( + Randomness r + ) public rand(r) { address invalidCaller = r.Address(); _registerOperatorWithBaseDetails(defaultOperator); - ( - Withdrawal memory withdrawal, - IERC20[] memory tokens, - ) = _setUpCompleteQueuedWithdrawalSingleStrat({ + (Withdrawal memory withdrawal, IERC20[] memory tokens,) = _setUpCompleteQueuedWithdrawalSingleStrat({ staker: defaultStaker, depositAmount: 100, withdrawalAmount: 100, @@ -5885,16 +5619,13 @@ contract DelegationManagerUnitTests_completeQueuedWithdrawal is DelegationManage cheats.expectRevert(WithdrawerNotCaller.selector); cheats.prank(invalidCaller); - delegationManager.completeQueuedWithdrawal(withdrawal, tokens, false); + delegationManager.completeQueuedWithdrawal(withdrawal, tokens, false); } function test_Revert_WhenInvalidWithdrawalRoot() public { _registerOperatorWithBaseDetails(defaultOperator); - ( - Withdrawal memory withdrawal, - IERC20[] memory tokens, - bytes32 withdrawalRoot - ) = _setUpCompleteQueuedWithdrawalSingleStrat({ + (Withdrawal memory withdrawal, IERC20[] memory tokens, bytes32 withdrawalRoot) = + _setUpCompleteQueuedWithdrawalSingleStrat({ staker: defaultStaker, depositAmount: 100, withdrawalAmount: 100, @@ -5905,12 +5636,15 @@ contract DelegationManagerUnitTests_completeQueuedWithdrawal is DelegationManage assertTrue(delegationManager.pendingWithdrawals(withdrawalRoot), "withdrawalRoot should be pending"); cheats.roll(withdrawal.startBlock + delegationManager.minWithdrawalDelayBlocks() + 1); cheats.prank(defaultStaker); - delegationManager.completeQueuedWithdrawal(withdrawal, tokens, true); - assertFalse(delegationManager.pendingWithdrawals(withdrawalRoot), "withdrawalRoot should be completed and marked false now"); + delegationManager.completeQueuedWithdrawal(withdrawal, tokens, true); + assertFalse( + delegationManager.pendingWithdrawals(withdrawalRoot), + "withdrawalRoot should be completed and marked false now" + ); cheats.expectRevert(WithdrawalNotQueued.selector); cheats.prank(defaultStaker); - delegationManager.completeQueuedWithdrawal(withdrawal, tokens, false); + delegationManager.completeQueuedWithdrawal(withdrawal, tokens, false); } /** @@ -5918,15 +5652,14 @@ contract DelegationManagerUnitTests_completeQueuedWithdrawal is DelegationManage * delegationManager.getCompletableTimestamp returns a value greater than MIN_WITHDRAWAL_DELAY_BLOCKS * then it should revert if the validBlockNumber has not passed either. */ - function test_Revert_WhenWithdrawalDelayNotPassed(Randomness r) rand(r) public { + function test_Revert_WhenWithdrawalDelayNotPassed( + Randomness r + ) public rand(r) { uint32 numStrategies = r.Uint32(1, 32); bool receiveAsTokens = r.Boolean(); - ( - uint256[] memory depositAmounts, - uint256[] memory withdrawalAmounts, - , - ) = _fuzzDepositWithdrawalAmounts(r, numStrategies); - + (uint256[] memory depositAmounts, uint256[] memory withdrawalAmounts,,) = + _fuzzDepositWithdrawalAmounts(r, numStrategies); + _registerOperatorWithBaseDetails(defaultOperator); ( Withdrawal memory withdrawal, @@ -5959,10 +5692,8 @@ contract DelegationManagerUnitTests_completeQueuedWithdrawal is DelegationManage // Queue withdrawal uint256 withdrawalAmount = depositAmount; - ( - QueuedWithdrawalParams[] memory queuedWithdrawalParams, - Withdrawal memory withdrawal, - ) = _setUpQueueWithdrawalsSingleStrat({ + (QueuedWithdrawalParams[] memory queuedWithdrawalParams, Withdrawal memory withdrawal,) = + _setUpQueueWithdrawalsSingleStrat({ staker: defaultStaker, strategy: strategyMock, depositSharesToWithdraw: withdrawalAmount @@ -5983,33 +5714,37 @@ contract DelegationManagerUnitTests_completeQueuedWithdrawal is DelegationManage IERC20[] memory tokens = strategyMock.underlyingToken().toArray(); bytes32 withdrawalRoot = delegationManager.calculateWithdrawalRoot(withdrawal); - assertTrue(delegationManager.pendingWithdrawals(withdrawalRoot), "withdrawal should be pending before completion"); + assertTrue( + delegationManager.pendingWithdrawals(withdrawalRoot), "withdrawal should be pending before completion" + ); cheats.prank(defaultStaker); delegationManager.completeQueuedWithdrawal(withdrawal, tokens, false); - assertFalse(delegationManager.pendingWithdrawals(withdrawalRoot), "withdrawal should be cleared after completion"); - + assertFalse( + delegationManager.pendingWithdrawals(withdrawalRoot), "withdrawal should be cleared after completion" + ); + // Assert that no shares were added back assertEq(delegationManager.operatorShares(defaultOperator, strategyMock), 0, "operator shares should remain 0"); - (uint256[] memory withdrawableShares, ) = delegationManager.getWithdrawableShares(defaultStaker, strategyMock.toArray()); + (uint256[] memory withdrawableShares,) = + delegationManager.getWithdrawableShares(defaultStaker, strategyMock.toArray()); assertEq(withdrawableShares[0], 0, "withdrawable shares should be 0"); } /** * Test completing multiple queued withdrawals for a single strategy by passing in the withdrawals */ - function test_completeQueuedWithdrawals_MultipleWithdrawals(Randomness r) public rand(r) { + function test_completeQueuedWithdrawals_MultipleWithdrawals( + Randomness r + ) public rand(r) { address staker = r.Address(); uint256 depositAmount = r.Uint256(1, MAX_STRATEGY_SHARES); uint256 numWithdrawals = r.Uint256(2, 20); bool receiveAsTokens = r.Boolean(); - ( - Withdrawal[] memory withdrawals, - IERC20[][] memory tokens, - bytes32[] memory withdrawalRoots - ) = _setUpCompleteQueuedWithdrawalsSingleStrat({ + (Withdrawal[] memory withdrawals, IERC20[][] memory tokens, bytes32[] memory withdrawalRoots) = + _setUpCompleteQueuedWithdrawalsSingleStrat({ staker: staker, depositAmount: depositAmount, numWithdrawals: numWithdrawals @@ -6019,7 +5754,7 @@ contract DelegationManagerUnitTests_completeQueuedWithdrawal is DelegationManage _delegateToOperatorWhoAcceptsAllStakers(staker, defaultOperator); uint256 operatorSharesBefore = delegationManager.operatorShares(defaultOperator, withdrawals[0].strategies[0]); - for (uint i = 0; i < withdrawalRoots.length; i++) { + for (uint256 i = 0; i < withdrawalRoots.length; i++) { assertTrue(delegationManager.pendingWithdrawals(withdrawalRoots[i]), "withdrawalRoots should be pending"); } bool[] memory receiveAsTokensArray = receiveAsTokens.toArray(numWithdrawals); @@ -6037,22 +5772,12 @@ contract DelegationManagerUnitTests_completeQueuedWithdrawal is DelegationManage delegationManager.completeQueuedWithdrawals(withdrawals, tokens, receiveAsTokensArray); // assertion checks - ( - uint256[] memory withdrawableShares, - uint256[] memory depositShares - ) = delegationManager.getWithdrawableShares(staker, withdrawals[0].strategies); + (uint256[] memory withdrawableShares, uint256[] memory depositShares) = + delegationManager.getWithdrawableShares(staker, withdrawals[0].strategies); uint256 operatorSharesAfter = delegationManager.operatorShares(defaultOperator, withdrawals[0].strategies[0]); if (receiveAsTokens) { - assertEq( - withdrawableShares[0], - 0, - "withdrawable shares should be 0 from withdrawing all" - ); - assertEq( - depositShares[0], - 0, - "deposit shares should be 0 from withdrawing all" - ); + assertEq(withdrawableShares[0], 0, "withdrawable shares should be 0 from withdrawing all"); + assertEq(depositShares[0], 0, "deposit shares should be 0 from withdrawing all"); assertEq(operatorSharesAfter, operatorSharesBefore, "operator shares should be unchanged"); } else { assertEq( @@ -6060,11 +5785,7 @@ contract DelegationManagerUnitTests_completeQueuedWithdrawal is DelegationManage depositAmount * numWithdrawals, "withdrawable shares should be added back as shares" ); - assertEq( - depositShares[0], - depositAmount * numWithdrawals, - "deposit shares should be added back as shares" - ); + assertEq(depositShares[0], depositAmount * numWithdrawals, "deposit shares should be added back as shares"); assertEq( operatorSharesAfter, operatorSharesBefore + depositAmount * numWithdrawals, @@ -6093,17 +5814,14 @@ contract DelegationManagerUnitTests_completeQueuedWithdrawal is DelegationManage */ function test_completeQueuedWithdrawal_SingleStrat( Randomness r - ) public rand(r) { + ) public rand(r) { uint256 depositAmount = r.Uint256(1, MAX_STRATEGY_SHARES); uint256 withdrawalAmount = r.Uint256(1, depositAmount); bool receiveAsTokens = r.Boolean(); _registerOperatorWithBaseDetails(defaultOperator); - ( - Withdrawal memory withdrawal, - IERC20[] memory tokens, - bytes32 withdrawalRoot - ) = _setUpCompleteQueuedWithdrawalSingleStrat({ + (Withdrawal memory withdrawal, IERC20[] memory tokens, bytes32 withdrawalRoot) = + _setUpCompleteQueuedWithdrawalSingleStrat({ staker: defaultStaker, depositAmount: depositAmount, withdrawalAmount: withdrawalAmount, @@ -6123,7 +5841,7 @@ contract DelegationManagerUnitTests_completeQueuedWithdrawal is DelegationManage }) ); cheats.prank(defaultStaker); - delegationManager.completeQueuedWithdrawal(withdrawal, tokens, receiveAsTokens); + delegationManager.completeQueuedWithdrawal(withdrawal, tokens, receiveAsTokens); _assertCompletedWithdrawal( AssertCompletedWithdrawalStruct({ @@ -6167,11 +5885,8 @@ contract DelegationManagerUnitTests_completeQueuedWithdrawal is DelegationManage _delegateToOperatorWhoAcceptsAllStakers(defaultStaker, defaultOperator); // Queue withdrawal - ( - QueuedWithdrawalParams[] memory queuedWithdrawalParams, - Withdrawal memory withdrawal, - bytes32 withdrawalRoot - ) = _setUpQueueWithdrawalsSingleStrat({ + (QueuedWithdrawalParams[] memory queuedWithdrawalParams, Withdrawal memory withdrawal, bytes32 withdrawalRoot) = + _setUpQueueWithdrawalsSingleStrat({ staker: defaultStaker, strategy: strategyMock, depositSharesToWithdraw: withdrawalAmount @@ -6198,14 +5913,16 @@ contract DelegationManagerUnitTests_completeQueuedWithdrawal is DelegationManage // Slash operator while staker has queued withdrawal { uint256 operatorSharesAfterQueue = delegationManager.operatorShares(defaultOperator, strategyMock); - (uint256 sharesToDecrement, ) = _calcSlashedAmount({ + (uint256 sharesToDecrement,) = _calcSlashedAmount({ operatorShares: operatorSharesAfterQueue, prevMaxMagnitude: prevMaxMagnitude, newMaxMagnitude: newMaxMagnitude }); _setOperatorMagnitude(defaultOperator, strategyMock, newMaxMagnitude); cheats.prank(address(allocationManagerMock)); - delegationManager.slashOperatorShares(defaultOperator, withdrawal.strategies[0], prevMaxMagnitude, newMaxMagnitude); + delegationManager.slashOperatorShares( + defaultOperator, withdrawal.strategies[0], prevMaxMagnitude, newMaxMagnitude + ); uint256 operatorSharesAfterSlash = delegationManager.operatorShares(defaultOperator, strategyMock); assertEq( operatorSharesAfterSlash, @@ -6215,10 +5932,8 @@ contract DelegationManagerUnitTests_completeQueuedWithdrawal is DelegationManage } // Complete queue withdrawal - ( - uint256[] memory withdrawableShares, - uint256[] memory depositShares - ) = delegationManager.getWithdrawableShares(defaultStaker, withdrawal.strategies); + (uint256[] memory withdrawableShares, uint256[] memory depositShares) = + delegationManager.getWithdrawableShares(defaultStaker, withdrawal.strategies); uint256 operatorSharesBefore = delegationManager.operatorShares(defaultOperator, strategyMock); { IERC20[] memory tokens = new IERC20[](1); @@ -6232,7 +5947,7 @@ contract DelegationManagerUnitTests_completeQueuedWithdrawal is DelegationManage }) ); cheats.prank(defaultStaker); - delegationManager.completeQueuedWithdrawal(withdrawal, tokens, receiveAsTokens); + delegationManager.completeQueuedWithdrawal(withdrawal, tokens, receiveAsTokens); } _assertCompletedWithdrawal( @@ -6277,11 +5992,8 @@ contract DelegationManagerUnitTests_completeQueuedWithdrawal is DelegationManage _delegateToOperatorWhoAcceptsAllStakers(defaultStaker, defaultOperator); // Queue withdrawal - ( - QueuedWithdrawalParams[] memory queuedWithdrawalParams, - Withdrawal memory withdrawal, - bytes32 withdrawalRoot - ) = _setUpQueueWithdrawalsSingleStrat({ + (QueuedWithdrawalParams[] memory queuedWithdrawalParams, Withdrawal memory withdrawal, bytes32 withdrawalRoot) = + _setUpQueueWithdrawalsSingleStrat({ staker: defaultStaker, strategy: beaconChainETHStrategy, depositSharesToWithdraw: withdrawalAmount @@ -6291,19 +6003,25 @@ contract DelegationManagerUnitTests_completeQueuedWithdrawal is DelegationManage { uint256 sharesToDecrement = _calcWithdrawableShares({ depositShares: withdrawalAmount, - depositScalingFactor: uint256(WAD).divWad(initialBCSF), + depositScalingFactor: uint256(WAD), slashingFactor: uint256(initialBCSF) }); - uint256 operatorSharesBeforeQueue = delegationManager.operatorShares(defaultOperator, beaconChainETHStrategy); + uint256 operatorSharesBeforeQueue = + delegationManager.operatorShares(defaultOperator, beaconChainETHStrategy); cheats.prank(defaultStaker); delegationManager.queueWithdrawals(queuedWithdrawalParams); assertTrue(delegationManager.pendingWithdrawals(withdrawalRoot), "withdrawalRoot should be pending"); uint256 operatorSharesAfterQueue = delegationManager.operatorShares(defaultOperator, beaconChainETHStrategy); - assertEq(operatorSharesAfterQueue, operatorSharesBeforeQueue - sharesToDecrement, "operator shares should be decreased after queue"); + assertEq( + operatorSharesAfterQueue, + operatorSharesBeforeQueue - sharesToDecrement, + "operator shares should be decreased after queue" + ); // Slash the staker for beacon chain shares while it has queued a withdrawal // simulate the operations done in EigenPodManager._reduceSlashingFactor - (uint256[] memory withdrawableSharesBefore, ) = delegationManager.getWithdrawableShares(defaultStaker, beaconChainETHStrategy.toArray()); + (uint256[] memory withdrawableSharesBefore,) = + delegationManager.getWithdrawableShares(defaultStaker, beaconChainETHStrategy.toArray()); uint256 currentPodShares = uint256(depositAmount) - withdrawalAmount; (prevBeaconSlashingFactor, newBeaconSlashingFactor) = _decreaseBeaconChainShares({ @@ -6314,17 +6032,17 @@ contract DelegationManagerUnitTests_completeQueuedWithdrawal is DelegationManage uint256 expectedWithdrawableShares = _calcWithdrawableShares({ depositShares: uint256(currentPodShares), - depositScalingFactor: uint256(WAD).divWad(prevBeaconSlashingFactor), + depositScalingFactor: uint256(WAD), slashingFactor: uint256(newBeaconSlashingFactor) }); - _assertSharesAfterBeaconSlash(defaultStaker, withdrawableSharesBefore[0], expectedWithdrawableShares, prevBeaconSlashingFactor); + _assertSharesAfterBeaconSlash( + defaultStaker, withdrawableSharesBefore[0], expectedWithdrawableShares, prevBeaconSlashingFactor + ); } // Complete queue withdrawal - ( - uint256[] memory withdrawableShares, - uint256[] memory depositShares - ) = delegationManager.getWithdrawableShares(defaultStaker, beaconChainETHStrategy.toArray()); + (uint256[] memory withdrawableShares, uint256[] memory depositShares) = + delegationManager.getWithdrawableShares(defaultStaker, beaconChainETHStrategy.toArray()); uint256 operatorSharesBefore = delegationManager.operatorShares(defaultOperator, beaconChainETHStrategy); { @@ -6338,7 +6056,7 @@ contract DelegationManagerUnitTests_completeQueuedWithdrawal is DelegationManage }) ); cheats.prank(defaultStaker); - delegationManager.completeQueuedWithdrawal(withdrawal, tokens, receiveAsTokens); + delegationManager.completeQueuedWithdrawal(withdrawal, tokens, receiveAsTokens); } _assertCompletedWithdrawal( @@ -6350,7 +6068,7 @@ contract DelegationManagerUnitTests_completeQueuedWithdrawal is DelegationManage operatorSharesBefore: operatorSharesBefore.toArrayU256(), withdrawableSharesBefore: withdrawableShares, depositSharesBefore: depositShares, - prevDepositScalingFactors: uint256(WAD).divWad(initialBCSF).toArrayU256(), + prevDepositScalingFactors: uint256(WAD).toArrayU256(), slashingFactors: uint256(WAD).toArrayU256(), // beaconChainSlashingFactor is separate from slashingFactors input beaconChainSlashingFactor: newBeaconSlashingFactor }) @@ -6381,11 +6099,8 @@ contract DelegationManagerUnitTests_completeQueuedWithdrawal is DelegationManage uint256 operatorSharesBeforeQueue = delegationManager.operatorShares(defaultOperator, beaconChainETHStrategy); // Queue withdrawal - ( - QueuedWithdrawalParams[] memory queuedWithdrawalParams, - Withdrawal memory withdrawal, - bytes32 withdrawalRoot - ) = _setUpQueueWithdrawalsSingleStrat({ + (QueuedWithdrawalParams[] memory queuedWithdrawalParams, Withdrawal memory withdrawal, bytes32 withdrawalRoot) = + _setUpQueueWithdrawalsSingleStrat({ staker: defaultStaker, strategy: beaconChainETHStrategy, depositSharesToWithdraw: withdrawalAmount @@ -6397,7 +6112,11 @@ contract DelegationManagerUnitTests_completeQueuedWithdrawal is DelegationManage delegationManager.queueWithdrawals(queuedWithdrawalParams); assertTrue(delegationManager.pendingWithdrawals(withdrawalRoot), "withdrawalRoot should be pending"); uint256 operatorSharesAfterQueue = delegationManager.operatorShares(defaultOperator, beaconChainETHStrategy); - assertEq(operatorSharesAfterQueue, operatorSharesBeforeQueue - withdrawalAmount, "operator shares should be decreased after queue"); + assertEq( + operatorSharesAfterQueue, + operatorSharesBeforeQueue - withdrawalAmount, + "operator shares should be decreased after queue" + ); // Slash the staker for beacon chain shares while it has queued a withdrawal // simulate the operations done in EigenPodManager._reduceSlashingFactor @@ -6406,23 +6125,32 @@ contract DelegationManagerUnitTests_completeQueuedWithdrawal is DelegationManage beaconShares: depositAmount - int256(withdrawalAmount), sharesDecrease: (uint256(depositAmount) - withdrawalAmount) / 2 }); - uint256 operatorSharesAfterBeaconSlash = delegationManager.operatorShares(defaultOperator, beaconChainETHStrategy); - assertEq(operatorSharesAfterBeaconSlash, operatorSharesAfterQueue.ceilDiv(2), "operator shares should be decreased after beaconChain slash"); + uint256 operatorSharesAfterBeaconSlash = + delegationManager.operatorShares(defaultOperator, beaconChainETHStrategy); + assertEq( + operatorSharesAfterBeaconSlash, + operatorSharesAfterQueue.ceilDiv(2), + "operator shares should be decreased after beaconChain slash" + ); // Slash the operator for beacon chain shares uint64 operatorMagnitude = 5e17; _setOperatorMagnitude(defaultOperator, withdrawal.strategies[0], operatorMagnitude); cheats.prank(address(allocationManagerMock)); delegationManager.slashOperatorShares(defaultOperator, withdrawal.strategies[0], WAD, operatorMagnitude); - uint256 operatorSharesAfterAVSSlash = delegationManager.operatorShares(defaultOperator, beaconChainETHStrategy); - assertApproxEqAbs(operatorSharesAfterAVSSlash, operatorSharesAfterBeaconSlash / 2, 1, "operator shares should be decreased after AVS slash"); + uint256 operatorSharesAfterAVSSlash = + delegationManager.operatorShares(defaultOperator, beaconChainETHStrategy); + assertApproxEqAbs( + operatorSharesAfterAVSSlash, + operatorSharesAfterBeaconSlash / 2, + 1, + "operator shares should be decreased after AVS slash" + ); } // Complete queue withdrawal - ( - uint256[] memory withdrawableShares, - uint256[] memory depositShares - ) = delegationManager.getWithdrawableShares(defaultStaker, beaconChainETHStrategy.toArray()); + (uint256[] memory withdrawableShares, uint256[] memory depositShares) = + delegationManager.getWithdrawableShares(defaultStaker, beaconChainETHStrategy.toArray()); uint256 operatorSharesBefore = delegationManager.operatorShares(defaultOperator, beaconChainETHStrategy); IERC20[] memory tokens = new IERC20[](1); cheats.roll(withdrawal.startBlock + delegationManager.minWithdrawalDelayBlocks() + 1); @@ -6434,7 +6162,7 @@ contract DelegationManagerUnitTests_completeQueuedWithdrawal is DelegationManage }) ); cheats.prank(defaultStaker); - delegationManager.completeQueuedWithdrawal(withdrawal, tokens, receiveAsTokens); + delegationManager.completeQueuedWithdrawal(withdrawal, tokens, receiveAsTokens); _assertCompletedWithdrawal( AssertCompletedWithdrawalStruct({ @@ -6452,7 +6180,6 @@ contract DelegationManagerUnitTests_completeQueuedWithdrawal is DelegationManage ); } - /** * @notice Verifies that `DelegationManager.completeQueuedWithdrawal` properly completes a queued withdrawal for the `withdrawer` * for a single strategy. Withdraws as shares so if the withdrawer is delegated, operator shares increase. In the test case, this only @@ -6467,14 +6194,11 @@ contract DelegationManagerUnitTests_completeQueuedWithdrawal is DelegationManage address staker = r.Address(); uint128 depositAmount = r.Uint128(); uint128 withdrawalAmount = r.Uint128(1, depositAmount); - + _registerOperatorWithBaseDetails(defaultOperator); - ( - Withdrawal memory withdrawal, - IERC20[] memory tokens, - bytes32 withdrawalRoot - ) = _setUpCompleteQueuedWithdrawalSingleStrat({ + (Withdrawal memory withdrawal, IERC20[] memory tokens, bytes32 withdrawalRoot) = + _setUpCompleteQueuedWithdrawalSingleStrat({ staker: staker, depositAmount: depositAmount, withdrawalAmount: withdrawalAmount, @@ -6490,22 +6214,25 @@ contract DelegationManagerUnitTests_completeQueuedWithdrawal is DelegationManage // completeQueuedWithdrawal cheats.roll(withdrawal.startBlock + delegationManager.minWithdrawalDelayBlocks() + 1); _completeQueuedWithdrawal_expectEmit( - CompleteQueuedWithdrawalEmitStruct({ - withdrawal: withdrawal, - tokens: tokens, - receiveAsTokens: false - }) + CompleteQueuedWithdrawalEmitStruct({withdrawal: withdrawal, tokens: tokens, receiveAsTokens: false}) ); cheats.prank(staker); - delegationManager.completeQueuedWithdrawal(withdrawal, tokens, false); + delegationManager.completeQueuedWithdrawal(withdrawal, tokens, false); uint256 operatorSharesAfter = delegationManager.operatorShares(defaultOperator, withdrawal.strategies[0]); // Since staker is delegated, operatorShares get incremented - assertEq(operatorSharesAfter, operatorSharesBefore + withdrawalAmount, "operator shares not increased correctly"); - assertFalse(delegationManager.pendingWithdrawals(withdrawalRoot), "withdrawalRoot should be completed and marked false now"); + assertEq( + operatorSharesAfter, operatorSharesBefore + withdrawalAmount, "operator shares not increased correctly" + ); + assertFalse( + delegationManager.pendingWithdrawals(withdrawalRoot), + "withdrawalRoot should be completed and marked false now" + ); } - function testFuzz_completeQueuedWithdrawals_OutOfOrderBlocking(Randomness r) public { + function testFuzz_completeQueuedWithdrawals_OutOfOrderBlocking( + Randomness r + ) public { uint256 totalDepositShares = r.Uint256(4, 100 ether); uint256 depositSharesPerWithdrawal = totalDepositShares / 4; @@ -6515,20 +6242,14 @@ contract DelegationManagerUnitTests_completeQueuedWithdrawal is DelegationManage QueuedWithdrawalParams[] memory queuedParams = new QueuedWithdrawalParams[](4); Withdrawal[] memory withdrawals = new Withdrawal[](4); - + uint256 startBlock = block.number; uint256 nonce = delegationManager.cumulativeWithdrawalsQueued(defaultStaker); for (uint256 i; i < 4; ++i) { cheats.roll(startBlock + i); - ( - QueuedWithdrawalParams[] memory params, - Withdrawal memory withdrawal, - ) = _setUpQueueWithdrawalsSingleStrat( - defaultStaker, - strategyMock, - depositSharesPerWithdrawal - ); + (QueuedWithdrawalParams[] memory params, Withdrawal memory withdrawal,) = + _setUpQueueWithdrawalsSingleStrat(defaultStaker, strategyMock, depositSharesPerWithdrawal); withdrawal.nonce = nonce; nonce += 1; @@ -6539,12 +6260,12 @@ contract DelegationManagerUnitTests_completeQueuedWithdrawal is DelegationManage cheats.startPrank(defaultStaker); cheats.roll(startBlock); - + delegationManager.queueWithdrawals(queuedParams[0].toArray()); cheats.roll(startBlock + 1); delegationManager.queueWithdrawals(queuedParams[1].toArray()); - - (Withdrawal[] memory firstWithdrawals, ) = delegationManager.getQueuedWithdrawals(defaultStaker); + + (Withdrawal[] memory firstWithdrawals,) = delegationManager.getQueuedWithdrawals(defaultStaker); cheats.roll(startBlock + 2); delegationManager.queueWithdrawals(queuedParams[2].toArray()); @@ -6558,23 +6279,17 @@ contract DelegationManagerUnitTests_completeQueuedWithdrawal is DelegationManage bytes32 root1 = delegationManager.calculateWithdrawalRoot(withdrawals[0]); bytes32 root2 = delegationManager.calculateWithdrawalRoot(withdrawals[1]); - + bytes32 root1_view = delegationManager.calculateWithdrawalRoot(firstWithdrawals[0]); bytes32 root2_view = delegationManager.calculateWithdrawalRoot(firstWithdrawals[1]); - assertEq( - root1, root1_view, - "withdrawal root should be the same" - ); + assertEq(root1, root1_view, "withdrawal root should be the same"); - assertEq( - root2, root2_view, - "withdrawal root should be the same" - ); + assertEq(root2, root2_view, "withdrawal root should be the same"); cheats.roll(startBlock + delay + 2); delegationManager.completeQueuedWithdrawals(firstWithdrawals, tokens, true.toArray(2)); - + // Throws `WithdrawalNotQueued`. cheats.roll(startBlock + delay + 3); delegationManager.completeQueuedWithdrawals(withdrawals[2].toArray(), tokens, true.toArray()); @@ -6588,7 +6303,9 @@ contract DelegationManagerUnitTests_slashingShares is DelegationManagerUnitTests using Math for *; /// @notice Verifies that `DelegationManager.slashOperatorShares` reverts if not called by the AllocationManager - function testFuzz_Revert_slashOperatorShares_invalidCaller(Randomness r) public rand(r) { + function testFuzz_Revert_slashOperatorShares_invalidCaller( + Randomness r + ) public rand(r) { address invalidCaller = r.Address(); cheats.startPrank(invalidCaller); @@ -6601,7 +6318,7 @@ contract DelegationManagerUnitTests_slashingShares is DelegationManagerUnitTests _registerOperatorWithBaseDetails(defaultOperator); cheats.prank(address(allocationManagerMock)); - delegationManager.slashOperatorShares(defaultOperator, strategyMock, WAD, WAD/2); + delegationManager.slashOperatorShares(defaultOperator, strategyMock, WAD, WAD / 2); assertEq(delegationManager.operatorShares(defaultOperator, strategyMock), 0, "shares should not have changed"); } @@ -6618,10 +6335,8 @@ contract DelegationManagerUnitTests_slashingShares is DelegationManagerUnitTests // Queue withdrawal uint256 withdrawalAmount = depositAmount; - ( - QueuedWithdrawalParams[] memory queuedWithdrawalParams, - Withdrawal memory withdrawal, - ) = _setUpQueueWithdrawalsSingleStrat({ + (QueuedWithdrawalParams[] memory queuedWithdrawalParams, Withdrawal memory withdrawal,) = + _setUpQueueWithdrawalsSingleStrat({ staker: defaultStaker, strategy: strategyMock, depositSharesToWithdraw: withdrawalAmount @@ -6646,23 +6361,23 @@ contract DelegationManagerUnitTests_slashingShares is DelegationManagerUnitTests IERC20[] memory tokens = strategyMock.underlyingToken().toArray(); bytes32 withdrawalRoot = delegationManager.calculateWithdrawalRoot(withdrawal); - assertTrue(delegationManager.pendingWithdrawals(withdrawalRoot), "withdrawal should be pending before completion"); - + assertTrue( + delegationManager.pendingWithdrawals(withdrawalRoot), "withdrawal should be pending before completion" + ); + cheats.prank(defaultStaker); delegationManager.completeQueuedWithdrawal(withdrawal, tokens, true); - assertFalse(delegationManager.pendingWithdrawals(withdrawalRoot), "withdrawal should be cleared after completion"); + assertFalse( + delegationManager.pendingWithdrawals(withdrawalRoot), "withdrawal should be cleared after completion" + ); assertEq( slashableSharesInQueue, depositAmount, "the withdrawal in queue from block.number - minWithdrawalDelayBlocks should still be included" ); - assertEq( - slashableSharesInQueueAfter, - 0, - "slashable shares in queue should be 0 after burning" - ); + assertEq(slashableSharesInQueueAfter, 0, "slashable shares in queue should be 0 after burning"); } /// @notice Verifies that shares are NOT burnable for a withdrawal queued just before the MIN_WITHDRAWAL_DELAY_BLOCKS @@ -6678,10 +6393,8 @@ contract DelegationManagerUnitTests_slashingShares is DelegationManagerUnitTests // Queue withdrawal uint256 withdrawalAmount = depositAmount; - ( - QueuedWithdrawalParams[] memory queuedWithdrawalParams, - Withdrawal memory withdrawal, - ) = _setUpQueueWithdrawalsSingleStrat({ + (QueuedWithdrawalParams[] memory queuedWithdrawalParams, Withdrawal memory withdrawal,) = + _setUpQueueWithdrawalsSingleStrat({ staker: defaultStaker, strategy: strategyMock, depositSharesToWithdraw: withdrawalAmount @@ -6712,7 +6425,7 @@ contract DelegationManagerUnitTests_slashingShares is DelegationManagerUnitTests ) ); cheats.prank(defaultStaker); - delegationManager.completeQueuedWithdrawal(withdrawal, tokens, true); + delegationManager.completeQueuedWithdrawal(withdrawal, tokens, true); } /** @@ -6731,10 +6444,8 @@ contract DelegationManagerUnitTests_slashingShares is DelegationManagerUnitTests // Queue 5 withdrawals uint256 startBlock = block.number; uint256 withdrawalAmount = depositAmount / 6; - for(uint256 i = 0; i < 5; i++) { - ( - QueuedWithdrawalParams[] memory queuedWithdrawalParams,, - ) = _setUpQueueWithdrawalsSingleStrat({ + for (uint256 i = 0; i < 5; i++) { + (QueuedWithdrawalParams[] memory queuedWithdrawalParams,,) = _setUpQueueWithdrawalsSingleStrat({ staker: defaultStaker, strategy: strategyMock, depositSharesToWithdraw: withdrawalAmount @@ -6750,7 +6461,11 @@ contract DelegationManagerUnitTests_slashingShares is DelegationManagerUnitTests // Get slashable shares uint256 slashableSharesInQueue = delegationManager.getSlashableSharesInQueue(defaultOperator, strategyMock); - assertEq(slashableSharesInQueue, depositAmount/6 * 3, "slashable shares in queue should be 3/6 of the deposit amount"); + assertEq( + slashableSharesInQueue, + depositAmount / 6 * 3, + "slashable shares in queue should be 3/6 of the deposit amount" + ); // Slash all of operator's shares _setOperatorMagnitude(defaultOperator, strategyMock, 0); @@ -6763,7 +6478,7 @@ contract DelegationManagerUnitTests_slashingShares is DelegationManagerUnitTests depositAmount / 6 // 1 withdrawal not queued so decreased ); delegationManager.slashOperatorShares(defaultOperator, strategyMock, WAD, 0); - + // Assert slashable shares slashableSharesInQueue = delegationManager.getSlashableSharesInQueue(defaultOperator, strategyMock); assertEq(slashableSharesInQueue, 0); @@ -6773,7 +6488,9 @@ contract DelegationManagerUnitTests_slashingShares is DelegationManagerUnitTests * @notice Verifies that `DelegationManager.slashOperatorShares` properly decreases the delegated `shares` that the operator * who the `defaultStaker` is delegated to has in the strategies */ - function testFuzz_slashOperatorShares_slashedOperator(Randomness r) public rand(r) { + function testFuzz_slashOperatorShares_slashedOperator( + Randomness r + ) public rand(r) { // sanity-filtering on fuzzed input length & staker IStrategy[] memory strategies = r.StrategyArray(16); uint256 shares = r.Uint256(1, MAX_STRATEGY_SHARES); @@ -6791,7 +6508,7 @@ contract DelegationManagerUnitTests_slashingShares is DelegationManagerUnitTests // Set the staker deposits in the strategies uint256[] memory sharesToSet = new uint256[](strategies.length); uint256[] memory depositScalingFactors = new uint256[](strategies.length); - for(uint256 i = 0; i < strategies.length; i++) { + for (uint256 i = 0; i < strategies.length; i++) { strategies[i] = IStrategy(random().Address()); sharesToSet[i] = shares; depositScalingFactors[i] = uint256(WAD).divWad(uint256(prevMaxMagnitude)); @@ -6838,12 +6555,7 @@ contract DelegationManagerUnitTests_slashingShares is DelegationManagerUnitTests }); cheats.expectEmit(true, true, true, true, address(delegationManager)); - emit OperatorSharesDecreased( - defaultOperator, - address(0), - strategies[i], - sharesToDecrease - ); + emit OperatorSharesDecreased(defaultOperator, address(0), strategies[i], sharesToDecrease); delegationManager.slashOperatorShares(defaultOperator, strategies[i], prevMaxMagnitude, newMaxMagnitude); // Also update maxMagnitude in ALM mock @@ -6855,7 +6567,7 @@ contract DelegationManagerUnitTests_slashingShares is DelegationManagerUnitTests } // check shares after call to `slashOperatorShares` - (uint256[] memory withdrawableShares, ) = delegationManager.getWithdrawableShares(defaultStaker, strategies); + (uint256[] memory withdrawableShares,) = delegationManager.getWithdrawableShares(defaultStaker, strategies); for (uint256 i = 0; i < strategies.length; ++i) { uint256 delegatedSharesAfter = delegationManager.operatorShares(delegatedTo, strategies[i]); assertEq( @@ -6899,7 +6611,7 @@ contract DelegationManagerUnitTests_slashingShares is DelegationManagerUnitTests uint256 queuedSlashableSharesBefore = delegationManager.getSlashableSharesInQueue(operator, strategyMock); // calculate burned shares, should be halved - uint256 sharesToBurn = shares/2; + uint256 sharesToBurn = shares / 2; // Burn shares _slashOperatorShares_expectEmit( @@ -6927,7 +6639,11 @@ contract DelegationManagerUnitTests_slashingShares is DelegationManagerUnitTests uint256 operatorSharesAfter = delegationManager.operatorShares(operator, strategyMock); assertEq(queuedSlashableSharesBefore, 0, "there should be no slashable shares in queue"); assertEq(queuedSlashableSharesAfter, 0, "there should be no slashable shares in queue"); - assertEq(operatorSharesAfter, operatorSharesBefore - sharesToBurn, "operator shares should be decreased by sharesToBurn"); + assertEq( + operatorSharesAfter, + operatorSharesBefore - sharesToBurn, + "operator shares should be decreased by sharesToBurn" + ); } /** @@ -6962,10 +6678,8 @@ contract DelegationManagerUnitTests_slashingShares is DelegationManagerUnitTests // 3. Queue withdrawal for staker2 and roll blocks forward so that the withdrawal is not slashable { - ( - QueuedWithdrawalParams[] memory queuedWithdrawalParams, - Withdrawal memory withdrawal, - ) = _setUpQueueWithdrawalsSingleStrat({ + (QueuedWithdrawalParams[] memory queuedWithdrawalParams, Withdrawal memory withdrawal,) = + _setUpQueueWithdrawalsSingleStrat({ staker: staker2, strategy: strategyMock, depositSharesToWithdraw: withdrawAmount @@ -7017,14 +6731,20 @@ contract DelegationManagerUnitTests_slashingShares is DelegationManagerUnitTests uint256 operatorSharesAfter = delegationManager.operatorShares(operator, strategyMock); assertEq(queuedSlashableSharesBefore, 0, "there should be no slashable shares in queue"); assertEq(queuedSlashableSharesAfter, 0, "there should be no slashable shares in queue"); - assertEq(operatorSharesAfter, operatorSharesBefore - sharesToBurn, "operator shares should be decreased by sharesToBurn"); + assertEq( + operatorSharesAfter, + operatorSharesBefore - sharesToBurn, + "operator shares should be decreased by sharesToBurn" + ); } /** * @notice Test burning shares for an operator with slashable queued withdrawals in past MIN_WITHDRAWAL_DELAY_BLOCKS window. * There exists a single withdrawal that is slashable. */ - function testFuzz_slashOperatorShares_SingleSlashableWithdrawal(Randomness r) public rand(r) { + function testFuzz_slashOperatorShares_SingleSlashableWithdrawal( + Randomness r + ) public rand(r) { // 1. Randomize operator and staker info // Operator info address operator = r.Address(); @@ -7046,9 +6766,7 @@ contract DelegationManagerUnitTests_slashingShares is DelegationManagerUnitTests // 3. Queue withdrawal for staker2 so that the withdrawal is slashable { - ( - QueuedWithdrawalParams[] memory queuedWithdrawalParams,, - ) = _setUpQueueWithdrawalsSingleStrat({ + (QueuedWithdrawalParams[] memory queuedWithdrawalParams,,) = _setUpQueueWithdrawalsSingleStrat({ staker: staker2, strategy: strategyMock, depositSharesToWithdraw: withdrawAmount @@ -7098,9 +6816,19 @@ contract DelegationManagerUnitTests_slashingShares is DelegationManagerUnitTests // 5. Assert expected values uint256 queuedSlashableSharesAfter = delegationManager.getSlashableSharesInQueue(operator, strategyMock); uint256 operatorSharesAfter = delegationManager.operatorShares(operator, strategyMock); - assertEq(queuedSlashableSharesBefore, withdrawAmount, "Slashable shares in queue should be full withdraw amount"); - assertEq(queuedSlashableSharesAfter, withdrawAmount / 4, "Slashable shares in queue should be 1/4 withdraw amount after slashing"); - assertEq(operatorSharesAfter, operatorSharesBefore - sharesToDecrease, "operator shares should be decreased by sharesToBurn"); + assertEq( + queuedSlashableSharesBefore, withdrawAmount, "Slashable shares in queue should be full withdraw amount" + ); + assertEq( + queuedSlashableSharesAfter, + withdrawAmount / 4, + "Slashable shares in queue should be 1/4 withdraw amount after slashing" + ); + assertEq( + operatorSharesAfter, + operatorSharesBefore - sharesToDecrease, + "operator shares should be decreased by sharesToBurn" + ); } /** @@ -7127,10 +6855,8 @@ contract DelegationManagerUnitTests_slashingShares is DelegationManagerUnitTests // 3. Queue withdrawal for staker and roll blocks forward so that the withdrawal is not slashable { - ( - QueuedWithdrawalParams[] memory queuedWithdrawalParams, - Withdrawal memory withdrawal, - ) = _setUpQueueWithdrawalsSingleStrat({ + (QueuedWithdrawalParams[] memory queuedWithdrawalParams, Withdrawal memory withdrawal,) = + _setUpQueueWithdrawalsSingleStrat({ staker: staker, strategy: strategyMock, depositSharesToWithdraw: withdrawAmount1 @@ -7143,10 +6869,7 @@ contract DelegationManagerUnitTests_slashingShares is DelegationManagerUnitTests "there should be withdrawAmount slashable shares in queue" ); - ( - queuedWithdrawalParams, - withdrawal, - ) = _setUpQueueWithdrawalsSingleStrat({ + (queuedWithdrawalParams, withdrawal,) = _setUpQueueWithdrawalsSingleStrat({ staker: staker, strategy: strategyMock, depositSharesToWithdraw: withdrawAmount2 @@ -7166,7 +6889,8 @@ contract DelegationManagerUnitTests_slashingShares is DelegationManagerUnitTests // calculate burned shares, should be halved for both operatorShares and slashable shares in queue // staker queue withdraws shares twice and both withdrawals should be slashed 75%. uint256 sharesToDecrease = (depositAmount - withdrawAmount1 - withdrawAmount2) * 3 / 4; - uint256 sharesToBurn = sharesToDecrease + (delegationManager.getSlashableSharesInQueue(operator, strategyMock) * 3 / 4); + uint256 sharesToBurn = + sharesToDecrease + (delegationManager.getSlashableSharesInQueue(operator, strategyMock) * 3 / 4); // 4. Burn shares _setOperatorMagnitude(operator, strategyMock, newMagnitude); @@ -7194,9 +6918,21 @@ contract DelegationManagerUnitTests_slashingShares is DelegationManagerUnitTests // 5. Assert expected values uint256 queuedSlashableSharesAfter = delegationManager.getSlashableSharesInQueue(operator, strategyMock); uint256 operatorSharesAfter = delegationManager.operatorShares(operator, strategyMock); - assertEq(queuedSlashableSharesBefore, (withdrawAmount1 + withdrawAmount2), "Slashable shares in queue should be full withdraw amount"); - assertEq(queuedSlashableSharesAfter, (withdrawAmount1 + withdrawAmount2) / 4, "Slashable shares in queue should be 1/4 withdraw amount after slashing"); - assertEq(operatorSharesAfter, operatorSharesBefore - sharesToDecrease, "operator shares should be decreased by sharesToBurn"); + assertEq( + queuedSlashableSharesBefore, + (withdrawAmount1 + withdrawAmount2), + "Slashable shares in queue should be full withdraw amount" + ); + assertEq( + queuedSlashableSharesAfter, + (withdrawAmount1 + withdrawAmount2) / 4, + "Slashable shares in queue should be 1/4 withdraw amount after slashing" + ); + assertEq( + operatorSharesAfter, + operatorSharesBefore - sharesToDecrease, + "operator shares should be decreased by sharesToBurn" + ); } /** @@ -7204,9 +6940,9 @@ contract DelegationManagerUnitTests_slashingShares is DelegationManagerUnitTests * There exists multiple withdrawals that are slashable but queued with different maxMagnitudes at * time of queuing. * - * Test Setup: + * Test Setup: * - staker1 deposits, queues withdrawal for some amount, - * - operator slashed 50% + * - operator slashed 50% * - staker 2 deposits, queues withdrawal for some amount * - operator is then slashed another 50% * slashed amount for staker 1 should be 75% and staker 2 should be 50% where the total @@ -7230,9 +6966,7 @@ contract DelegationManagerUnitTests_slashingShares is DelegationManagerUnitTests // 3. Queue withdrawal for staker and slash operator for 50% { - ( - QueuedWithdrawalParams[] memory queuedWithdrawalParams,, - ) = _setUpQueueWithdrawalsSingleStrat({ + (QueuedWithdrawalParams[] memory queuedWithdrawalParams,,) = _setUpQueueWithdrawalsSingleStrat({ staker: staker, strategy: strategyMock, depositSharesToWithdraw: depositSharesToWithdraw1 @@ -7245,7 +6979,7 @@ contract DelegationManagerUnitTests_slashingShares is DelegationManagerUnitTests uint256 queuedSlashableSharesBefore = delegationManager.getSlashableSharesInQueue(operator, strategyMock); uint256 sharesToDecrease = (depositAmount - depositSharesToWithdraw1) / 2; - uint256 sharesToBurn = sharesToDecrease + depositSharesToWithdraw1/2; + uint256 sharesToBurn = sharesToDecrease + depositSharesToWithdraw1 / 2; // 3.2 Burn shares _setOperatorMagnitude(operator, strategyMock, newMagnitude); @@ -7291,15 +7025,12 @@ contract DelegationManagerUnitTests_slashingShares is DelegationManagerUnitTests // 4. Queue withdrawal for staker and slash operator for 60% again newMagnitude = 25e16; { - ( - QueuedWithdrawalParams[] memory queuedWithdrawalParams,, - ) = _setUpQueueWithdrawalsSingleStrat({ + (QueuedWithdrawalParams[] memory queuedWithdrawalParams,,) = _setUpQueueWithdrawalsSingleStrat({ staker: staker, strategy: strategyMock, depositSharesToWithdraw: depositSharesToWithdraw2 }); - // 4.1 queue a withdrawal for the staker cheats.prank(staker); delegationManager.queueWithdrawals(queuedWithdrawalParams); @@ -7328,14 +7059,14 @@ contract DelegationManagerUnitTests_slashingShares is DelegationManagerUnitTests delegationManager.slashOperatorShares({ operator: operator, strategy: strategyMock, - prevMaxMagnitude: newMagnitude*2, + prevMaxMagnitude: newMagnitude * 2, newMaxMagnitude: newMagnitude }); // 4.3 Assert slashable shares and operator shares assertEq( queuedSlashableSharesBefore, - (depositSharesToWithdraw1 + depositSharesToWithdraw2)/2, + (depositSharesToWithdraw1 + depositSharesToWithdraw2) / 2, "Slashable shares in queue before should be both queued withdrawal amounts halved" ); assertEq( @@ -7356,7 +7087,9 @@ contract DelegationManagerUnitTests_slashingShares is DelegationManagerUnitTests * However if the withdrawal is not completable and the withdrawal delay hasn't elapsed, then the withdrawal * should be counted as slashable. */ - function testFuzz_slashOperatorShares_Timings(Randomness r) public rand(r) { + function testFuzz_slashOperatorShares_Timings( + Randomness r + ) public rand(r) { // 1. Randomize operator and staker info // Operator info address operator = r.Address(); @@ -7373,10 +7106,8 @@ contract DelegationManagerUnitTests_slashingShares is DelegationManagerUnitTests // 3. Queue withdrawal for staker and roll blocks forward so that the withdrawal is completable uint256 completableBlock; { - ( - QueuedWithdrawalParams[] memory queuedWithdrawalParams, - Withdrawal memory withdrawal, - ) = _setUpQueueWithdrawalsSingleStrat({ + (QueuedWithdrawalParams[] memory queuedWithdrawalParams, Withdrawal memory withdrawal,) = + _setUpQueueWithdrawalsSingleStrat({ staker: staker, strategy: strategyMock, depositSharesToWithdraw: depositAmount @@ -7414,7 +7145,6 @@ contract DelegationManagerUnitTests_slashingShares is DelegationManagerUnitTests ); cheats.stopPrank(); - } uint256 operatorSharesBefore = delegationManager.operatorShares(operator, strategyMock); @@ -7458,7 +7188,9 @@ contract DelegationManagerUnitTests_slashingShares is DelegationManagerUnitTests * and there are no slashable shares in the queue. Note: this will be implemented in a future release with * consideration of the Pectra upgrade. */ - function testFuzz_slashOperatorShares_BeaconChainStrategy(Randomness r) public rand(r) { + function testFuzz_slashOperatorShares_BeaconChainStrategy( + Randomness r + ) public rand(r) { // 1. Randomize operator and staker info // Operator info address operator = r.Address(); @@ -7480,9 +7212,7 @@ contract DelegationManagerUnitTests_slashingShares is DelegationManagerUnitTests // 3. Queue withdrawal for staker2 so that the withdrawal is slashable { - ( - QueuedWithdrawalParams[] memory queuedWithdrawalParams,, - ) = _setUpQueueWithdrawalsSingleStrat({ + (QueuedWithdrawalParams[] memory queuedWithdrawalParams,,) = _setUpQueueWithdrawalsSingleStrat({ staker: staker2, strategy: beaconChainETHStrategy, depositSharesToWithdraw: withdrawAmount @@ -7497,7 +7227,8 @@ contract DelegationManagerUnitTests_slashingShares is DelegationManagerUnitTests } uint256 operatorSharesBefore = delegationManager.operatorShares(operator, beaconChainETHStrategy); - uint256 queuedSlashableSharesBefore = delegationManager.getSlashableSharesInQueue(operator, beaconChainETHStrategy); + uint256 queuedSlashableSharesBefore = + delegationManager.getSlashableSharesInQueue(operator, beaconChainETHStrategy); // calculate burned shares, should be 3/4 of the original shares // staker2 queue withdraws shares @@ -7524,7 +7255,8 @@ contract DelegationManagerUnitTests_slashingShares is DelegationManagerUnitTests }); // 5. Assert expected values - uint256 queuedSlashableSharesAfter = delegationManager.getSlashableSharesInQueue(operator, beaconChainETHStrategy); + uint256 queuedSlashableSharesAfter = + delegationManager.getSlashableSharesInQueue(operator, beaconChainETHStrategy); uint256 operatorSharesAfter = delegationManager.operatorShares(operator, beaconChainETHStrategy); assertEq(queuedSlashableSharesBefore, withdrawAmount, "Slashable shares in queue should be full withdraw amount"); assertEq(queuedSlashableSharesAfter, withdrawAmount / 4, "Slashable shares in queue should be 1/4 withdraw amount after slashing"); @@ -7533,18 +7265,18 @@ contract DelegationManagerUnitTests_slashingShares is DelegationManagerUnitTests /** * @notice This test demonstrates that the rate that withdrawable shares decrease from slashing is at LEAST - * greater than or equal to the rate that the operator shares decrease from slashing. + * greater than or equal to the rate that the operator shares decrease from slashing. * We want this property otherwise undelegating/queue withdrawing all shares as a staker could lead to a underflow revert. * Note: If the SlashingLib.calcSlashedAmount function were to round down (overslash) then this test would fail. */ function test_slashOperatorShares_slashedRepeatedly() public { - uint64 initialMagnitude = 90009; - uint256 shares = 40000000004182209037560531097078597505; + uint64 initialMagnitude = 90_009; + uint256 shares = 40_000_000_004_182_209_037_560_531_097_078_597_505; // register *this contract* as an operator _registerOperatorWithBaseDetails(defaultOperator); _setOperatorMagnitude(defaultOperator, strategyMock, initialMagnitude); - + // Set the staker deposits in the strategies strategyManagerMock.addDeposit(defaultStaker, strategyMock, shares); @@ -7565,17 +7297,12 @@ contract DelegationManagerUnitTests_slashingShares is DelegationManagerUnitTests cheats.prank(address(allocationManagerMock)); delegationManager.slashOperatorShares( - defaultOperator, - strategyMock, - newOperatorMagnitude + slashMagnitude, - newOperatorMagnitude + defaultOperator, strategyMock, newOperatorMagnitude + slashMagnitude, newOperatorMagnitude ); uint256 operatorSharesAfterSlash = delegationManager.operatorShares(defaultOperator, strategyMock); - ( - uint256[] memory withdrawableShares, - uint256[] memory depositShares - ) = delegationManager.getWithdrawableShares(defaultStaker, strategyMock.toArray()); + (uint256[] memory withdrawableShares, uint256[] memory depositShares) = + delegationManager.getWithdrawableShares(defaultStaker, strategyMock.toArray()); assertEq(depositShares[0], shares, "staker deposit shares not reset correctly"); assertLe( withdrawableShares[0], @@ -7590,7 +7317,9 @@ contract DelegationManagerUnitTests_slashingShares is DelegationManagerUnitTests * and also on the beaconChain. This test ensures that the order of slashing does not matter and nets * the same withdrawableShares for the staker whether slashing occurred on the beaconChain, or on EigenLayer first. */ - function testFuzz_beaconSlashAndAVSSlash(Randomness r) public rand(r) { + function testFuzz_beaconSlashAndAVSSlash( + Randomness r + ) public rand(r) { uint64 initialMagnitude = r.Uint64(2, WAD); uint64 newMaxMagnitude = r.Uint64(1, initialMagnitude); // note: beaconShares only goes negative when performing withdrawal -- and this will change post-migration @@ -7638,15 +7367,13 @@ contract DelegationManagerUnitTests_slashingShares is DelegationManagerUnitTests { // Slash beaconChain first { - (withdrawableShares,) = delegationManager.getWithdrawableShares(defaultStaker, beaconChainETHStrategy.toArray()); + (withdrawableShares,) = + delegationManager.getWithdrawableShares(defaultStaker, beaconChainETHStrategy.toArray()); uint256 beaconSharesBeforeSlash = withdrawableShares[0]; uint64 prevBeaconChainSlashingFactor; - (prevBeaconChainSlashingFactor, newBeaconSlashingFactor) = _decreaseBeaconChainShares( - defaultStaker, - beaconShares, - sharesDecrease - ); + (prevBeaconChainSlashingFactor, newBeaconSlashingFactor) = + _decreaseBeaconChainShares(defaultStaker, beaconShares, sharesDecrease); uint256 expectedWithdrawableShares = _calcWithdrawableShares({ depositShares: uint256(beaconShares), @@ -7662,19 +7389,23 @@ contract DelegationManagerUnitTests_slashingShares is DelegationManagerUnitTests } // Slash on EigenLayer second { - (withdrawableShares,) = delegationManager.getWithdrawableShares(defaultStaker, beaconChainETHStrategy.toArray()); + (withdrawableShares,) = + delegationManager.getWithdrawableShares(defaultStaker, beaconChainETHStrategy.toArray()); uint256 beaconSharesBeforeSlash = withdrawableShares[0]; // do a slash via an AVS _setOperatorMagnitude(defaultOperator, beaconChainETHStrategy, newMaxMagnitude); cheats.prank(address(allocationManagerMock)); - delegationManager.slashOperatorShares(defaultOperator, beaconChainETHStrategy, initialMagnitude, newMaxMagnitude); + delegationManager.slashOperatorShares( + defaultOperator, beaconChainETHStrategy, initialMagnitude, newMaxMagnitude + ); // save the outcome - (withdrawableShares,) = delegationManager.getWithdrawableShares(defaultStaker, beaconChainETHStrategy.toArray()); + (withdrawableShares,) = + delegationManager.getWithdrawableShares(defaultStaker, beaconChainETHStrategy.toArray()); uint256 beaconSharesAfterSecondSlash = withdrawableShares[0]; uint256 expectedWithdrawable = _calcWithdrawableShares( - uint256(beaconShares), + uint256(beaconShares), uint256(WAD).divWad(initialMagnitude), _getSlashingFactor(defaultStaker, beaconChainETHStrategy, newMaxMagnitude) ); @@ -7696,16 +7427,15 @@ contract DelegationManagerUnitTests_slashingShares is DelegationManagerUnitTests // 2. do AVS slash then beacon chain slash //////////////////////////// - // restore the staker and operator to their original state - // Reset operator's magnitude, beaconChainSlashingFactor + // initialize new staker and operator with same initial conditions delegationManager.undelegate(defaultStaker); _registerOperatorWithBaseDetails(defaultOperator2); _setOperatorMagnitude(defaultOperator2, beaconChainETHStrategy, initialMagnitude); - eigenPodManagerMock.setPodOwnerShares(defaultStaker, beaconShares); - eigenPodManagerMock.setBeaconChainSlashingFactor(defaultStaker, WAD); - _delegateToOperatorWhoAcceptsAllStakers(defaultStaker, defaultOperator2); + eigenPodManagerMock.setPodOwnerShares(defaultStaker2, beaconShares); + eigenPodManagerMock.setBeaconChainSlashingFactor(defaultStaker2, WAD); + _delegateToOperatorWhoAcceptsAllStakers(defaultStaker2, defaultOperator2); _assertDeposit({ - staker: defaultStaker, + staker: defaultStaker2, operator: defaultOperator2, strategy: beaconChainETHStrategy, operatorSharesBefore: 0, @@ -7718,21 +7448,24 @@ contract DelegationManagerUnitTests_slashingShares is DelegationManagerUnitTests { // Slash on EigenLayer first { - (withdrawableShares,) = delegationManager.getWithdrawableShares(defaultStaker, beaconChainETHStrategy.toArray()); + (withdrawableShares,) = + delegationManager.getWithdrawableShares(defaultStaker2, beaconChainETHStrategy.toArray()); uint256 beaconSharesBeforeSlash = withdrawableShares[0]; _setOperatorMagnitude(defaultOperator2, beaconChainETHStrategy, newMaxMagnitude); cheats.prank(address(allocationManagerMock)); - delegationManager.slashOperatorShares(defaultOperator2, beaconChainETHStrategy, initialMagnitude, newMaxMagnitude); + delegationManager.slashOperatorShares( + defaultOperator2, beaconChainETHStrategy, initialMagnitude, newMaxMagnitude + ); uint256 expectedWithdrawable = _calcWithdrawableShares( - uint256(beaconShares), + uint256(beaconShares), uint256(WAD).divWad(initialMagnitude), - _getSlashingFactor(defaultStaker, beaconChainETHStrategy, newMaxMagnitude) + _getSlashingFactor(defaultStaker2, beaconChainETHStrategy, newMaxMagnitude) ); _assertSharesAfterSlash({ - staker: defaultStaker, + staker: defaultStaker2, strategy: beaconChainETHStrategy, withdrawableSharesBefore: beaconSharesBeforeSlash, expectedWithdrawableShares: expectedWithdrawable, @@ -7743,15 +7476,13 @@ contract DelegationManagerUnitTests_slashingShares is DelegationManagerUnitTests // Slash beaconChain second { - (withdrawableShares,) = delegationManager.getWithdrawableShares(defaultStaker, beaconChainETHStrategy.toArray()); + (withdrawableShares,) = + delegationManager.getWithdrawableShares(defaultStaker2, beaconChainETHStrategy.toArray()); uint256 beaconSharesBeforeSlash = withdrawableShares[0]; uint64 prevBeaconChainSlashingFactor; - (prevBeaconChainSlashingFactor, newBeaconSlashingFactor) = _decreaseBeaconChainShares( - defaultStaker, - beaconShares, - sharesDecrease - ); + (prevBeaconChainSlashingFactor, newBeaconSlashingFactor) = + _decreaseBeaconChainShares(defaultStaker2, beaconShares, sharesDecrease); uint256 expectedWithdrawableShares = _calcWithdrawableShares({ depositShares: uint256(beaconShares), @@ -7759,7 +7490,7 @@ contract DelegationManagerUnitTests_slashingShares is DelegationManagerUnitTests slashingFactor: newMaxMagnitude.mulWad(newBeaconSlashingFactor) }); _assertSharesAfterBeaconSlash({ - staker: defaultStaker, + staker: defaultStaker2, withdrawableSharesBefore: beaconSharesBeforeSlash, expectedWithdrawableShares: expectedWithdrawableShares, prevBeaconSlashingFactor: prevBeaconChainSlashingFactor @@ -7770,12 +7501,9 @@ contract DelegationManagerUnitTests_slashingShares is DelegationManagerUnitTests //////////////////////////// // 3. Confirm withdrawable shares are the same regardless of order of operations in Test 1 or Test 2 //////////////////////////// - (withdrawableShares,) = delegationManager.getWithdrawableShares(defaultStaker, beaconChainETHStrategy.toArray()); - assertEq( - withdrawableShares[0], - sharesAfterAllSlashing, - "shares after all slashing should be the same" - ); + (withdrawableShares,) = + delegationManager.getWithdrawableShares(defaultStaker2, beaconChainETHStrategy.toArray()); + assertEq(withdrawableShares[0], sharesAfterAllSlashing, "shares after all slashing should be the same"); } } @@ -7794,7 +7522,7 @@ contract DelegationManagerUnitTests_SharesUnderflowChecks is DelegationManagerUn function testFuzz_slashDepositRepeatedly( Randomness r ) public rand(r) { - uint64 initMagnitude = r.Uint64(10000, WAD); + uint64 initMagnitude = r.Uint64(10_000, WAD); uint256 shares = r.Uint256(1, MAX_STRATEGY_SHARES); cheats.assume(initMagnitude % 2 != 0); cheats.assume(shares % 2 != 0); @@ -7802,7 +7530,7 @@ contract DelegationManagerUnitTests_SharesUnderflowChecks is DelegationManagerUn // register *this contract* as an operator _registerOperatorWithBaseDetails(defaultOperator); _setOperatorMagnitude(defaultOperator, strategyMock, initMagnitude); - + // Set the staker deposits in the strategies IStrategy[] memory strategies = strategyMock.toArray(); { @@ -7815,13 +7543,11 @@ contract DelegationManagerUnitTests_SharesUnderflowChecks is DelegationManagerUn // delegate from the `defaultStaker` to the operator _delegateToOperatorWhoAcceptsAllStakers(defaultStaker, defaultOperator); - // Slash and deposit more for each iteration uint64 currMagnitude = initMagnitude; { uint256 newDepositShares = shares; for (uint256 i = 0; i < 100; ++i) { - // 1. slash operator for 100 magnitude uint64 slashMagnitude = 100; currMagnitude -= slashMagnitude; @@ -7847,7 +7573,7 @@ contract DelegationManagerUnitTests_SharesUnderflowChecks is DelegationManagerUn } } - (uint256[] memory withdrawableShares, ) = delegationManager.getWithdrawableShares(defaultStaker, strategies); + (uint256[] memory withdrawableShares,) = delegationManager.getWithdrawableShares(defaultStaker, strategies); assertLe( withdrawableShares[0], delegationManager.operatorShares(defaultOperator, strategyMock), @@ -7857,13 +7583,23 @@ contract DelegationManagerUnitTests_SharesUnderflowChecks is DelegationManagerUn if (cheats.envOr("WRITE_CSV_TESTS", false)) { cheats.writeLine( "./test.csv", - string(abi.encodePacked( - cheats.toString(initMagnitude), ", ", - cheats.toString(shares), ", ", - cheats.toString(delegationManager.operatorShares(defaultOperator, strategyMock)), ", ", - cheats.toString(withdrawableShares[0]), ", ", - cheats.toString(stdMath.delta(delegationManager.operatorShares(defaultOperator, strategyMock), withdrawableShares[0])) - )) + string( + abi.encodePacked( + cheats.toString(initMagnitude), + ", ", + cheats.toString(shares), + ", ", + cheats.toString(delegationManager.operatorShares(defaultOperator, strategyMock)), + ", ", + cheats.toString(withdrawableShares[0]), + ", ", + cheats.toString( + stdMath.delta( + delegationManager.operatorShares(defaultOperator, strategyMock), withdrawableShares[0] + ) + ) + ) + ) ); } } @@ -7873,11 +7609,11 @@ contract DelegationManagerUnitTests_SharesUnderflowChecks is DelegationManagerUn * Single staker with fuzzed starting shares and magnitude. * Slash 100 magnitude and fuzz deposit amount for 100 iterations. */ - /// forge-config: default.fuzz.runs = 50 + /// forge-config: default.fuzz.runs = 50 function testFuzz_slashDepositRepeatedly_randDeposits( Randomness r ) public rand(r) { - uint64 initMagnitude = r.Uint64(10000, WAD); + uint64 initMagnitude = r.Uint64(10_000, WAD); uint256 depositAmount = r.Uint256(1, 1e34); uint256 shares = r.Uint256(1, MAX_STRATEGY_SHARES / 1e4); cheats.assume(initMagnitude % 2 != 0); @@ -7886,7 +7622,7 @@ contract DelegationManagerUnitTests_SharesUnderflowChecks is DelegationManagerUn // register *this contract* as an operator _registerOperatorWithBaseDetails(defaultOperator); _setOperatorMagnitude(defaultOperator, strategyMock, initMagnitude); - + // Set the staker deposits in the strategies IStrategy[] memory strategies = strategyMock.toArray(); { @@ -7899,13 +7635,11 @@ contract DelegationManagerUnitTests_SharesUnderflowChecks is DelegationManagerUn // delegate from the `defaultStaker` to the operator _delegateToOperatorWhoAcceptsAllStakers(defaultStaker, defaultOperator); - // Slash and deposit more for each iteration uint64 currMagnitude = initMagnitude; { uint256 newDepositShares = shares; for (uint256 i = 0; i < 100; ++i) { - // 1. slash operator for 100 magnitude uint64 slashMagnitude = 100; currMagnitude -= slashMagnitude; @@ -7930,7 +7664,7 @@ contract DelegationManagerUnitTests_SharesUnderflowChecks is DelegationManagerUn } } - (uint256[] memory withdrawableShares, ) = delegationManager.getWithdrawableShares(defaultStaker, strategies); + (uint256[] memory withdrawableShares,) = delegationManager.getWithdrawableShares(defaultStaker, strategies); assertLe( withdrawableShares[0], delegationManager.operatorShares(defaultOperator, strategyMock), @@ -7940,29 +7674,39 @@ contract DelegationManagerUnitTests_SharesUnderflowChecks is DelegationManagerUn if (cheats.envOr("WRITE_CSV_TESTS", false)) { cheats.writeLine( "./test2.csv", - string(abi.encodePacked( - cheats.toString(initMagnitude), ", ", - cheats.toString(shares), ", ", - cheats.toString(depositAmount), ", ", - cheats.toString(delegationManager.operatorShares(defaultOperator, strategyMock)), ", ", - cheats.toString(withdrawableShares[0]), ", ", - cheats.toString(stdMath.delta(delegationManager.operatorShares(defaultOperator, strategyMock), withdrawableShares[0])) - )) + string( + abi.encodePacked( + cheats.toString(initMagnitude), + ", ", + cheats.toString(shares), + ", ", + cheats.toString(depositAmount), + ", ", + cheats.toString(delegationManager.operatorShares(defaultOperator, strategyMock)), + ", ", + cheats.toString(withdrawableShares[0]), + ", ", + cheats.toString( + stdMath.delta( + delegationManager.operatorShares(defaultOperator, strategyMock), withdrawableShares[0] + ) + ) + ) + ) ); } } - /** * @notice Fuzzed tests * For 500 stakers, deposit `shares` amount and delegate to the operator. After each staker delegates, * slash 100 magnitude. */ - /// forge-config: default.fuzz.runs = 50 + /// forge-config: default.fuzz.runs = 50 function testFuzz_depositMultipleStakers_slash_repeatedly( Randomness r ) public rand(r) { - uint64 initMagnitude = r.Uint64(50000, WAD); + uint64 initMagnitude = r.Uint64(50_000, WAD); uint256 shares = r.Uint256(MAX_STRATEGY_SHARES / 1e7, MAX_STRATEGY_SHARES / 1e4); cheats.assume(initMagnitude % 2 != 0); cheats.assume(shares % 2 != 0); @@ -7970,7 +7714,7 @@ contract DelegationManagerUnitTests_SharesUnderflowChecks is DelegationManagerUn // register *this contract* as an operator _registerOperatorWithBaseDetails(defaultOperator); _setOperatorMagnitude(defaultOperator, strategyMock, initMagnitude); - + // Set the staker deposits in the strategies IStrategy[] memory strategies = strategyMock.toArray(); uint256[] memory sharesToSet = new uint256[](1); @@ -8005,7 +7749,7 @@ contract DelegationManagerUnitTests_SharesUnderflowChecks is DelegationManagerUn uint256 operatorSharesAfter = delegationManager.operatorShares(defaultOperator, strategyMock); uint256 totalWithdrawableShares = 0; for (uint256 i = 0; i < numStakers; ++i) { - (uint256[] memory withdrawableShares, ) = delegationManager.getWithdrawableShares(stakers[i], strategies); + (uint256[] memory withdrawableShares,) = delegationManager.getWithdrawableShares(stakers[i], strategies); totalWithdrawableShares += withdrawableShares[0]; } assertLe( @@ -8014,17 +7758,22 @@ contract DelegationManagerUnitTests_SharesUnderflowChecks is DelegationManagerUn "withdrawableShares should be less than or equal to operatorShares" ); - if (cheats.envOr("WRITE_CSV_TESTS", false)) { cheats.writeLine( "./test3.csv", - string(abi.encodePacked( - cheats.toString(initMagnitude), ", ", // initial magnitude - cheats.toString(shares), ", ", // amount each staker deposits - cheats.toString(operatorSharesAfter), ", ", // operator shares after all slashing and deposits - cheats.toString(totalWithdrawableShares), ", ", // total withdrawable shares from all stakers - cheats.toString(stdMath.delta(operatorSharesAfter, totalWithdrawableShares)) // delta difference between opShares and total withdrawable - )) + string( + abi.encodePacked( + cheats.toString(initMagnitude), + ", ", // initial magnitude + cheats.toString(shares), + ", ", // amount each staker deposits + cheats.toString(operatorSharesAfter), + ", ", // operator shares after all slashing and deposits + cheats.toString(totalWithdrawableShares), + ", ", // total withdrawable shares from all stakers + cheats.toString(stdMath.delta(operatorSharesAfter, totalWithdrawableShares)) // delta difference between opShares and total withdrawable + ) + ) ); } } @@ -8038,7 +7787,7 @@ contract DelegationManagerUnitTests_SharesUnderflowChecks is DelegationManagerUn function testFuzz_depositMultipleStakers_slashLargeMagnitudes( Randomness r ) public rand(r) { - uint64 initMagnitude = r.Uint64(50000, WAD); + uint64 initMagnitude = r.Uint64(50_000, WAD); uint256 shares = r.Uint256(MAX_STRATEGY_SHARES / 1e7, MAX_STRATEGY_SHARES / 1e4); cheats.assume(initMagnitude % 2 != 0); cheats.assume(shares % 2 != 0); @@ -8046,7 +7795,7 @@ contract DelegationManagerUnitTests_SharesUnderflowChecks is DelegationManagerUn // register *this contract* as an operator _registerOperatorWithBaseDetails(defaultOperator); _setOperatorMagnitude(defaultOperator, strategyMock, initMagnitude); - + // Set the staker deposits in the strategies IStrategy[] memory strategies = strategyMock.toArray(); uint256[] memory sharesToSet = new uint256[](1); @@ -8059,7 +7808,6 @@ contract DelegationManagerUnitTests_SharesUnderflowChecks is DelegationManagerUn uint64 currMagnitude = initMagnitude; { for (uint256 i = 0; i < numStakers; ++i) { - // 1. deposit and delegate new staker stakers[i] = random().Address(); strategyManagerMock.setDeposits(stakers[i], strategies, sharesToSet); @@ -8082,7 +7830,7 @@ contract DelegationManagerUnitTests_SharesUnderflowChecks is DelegationManagerUn uint256 operatorSharesAfter = delegationManager.operatorShares(defaultOperator, strategyMock); uint256 totalWithdrawableShares = 0; for (uint256 i = 0; i < numStakers; ++i) { - (uint256[] memory withdrawableShares, ) = delegationManager.getWithdrawableShares(stakers[i], strategies); + (uint256[] memory withdrawableShares,) = delegationManager.getWithdrawableShares(stakers[i], strategies); totalWithdrawableShares += withdrawableShares[0]; } assertLe( @@ -8094,13 +7842,19 @@ contract DelegationManagerUnitTests_SharesUnderflowChecks is DelegationManagerUn if (cheats.envOr("WRITE_CSV_TESTS", false)) { cheats.writeLine( "./test4.csv", - string(abi.encodePacked( - cheats.toString(initMagnitude), ", ", // initial magnitude - cheats.toString(shares), ", ", // amount each staker deposits - cheats.toString(operatorSharesAfter), ", ", // operator shares after all slashing and deposits - cheats.toString(totalWithdrawableShares), ", ", // total withdrawable shares from all stakers - cheats.toString(stdMath.delta(operatorSharesAfter, totalWithdrawableShares)) // delta difference between opShares and total withdrawable - )) + string( + abi.encodePacked( + cheats.toString(initMagnitude), + ", ", // initial magnitude + cheats.toString(shares), + ", ", // amount each staker deposits + cheats.toString(operatorSharesAfter), + ", ", // operator shares after all slashing and deposits + cheats.toString(totalWithdrawableShares), + ", ", // total withdrawable shares from all stakers + cheats.toString(stdMath.delta(operatorSharesAfter, totalWithdrawableShares)) // delta difference between opShares and total withdrawable + ) + ) ); } } @@ -8121,7 +7875,7 @@ contract DelegationManagerUnitTests_SharesUnderflowChecks is DelegationManagerUn // register *this contract* as an operator _registerOperatorWithBaseDetails(defaultOperator); _setOperatorMagnitude(defaultOperator, strategyMock, initMagnitude); - + // Set the staker deposits in the strategies IStrategy[] memory strategies = strategyMock.toArray(); uint256[] memory sharesToSet = new uint256[](1); @@ -8134,7 +7888,6 @@ contract DelegationManagerUnitTests_SharesUnderflowChecks is DelegationManagerUn uint64 currMagnitude = initMagnitude; { for (uint256 i = 0; i < numStakers; ++i) { - // 1. deposit and delegate new staker stakers[i] = random().Address(); strategyManagerMock.setDeposits(stakers[i], strategies, sharesToSet); @@ -8157,7 +7910,7 @@ contract DelegationManagerUnitTests_SharesUnderflowChecks is DelegationManagerUn uint256 operatorSharesAfter = delegationManager.operatorShares(defaultOperator, strategyMock); uint256 totalWithdrawableShares = 0; for (uint256 i = 0; i < numStakers; ++i) { - (uint256[] memory withdrawableShares, ) = delegationManager.getWithdrawableShares(stakers[i], strategies); + (uint256[] memory withdrawableShares,) = delegationManager.getWithdrawableShares(stakers[i], strategies); totalWithdrawableShares += withdrawableShares[0]; } assertLe( @@ -8165,17 +7918,23 @@ contract DelegationManagerUnitTests_SharesUnderflowChecks is DelegationManagerUn operatorSharesAfter, "withdrawableShares should be less than or equal to operatorShares" ); - + if (cheats.envOr("WRITE_CSV_TESTS", false)) { cheats.writeLine( "./test5.csv", - string(abi.encodePacked( - cheats.toString(initMagnitude), ", ", // initial magnitude - cheats.toString(shares), ", ", // amount each staker deposits - cheats.toString(operatorSharesAfter), ", ", // operator shares after all slashing and deposits - cheats.toString(totalWithdrawableShares), ", ", // total withdrawable shares from all stakers - cheats.toString(stdMath.delta(operatorSharesAfter, totalWithdrawableShares)) // delta difference between opShares and total withdrawable - )) + string( + abi.encodePacked( + cheats.toString(initMagnitude), + ", ", // initial magnitude + cheats.toString(shares), + ", ", // amount each staker deposits + cheats.toString(operatorSharesAfter), + ", ", // operator shares after all slashing and deposits + cheats.toString(totalWithdrawableShares), + ", ", // total withdrawable shares from all stakers + cheats.toString(stdMath.delta(operatorSharesAfter, totalWithdrawableShares)) // delta difference between opShares and total withdrawable + ) + ) ); } } @@ -8196,7 +7955,7 @@ contract DelegationManagerUnitTests_SharesUnderflowChecks is DelegationManagerUn // register *this contract* as an operator _registerOperatorWithBaseDetails(defaultOperator); _setOperatorMagnitude(defaultOperator, strategyMock, initMagnitude); - + // Set the staker deposits in the strategies IStrategy[] memory strategies = strategyMock.toArray(); uint256[] memory sharesToSet = new uint256[](1); @@ -8207,7 +7966,6 @@ contract DelegationManagerUnitTests_SharesUnderflowChecks is DelegationManagerUn address[] memory stakers = new address[](numStakers); // deposit all stakers one time for (uint256 i = 0; i < numStakers; ++i) { - // 1. deposit and delegate new staker stakers[i] = random().Address(); strategyManagerMock.setDeposits(stakers[i], strategies, sharesToSet); @@ -8218,7 +7976,6 @@ contract DelegationManagerUnitTests_SharesUnderflowChecks is DelegationManagerUn uint64 currMagnitude = initMagnitude; { for (uint256 i = 0; i < numStakers; ++i) { - // 2. slash operator for 100 magnitude uint64 slashMagnitude = 1; currMagnitude -= slashMagnitude; @@ -8236,7 +7993,7 @@ contract DelegationManagerUnitTests_SharesUnderflowChecks is DelegationManagerUn uint256 operatorSharesAfter = delegationManager.operatorShares(defaultOperator, strategyMock); uint256 totalWithdrawableShares = 0; for (uint256 i = 0; i < numStakers; ++i) { - (uint256[] memory withdrawableShares, ) = delegationManager.getWithdrawableShares(stakers[i], strategies); + (uint256[] memory withdrawableShares,) = delegationManager.getWithdrawableShares(stakers[i], strategies); totalWithdrawableShares += withdrawableShares[0]; } assertLe( @@ -8248,13 +8005,19 @@ contract DelegationManagerUnitTests_SharesUnderflowChecks is DelegationManagerUn if (cheats.envOr("WRITE_CSV_TESTS", false)) { cheats.writeLine( "./test6.csv", - string(abi.encodePacked( - cheats.toString(initMagnitude), ", ", // initial magnitude - cheats.toString(shares), ", ", // amount each staker deposits - cheats.toString(operatorSharesAfter), ", ", // operator shares after all slashing and deposits - cheats.toString(totalWithdrawableShares), ", ", // total withdrawable shares from all stakers - cheats.toString(stdMath.delta(operatorSharesAfter, totalWithdrawableShares)) // delta difference between opShares and total withdrawable - )) + string( + abi.encodePacked( + cheats.toString(initMagnitude), + ", ", // initial magnitude + cheats.toString(shares), + ", ", // amount each staker deposits + cheats.toString(operatorSharesAfter), + ", ", // operator shares after all slashing and deposits + cheats.toString(totalWithdrawableShares), + ", ", // total withdrawable shares from all stakers + cheats.toString(stdMath.delta(operatorSharesAfter, totalWithdrawableShares)) // delta difference between opShares and total withdrawable + ) + ) ); } } @@ -8264,25 +8027,26 @@ contract DelegationManagerUnitTests_Rounding is DelegationManagerUnitTests {} /** * @notice TODO Lifecycle tests - These tests combine multiple functionalities of the DelegationManager - 1. Old SigP test - registerAsOperator, separate staker delegate to operator, as operator undelegate (reverts), - checks that staker is still delegated and operator still registered, staker undelegates, checks staker not delegated and operator - is still registered - 2. RegisterOperator, Deposit, Delegate, Queue, Complete - 3. RegisterOperator, Mock Slash(set maxMagnitudes), Deposit/Delegate, Queue, Complete - 4. RegisterOperator, Deposit/Delegate, Mock Slash(set maxMagnitudes), Queue, Complete - 5. RegisterOperator, Mock Slash(set maxMagnitudes), Deposit/Delegate, Queue, Mock Slash(set maxMagnitudes), Complete - 7. RegisterOperator, Deposit/Delegate, Mock Slash 100% (set maxMagnitudes), Undelegate, Complete non 100% slashed strategies - 8. RegisterOperator, Deposit/Delegate, Undelegate, Re delegate to another operator, Mock Slash 100% (set maxMagnitudes), Complete as shares - (withdrawals should have been slashed even though delegated to a new operator) - 9. Invariant check getWithdrawableShares = sum(deposits), Multiple deposits with operator who has never been slashed - 10. Invariant check getWithdrawableShares = sum(deposits), Multiple deposits with operator who HAS been been slashed + * 1. Old SigP test - registerAsOperator, separate staker delegate to operator, as operator undelegate (reverts), + * checks that staker is still delegated and operator still registered, staker undelegates, checks staker not delegated and operator + * is still registered + * 2. RegisterOperator, Deposit, Delegate, Queue, Complete + * 3. RegisterOperator, Mock Slash(set maxMagnitudes), Deposit/Delegate, Queue, Complete + * 4. RegisterOperator, Deposit/Delegate, Mock Slash(set maxMagnitudes), Queue, Complete + * 5. RegisterOperator, Mock Slash(set maxMagnitudes), Deposit/Delegate, Queue, Mock Slash(set maxMagnitudes), Complete + * 7. RegisterOperator, Deposit/Delegate, Mock Slash 100% (set maxMagnitudes), Undelegate, Complete non 100% slashed strategies + * 8. RegisterOperator, Deposit/Delegate, Undelegate, Re delegate to another operator, Mock Slash 100% (set maxMagnitudes), Complete as shares + * (withdrawals should have been slashed even though delegated to a new operator) + * 9. Invariant check getWithdrawableShares = sum(deposits), Multiple deposits with operator who has never been slashed + * 10. Invariant check getWithdrawableShares = sum(deposits), Multiple deposits with operator who HAS been been slashed */ - contract DelegationManagerUnitTests_Lifecycle is DelegationManagerUnitTests { using ArrayLib for *; // 2. RegisterOperator, Deposit, Delegate, Queue, Complete - function test_register_operator_deposit_delegate_queue_complete(Randomness r) public rand(r) { + function test_register_operator_deposit_delegate_queue_complete( + Randomness r + ) public rand(r) { address operator = r.Address(); address staker = r.Address(); IStrategy[] memory strategies = strategyMock.toArray(); @@ -8293,10 +8057,10 @@ contract DelegationManagerUnitTests_Lifecycle is DelegationManagerUnitTests { // 2) Mock deposit into SM. strategyManagerMock.setDeposits(staker, strategies, depositShares); - + // 3) Staker delegates to operator. _delegateToOperatorWhoAcceptsAllStakers(staker, operator); - + // 3) Staker queues withdrawals. QueuedWithdrawalParams[] memory queuedWithdrawalParams = new QueuedWithdrawalParams[](1); queuedWithdrawalParams[0] = QueuedWithdrawalParams({ @@ -8323,13 +8087,17 @@ contract DelegationManagerUnitTests_Lifecycle is DelegationManagerUnitTests { cheats.roll(block.number + delegationManager.minWithdrawalDelayBlocks() + 1); cheats.prank(staker); - delegationManager.completeQueuedWithdrawal(withdrawal, tokenMock.toArray(), false); + delegationManager.completeQueuedWithdrawal(withdrawal, tokenMock.toArray(), false); assertFalse(delegationManager.pendingWithdrawals(withdrawalRoot), "withdrawalRoot should not be pending"); // Checks - assertEq(delegationManager.cumulativeWithdrawalsQueued(staker), 1, "staker nonce should have incremented"); - assertEq(delegationManager.operatorShares(operator, strategies[0]), 100 ether, "operator shares should be 0 after withdrawal"); + assertEq(delegationManager.cumulativeWithdrawalsQueued(staker), 1, "staker nonce should have incremented"); + assertEq( + delegationManager.operatorShares(operator, strategies[0]), + 100 ether, + "operator shares should be 0 after withdrawal" + ); } /** @@ -8366,11 +8134,7 @@ contract DelegationManagerUnitTests_Lifecycle is DelegationManagerUnitTests { assertEq(operatorSharesAfterSlash, 0, "operator shares not fully slashed"); } - ( - , - Withdrawal memory withdrawal, - bytes32 withdrawalRoot - ) = _setUpQueueWithdrawalsSingleStrat({ + (, Withdrawal memory withdrawal, bytes32 withdrawalRoot) = _setUpQueueWithdrawalsSingleStrat({ staker: defaultStaker, strategy: strategy, depositSharesToWithdraw: shares @@ -8380,20 +8144,10 @@ contract DelegationManagerUnitTests_Lifecycle is DelegationManagerUnitTests { assertEq(depositScalingFactor, WAD, "bad test setup"); // Get withdrawable and deposit shares { - ( - uint256[] memory withdrawableSharesBefore, - uint256[] memory depositSharesBefore - ) = delegationManager.getWithdrawableShares(defaultStaker, strategyArray); - assertEq( - withdrawableSharesBefore[0], - 0, - "withdrawable shares should be 0 after being slashed fully" - ); - assertEq( - depositSharesBefore[0], - shares, - "deposit shares should be unchanged after being slashed fully" - ); + (uint256[] memory withdrawableSharesBefore, uint256[] memory depositSharesBefore) = + delegationManager.getWithdrawableShares(defaultStaker, strategyArray); + assertEq(withdrawableSharesBefore[0], 0, "withdrawable shares should be 0 after being slashed fully"); + assertEq(depositSharesBefore[0], shares, "deposit shares should be unchanged after being slashed fully"); } // Undelegate the staker @@ -8422,11 +8176,11 @@ contract DelegationManagerUnitTests_Lifecycle is DelegationManagerUnitTests { assertFalse(delegationManager.isDelegated(defaultStaker), "staker not undelegated"); // Checks - operator & staker shares - assertEq(delegationManager.operatorShares(defaultOperator, strategy), 0, "operator shares not decreased correctly"); - ( - uint256[] memory stakerWithdrawableShares, - uint256[] memory depositShares - ) = delegationManager.getWithdrawableShares(defaultStaker, strategyArray); + assertEq( + delegationManager.operatorShares(defaultOperator, strategy), 0, "operator shares not decreased correctly" + ); + (uint256[] memory stakerWithdrawableShares, uint256[] memory depositShares) = + delegationManager.getWithdrawableShares(defaultStaker, strategyArray); assertEq(stakerWithdrawableShares[0], 0, "staker withdrawable shares not calculated correctly"); assertEq(depositShares[0], 0, "staker deposit shares not reset correctly"); @@ -8435,7 +8189,8 @@ contract DelegationManagerUnitTests_Lifecycle is DelegationManagerUnitTests { _registerOperatorWithBaseDetails(newOperator); _delegateToOperatorWhoAcceptsAllStakers(defaultStaker, newOperator); - (stakerWithdrawableShares, depositShares) = delegationManager.getWithdrawableShares(defaultStaker, strategyArray); + (stakerWithdrawableShares, depositShares) = + delegationManager.getWithdrawableShares(defaultStaker, strategyArray); assertEq(stakerWithdrawableShares[0], 0, "staker withdrawable shares not calculated correctly"); assertEq(depositShares[0], 0, "staker deposit shares not reset correctly"); @@ -8443,7 +8198,8 @@ contract DelegationManagerUnitTests_Lifecycle is DelegationManagerUnitTests { cheats.prank(defaultStaker); delegationManager.completeQueuedWithdrawal(withdrawal, tokenMock.toArray(), false); - (stakerWithdrawableShares, depositShares) = delegationManager.getWithdrawableShares(defaultStaker, strategyArray); + (stakerWithdrawableShares, depositShares) = + delegationManager.getWithdrawableShares(defaultStaker, strategyArray); assertEq(stakerWithdrawableShares[0], 0, "staker withdrawable shares not calculated correctly"); assertEq(depositShares[0], 0, "staker deposit shares not reset correctly"); assertEq(delegationManager.operatorShares(newOperator, strategy), 0, "new operator shares should be unchanged"); @@ -8454,7 +8210,7 @@ contract DelegationManagerUnitTests_ConvertToDepositShares is DelegationManagerU using ArrayLib for *; function test_convertToDepositShares_noSlashing() public { - uint shares = 100 ether; + uint256 shares = 100 ether; // Set the staker deposits in the strategies strategyManagerMock.addDeposit(defaultStaker, strategyMock, shares); @@ -8471,9 +8227,9 @@ contract DelegationManagerUnitTests_ConvertToDepositShares is DelegationManagerU // register *this contract* as an operator _registerOperatorWithBaseDetails(defaultOperator); _delegateToOperatorWhoAcceptsAllStakers(defaultStaker, defaultOperator); - _setOperatorMagnitude(defaultOperator, strategyMock, WAD/3); + _setOperatorMagnitude(defaultOperator, strategyMock, WAD / 3); - _checkDepositSharesConvertCorrectly(strategies, shares); + _checkDepositSharesConvertCorrectly(strategies, shares); // queue and complete a withdrawal for half the deposit shares (uint256[] memory withdrawableShares,) = delegationManager.getWithdrawableShares(defaultStaker, strategies); @@ -8497,12 +8253,12 @@ contract DelegationManagerUnitTests_ConvertToDepositShares is DelegationManagerU // delegate to an operator and slash _registerOperatorWithBaseDetails(defaultOperator); _delegateToOperatorWhoAcceptsAllStakers(defaultStaker, defaultOperator); - _setOperatorMagnitude(defaultOperator, beaconChainETHStrategy, WAD/3); + _setOperatorMagnitude(defaultOperator, beaconChainETHStrategy, WAD / 3); _checkDepositSharesConvertCorrectly(strategies, shares); // slash on beacon chain by 1/3 - _decreaseBeaconChainShares(defaultStaker, int256(shares[0]), shares[0]/3); + _decreaseBeaconChainShares(defaultStaker, int256(shares[0]), shares[0] / 3); _checkDepositSharesConvertCorrectly(strategies, shares); @@ -8515,20 +8271,21 @@ contract DelegationManagerUnitTests_ConvertToDepositShares is DelegationManagerU _checkDepositSharesConvertCorrectly(strategies, shares); } - function _checkDepositSharesConvertCorrectly(IStrategy[] memory strategies, uint256[] memory expectedDepositShares) public view { + function _checkDepositSharesConvertCorrectly( + IStrategy[] memory strategies, + uint256[] memory expectedDepositShares + ) public view { (uint256[] memory withdrawableShares,) = delegationManager.getWithdrawableShares(defaultStaker, strategies); // get the deposit shares - uint256[] memory depositShares = delegationManager.convertToDepositShares(defaultStaker, strategies, withdrawableShares); + uint256[] memory depositShares = + delegationManager.convertToDepositShares(defaultStaker, strategies, withdrawableShares); for (uint256 i = 0; i < strategies.length; i++) { assertApproxEqRel( - expectedDepositShares[i], - depositShares[i], - APPROX_REL_DIFF, - "deposit shares not converted correctly" + expectedDepositShares[i], depositShares[i], APPROX_REL_DIFF, "deposit shares not converted correctly" ); - // make sure that the deposit shares are less than or equal to the shares, + // make sure that the deposit shares are less than or equal to the shares, // so this value is sane to input into `completeQueuedWithdrawals` assertLe( depositShares[i], @@ -8540,12 +8297,13 @@ contract DelegationManagerUnitTests_ConvertToDepositShares is DelegationManagerU // get the deposit shares uint256[] memory oneThirdWithdrawableShares = new uint256[](strategies.length); for (uint256 i = 0; i < strategies.length; i++) { - oneThirdWithdrawableShares[i] = withdrawableShares[i]/3; + oneThirdWithdrawableShares[i] = withdrawableShares[i] / 3; } - uint256[] memory oneThirdDepositShares = delegationManager.convertToDepositShares(defaultStaker, strategies, oneThirdWithdrawableShares); + uint256[] memory oneThirdDepositShares = + delegationManager.convertToDepositShares(defaultStaker, strategies, oneThirdWithdrawableShares); for (uint256 i = 0; i < strategies.length; i++) { assertApproxEqRel( - expectedDepositShares[i]/3, + expectedDepositShares[i] / 3, oneThirdDepositShares[i], APPROX_REL_DIFF, "deposit shares not converted correctly" @@ -8554,11 +8312,8 @@ contract DelegationManagerUnitTests_ConvertToDepositShares is DelegationManagerU } function _queueAndCompleteWithdrawalForSingleStrategy(IStrategy strategy, uint256 shares) public { - (QueuedWithdrawalParams[] memory queuedWithdrawalParams, Withdrawal memory withdrawal,) = _setUpQueueWithdrawalsSingleStrat({ - staker: defaultStaker, - strategy: strategy, - depositSharesToWithdraw: shares - }); + (QueuedWithdrawalParams[] memory queuedWithdrawalParams, Withdrawal memory withdrawal,) = + _setUpQueueWithdrawalsSingleStrat({staker: defaultStaker, strategy: strategy, depositSharesToWithdraw: shares}); cheats.prank(defaultStaker); delegationManager.queueWithdrawals(queuedWithdrawalParams); @@ -8573,17 +8328,17 @@ contract DelegationManagerUnitTests_getQueuedWithdrawals is DelegationManagerUni using ArrayLib for *; using SlashingLib for *; - function _withdrawalRoot(Withdrawal memory withdrawal) internal pure returns (bytes32) { + function _withdrawalRoot( + Withdrawal memory withdrawal + ) internal pure returns (bytes32) { return keccak256(abi.encode(withdrawal)); } - function test_getQueuedWithdrawals_Correctness(Randomness r) public rand(r) { + function test_getQueuedWithdrawals_Correctness( + Randomness r + ) public rand(r) { uint256 numStrategies = r.Uint256(2, 8); - uint256[] memory depositShares = r.Uint256Array({ - len: numStrategies, - min: 2, - max: 100 ether - }); + uint256[] memory depositShares = r.Uint256Array({len: numStrategies, min: 2, max: 100 ether}); IStrategy[] memory strategies = _deployAndDepositIntoStrategies(defaultStaker, depositShares, false); _registerOperatorWithBaseDetails(defaultOperator); @@ -8599,28 +8354,26 @@ contract DelegationManagerUnitTests_getQueuedWithdrawals is DelegationManagerUni } // Queue withdrawals. - ( - QueuedWithdrawalParams[] memory queuedWithdrawalParams, - Withdrawal memory withdrawal, - bytes32 withdrawalRoot - ) = _setUpQueueWithdrawals({ - staker: defaultStaker, - strategies: strategies, - depositWithdrawalAmounts: depositShares - }); + (QueuedWithdrawalParams[] memory queuedWithdrawalParams, Withdrawal memory withdrawal, bytes32 withdrawalRoot) = + _setUpQueueWithdrawals({staker: defaultStaker, strategies: strategies, depositWithdrawalAmounts: depositShares}); cheats.prank(defaultStaker); delegationManager.queueWithdrawals(queuedWithdrawalParams); - + // Get queued withdrawals. - (Withdrawal[] memory withdrawals, uint256[][] memory shares) = delegationManager.getQueuedWithdrawals(defaultStaker); + (Withdrawal[] memory withdrawals, uint256[][] memory shares) = + delegationManager.getQueuedWithdrawals(defaultStaker); // Checks for (uint256 i; i < strategies.length; ++i) { uint256 newStakerShares = depositShares[i] / 2; assertApproxEqAbs(shares[0][i], newStakerShares, 1, "staker shares should be decreased by half +- 1"); } - - assertEq(_withdrawalRoot(withdrawal), _withdrawalRoot(withdrawals[0]), "_withdrawalRoot(withdrawal) != _withdrawalRoot(withdrawals[0])"); + + assertEq( + _withdrawalRoot(withdrawal), + _withdrawalRoot(withdrawals[0]), + "_withdrawalRoot(withdrawal) != _withdrawalRoot(withdrawals[0])" + ); assertEq(_withdrawalRoot(withdrawal), withdrawalRoot, "_withdrawalRoot(withdrawal) != withdrawalRoot"); } @@ -8632,7 +8385,7 @@ contract DelegationManagerUnitTests_getQueuedWithdrawals is DelegationManagerUni _registerOperatorWithBaseDetails(defaultOperator); strategyManagerMock.addDeposit(defaultStaker, strategyMock, totalDepositShares); _delegateToOperatorWhoAcceptsAllStakers(defaultStaker, defaultOperator); - + uint256 newStakerShares = totalDepositShares / 2; _setOperatorMagnitude(defaultOperator, strategyMock, 0.5 ether); cheats.prank(address(allocationManagerMock)); @@ -8661,14 +8414,15 @@ contract DelegationManagerUnitTests_getQueuedWithdrawals is DelegationManagerUni ) = _setUpQueueWithdrawalsSingleStrat({ staker: defaultStaker, strategy: strategyMock, - depositSharesToWithdraw: totalDepositShares / 2 + depositSharesToWithdraw: totalDepositShares / 2 }); cheats.prank(defaultStaker); delegationManager.queueWithdrawals(queuedWithdrawalParams1); // Get queued withdrawals. - (Withdrawal[] memory withdrawals, uint256[][] memory shares) = delegationManager.getQueuedWithdrawals(defaultStaker); + (Withdrawal[] memory withdrawals, uint256[][] memory shares) = + delegationManager.getQueuedWithdrawals(defaultStaker); // Sanity assertEq(withdrawals.length, 2, "withdrawal.length != 2"); @@ -8690,7 +8444,9 @@ contract DelegationManagerUnitTests_getQueuedWithdrawals is DelegationManagerUni * expected withdrawn shares from the view function. * Slashing on the completableBlock of the withdrawal should have no affect on the withdrawn shares. */ - function test_getQueuedWithdrawals_SlashAfterWithdrawalCompletion(Randomness r) public rand(r) { + function test_getQueuedWithdrawals_SlashAfterWithdrawalCompletion( + Randomness r + ) public rand(r) { uint256 depositAmount = r.Uint256(1, MAX_STRATEGY_SHARES); // Deposit Staker @@ -8701,11 +8457,8 @@ contract DelegationManagerUnitTests_getQueuedWithdrawals is DelegationManagerUni _delegateToOperatorWhoAcceptsAllStakers(defaultStaker, defaultOperator); // Queue withdrawal - ( - QueuedWithdrawalParams[] memory queuedWithdrawalParams, - Withdrawal memory withdrawal, - bytes32 withdrawalRoot - ) = _setUpQueueWithdrawalsSingleStrat({ + (QueuedWithdrawalParams[] memory queuedWithdrawalParams, Withdrawal memory withdrawal, bytes32 withdrawalRoot) = + _setUpQueueWithdrawalsSingleStrat({ staker: defaultStaker, strategy: strategyMock, depositSharesToWithdraw: depositAmount @@ -8732,7 +8485,7 @@ contract DelegationManagerUnitTests_getQueuedWithdrawals is DelegationManagerUni // Slash operator 50% while staker has queued withdrawal { uint256 operatorSharesAfterQueue = delegationManager.operatorShares(defaultOperator, strategyMock); - (uint256 sharesToDecrement, ) = _calcSlashedAmount({ + (uint256 sharesToDecrement,) = _calcSlashedAmount({ operatorShares: operatorSharesAfterQueue, prevMaxMagnitude: uint64(WAD), newMaxMagnitude: 50e16 @@ -8750,7 +8503,8 @@ contract DelegationManagerUnitTests_getQueuedWithdrawals is DelegationManagerUni // Assert that the getQueuedWithdrawals returns shares that are halved as a result of being slashed 50% { - (Withdrawal[] memory withdrawals, uint256[][] memory shares) = delegationManager.getQueuedWithdrawals(defaultStaker); + (Withdrawal[] memory withdrawals, uint256[][] memory shares) = + delegationManager.getQueuedWithdrawals(defaultStaker); assertEq(withdrawals.length, 1, "withdrawals.length != 1"); assertEq(withdrawals[0].strategies.length, 1, "withdrawals[0].strategies.length != 1"); assertEq(shares[0][0], depositAmount / 2, "shares[0][0] != depositAmount / 2"); @@ -8763,11 +8517,8 @@ contract DelegationManagerUnitTests_getQueuedWithdrawals is DelegationManagerUni // slash operator 50% again { uint256 operatorShares = delegationManager.operatorShares(defaultOperator, strategyMock); - (uint256 sharesToDecrement, ) = _calcSlashedAmount({ - operatorShares: operatorShares, - prevMaxMagnitude: 50e16, - newMaxMagnitude: 25e16 - }); + (uint256 sharesToDecrement,) = + _calcSlashedAmount({operatorShares: operatorShares, prevMaxMagnitude: 50e16, newMaxMagnitude: 25e16}); _setOperatorMagnitude(defaultOperator, strategyMock, 25e16); cheats.prank(address(allocationManagerMock)); delegationManager.slashOperatorShares(defaultOperator, withdrawal.strategies[0], 50e16, 25e16); @@ -8784,7 +8535,8 @@ contract DelegationManagerUnitTests_getQueuedWithdrawals is DelegationManagerUni uint256 expectedSharesIncrease = depositAmount / 2; uint256 queuedWithdrawableShares; { - (Withdrawal[] memory withdrawals, uint256[][] memory shares) = delegationManager.getQueuedWithdrawals(defaultStaker); + (Withdrawal[] memory withdrawals, uint256[][] memory shares) = + delegationManager.getQueuedWithdrawals(defaultStaker); queuedWithdrawableShares = shares[0][0]; assertEq(withdrawals.length, 1, "withdrawals.length != 1"); assertEq(withdrawals[0].strategies.length, 1, "withdrawals[0].strategies.length != 1"); @@ -8792,10 +8544,12 @@ contract DelegationManagerUnitTests_getQueuedWithdrawals is DelegationManagerUni } // Complete queued Withdrawal with shares added back. Since total deposit slashed by 50% and not 75% - (uint256[] memory withdrawableSharesBefore, ) = delegationManager.getWithdrawableShares(defaultStaker, withdrawal.strategies); + (uint256[] memory withdrawableSharesBefore,) = + delegationManager.getWithdrawableShares(defaultStaker, withdrawal.strategies); cheats.prank(defaultStaker); delegationManager.completeQueuedWithdrawal(withdrawal, tokenMock.toArray(), false); - (uint256[] memory withdrawableSharesAfter, ) = delegationManager.getWithdrawableShares(defaultStaker, withdrawal.strategies); + (uint256[] memory withdrawableSharesAfter,) = + delegationManager.getWithdrawableShares(defaultStaker, withdrawal.strategies); // Added shares assertEq( @@ -8808,11 +8562,7 @@ contract DelegationManagerUnitTests_getQueuedWithdrawals is DelegationManagerUni queuedWithdrawableShares, "expectedSharesIncrease should be equal to queuedWithdrawableShares" ); - assertEq( - block.number, - completableBlock, - "block.number should be the completableBlock" - ); + assertEq(block.number, completableBlock, "block.number should be the completableBlock"); } function test_getQueuedWithdrawals_UsesCorrectOperatorMagnitude() public { diff --git a/src/test/unit/mixins/SignatureUtilsUnit.t.sol b/src/test/unit/mixins/SignatureUtilsUnit.t.sol index 7600a2cabb..f5f3183c4c 100644 --- a/src/test/unit/mixins/SignatureUtilsUnit.t.sol +++ b/src/test/unit/mixins/SignatureUtilsUnit.t.sol @@ -89,8 +89,7 @@ contract SignatureUtilsUnit is Test { harness.checkIsValidSignatureNow(signer, digest, abi.encode(r, s, v), block.timestamp - 1); } - function test_Revert_checkIsValidSignatureNow_InvalidSignature() public { - vm.expectRevert(ISignatureUtils.InvalidSignature.selector); - harness.checkIsValidSignatureNow(signer, digest, "", block.timestamp); - } + // function testFail_checkIsValidSignatureNow_InvalidSignature() public { + // _checkIsValidSignatureNow(signer, digest, "", block.timestamp); + // } } \ No newline at end of file From bdd4415365ccc744205cb310209f86e853ec91f5 Mon Sep 17 00:00:00 2001 From: "clandestine.eth" <96172957+0xClandestine@users.noreply.github.com> Date: Fri, 14 Feb 2025 12:36:24 -0500 Subject: [PATCH 25/35] docs: upgrades can invalidate permissions (#1096) **Motivation:** Audit report flagged that function selector-based permissions may break on upgrades. This PR documents the limitation and its implications while improving NatSpec for clarity. (EGSL-15) **Modifications:** - Documented function selector upgrade invalidations. - Improved NatSpec comments in `IPermissionController`. **Result:** Clearer documentation on function selector limitations and enhanced NatSpec for better code clarity. --- .../interfaces/IPermissionController.sol | 142 ++++++++++-------- 1 file changed, 78 insertions(+), 64 deletions(-) diff --git a/src/contracts/interfaces/IPermissionController.sol b/src/contracts/interfaces/IPermissionController.sol index 6881289355..82940dafa1 100644 --- a/src/contracts/interfaces/IPermissionController.sol +++ b/src/contracts/interfaces/IPermissionController.sol @@ -2,141 +2,154 @@ pragma solidity ^0.8.27; interface IPermissionControllerErrors { - /// @notice Thrown when the caller is not the admin + /// @notice Thrown when a non-admin caller attempts to perform an admin-only action. error NotAdmin(); - /// @notice Thrown when the admin to remove is not an admin + /// @notice Thrown when attempting to remove an admin that does not exist. error AdminNotSet(); - /// @notice Thrown when an appointee is already set for the account's function + /// @notice Thrown when attempting to set an appointee for a function that already has one. error AppointeeAlreadySet(); - /// @notice Thrown when an appointee is not set for the account's function + /// @notice Thrown when attempting to interact with a non-existent appointee. error AppointeeNotSet(); - /// @notice Thrown when the account attempts to remove the only admin + /// @notice Thrown when attempting to remove the last remaining admin. error CannotHaveZeroAdmins(); - /// @notice Thrown when an admin is already set + /// @notice Thrown when attempting to set an admin that is already registered. error AdminAlreadySet(); - /// @notice Thrown when an admin is not pending + /// @notice Thrown when attempting to interact with an admin that is not in pending status. error AdminNotPending(); - /// @notice Thrown when an admin is already pending + /// @notice Thrown when attempting to add an admin that is already pending. error AdminAlreadyPending(); } interface IPermissionControllerEvents { - /// @notice Emitted when an appointee is set + /// @notice Emitted when an appointee is set for an account to handle specific function calls. event AppointeeSet(address indexed account, address indexed appointee, address target, bytes4 selector); - /// @notice Emitted when an appointee is revoked + /// @notice Emitted when an appointee's permission to handle function calls for an account is revoked. event AppointeeRemoved(address indexed account, address indexed appointee, address target, bytes4 selector); - /// @notice Emitted when an admin is set as pending for an account + /// @notice Emitted when an address is set as a pending admin for an account, requiring acceptance. event PendingAdminAdded(address indexed account, address admin); - /// @notice Emitted when an admin is removed as pending for an account + /// @notice Emitted when a pending admin status is removed for an account before acceptance. event PendingAdminRemoved(address indexed account, address admin); - /// @notice Emitted when an admin is set for a given account + /// @notice Emitted when an address accepts and becomes an active admin for an account. event AdminSet(address indexed account, address admin); - /// @notice Emitted when an admin is removed for a given account + /// @notice Emitted when an admin's permissions are removed from an account. event AdminRemoved(address indexed account, address admin); } interface IPermissionController is IPermissionControllerErrors, IPermissionControllerEvents { /** - * @notice Sets a pending admin of an account - * @param account to set pending admin for - * @param admin to set - * @dev Multiple admins can be set for an account + * @notice Sets a pending admin for an account. + * @param account The account to set the pending admin for. + * @param admin The address to set as pending admin. + * @dev The pending admin must accept the role before becoming an active admin. + * @dev Multiple admins can be set for a single account. */ function addPendingAdmin(address account, address admin) external; /** - * @notice Removes a pending admin of an account - * @param account to remove pending admin for - * @param admin to remove - * @dev Only the admin of the account can remove a pending admin + * @notice Removes a pending admin from an account before they have accepted the role. + * @param account The account to remove the pending admin from. + * @param admin The pending admin address to remove. + * @dev Only an existing admin of the account can remove a pending admin. */ function removePendingAdmin(address account, address admin) external; /** - * @notice Accepts the admin role of an account - * @param account to accept admin for - * @dev Only a pending admin for the account can become an admin + * @notice Allows a pending admin to accept their admin role for an account. + * @param account The account to accept the admin role for. + * @dev Only addresses that were previously set as pending admins can accept the role. */ function acceptAdmin( address account ) external; /** - * @notice Remove an admin of an account - * @param account to remove admin for - * @param admin to remove - * @dev Only the admin of the account can remove an admin - * @dev Reverts when an admin is removed such that no admins are remaining + * @notice Removes an active admin from an account. + * @param account The account to remove the admin from. + * @param admin The admin address to remove. + * @dev Only an existing admin of the account can remove another admin. + * @dev Will revert if removing this admin would leave the account with zero admins. */ function removeAdmin(address account, address admin) external; /** - * @notice Set an appointee for a given account - * @param account to set appointee for - * @param appointee to set - * @param target to set appointee for - * @param selector to set appointee for - * @dev Only the admin of the account can set an appointee + * @notice Sets an appointee who can call specific functions on behalf of an account. + * @param account The account to set the appointee for. + * @param appointee The address to be given permission. + * @param target The contract address the appointee can interact with. + * @param selector The function selector the appointee can call. + * @dev Only an admin of the account can set appointees. */ function setAppointee(address account, address appointee, address target, bytes4 selector) external; /** - * Removes an appointee for a given account - * @param account to remove appointee for - * @param appointee to remove - * @param target to remove appointee for - * @param selector to remove appointee for - * @dev Only the admin of the account can remove an appointee + * @notice Removes an appointee's permission to call a specific function. + * @param account The account to remove the appointee from. + * @param appointee The appointee address to remove. + * @param target The contract address to remove permissions for. + * @param selector The function selector to remove permissions for. + * @dev Only an admin of the account can remove appointees. */ function removeAppointee(address account, address appointee, address target, bytes4 selector) external; /** - * @notice Checks if the given caller is an admin of the account - * @dev If the account has no admin, the caller is checked to be the account itself + * @notice Checks if a given address is an admin of an account. + * @param account The account to check admin status for. + * @param caller The address to check. + * @dev If the account has no admins, returns true only if the caller is the account itself. + * @return Returns true if the caller is an admin, false otherwise. */ function isAdmin(address account, address caller) external view returns (bool); /** - * @notice Checks if the `pendingAdmin` is a pending admin of the `account` + * @notice Checks if an address is currently a pending admin for an account. + * @param account The account to check pending admin status for. + * @param pendingAdmin The address to check. + * @return Returns true if the address is a pending admin, false otherwise. */ function isPendingAdmin(address account, address pendingAdmin) external view returns (bool); /** - * @notice Get the admins of an account - * @param account The account to get the admin of - * @dev If the account has no admin, the account itself is returned + * @notice Retrieves all active admins for an account. + * @param account The account to get the admins for. + * @dev If the account has no admins, returns an array containing only the account address. + * @return An array of admin addresses. */ function getAdmins( address account ) external view returns (address[] memory); /** - * @notice Get the pending admins of an account - * @param account The account to get the pending admin of + * @notice Retrieves all pending admins for an account. + * @param account The account to get the pending admins for. + * @return An array of pending admin addresses. */ function getPendingAdmins( address account ) external view returns (address[] memory); /** - * @notice Checks if the given caller has permissions to call the function - * @param account to check - * @param caller to check permission for - * @param target to check permission for - * @param selector to check permission for - * @dev Returns `true` if the admin OR the appointee is the caller + * @notice Checks if a caller has permission to call a specific function. + * @param account The account to check permissions for. + * @param caller The address attempting to make the call. + * @param target The contract address being called. + * @param selector The function selector being called. + * @dev Returns true if the caller is either an admin or an appointed caller. + * @dev Be mindful that upgrades to the contract may invalidate the appointee's permissions. + * This is only possible if a function's selector changes (e.g. if a function's parameters are modified). + * @return Returns true if the caller has permission, false otherwise. */ function canCall(address account, address caller, address target, bytes4 selector) external returns (bool); /** - * @notice Gets the list of permissions of an appointee for a given account - * @param account to get appointee permissions for - * @param appointee to get permissions + * @notice Retrieves all permissions granted to an appointee for a given account. + * @param account The account to check appointee permissions for. + * @param appointee The appointee address to check. + * @return Two arrays: target contract addresses and their corresponding function selectors. */ function getAppointeePermissions( address account, @@ -144,11 +157,12 @@ interface IPermissionController is IPermissionControllerErrors, IPermissionContr ) external returns (address[] memory, bytes4[] memory); /** - * @notice Returns the list of appointees for a given account and function - * @param account to get appointees for - * @param target to get appointees for - * @param selector to get appointees for - * @dev Does NOT include admin as an appointee, even though it can call + * @notice Retrieves all appointees that can call a specific function for an account. + * @param account The account to get appointees for. + * @param target The contract address to check. + * @param selector The function selector to check. + * @dev Does not include admins in the returned list, even though they have calling permission. + * @return An array of appointee addresses. */ function getAppointees(address account, address target, bytes4 selector) external returns (address[] memory); } From 5bc53cda9cb27caa95c3de28d87cab7810362677 Mon Sep 17 00:00:00 2001 From: "clandestine.eth" <96172957+0xClandestine@users.noreply.github.com> Date: Fri, 14 Feb 2025 14:46:46 -0500 Subject: [PATCH 26/35] fix: signature utils (#1015) - *Dynamic Domain Separator:* `SignatureUtils.domainSeparator()` is now recomputed for each signature verification. This eliminates the need for storing initial values in storage or as immutables, which is important for beacon proxy support. - ~*Version Bump Command:* Introduced `make bump-version VERSION=2`, which automatically updates the version function's return values.~ - *Version Fn + Constructor Param:* Adds an immutable oz `ShortString` that's set in the constructor. --- Makefile | 6 +- .../deploy_from_scratch.anvil.config.json | 3 +- .../deploy_from_scratch.holesky.config.json | 5 +- ..._from_scratch.holesky.slashing.config.json | 3 +- .../deploy_from_scratch.anvil.config.json | 3 +- ...oy_from_scratch.slashing.anvil.config.json | 3 +- .../mainnet/mainnet-addresses.config.json | 3 +- .../deploy/devnet/deploy_from_scratch.s.sol | 63 +++++-- script/deploy/local/Deploy_From_Scratch.s.sol | 59 +++++-- .../local/deploy_from_scratch.slashing.s.sol | 60 +++++-- script/releases/v1.1.0-slashing/1-eoa.s.sol | 152 ---------------- .../releases/v1.1.0-slashing/2-multisig.s.sol | 83 --------- .../releases/v1.1.0-slashing/3-execute.s.sol | 128 -------------- script/releases/v1.1.0-slashing/upgrade.json | 19 -- script/releases/v1.1.1-slashing/1-eoa.s.sol | 104 ----------- .../releases/v1.1.1-slashing/2-multisig.s.sol | 69 -------- .../releases/v1.1.1-slashing/3-execute.s.sol | 82 --------- script/releases/v1.1.1-slashing/upgrade.json | 19 -- .../register_operator_to_operatorSet.s.sol | 3 +- script/utils/ExistingDeploymentParser.sol | 8 +- src/contracts/core/AVSDirectory.sol | 11 +- src/contracts/core/AllocationManager.sol | 8 +- src/contracts/core/DelegationManager.sol | 10 +- src/contracts/core/RewardsCoordinator.sol | 36 ++-- .../core/RewardsCoordinatorStorage.sol | 3 - src/contracts/core/StrategyManager.sol | 9 +- src/contracts/interfaces/IAVSDirectory.sol | 6 +- .../interfaces/IAllocationManager.sol | 3 +- .../interfaces/IDelegationManager.sol | 4 +- src/contracts/interfaces/IEigenPod.sol | 3 +- src/contracts/interfaces/IEigenPodManager.sol | 4 +- .../interfaces/IPermissionController.sol | 4 +- .../interfaces/IRewardsCoordinator.sol | 37 +++- src/contracts/interfaces/ISemVerMixin.sol | 11 ++ src/contracts/interfaces/IShareManager.sol | 2 +- src/contracts/interfaces/ISignatureUtils.sol | 30 ---- .../interfaces/ISignatureUtilsMixin.sol | 50 ++++++ src/contracts/interfaces/IStrategy.sol | 3 +- src/contracts/interfaces/IStrategyFactory.sol | 3 +- src/contracts/interfaces/IStrategyManager.sol | 3 +- src/contracts/mixins/SemVerMixin.sol | 38 ++++ src/contracts/mixins/SignatureUtils.sol | 85 --------- src/contracts/mixins/SignatureUtilsMixin.sol | 87 ++++++++++ .../permissions/PermissionController.sol | 7 +- src/contracts/pods/EigenPod.sol | 17 +- src/contracts/pods/EigenPodManager.sol | 13 +- src/contracts/strategies/EigenStrategy.sol | 6 +- src/contracts/strategies/StrategyBase.sol | 9 +- .../strategies/StrategyBaseTVLLimits.sol | 5 +- src/contracts/strategies/StrategyFactory.sol | 9 +- src/test/DevnetLifecycle.t.sol | 2 +- .../harnesses/AllocationManagerHarness.sol | 3 +- .../harnesses/DelegationManagerHarness.sol | 3 +- src/test/harnesses/EigenPodHarness.sol | 6 +- src/test/harnesses/EigenPodManagerWrapper.sol | 5 +- .../integration/IntegrationDeployer.t.sol | 61 ++++--- .../mainnet/IDelegationManager.sol | 4 +- src/test/integration/users/User.t.sol | 4 +- src/test/integration/users/User_M1.t.sol | 7 +- src/test/mocks/DelegationManagerMock.sol | 2 +- src/test/mocks/EigenPodMock.sol | 4 +- src/test/unit/AVSDirectoryUnit.t.sol | 19 +- src/test/unit/AllocationManagerUnit.t.sol | 2 +- src/test/unit/DelegationUnit.t.sol | 163 +++++++++++++----- src/test/unit/EigenPodManagerUnit.t.sol | 12 +- src/test/unit/EigenPodUnit.t.sol | 10 +- src/test/unit/RewardsCoordinatorUnit.t.sol | 26 +-- src/test/unit/StrategyBaseTVLLimitsUnit.sol | 2 +- src/test/unit/StrategyBaseUnit.t.sol | 4 +- src/test/unit/StrategyFactoryUnit.t.sol | 4 +- src/test/unit/StrategyManagerUnit.t.sol | 28 ++- src/test/unit/mixins/SemVerMixin.t.sol | 29 ++++ src/test/unit/mixins/SignatureUtilsUnit.t.sol | 44 ++--- src/test/utils/EigenLayerUnitTestSetup.sol | 2 +- 74 files changed, 779 insertions(+), 1058 deletions(-) delete mode 100644 script/releases/v1.1.0-slashing/1-eoa.s.sol delete mode 100644 script/releases/v1.1.0-slashing/2-multisig.s.sol delete mode 100644 script/releases/v1.1.0-slashing/3-execute.s.sol delete mode 100644 script/releases/v1.1.0-slashing/upgrade.json delete mode 100644 script/releases/v1.1.1-slashing/1-eoa.s.sol delete mode 100644 script/releases/v1.1.1-slashing/2-multisig.s.sol delete mode 100644 script/releases/v1.1.1-slashing/3-execute.s.sol delete mode 100644 script/releases/v1.1.1-slashing/upgrade.json create mode 100644 src/contracts/interfaces/ISemVerMixin.sol delete mode 100644 src/contracts/interfaces/ISignatureUtils.sol create mode 100644 src/contracts/interfaces/ISignatureUtilsMixin.sol create mode 100644 src/contracts/mixins/SemVerMixin.sol delete mode 100644 src/contracts/mixins/SignatureUtils.sol create mode 100644 src/contracts/mixins/SignatureUtilsMixin.sol create mode 100644 src/test/unit/mixins/SemVerMixin.t.sol diff --git a/Makefile b/Makefile index 5bc5d6dac0..03942f6e09 100644 --- a/Makefile +++ b/Makefile @@ -45,7 +45,11 @@ gha-docker: docker run -v $(PWD):/build -w /build --rm -i ${CONTAINER_NAME}:latest bash -c "make gha" storage-report: +<<<<<<< HEAD bash "bin/storage-report.sh" "docs/storage-report/" fix-typos: - typos --config .github/configs/typos-cli.toml --write-changes \ No newline at end of file + typos --config .github/configs/typos-cli.toml --write-changes +======= + bash "bin/storage-report.sh" "docs/storage-report/" +>>>>>>> dd27b022 (fix: signature utils (#1015)) diff --git a/script/configs/devnet/deploy_from_scratch.anvil.config.json b/script/configs/devnet/deploy_from_scratch.anvil.config.json index 96df127e1f..6d8b5fef76 100644 --- a/script/configs/devnet/deploy_from_scratch.anvil.config.json +++ b/script/configs/devnet/deploy_from_scratch.anvil.config.json @@ -51,5 +51,6 @@ "OPERATOR_SET_GENESIS_REWARDS_TIMESTAMP": 1720656000, "OPERATOR_SET_MAX_RETROACTIVE_LENGTH": 2592000 }, - "ethPOSDepositAddress": "0x00000000219ab540356cBB839Cbe05303d7705Fa" + "ethPOSDepositAddress": "0x00000000219ab540356cBB839Cbe05303d7705Fa", + "semver": "v1.0.3" } \ No newline at end of file diff --git a/script/configs/devnet/deploy_from_scratch.holesky.config.json b/script/configs/devnet/deploy_from_scratch.holesky.config.json index 3dc1f204d5..054a432868 100644 --- a/script/configs/devnet/deploy_from_scratch.holesky.config.json +++ b/script/configs/devnet/deploy_from_scratch.holesky.config.json @@ -51,5 +51,6 @@ "OPERATOR_SET_GENESIS_REWARDS_TIMESTAMP": 1720656000, "OPERATOR_SET_MAX_RETROACTIVE_LENGTH": 2592000 }, - "ethPOSDepositAddress": "0x00000000219ab540356cBB839Cbe05303d7705Fa" -} \ No newline at end of file + "ethPOSDepositAddress": "0x00000000219ab540356cBB839Cbe05303d7705Fa", + "semver": "v0.0.0" +} diff --git a/script/configs/devnet/deploy_from_scratch.holesky.slashing.config.json b/script/configs/devnet/deploy_from_scratch.holesky.slashing.config.json index bcd808f715..99d3c54cbe 100644 --- a/script/configs/devnet/deploy_from_scratch.holesky.slashing.config.json +++ b/script/configs/devnet/deploy_from_scratch.holesky.slashing.config.json @@ -43,5 +43,6 @@ "DEALLOCATION_DELAY": 86400, "ALLOCATION_CONFIGURATION_DELAY": 600 }, - "ethPOSDepositAddress": "0x4242424242424242424242424242424242424242" + "ethPOSDepositAddress": "0x4242424242424242424242424242424242424242", + "semver": "v0.0.0" } \ No newline at end of file diff --git a/script/configs/local/deploy_from_scratch.anvil.config.json b/script/configs/local/deploy_from_scratch.anvil.config.json index f8b15599d4..3b516c4547 100644 --- a/script/configs/local/deploy_from_scratch.anvil.config.json +++ b/script/configs/local/deploy_from_scratch.anvil.config.json @@ -57,5 +57,6 @@ "DEALLOCATION_DELAY": 900, "ALLOCATION_CONFIGURATION_DELAY": 1200 }, - "ethPOSDepositAddress": "0x00000000219ab540356cBB839Cbe05303d7705Fa" + "ethPOSDepositAddress": "0x00000000219ab540356cBB839Cbe05303d7705Fa", + "semver": "v0.0.0" } \ No newline at end of file diff --git a/script/configs/local/deploy_from_scratch.slashing.anvil.config.json b/script/configs/local/deploy_from_scratch.slashing.anvil.config.json index 313bd1827a..af310692d5 100644 --- a/script/configs/local/deploy_from_scratch.slashing.anvil.config.json +++ b/script/configs/local/deploy_from_scratch.slashing.anvil.config.json @@ -57,5 +57,6 @@ "OPERATOR_SET_GENESIS_REWARDS_TIMESTAMP": 1720656000, "OPERATOR_SET_MAX_RETROACTIVE_LENGTH": 2592000 }, - "ethPOSDepositAddress": "0x00000000219ab540356cBB839Cbe05303d7705Fa" + "ethPOSDepositAddress": "0x00000000219ab540356cBB839Cbe05303d7705Fa", + "semver": "v0.0.0" } \ No newline at end of file diff --git a/script/configs/mainnet/mainnet-addresses.config.json b/script/configs/mainnet/mainnet-addresses.config.json index f47b5d9497..c33d7e8380 100644 --- a/script/configs/mainnet/mainnet-addresses.config.json +++ b/script/configs/mainnet/mainnet-addresses.config.json @@ -75,6 +75,7 @@ "executorMultisig": "0x369e6F597e22EaB55fFb173C6d9cD234BD699111", "operationsMultisig": "0xBE1685C81aA44FF9FB319dD389addd9374383e90", "pauserMultisig": "0x5050389572f2d220ad927CcbeA0D406831012390", - "timelock": "0xA6Db1A8C5a981d1536266D2a393c5F8dDb210EAF" + "timelock": "0xA6Db1A8C5a981d1536266D2a393c5F8dDb210EAF", + "semver": "v0.5.4" } } \ No newline at end of file diff --git a/script/deploy/devnet/deploy_from_scratch.s.sol b/script/deploy/devnet/deploy_from_scratch.s.sol index 5a90e4fcb2..1f7c5b3753 100644 --- a/script/deploy/devnet/deploy_from_scratch.s.sol +++ b/script/deploy/devnet/deploy_from_scratch.s.sol @@ -76,6 +76,8 @@ contract DeployFromScratch is Script, Test { // strategies deployed StrategyBaseTVLLimits[] public deployedStrategyArray; + string SEMVER; + // IMMUTABLES TO SET uint64 GOERLI_GENESIS_TIME = 1616508000; @@ -121,6 +123,8 @@ contract DeployFromScratch is Script, Test { string memory config_data = vm.readFile(deployConfigPath); // bytes memory parsedData = vm.parseJson(config_data); + SEMVER = stdJson.readString(config_data, ".semver"); + STRATEGY_MANAGER_INIT_PAUSED_STATUS = stdJson.readUint(config_data, ".strategyManager.init_paused_status"); DELEGATION_INIT_PAUSED_STATUS = stdJson.readUint(config_data, ".delegation.init_paused_status"); DELEGATION_WITHDRAWAL_DELAY_BLOCKS = stdJson.readUint(config_data, ".delegation.init_withdrawal_delay_blocks"); @@ -227,37 +231,58 @@ contract DeployFromScratch is Script, Test { eigenPodImplementation = new EigenPod( ethPOSDeposit, eigenPodManager, - GOERLI_GENESIS_TIME + GOERLI_GENESIS_TIME, + SEMVER ); eigenPodBeacon = new UpgradeableBeacon(address(eigenPodImplementation)); // Second, deploy the *implementation* contracts, using the *proxy contracts* as inputs - delegationImplementation = new DelegationManager(strategyManager, eigenPodManager, allocationManager, eigenLayerPauserReg, permissionController, MIN_WITHDRAWAL_DELAY); - strategyManagerImplementation = new StrategyManager(delegation, eigenLayerPauserReg); - avsDirectoryImplementation = new AVSDirectory(delegation, eigenLayerPauserReg); + delegationImplementation = new DelegationManager( + strategyManager, + eigenPodManager, + allocationManager, + eigenLayerPauserReg, + permissionController, + MIN_WITHDRAWAL_DELAY, + SEMVER + ); + + strategyManagerImplementation = new StrategyManager(delegation, eigenLayerPauserReg, SEMVER); + avsDirectoryImplementation = new AVSDirectory(delegation, eigenLayerPauserReg, SEMVER); eigenPodManagerImplementation = new EigenPodManager( ethPOSDeposit, eigenPodBeacon, delegation, - eigenLayerPauserReg + eigenLayerPauserReg, + SEMVER ); rewardsCoordinatorImplementation = new RewardsCoordinator( - delegation, - strategyManager, - allocationManager, - eigenLayerPauserReg, - permissionController, - REWARDS_COORDINATOR_CALCULATION_INTERVAL_SECONDS, - REWARDS_COORDINATOR_MAX_REWARDS_DURATION, - REWARDS_COORDINATOR_MAX_RETROACTIVE_LENGTH, - REWARDS_COORDINATOR_MAX_FUTURE_LENGTH, - REWARDS_COORDINATOR_GENESIS_REWARDS_TIMESTAMP + IRewardsCoordinatorTypes.RewardsCoordinatorConstructorParams( + delegation, + strategyManager, + allocationManager, + eigenLayerPauserReg, + permissionController, + REWARDS_COORDINATOR_CALCULATION_INTERVAL_SECONDS, + REWARDS_COORDINATOR_MAX_REWARDS_DURATION, + REWARDS_COORDINATOR_MAX_RETROACTIVE_LENGTH, + REWARDS_COORDINATOR_MAX_FUTURE_LENGTH, + REWARDS_COORDINATOR_GENESIS_REWARDS_TIMESTAMP, + SEMVER + ) + ); + allocationManagerImplementation = new AllocationManager( + delegation, + eigenLayerPauserReg, + permissionController, + DEALLOCATION_DELAY, + ALLOCATION_CONFIGURATION_DELAY, + SEMVER ); - allocationManagerImplementation = new AllocationManager(delegation, eigenLayerPauserReg, permissionController, DEALLOCATION_DELAY, ALLOCATION_CONFIGURATION_DELAY); - permissionControllerImplementation = new PermissionController(); - strategyFactoryImplementation = new StrategyFactory(strategyManager, eigenLayerPauserReg); + permissionControllerImplementation = new PermissionController(SEMVER); + strategyFactoryImplementation = new StrategyFactory(strategyManager, eigenLayerPauserReg, SEMVER); // Third, upgrade the proxy contracts to use the correct implementation contracts and initialize them. { @@ -325,7 +350,7 @@ contract DeployFromScratch is Script, Test { // Deploy strategyFactory & base // Create base strategy implementation - baseStrategyImplementation = new StrategyBase(strategyManager, eigenLayerPauserReg); + baseStrategyImplementation = new StrategyBase(strategyManager, eigenLayerPauserReg, SEMVER); // Create a proxy beacon for base strategy implementation strategyBeacon = new UpgradeableBeacon(address(baseStrategyImplementation)); diff --git a/script/deploy/local/Deploy_From_Scratch.s.sol b/script/deploy/local/Deploy_From_Scratch.s.sol index 8987c680e4..6201cd55a4 100644 --- a/script/deploy/local/Deploy_From_Scratch.s.sol +++ b/script/deploy/local/Deploy_From_Scratch.s.sol @@ -79,6 +79,8 @@ contract DeployFromScratch is Script, Test { // strategies deployed StrategyBaseTVLLimits[] public deployedStrategyArray; + string SEMVER; + // IMMUTABLES TO SET uint64 GOERLI_GENESIS_TIME = 1616508000; @@ -124,6 +126,8 @@ contract DeployFromScratch is Script, Test { string memory config_data = vm.readFile(deployConfigPath); // bytes memory parsedData = vm.parseJson(config_data); + SEMVER = stdJson.readString(config_data, ".semver"); + STRATEGY_MANAGER_INIT_PAUSED_STATUS = stdJson.readUint(config_data, ".strategyManager.init_paused_status"); DELEGATION_INIT_PAUSED_STATUS = stdJson.readUint(config_data, ".delegation.init_paused_status"); DELEGATION_WITHDRAWAL_DELAY_BLOCKS = stdJson.readUint(config_data, ".delegation.init_withdrawal_delay_blocks"); @@ -240,35 +244,54 @@ contract DeployFromScratch is Script, Test { } else { ethPOSDeposit = IETHPOSDeposit(stdJson.readAddress(config_data, ".ethPOSDepositAddress")); } - eigenPodImplementation = new EigenPod(ethPOSDeposit, eigenPodManager, GOERLI_GENESIS_TIME); + eigenPodImplementation = new EigenPod(ethPOSDeposit, eigenPodManager, GOERLI_GENESIS_TIME, SEMVER); eigenPodBeacon = new UpgradeableBeacon(address(eigenPodImplementation)); // Second, deploy the *implementation* contracts, using the *proxy contracts* as inputs - delegationImplementation = new DelegationManager(strategyManager, eigenPodManager, allocationManager, eigenLayerPauserReg, permissionController, MIN_WITHDRAWAL_DELAY); - strategyManagerImplementation = new StrategyManager(delegation, eigenLayerPauserReg); - avsDirectoryImplementation = new AVSDirectory(delegation, eigenLayerPauserReg); + delegationImplementation = new DelegationManager( + strategyManager, + eigenPodManager, + allocationManager, + eigenLayerPauserReg, + permissionController, + MIN_WITHDRAWAL_DELAY, + SEMVER + ); + strategyManagerImplementation = new StrategyManager(delegation, eigenLayerPauserReg, SEMVER); + avsDirectoryImplementation = new AVSDirectory(delegation, eigenLayerPauserReg, SEMVER); eigenPodManagerImplementation = new EigenPodManager( ethPOSDeposit, eigenPodBeacon, delegation, - eigenLayerPauserReg + eigenLayerPauserReg, + SEMVER ); rewardsCoordinatorImplementation = new RewardsCoordinator( - delegation, - strategyManager, - allocationManager, - eigenLayerPauserReg, - permissionController, - REWARDS_COORDINATOR_CALCULATION_INTERVAL_SECONDS, - REWARDS_COORDINATOR_MAX_REWARDS_DURATION, - REWARDS_COORDINATOR_MAX_RETROACTIVE_LENGTH, - REWARDS_COORDINATOR_MAX_FUTURE_LENGTH, - REWARDS_COORDINATOR_GENESIS_REWARDS_TIMESTAMP + IRewardsCoordinatorTypes.RewardsCoordinatorConstructorParams( + delegation, + strategyManager, + allocationManager, + eigenLayerPauserReg, + permissionController, + REWARDS_COORDINATOR_CALCULATION_INTERVAL_SECONDS, + REWARDS_COORDINATOR_MAX_REWARDS_DURATION, + REWARDS_COORDINATOR_MAX_RETROACTIVE_LENGTH, + REWARDS_COORDINATOR_MAX_FUTURE_LENGTH, + REWARDS_COORDINATOR_GENESIS_REWARDS_TIMESTAMP, + SEMVER + ) + ); + allocationManagerImplementation = new AllocationManager( + delegation, + eigenLayerPauserReg, + permissionController, + DEALLOCATION_DELAY, + ALLOCATION_CONFIGURATION_DELAY, + SEMVER ); - allocationManagerImplementation = new AllocationManager(delegation, eigenLayerPauserReg, permissionController, DEALLOCATION_DELAY, ALLOCATION_CONFIGURATION_DELAY); - permissionControllerImplementation = new PermissionController(); + permissionControllerImplementation = new PermissionController(SEMVER); // Third, upgrade the proxy contracts to use the correct implementation contracts and initialize them. { @@ -340,7 +363,7 @@ contract DeployFromScratch is Script, Test { ); // deploy StrategyBaseTVLLimits contract implementation - baseStrategyImplementation = new StrategyBaseTVLLimits(strategyManager, eigenLayerPauserReg); + baseStrategyImplementation = new StrategyBaseTVLLimits(strategyManager, eigenLayerPauserReg, SEMVER); // create upgradeable proxies that each point to the implementation and initialize them for (uint256 i = 0; i < strategyConfigs.length; ++i) { if (strategyConfigs[i].tokenAddress == address(0)) { diff --git a/script/deploy/local/deploy_from_scratch.slashing.s.sol b/script/deploy/local/deploy_from_scratch.slashing.s.sol index 38ba01b7de..bf07af1d0a 100644 --- a/script/deploy/local/deploy_from_scratch.slashing.s.sol +++ b/script/deploy/local/deploy_from_scratch.slashing.s.sol @@ -73,6 +73,8 @@ contract DeployFromScratch is Script, Test { address operationsMultisig; address pauserMultisig; + string SEMVER; + // the ETH2 deposit contract -- if not on mainnet, we deploy a mock as stand-in IETHPOSDeposit public ethPOSDeposit; @@ -124,6 +126,8 @@ contract DeployFromScratch is Script, Test { string memory config_data = vm.readFile(deployConfigPath); // bytes memory parsedData = vm.parseJson(config_data); + SEMVER = stdJson.readString(config_data, ".semver"); + MIN_WITHDRAWAL_DELAY = uint32(stdJson.readUint(config_data, ".delegation.withdrawal_delay_blocks")); STRATEGY_MANAGER_INIT_PAUSED_STATUS = stdJson.readUint(config_data, ".strategyManager.init_paused_status"); DELEGATION_INIT_PAUSED_STATUS = stdJson.readUint(config_data, ".delegation.init_paused_status"); @@ -234,36 +238,56 @@ contract DeployFromScratch is Script, Test { eigenPodImplementation = new EigenPod( ethPOSDeposit, eigenPodManager, - GOERLI_GENESIS_TIME + GOERLI_GENESIS_TIME, + SEMVER ); eigenPodBeacon = new UpgradeableBeacon(address(eigenPodImplementation)); // Second, deploy the *implementation* contracts, using the *proxy contracts* as inputs - delegationImplementation = new DelegationManager(strategyManager, eigenPodManager, allocationManager, eigenLayerPauserReg, permissionController, MIN_WITHDRAWAL_DELAY); - strategyManagerImplementation = new StrategyManager(delegation, eigenLayerPauserReg); - avsDirectoryImplementation = new AVSDirectory(delegation, eigenLayerPauserReg); + delegationImplementation = new DelegationManager( + strategyManager, + eigenPodManager, + allocationManager, + eigenLayerPauserReg, + permissionController, + MIN_WITHDRAWAL_DELAY, + SEMVER + ); + strategyManagerImplementation = new StrategyManager(delegation, eigenLayerPauserReg, SEMVER); + avsDirectoryImplementation = new AVSDirectory(delegation, eigenLayerPauserReg, SEMVER); eigenPodManagerImplementation = new EigenPodManager( ethPOSDeposit, eigenPodBeacon, delegation, - eigenLayerPauserReg + eigenLayerPauserReg, + SEMVER ); rewardsCoordinatorImplementation = new RewardsCoordinator( - delegation, - strategyManager, - allocationManager, - eigenLayerPauserReg, - permissionController, - REWARDS_COORDINATOR_CALCULATION_INTERVAL_SECONDS, - REWARDS_COORDINATOR_MAX_REWARDS_DURATION, - REWARDS_COORDINATOR_MAX_RETROACTIVE_LENGTH, - REWARDS_COORDINATOR_MAX_FUTURE_LENGTH, - REWARDS_COORDINATOR_GENESIS_REWARDS_TIMESTAMP + IRewardsCoordinatorTypes.RewardsCoordinatorConstructorParams( + delegation, + strategyManager, + allocationManager, + eigenLayerPauserReg, + permissionController, + REWARDS_COORDINATOR_CALCULATION_INTERVAL_SECONDS, + REWARDS_COORDINATOR_MAX_REWARDS_DURATION, + REWARDS_COORDINATOR_MAX_RETROACTIVE_LENGTH, + REWARDS_COORDINATOR_MAX_FUTURE_LENGTH, + REWARDS_COORDINATOR_GENESIS_REWARDS_TIMESTAMP, + SEMVER + ) + ); + allocationManagerImplementation = new AllocationManager( + delegation, + eigenLayerPauserReg, + permissionController, + DEALLOCATION_DELAY, + ALLOCATION_CONFIGURATION_DELAY, + SEMVER ); - allocationManagerImplementation = new AllocationManager(delegation, eigenLayerPauserReg, permissionController, DEALLOCATION_DELAY, ALLOCATION_CONFIGURATION_DELAY); - permissionControllerImplementation = new PermissionController(); + permissionControllerImplementation = new PermissionController(SEMVER); // Third, upgrade the proxy contracts to use the correct implementation contracts and initialize them. { @@ -335,7 +359,7 @@ contract DeployFromScratch is Script, Test { ); // deploy StrategyBaseTVLLimits contract implementation - baseStrategyImplementation = new StrategyBaseTVLLimits(strategyManager, eigenLayerPauserReg); + baseStrategyImplementation = new StrategyBaseTVLLimits(strategyManager, eigenLayerPauserReg, SEMVER); // create upgradeable proxies that each point to the implementation and initialize them for (uint256 i = 0; i < strategyConfigs.length; ++i) { if (strategyConfigs[i].tokenAddress == address(0)) { diff --git a/script/releases/v1.1.0-slashing/1-eoa.s.sol b/script/releases/v1.1.0-slashing/1-eoa.s.sol deleted file mode 100644 index 0ff2aad91e..0000000000 --- a/script/releases/v1.1.0-slashing/1-eoa.s.sol +++ /dev/null @@ -1,152 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.12; - -import {EOADeployer} from "zeus-templates/templates/EOADeployer.sol"; -import "../Env.sol"; - -import "@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol"; -import "@openzeppelin/contracts/proxy/transparent/ProxyAdmin.sol"; -import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; -import "@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol"; - -contract Deploy is EOADeployer { - using Env for *; - - function _runAsEOA() internal override { - vm.startBroadcast(); - - // Deploy RC - deployImpl({ - name: type(RewardsCoordinator).name, - deployedTo: address( - new RewardsCoordinator({ - _delegationManager: Env.proxy.delegationManager(), - _strategyManager: Env.proxy.strategyManager(), - _allocationManager: Env.proxy.allocationManager(), - _pauserRegistry: Env.impl.pauserRegistry(), - _permissionController: Env.proxy.permissionController(), - _CALCULATION_INTERVAL_SECONDS: Env - .CALCULATION_INTERVAL_SECONDS(), - _MAX_REWARDS_DURATION: Env.MAX_REWARDS_DURATION(), - _MAX_RETROACTIVE_LENGTH: Env.MAX_RETROACTIVE_LENGTH(), - _MAX_FUTURE_LENGTH: Env.MAX_FUTURE_LENGTH(), - _GENESIS_REWARDS_TIMESTAMP: Env.GENESIS_REWARDS_TIMESTAMP() - }) - ) - }); - - vm.stopBroadcast(); - } - - function testDeploy() public virtual { - _runAsEOA(); - _validateNewImplAddresses(false); - _validateImplConstructors(); - _validateImplsInitialized(); - } - - /// @dev Validate that the `Env.impl` addresses are updated to be distinct from what the proxy - /// admin reports as the current implementation address. - /// - /// Note: The upgrade script can call this with `areMatching == true` to check that these impl - /// addresses _are_ matches. - function _validateNewImplAddresses(bool areMatching) internal view { - function(address, address, string memory) - internal - pure assertion = areMatching ? _assertMatch : _assertNotMatch; - - assertion( - _getProxyImpl(address(Env.proxy.rewardsCoordinator())), - address(Env.impl.rewardsCoordinator()), - "rewardsCoordinator impl failed" - ); - } - - /// @dev Validate the immutables set in the new implementation constructors - function _validateImplConstructors() internal view { - RewardsCoordinator rewards = Env.impl.rewardsCoordinator(); - assertTrue( - rewards.delegationManager() == Env.proxy.delegationManager(), - "rc.dm invalid" - ); - assertTrue( - rewards.strategyManager() == Env.proxy.strategyManager(), - "rc.sm invalid" - ); - assertTrue( - rewards.allocationManager() == Env.proxy.allocationManager(), - "rc.alm invalid" - ); - assertTrue( - rewards.pauserRegistry() == Env.impl.pauserRegistry(), - "rc.pR invalid" - ); - assertTrue( - rewards.permissionController() == Env.proxy.permissionController(), - "rc.pc invalid" - ); - assertTrue( - rewards.CALCULATION_INTERVAL_SECONDS() == - Env.CALCULATION_INTERVAL_SECONDS(), - "rc.calcInterval invalid" - ); - assertTrue( - rewards.MAX_REWARDS_DURATION() == Env.MAX_REWARDS_DURATION(), - "rc.rewardsDuration invalid" - ); - assertTrue( - rewards.MAX_RETROACTIVE_LENGTH() == Env.MAX_RETROACTIVE_LENGTH(), - "rc.retroLength invalid" - ); - assertTrue( - rewards.MAX_FUTURE_LENGTH() == Env.MAX_FUTURE_LENGTH(), - "rc.futureLength invalid" - ); - assertTrue( - rewards.GENESIS_REWARDS_TIMESTAMP() == - Env.GENESIS_REWARDS_TIMESTAMP(), - "rc.genesis invalid" - ); - } - - /// @dev Call initialize on all deployed implementations to ensure initializers are disabled - function _validateImplsInitialized() internal { - bytes memory errInit = "Initializable: contract is already initialized"; - - RewardsCoordinator rewards = Env.impl.rewardsCoordinator(); - vm.expectRevert(errInit); - rewards.initialize(address(0), 0, address(0), 0, 0); - } - - /// @dev Query and return `proxyAdmin.getProxyImplementation(proxy)` - function _getProxyImpl(address proxy) internal view returns (address) { - return - ProxyAdmin(Env.proxyAdmin()).getProxyImplementation( - ITransparentUpgradeableProxy(proxy) - ); - } - - /// @dev Query and return `proxyAdmin.getProxyAdmin(proxy)` - function _getProxyAdmin(address proxy) internal view returns (address) { - return - ProxyAdmin(Env.proxyAdmin()).getProxyAdmin( - ITransparentUpgradeableProxy(proxy) - ); - } - - function _assertMatch( - address a, - address b, - string memory err - ) private pure { - assertEq(a, b, err); - } - - function _assertNotMatch( - address a, - address b, - string memory err - ) private pure { - assertNotEq(a, b, err); - } -} diff --git a/script/releases/v1.1.0-slashing/2-multisig.s.sol b/script/releases/v1.1.0-slashing/2-multisig.s.sol deleted file mode 100644 index 7e01875f4c..0000000000 --- a/script/releases/v1.1.0-slashing/2-multisig.s.sol +++ /dev/null @@ -1,83 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.12; - -import {Deploy} from "./1-eoa.s.sol"; -import "../Env.sol"; - -import {MultisigBuilder} from "zeus-templates/templates/MultisigBuilder.sol"; -import "zeus-templates/utils/Encode.sol"; - -import {TimelockController} from "@openzeppelin/contracts/governance/TimelockController.sol"; - -contract Queue is MultisigBuilder, Deploy { - using Env for *; - using Encode for *; - - function _runAsMultisig() - internal - virtual - override - prank(Env.opsMultisig()) - { - bytes memory calldata_to_executor = _getCalldataToExecutor(); - - TimelockController timelock = Env.timelockController(); - timelock.schedule({ - target: Env.executorMultisig(), - value: 0, - data: calldata_to_executor, - predecessor: 0, - salt: 0, - delay: timelock.getMinDelay() - }); - } - - /// @dev Get the calldata to be sent from the timelock to the executor - function _getCalldataToExecutor() internal returns (bytes memory) { - MultisigCall[] storage executorCalls = Encode - .newMultisigCalls() - .append({ - to: Env.proxyAdmin(), - data: Encode.proxyAdmin.upgrade({ - proxy: address(Env.proxy.rewardsCoordinator()), - impl: address(Env.impl.rewardsCoordinator()) - }) - }); - - return - Encode.gnosisSafe.execTransaction({ - from: address(Env.timelockController()), - to: address(Env.multiSendCallOnly()), - op: Encode.Operation.DelegateCall, - data: Encode.multiSend(executorCalls) - }); - } - - function testScript() public virtual { - runAsEOA(); - - TimelockController timelock = Env.timelockController(); - bytes memory calldata_to_executor = _getCalldataToExecutor(); - bytes32 txHash = timelock.hashOperation({ - target: Env.executorMultisig(), - value: 0, - data: calldata_to_executor, - predecessor: 0, - salt: 0 - }); - - // Check that the upgrade does not exist in the timelock - assertFalse( - timelock.isOperationPending(txHash), - "Transaction should NOT be queued." - ); - - execute(); - - // Check that the upgrade has been added to the timelock - assertTrue( - timelock.isOperationPending(txHash), - "Transaction should be queued." - ); - } -} diff --git a/script/releases/v1.1.0-slashing/3-execute.s.sol b/script/releases/v1.1.0-slashing/3-execute.s.sol deleted file mode 100644 index 2a250a2403..0000000000 --- a/script/releases/v1.1.0-slashing/3-execute.s.sol +++ /dev/null @@ -1,128 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.12; - -import "../Env.sol"; -import {Queue} from "./2-multisig.s.sol"; - -import "@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol"; -import "@openzeppelin/contracts/proxy/transparent/ProxyAdmin.sol"; - -contract Execute is Queue { - using Env for *; - - function _runAsMultisig() - internal - override(Queue) - prank(Env.protocolCouncilMultisig()) - { - bytes memory calldata_to_executor = _getCalldataToExecutor(); - - TimelockController timelock = Env.timelockController(); - timelock.execute({ - target: Env.executorMultisig(), - value: 0, - payload: calldata_to_executor, - predecessor: 0, - salt: 0 - }); - } - - function testScript() public virtual override(Queue) { - // 0. Deploy Impls - runAsEOA(); - - TimelockController timelock = Env.timelockController(); - bytes memory calldata_to_executor = _getCalldataToExecutor(); - bytes32 txHash = timelock.hashOperation({ - target: Env.executorMultisig(), - value: 0, - data: calldata_to_executor, - predecessor: 0, - salt: 0 - }); - assertFalse( - timelock.isOperationPending(txHash), - "Transaction should NOT be queued." - ); - - // 1. Queue Upgrade - Queue._runAsMultisig(); - _unsafeResetHasPranked(); // reset hasPranked so we can use it again - - // 2. Warp past delay - vm.warp(block.timestamp + timelock.getMinDelay()); // 1 tick after ETA - assertEq( - timelock.isOperationReady(txHash), - true, - "Transaction should be executable." - ); - - // 3- execute - execute(); - - assertTrue( - timelock.isOperationDone(txHash), - "Transaction should be complete." - ); - - // 4. Validate - _validateNewImplAddresses(true); - _validateProxyConstructors(); - _validateProxyInitialized(); - } - - function _validateProxyConstructors() internal view { - RewardsCoordinator rewards = Env.proxy.rewardsCoordinator(); - assertTrue( - rewards.delegationManager() == Env.proxy.delegationManager(), - "rc.dm invalid" - ); - assertTrue( - rewards.strategyManager() == Env.proxy.strategyManager(), - "rc.sm invalid" - ); - assertTrue( - rewards.allocationManager() == Env.proxy.allocationManager(), - "rc.alm invalid" - ); - assertTrue( - rewards.pauserRegistry() == Env.impl.pauserRegistry(), - "rc.pR invalid" - ); - assertTrue( - rewards.permissionController() == Env.proxy.permissionController(), - "rc.pc invalid" - ); - assertTrue( - rewards.CALCULATION_INTERVAL_SECONDS() == - Env.CALCULATION_INTERVAL_SECONDS(), - "rc.calcInterval invalid" - ); - assertTrue( - rewards.MAX_REWARDS_DURATION() == Env.MAX_REWARDS_DURATION(), - "rc.rewardsDuration invalid" - ); - assertTrue( - rewards.MAX_RETROACTIVE_LENGTH() == Env.MAX_RETROACTIVE_LENGTH(), - "rc.retroLength invalid" - ); - assertTrue( - rewards.MAX_FUTURE_LENGTH() == Env.MAX_FUTURE_LENGTH(), - "rc.futureLength invalid" - ); - assertTrue( - rewards.GENESIS_REWARDS_TIMESTAMP() == - Env.GENESIS_REWARDS_TIMESTAMP(), - "rc.genesis invalid" - ); - } - - /// @dev Call initialize on all deployed implementations to ensure initializers are disabled - function _validateProxyInitialized() internal { - bytes memory errInit = "Initializable: contract is already initialized"; - - RewardsCoordinator rewards = Env.proxy.rewardsCoordinator(); - vm.expectRevert(errInit); - rewards.initialize(address(0), 0, address(0), 0, 0); - } -} diff --git a/script/releases/v1.1.0-slashing/upgrade.json b/script/releases/v1.1.0-slashing/upgrade.json deleted file mode 100644 index 3e544cff48..0000000000 --- a/script/releases/v1.1.0-slashing/upgrade.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "name": "slashing-rewards-v2.1", - "from": "1.0.3", - "to": "1.1.0", - "phases": [ - { - "type": "eoa", - "filename": "1-eoa.s.sol" - }, - { - "type": "multisig", - "filename": "2-multisig.s.sol" - }, - { - "type": "multisig", - "filename": "3-execute.s.sol" - } - ] -} \ No newline at end of file diff --git a/script/releases/v1.1.1-slashing/1-eoa.s.sol b/script/releases/v1.1.1-slashing/1-eoa.s.sol deleted file mode 100644 index 41d538c376..0000000000 --- a/script/releases/v1.1.1-slashing/1-eoa.s.sol +++ /dev/null @@ -1,104 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.12; - -import {EOADeployer} from "zeus-templates/templates/EOADeployer.sol"; -import "../Env.sol"; - -import "@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol"; -import "@openzeppelin/contracts/proxy/transparent/ProxyAdmin.sol"; -import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; -import "@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol"; - -contract Deploy is EOADeployer { - using Env for *; - - function _runAsEOA() internal override { - vm.startBroadcast(); - - // Deploy Allocation Manager - deployImpl({ - name: type(AllocationManager).name, - deployedTo: address( - new AllocationManager({ - _delegation: Env.proxy.delegationManager(), - _pauserRegistry: Env.impl.pauserRegistry(), - _permissionController: Env.proxy.permissionController(), - _DEALLOCATION_DELAY: Env.MIN_WITHDRAWAL_DELAY(), - _ALLOCATION_CONFIGURATION_DELAY: Env.ALLOCATION_CONFIGURATION_DELAY() - }) - ) - }); - - vm.stopBroadcast(); - } - - function testDeploy() public virtual { - _runAsEOA(); - _validateNewImplAddresses(false); - _validateImplConstructors(); - _validateImplsInitialized(); - } - - /// @dev Validate that the `Env.impl` addresses are updated to be distinct from what the proxy - /// admin reports as the current implementation address. - /// - /// Note: The upgrade script can call this with `areMatching == true` to check that these impl - /// addresses _are_ matches. - function _validateNewImplAddresses( - bool areMatching - ) internal view { - function(address, address, string memory) - internal - pure assertion = areMatching ? _assertMatch : _assertNotMatch; - - assertion( - _getProxyImpl(address(Env.proxy.allocationManager())), - address(Env.impl.allocationManager()), - "allocationManager impl failed" - ); - } - - /// @dev Validate the immutables set in the new implementation constructors - function _validateImplConstructors() internal view { - AllocationManager allocationManager = Env.impl.allocationManager(); - assertTrue(allocationManager.delegation() == Env.proxy.delegationManager(), "dm invalid"); - assertTrue(allocationManager.pauserRegistry() == Env.impl.pauserRegistry(), "pR invalid"); - assertTrue(allocationManager.permissionController() == Env.proxy.permissionController(), "pc invalid"); - assertTrue(allocationManager.DEALLOCATION_DELAY() == Env.MIN_WITHDRAWAL_DELAY(), "deallocationDelay invalid"); - assertTrue( - allocationManager.ALLOCATION_CONFIGURATION_DELAY() == Env.ALLOCATION_CONFIGURATION_DELAY(), - "allocationConfigurationDelay invalid" - ); - } - - /// @dev Call initialize on all deployed implementations to ensure initializers are disabled - function _validateImplsInitialized() internal { - bytes memory errInit = "Initializable: contract is already initialized"; - - AllocationManager allocationManager = Env.impl.allocationManager(); - vm.expectRevert(errInit); - allocationManager.initialize(address(0), 0); - } - - /// @dev Query and return `proxyAdmin.getProxyImplementation(proxy)` - function _getProxyImpl( - address proxy - ) internal view returns (address) { - return ProxyAdmin(Env.proxyAdmin()).getProxyImplementation(ITransparentUpgradeableProxy(proxy)); - } - - /// @dev Query and return `proxyAdmin.getProxyAdmin(proxy)` - function _getProxyAdmin( - address proxy - ) internal view returns (address) { - return ProxyAdmin(Env.proxyAdmin()).getProxyAdmin(ITransparentUpgradeableProxy(proxy)); - } - - function _assertMatch(address a, address b, string memory err) private pure { - assertEq(a, b, err); - } - - function _assertNotMatch(address a, address b, string memory err) private pure { - assertNotEq(a, b, err); - } -} diff --git a/script/releases/v1.1.1-slashing/2-multisig.s.sol b/script/releases/v1.1.1-slashing/2-multisig.s.sol deleted file mode 100644 index ab39003e83..0000000000 --- a/script/releases/v1.1.1-slashing/2-multisig.s.sol +++ /dev/null @@ -1,69 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.12; - -import {Deploy} from "./1-eoa.s.sol"; -import "../Env.sol"; - -import {MultisigBuilder} from "zeus-templates/templates/MultisigBuilder.sol"; -import "zeus-templates/utils/Encode.sol"; - -import {TimelockController} from "@openzeppelin/contracts/governance/TimelockController.sol"; - -contract Queue is MultisigBuilder, Deploy { - using Env for *; - using Encode for *; - - function _runAsMultisig() internal virtual override prank(Env.opsMultisig()) { - bytes memory calldata_to_executor = _getCalldataToExecutor(); - - TimelockController timelock = Env.timelockController(); - timelock.schedule({ - target: Env.executorMultisig(), - value: 0, - data: calldata_to_executor, - predecessor: 0, - salt: 0, - delay: timelock.getMinDelay() - }); - } - - /// @dev Get the calldata to be sent from the timelock to the executor - function _getCalldataToExecutor() internal returns (bytes memory) { - MultisigCall[] storage executorCalls = Encode.newMultisigCalls().append({ - to: Env.proxyAdmin(), - data: Encode.proxyAdmin.upgrade({ - proxy: address(Env.proxy.allocationManager()), - impl: address(Env.impl.allocationManager()) - }) - }); - - return Encode.gnosisSafe.execTransaction({ - from: address(Env.timelockController()), - to: address(Env.multiSendCallOnly()), - op: Encode.Operation.DelegateCall, - data: Encode.multiSend(executorCalls) - }); - } - - function testScript() public virtual { - runAsEOA(); - - TimelockController timelock = Env.timelockController(); - bytes memory calldata_to_executor = _getCalldataToExecutor(); - bytes32 txHash = timelock.hashOperation({ - target: Env.executorMultisig(), - value: 0, - data: calldata_to_executor, - predecessor: 0, - salt: 0 - }); - - // Check that the upgrade does not exist in the timelock - assertFalse(timelock.isOperationPending(txHash), "Transaction should NOT be queued."); - - execute(); - - // Check that the upgrade has been added to the timelock - assertTrue(timelock.isOperationPending(txHash), "Transaction should be queued."); - } -} diff --git a/script/releases/v1.1.1-slashing/3-execute.s.sol b/script/releases/v1.1.1-slashing/3-execute.s.sol deleted file mode 100644 index 7b1f87f5ef..0000000000 --- a/script/releases/v1.1.1-slashing/3-execute.s.sol +++ /dev/null @@ -1,82 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.12; - -import "../Env.sol"; -import {Queue} from "./2-multisig.s.sol"; - -import "@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol"; -import "@openzeppelin/contracts/proxy/transparent/ProxyAdmin.sol"; - -contract Execute is Queue { - using Env for *; - - function _runAsMultisig() internal override(Queue) prank(Env.protocolCouncilMultisig()) { - bytes memory calldata_to_executor = _getCalldataToExecutor(); - - TimelockController timelock = Env.timelockController(); - timelock.execute({ - target: Env.executorMultisig(), - value: 0, - payload: calldata_to_executor, - predecessor: 0, - salt: 0 - }); - } - - function testScript() public virtual override(Queue) { - // 0. Deploy Impls - runAsEOA(); - - TimelockController timelock = Env.timelockController(); - bytes memory calldata_to_executor = _getCalldataToExecutor(); - bytes32 txHash = timelock.hashOperation({ - target: Env.executorMultisig(), - value: 0, - data: calldata_to_executor, - predecessor: 0, - salt: 0 - }); - assertFalse(timelock.isOperationPending(txHash), "Transaction should NOT be queued."); - - // 1. Queue Upgrade - Queue._runAsMultisig(); - _unsafeResetHasPranked(); // reset hasPranked so we can use it again - - // 2. Warp past delay - vm.warp(block.timestamp + timelock.getMinDelay()); // 1 tick after ETA - assertEq(timelock.isOperationReady(txHash), true, "Transaction should be executable."); - - // 3- execute - execute(); - - assertTrue(timelock.isOperationDone(txHash), "Transaction should be complete."); - - // 4. Validate - _validateNewImplAddresses(true); - _validateProxyConstructors(); - _validateProxyInitialized(); - } - - function _validateProxyConstructors() internal view { - AllocationManager allocationManager = Env.proxy.allocationManager(); - assertTrue(allocationManager.delegation() == Env.proxy.delegationManager(), "alm.dm invalid"); - assertTrue(allocationManager.pauserRegistry() == Env.impl.pauserRegistry(), "alm.pR invalid"); - assertTrue(allocationManager.permissionController() == Env.proxy.permissionController(), "alm.pc invalid"); - assertTrue( - allocationManager.DEALLOCATION_DELAY() == Env.MIN_WITHDRAWAL_DELAY(), "alm.deallocationDelay invalid" - ); - assertTrue( - allocationManager.ALLOCATION_CONFIGURATION_DELAY() == Env.ALLOCATION_CONFIGURATION_DELAY(), - "alm.allocationConfigurationDelay invalid" - ); - } - - /// @dev Call initialize on all deployed proxies to ensure initializers are disabled - function _validateProxyInitialized() internal { - bytes memory errInit = "Initializable: contract is already initialized"; - - AllocationManager allocationManager = Env.proxy.allocationManager(); - vm.expectRevert(errInit); - allocationManager.initialize(address(0), 0); - } -} diff --git a/script/releases/v1.1.1-slashing/upgrade.json b/script/releases/v1.1.1-slashing/upgrade.json deleted file mode 100644 index 64703c7d0d..0000000000 --- a/script/releases/v1.1.1-slashing/upgrade.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "name": "slashing-registrar-hotfix", - "from": "1.1.0", - "to": "1.1.1", - "phases": [ - { - "type": "eoa", - "filename": "1-eoa.s.sol" - }, - { - "type": "multisig", - "filename": "2-multisig.s.sol" - }, - { - "type": "multisig", - "filename": "3-execute.s.sol" - } - ] -} \ No newline at end of file diff --git a/script/tasks/register_operator_to_operatorSet.s.sol b/script/tasks/register_operator_to_operatorSet.s.sol index 182b2a17f9..2976ac9d98 100644 --- a/script/tasks/register_operator_to_operatorSet.s.sol +++ b/script/tasks/register_operator_to_operatorSet.s.sol @@ -72,8 +72,7 @@ contract RegisterOperatorToOperatorSets is Script, Test { // Register the Operator to the AVS avsDirectory.registerOperatorToAVS( - operator, - ISignatureUtils.SignatureWithSaltAndExpiry(abi.encodePacked(r, s, v), bytes32(uint256(0) + 1), expiry) + operator, ISignatureUtilsMixinTypes.SignatureWithSaltAndExpiry(abi.encodePacked(r, s, v), bytes32(uint256(0) + 1), expiry) ); // Deploy and set registrar. diff --git a/script/utils/ExistingDeploymentParser.sol b/script/utils/ExistingDeploymentParser.sol index 84c1886b7d..112f887d72 100644 --- a/script/utils/ExistingDeploymentParser.sol +++ b/script/utils/ExistingDeploymentParser.sol @@ -50,6 +50,7 @@ contract ExistingDeploymentParser is Script, Logger { /// EigenLayer Contract Parameters /// ----------------------------------------------------------------------- + string public SEMVER; /// @dev AllocationManager uint256 ALLOCATION_MANAGER_INIT_PAUSED_STATUS; uint32 DEALLOCATION_DELAY; @@ -193,6 +194,8 @@ contract ExistingDeploymentParser is Script, Logger { // READ JSON CONFIG DATA string memory json = cheats.readFile(existingDeploymentInfoPath); + SEMVER = stdJson.readString(json, ".parameters.semver"); + // check that the chainID matches the one in the config uint256 configChainId = json.readUint(".chainInfo.chainId"); assertEq(configChainId, currentChainId, "You are on the wrong chain for this config"); @@ -211,7 +214,7 @@ contract ExistingDeploymentParser is Script, Logger { eigenLayerPauserReg = PauserRegistry(json.readAddress(".addresses.eigenLayerPauserReg")); // FIXME: hotfix - remove later... - permissionControllerImplementation = new PermissionController(); + permissionControllerImplementation = new PermissionController(SEMVER); permissionController = PermissionController( address(new TransparentUpgradeableProxy(address(permissionControllerImplementation), address(eigenLayerProxyAdmin), "")) ); @@ -221,7 +224,8 @@ contract ExistingDeploymentParser is Script, Logger { eigenLayerPauserReg, permissionController, DEALLOCATION_DELAY, - ALLOCATION_CONFIGURATION_DELAY + ALLOCATION_CONFIGURATION_DELAY, + SEMVER ); allocationManager = AllocationManager( address(new TransparentUpgradeableProxy(address(allocationManagerImplementation), address(eigenLayerProxyAdmin), "")) diff --git a/src/contracts/core/AVSDirectory.sol b/src/contracts/core/AVSDirectory.sol index d689eb18f0..6f76e421e3 100644 --- a/src/contracts/core/AVSDirectory.sol +++ b/src/contracts/core/AVSDirectory.sol @@ -5,7 +5,7 @@ import "@openzeppelin-upgrades/contracts/proxy/utils/Initializable.sol"; import "@openzeppelin-upgrades/contracts/access/OwnableUpgradeable.sol"; import "@openzeppelin-upgrades/contracts/security/ReentrancyGuardUpgradeable.sol"; -import "../mixins/SignatureUtils.sol"; +import "../mixins/SignatureUtilsMixin.sol"; import "../permissions/Pausable.sol"; import "./AVSDirectoryStorage.sol"; @@ -15,7 +15,7 @@ contract AVSDirectory is Pausable, AVSDirectoryStorage, ReentrancyGuardUpgradeable, - SignatureUtils + SignatureUtilsMixin { /** * @@ -29,8 +29,9 @@ contract AVSDirectory is */ constructor( IDelegationManager _delegation, - IPauserRegistry _pauserRegistry - ) AVSDirectoryStorage(_delegation) Pausable(_pauserRegistry) { + IPauserRegistry _pauserRegistry, + string memory _version + ) AVSDirectoryStorage(_delegation) Pausable(_pauserRegistry) SignatureUtilsMixin(_version) { _disableInitializers(); } @@ -70,7 +71,7 @@ contract AVSDirectory is /// @inheritdoc IAVSDirectory function registerOperatorToAVS( address operator, - ISignatureUtils.SignatureWithSaltAndExpiry memory operatorSignature + ISignatureUtilsMixinTypes.SignatureWithSaltAndExpiry memory operatorSignature ) external override onlyWhenNotPaused(PAUSED_OPERATOR_REGISTER_DEREGISTER_TO_AVS) { // Assert that the `operator` is not actively registered to the AVS. require( diff --git a/src/contracts/core/AllocationManager.sol b/src/contracts/core/AllocationManager.sol index 408bd90e4c..fd88e07aa0 100644 --- a/src/contracts/core/AllocationManager.sol +++ b/src/contracts/core/AllocationManager.sol @@ -6,6 +6,7 @@ import "@openzeppelin-upgrades/contracts/access/OwnableUpgradeable.sol"; import "@openzeppelin-upgrades/contracts/security/ReentrancyGuardUpgradeable.sol"; import "../mixins/PermissionControllerMixin.sol"; +import "../mixins/SemVerMixin.sol"; import "../permissions/Pausable.sol"; import "../libraries/SlashingLib.sol"; import "../libraries/OperatorSetLib.sol"; @@ -17,7 +18,8 @@ contract AllocationManager is Pausable, AllocationManagerStorage, ReentrancyGuardUpgradeable, - PermissionControllerMixin + PermissionControllerMixin, + SemVerMixin { using DoubleEndedQueue for DoubleEndedQueue.Bytes32Deque; using EnumerableSet for *; @@ -41,11 +43,13 @@ contract AllocationManager is IPauserRegistry _pauserRegistry, IPermissionController _permissionController, uint32 _DEALLOCATION_DELAY, - uint32 _ALLOCATION_CONFIGURATION_DELAY + uint32 _ALLOCATION_CONFIGURATION_DELAY, + string memory _version ) AllocationManagerStorage(_delegation, _DEALLOCATION_DELAY, _ALLOCATION_CONFIGURATION_DELAY) Pausable(_pauserRegistry) PermissionControllerMixin(_permissionController) + SemVerMixin(_version) { _disableInitializers(); } diff --git a/src/contracts/core/DelegationManager.sol b/src/contracts/core/DelegationManager.sol index c131a7039f..1038e9c601 100644 --- a/src/contracts/core/DelegationManager.sol +++ b/src/contracts/core/DelegationManager.sol @@ -5,7 +5,7 @@ import "@openzeppelin-upgrades/contracts/proxy/utils/Initializable.sol"; import "@openzeppelin-upgrades/contracts/access/OwnableUpgradeable.sol"; import "@openzeppelin-upgrades/contracts/security/ReentrancyGuardUpgradeable.sol"; -import "../mixins/SignatureUtils.sol"; +import "../mixins/SignatureUtilsMixin.sol"; import "../mixins/PermissionControllerMixin.sol"; import "../permissions/Pausable.sol"; import "../libraries/SlashingLib.sol"; @@ -28,8 +28,8 @@ contract DelegationManager is Pausable, DelegationManagerStorage, ReentrancyGuardUpgradeable, - SignatureUtils, - PermissionControllerMixin + PermissionControllerMixin, + SignatureUtilsMixin { using SlashingLib for *; using Snapshots for Snapshots.DefaultZeroHistory; @@ -69,11 +69,13 @@ contract DelegationManager is IAllocationManager _allocationManager, IPauserRegistry _pauserRegistry, IPermissionController _permissionController, - uint32 _MIN_WITHDRAWAL_DELAY + uint32 _MIN_WITHDRAWAL_DELAY, + string memory _version ) DelegationManagerStorage(_strategyManager, _eigenPodManager, _allocationManager, _MIN_WITHDRAWAL_DELAY) Pausable(_pauserRegistry) PermissionControllerMixin(_permissionController) + SignatureUtilsMixin(_version) { _disableInitializers(); } diff --git a/src/contracts/core/RewardsCoordinator.sol b/src/contracts/core/RewardsCoordinator.sol index 2ebddfce36..82e985769b 100644 --- a/src/contracts/core/RewardsCoordinator.sol +++ b/src/contracts/core/RewardsCoordinator.sol @@ -10,6 +10,7 @@ import "../libraries/Merkle.sol"; import "../permissions/Pausable.sol"; import "./RewardsCoordinatorStorage.sol"; import "../mixins/PermissionControllerMixin.sol"; +import "../mixins/SemVerMixin.sol"; /** * @title RewardsCoordinator @@ -26,7 +27,8 @@ contract RewardsCoordinator is Pausable, ReentrancyGuardUpgradeable, RewardsCoordinatorStorage, - PermissionControllerMixin + PermissionControllerMixin, + SemVerMixin { using SafeERC20 for IERC20; using OperatorSetLib for OperatorSet; @@ -43,29 +45,21 @@ contract RewardsCoordinator is /// @dev Sets the immutable variables for the contract constructor( - IDelegationManager _delegationManager, - IStrategyManager _strategyManager, - IAllocationManager _allocationManager, - IPauserRegistry _pauserRegistry, - IPermissionController _permissionController, - uint32 _CALCULATION_INTERVAL_SECONDS, - uint32 _MAX_REWARDS_DURATION, - uint32 _MAX_RETROACTIVE_LENGTH, - uint32 _MAX_FUTURE_LENGTH, - uint32 _GENESIS_REWARDS_TIMESTAMP + RewardsCoordinatorConstructorParams memory params ) RewardsCoordinatorStorage( - _delegationManager, - _strategyManager, - _allocationManager, - _CALCULATION_INTERVAL_SECONDS, - _MAX_REWARDS_DURATION, - _MAX_RETROACTIVE_LENGTH, - _MAX_FUTURE_LENGTH, - _GENESIS_REWARDS_TIMESTAMP + params.delegationManager, + params.strategyManager, + params.allocationManager, + params.CALCULATION_INTERVAL_SECONDS, + params.MAX_REWARDS_DURATION, + params.MAX_RETROACTIVE_LENGTH, + params.MAX_FUTURE_LENGTH, + params.GENESIS_REWARDS_TIMESTAMP ) - Pausable(_pauserRegistry) - PermissionControllerMixin(_permissionController) + Pausable(params.pauserRegistry) + PermissionControllerMixin(params.permissionController) + SemVerMixin(params.version) { _disableInitializers(); } diff --git a/src/contracts/core/RewardsCoordinatorStorage.sol b/src/contracts/core/RewardsCoordinatorStorage.sol index e1896a808d..abe63de018 100644 --- a/src/contracts/core/RewardsCoordinatorStorage.sol +++ b/src/contracts/core/RewardsCoordinatorStorage.sol @@ -2,9 +2,6 @@ pragma solidity ^0.8.27; import "../interfaces/IRewardsCoordinator.sol"; -import "../interfaces/IDelegationManager.sol"; -import "../interfaces/IStrategyManager.sol"; -import "../interfaces/IAllocationManager.sol"; /** * @title Storage variables for the `RewardsCoordinator` contract. diff --git a/src/contracts/core/StrategyManager.sol b/src/contracts/core/StrategyManager.sol index 49ed6c5e87..c1b5bbada0 100644 --- a/src/contracts/core/StrategyManager.sol +++ b/src/contracts/core/StrategyManager.sol @@ -6,7 +6,7 @@ import "@openzeppelin-upgrades/contracts/access/OwnableUpgradeable.sol"; import "@openzeppelin-upgrades/contracts/security/ReentrancyGuardUpgradeable.sol"; import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; -import "../mixins/SignatureUtils.sol"; +import "../mixins/SignatureUtilsMixin.sol"; import "../interfaces/IEigenPodManager.sol"; import "../permissions/Pausable.sol"; import "./StrategyManagerStorage.sol"; @@ -26,7 +26,7 @@ contract StrategyManager is ReentrancyGuardUpgradeable, Pausable, StrategyManagerStorage, - SignatureUtils + SignatureUtilsMixin { using SlashingLib for *; using SafeERC20 for IERC20; @@ -53,8 +53,9 @@ contract StrategyManager is */ constructor( IDelegationManager _delegation, - IPauserRegistry _pauserRegistry - ) StrategyManagerStorage(_delegation) Pausable(_pauserRegistry) { + IPauserRegistry _pauserRegistry, + string memory _version + ) StrategyManagerStorage(_delegation) Pausable(_pauserRegistry) SignatureUtilsMixin(_version) { _disableInitializers(); } diff --git a/src/contracts/interfaces/IAVSDirectory.sol b/src/contracts/interfaces/IAVSDirectory.sol index 798f5a4e63..643f601e5d 100644 --- a/src/contracts/interfaces/IAVSDirectory.sol +++ b/src/contracts/interfaces/IAVSDirectory.sol @@ -1,7 +1,7 @@ // SPDX-License-Identifier: BUSL-1.1 pragma solidity >=0.5.0; -import "./ISignatureUtils.sol"; +import "./ISignatureUtilsMixin.sol"; import "./IPauserRegistry.sol"; import "./IStrategy.sol"; @@ -53,7 +53,7 @@ interface IAVSDirectoryEvents is IAVSDirectoryTypes { event AVSMetadataURIUpdated(address indexed avs, string metadataURI); } -interface IAVSDirectory is IAVSDirectoryEvents, IAVSDirectoryErrors, ISignatureUtils { +interface IAVSDirectory is IAVSDirectoryEvents, IAVSDirectoryErrors, ISignatureUtilsMixin { /** * * EXTERNAL FUNCTIONS @@ -98,7 +98,7 @@ interface IAVSDirectory is IAVSDirectoryEvents, IAVSDirectoryErrors, ISignatureU */ function registerOperatorToAVS( address operator, - ISignatureUtils.SignatureWithSaltAndExpiry memory operatorSignature + ISignatureUtilsMixinTypes.SignatureWithSaltAndExpiry memory operatorSignature ) external; /** diff --git a/src/contracts/interfaces/IAllocationManager.sol b/src/contracts/interfaces/IAllocationManager.sol index 1a24333c14..bce2134972 100644 --- a/src/contracts/interfaces/IAllocationManager.sol +++ b/src/contracts/interfaces/IAllocationManager.sol @@ -5,6 +5,7 @@ import {OperatorSet} from "../libraries/OperatorSetLib.sol"; import "./IPauserRegistry.sol"; import "./IStrategy.sol"; import "./IAVSRegistrar.sol"; +import "./ISemVerMixin.sol"; interface IAllocationManagerErrors { /// Input Validation @@ -213,7 +214,7 @@ interface IAllocationManagerEvents is IAllocationManagerTypes { event StrategyRemovedFromOperatorSet(OperatorSet operatorSet, IStrategy strategy); } -interface IAllocationManager is IAllocationManagerErrors, IAllocationManagerEvents { +interface IAllocationManager is IAllocationManagerErrors, IAllocationManagerEvents, ISemVerMixin { /** * @dev Initializes the initial owner and paused status. */ diff --git a/src/contracts/interfaces/IDelegationManager.sol b/src/contracts/interfaces/IDelegationManager.sol index ce3496c483..eed886ecd4 100644 --- a/src/contracts/interfaces/IDelegationManager.sol +++ b/src/contracts/interfaces/IDelegationManager.sol @@ -3,7 +3,7 @@ pragma solidity >=0.5.0; import "./IStrategy.sol"; import "./IPauserRegistry.sol"; -import "./ISignatureUtils.sol"; +import "./ISignatureUtilsMixin.sol"; import "../libraries/SlashingLib.sol"; interface IDelegationManagerErrors { @@ -185,7 +185,7 @@ interface IDelegationManagerEvents is IDelegationManagerTypes { * - enabling any staker to delegate its stake to the operator of its choice (a given staker can only delegate to a single operator at a time) * - enabling a staker to undelegate its assets from the operator it is delegated to (performed as part of the withdrawal process, initiated through the StrategyManager) */ -interface IDelegationManager is ISignatureUtils, IDelegationManagerErrors, IDelegationManagerEvents { +interface IDelegationManager is ISignatureUtilsMixin, IDelegationManagerErrors, IDelegationManagerEvents { /** * @dev Initializes the initial owner and paused status. */ diff --git a/src/contracts/interfaces/IEigenPod.sol b/src/contracts/interfaces/IEigenPod.sol index 5f354e7cd4..83dc8d8211 100644 --- a/src/contracts/interfaces/IEigenPod.sol +++ b/src/contracts/interfaces/IEigenPod.sol @@ -4,6 +4,7 @@ pragma solidity >=0.5.0; import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; import "../libraries/BeaconChainProofs.sol"; +import "./ISemVerMixin.sol"; import "./IEigenPodManager.sol"; interface IEigenPodErrors { @@ -138,7 +139,7 @@ interface IEigenPodEvents is IEigenPodTypes { * @dev Note that all beacon chain balances are stored as gwei within the beacon chain datastructures. We choose * to account balances in terms of gwei in the EigenPod contract and convert to wei when making calls to other contracts */ -interface IEigenPod is IEigenPodErrors, IEigenPodEvents { +interface IEigenPod is IEigenPodErrors, IEigenPodEvents, ISemVerMixin { /// @notice Used to initialize the pointers to contracts crucial to the pod's functionality, in beacon proxy construction from EigenPodManager function initialize( address owner diff --git a/src/contracts/interfaces/IEigenPodManager.sol b/src/contracts/interfaces/IEigenPodManager.sol index baf574cde8..afb384b744 100644 --- a/src/contracts/interfaces/IEigenPodManager.sol +++ b/src/contracts/interfaces/IEigenPodManager.sol @@ -8,6 +8,7 @@ import "./IEigenPod.sol"; import "./IShareManager.sol"; import "./IPausable.sol"; import "./IStrategy.sol"; +import "./ISemVerMixin.sol"; interface IEigenPodManagerErrors { /// @dev Thrown when caller is not a EigenPod. @@ -85,7 +86,8 @@ interface IEigenPodManager is IEigenPodManagerEvents, IEigenPodManagerTypes, IShareManager, - IPausable + IPausable, + ISemVerMixin { /** * @notice Creates an EigenPod for the sender. diff --git a/src/contracts/interfaces/IPermissionController.sol b/src/contracts/interfaces/IPermissionController.sol index 82940dafa1..b8e2153736 100644 --- a/src/contracts/interfaces/IPermissionController.sol +++ b/src/contracts/interfaces/IPermissionController.sol @@ -1,6 +1,8 @@ // SPDX-License-Identifier: BUSL-1.1 pragma solidity ^0.8.27; +import "./ISemVerMixin.sol"; + interface IPermissionControllerErrors { /// @notice Thrown when a non-admin caller attempts to perform an admin-only action. error NotAdmin(); @@ -40,7 +42,7 @@ interface IPermissionControllerEvents { event AdminRemoved(address indexed account, address admin); } -interface IPermissionController is IPermissionControllerErrors, IPermissionControllerEvents { +interface IPermissionController is IPermissionControllerErrors, IPermissionControllerEvents, ISemVerMixin { /** * @notice Sets a pending admin for an account. * @param account The account to set the pending admin for. diff --git a/src/contracts/interfaces/IRewardsCoordinator.sol b/src/contracts/interfaces/IRewardsCoordinator.sol index 953c435561..a449e98bbf 100644 --- a/src/contracts/interfaces/IRewardsCoordinator.sol +++ b/src/contracts/interfaces/IRewardsCoordinator.sol @@ -3,8 +3,14 @@ pragma solidity ^0.8.27; import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; import "../libraries/OperatorSetLib.sol"; + +import "./IAllocationManager.sol"; +import "./IDelegationManager.sol"; +import "./IStrategyManager.sol"; import "./IPauserRegistry.sol"; +import "./IPermissionController.sol"; import "./IStrategy.sol"; +import "./ISemVerMixin.sol"; interface IRewardsCoordinatorErrors { /// @dev Thrown when msg.sender is not allowed to call a function @@ -237,6 +243,35 @@ interface IRewardsCoordinatorTypes { bytes[] tokenTreeProofs; TokenTreeMerkleLeaf[] tokenLeaves; } + + /** + * @notice Parameters for the RewardsCoordinator constructor + * @param delegationManager The address of the DelegationManager contract + * @param strategyManager The address of the StrategyManager contract + * @param allocationManager The address of the AllocationManager contract + * @param pauserRegistry The address of the PauserRegistry contract + * @param permissionController The address of the PermissionController contract + * @param CALCULATION_INTERVAL_SECONDS The interval at which rewards are calculated + * @param MAX_REWARDS_DURATION The maximum duration of a rewards submission + * @param MAX_RETROACTIVE_LENGTH The maximum retroactive length of a rewards submission + * @param MAX_FUTURE_LENGTH The maximum future length of a rewards submission + * @param GENESIS_REWARDS_TIMESTAMP The timestamp at which rewards are first calculated + * @param version The semantic version of the contract (e.g. "v1.2.3") + * @dev Needed to avoid stack-too-deep errors + */ + struct RewardsCoordinatorConstructorParams { + IDelegationManager delegationManager; + IStrategyManager strategyManager; + IAllocationManager allocationManager; + IPauserRegistry pauserRegistry; + IPermissionController permissionController; + uint32 CALCULATION_INTERVAL_SECONDS; + uint32 MAX_REWARDS_DURATION; + uint32 MAX_RETROACTIVE_LENGTH; + uint32 MAX_FUTURE_LENGTH; + uint32 GENESIS_REWARDS_TIMESTAMP; + string version; + } } interface IRewardsCoordinatorEvents is IRewardsCoordinatorTypes { @@ -390,7 +425,7 @@ interface IRewardsCoordinatorEvents is IRewardsCoordinatorTypes { * Calculations are performed based on the completed RewardsSubmission, with the results posted in * a Merkle root against which Stakers & Operators can make claims. */ -interface IRewardsCoordinator is IRewardsCoordinatorErrors, IRewardsCoordinatorEvents { +interface IRewardsCoordinator is IRewardsCoordinatorErrors, IRewardsCoordinatorEvents, ISemVerMixin { /** * @dev Initializes the addresses of the initial owner, pauser registry, rewardsUpdater and * configures the initial paused status, activationDelay, and defaultOperatorSplitBips. diff --git a/src/contracts/interfaces/ISemVerMixin.sol b/src/contracts/interfaces/ISemVerMixin.sol new file mode 100644 index 0000000000..206cf38d46 --- /dev/null +++ b/src/contracts/interfaces/ISemVerMixin.sol @@ -0,0 +1,11 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.0; + +/// @title ISemVerMixin +/// @notice A mixin interface that provides semantic versioning functionality. +/// @dev Follows SemVer 2.0.0 specification (https://semver.org/) +interface ISemVerMixin { + /// @notice Returns the semantic version string of the contract. + /// @return The version string in SemVer format (e.g., "v1.1.1") + function version() external view returns (string memory); +} diff --git a/src/contracts/interfaces/IShareManager.sol b/src/contracts/interfaces/IShareManager.sol index e7c9501baf..4d2d66e9ff 100644 --- a/src/contracts/interfaces/IShareManager.sol +++ b/src/contracts/interfaces/IShareManager.sol @@ -1,9 +1,9 @@ // SPDX-License-Identifier: BUSL-1.1 pragma solidity ^0.8.27; -import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; import "../libraries/SlashingLib.sol"; import "./IStrategy.sol"; +import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; /** * @title Interface for a `IShareManager` contract. diff --git a/src/contracts/interfaces/ISignatureUtils.sol b/src/contracts/interfaces/ISignatureUtils.sol deleted file mode 100644 index 9e1ac2b45d..0000000000 --- a/src/contracts/interfaces/ISignatureUtils.sol +++ /dev/null @@ -1,30 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity >=0.5.0; - -/** - * @title The interface for common signature utilities. - * @author Layr Labs, Inc. - * @notice Terms of Service: https://docs.eigenlayer.xyz/overview/terms-of-service - */ -interface ISignatureUtils { - error InvalidSignature(); - error SignatureExpired(); - - // @notice Struct that bundles together a signature and an expiration time for the signature. Used primarily for stack management. - struct SignatureWithExpiry { - // the signature itself, formatted as a single bytes object - bytes signature; - // the expiration timestamp (UTC) of the signature - uint256 expiry; - } - - // @notice Struct that bundles together a signature, a salt for uniqueness, and an expiration time for the signature. Used primarily for stack management. - struct SignatureWithSaltAndExpiry { - // the signature itself, formatted as a single bytes object - bytes signature; - // the salt used to generate the signature - bytes32 salt; - // the expiration timestamp (UTC) of the signature - uint256 expiry; - } -} diff --git a/src/contracts/interfaces/ISignatureUtilsMixin.sol b/src/contracts/interfaces/ISignatureUtilsMixin.sol new file mode 100644 index 0000000000..7b9c8c372f --- /dev/null +++ b/src/contracts/interfaces/ISignatureUtilsMixin.sol @@ -0,0 +1,50 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity >=0.5.0; + +import "./ISemVerMixin.sol"; + +interface ISignatureUtilsMixinErrors { + /// @notice Thrown when a signature is invalid. + error InvalidSignature(); + /// @notice Thrown when a signature has expired. + error SignatureExpired(); +} + +interface ISignatureUtilsMixinTypes { + /// @notice Struct that bundles together a signature and an expiration time for the signature. + /// @dev Used primarily for stack management. + struct SignatureWithExpiry { + // the signature itself, formatted as a single bytes object + bytes signature; + // the expiration timestamp (UTC) of the signature + uint256 expiry; + } + + /// @notice Struct that bundles together a signature, a salt for uniqueness, and an expiration time for the signature. + /// @dev Used primarily for stack management. + struct SignatureWithSaltAndExpiry { + // the signature itself, formatted as a single bytes object + bytes signature; + // the salt used to generate the signature + bytes32 salt; + // the expiration timestamp (UTC) of the signature + uint256 expiry; + } +} + +/** + * @title The interface for common signature utilities. + * @author Layr Labs, Inc. + * @notice Terms of Service: https://docs.eigenlayer.xyz/overview/terms-of-service + */ +interface ISignatureUtilsMixin is ISignatureUtilsMixinErrors, ISignatureUtilsMixinTypes, ISemVerMixin { + /// @notice Computes the EIP-712 domain separator used for signature validation. + /// @dev The domain separator is computed according to EIP-712 specification, using: + /// - The hardcoded name "EigenLayer" + /// - The contract's version string + /// - The current chain ID + /// - This contract's address + /// @return The 32-byte domain separator hash used in EIP-712 structured data signing. + /// @dev See https://eips.ethereum.org/EIPS/eip-712#definition-of-domainseparator. + function domainSeparator() external view returns (bytes32); +} diff --git a/src/contracts/interfaces/IStrategy.sol b/src/contracts/interfaces/IStrategy.sol index 3052cba1c4..79e95302ca 100644 --- a/src/contracts/interfaces/IStrategy.sol +++ b/src/contracts/interfaces/IStrategy.sol @@ -3,6 +3,7 @@ pragma solidity >=0.5.0; import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; import "../libraries/SlashingLib.sol"; +import "./ISemVerMixin.sol"; interface IStrategyErrors { /// @dev Thrown when called by an account that is not strategy manager. @@ -47,7 +48,7 @@ interface IStrategyEvents { * @notice Terms of Service: https://docs.eigenlayer.xyz/overview/terms-of-service * @notice Custom `Strategy` implementations may expand extensively on this interface. */ -interface IStrategy is IStrategyErrors, IStrategyEvents { +interface IStrategy is IStrategyErrors, IStrategyEvents, ISemVerMixin { /** * @notice Used to deposit tokens into this Strategy * @param token is the ERC20 token being deposited diff --git a/src/contracts/interfaces/IStrategyFactory.sol b/src/contracts/interfaces/IStrategyFactory.sol index 137659cc34..c019695b4a 100644 --- a/src/contracts/interfaces/IStrategyFactory.sol +++ b/src/contracts/interfaces/IStrategyFactory.sol @@ -4,6 +4,7 @@ pragma solidity ^0.8.27; import "@openzeppelin/contracts/proxy/beacon/IBeacon.sol"; import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; import "./IStrategy.sol"; +import "./ISemVerMixin.sol"; /** * @title Interface for the `StrategyFactory` contract. @@ -11,7 +12,7 @@ import "./IStrategy.sol"; * @notice Terms of Service: https://docs.eigenlayer.xyz/overview/terms-of-service * @dev This may not be compatible with non-standard ERC20 tokens. Caution is warranted. */ -interface IStrategyFactory { +interface IStrategyFactory is ISemVerMixin { /// @dev Thrown when attempting to deploy a strategy for a blacklisted token. error BlacklistedToken(); /// @dev Thrown when attempting to deploy a strategy that already exists. diff --git a/src/contracts/interfaces/IStrategyManager.sol b/src/contracts/interfaces/IStrategyManager.sol index eeac883c37..2af48d4386 100644 --- a/src/contracts/interfaces/IStrategyManager.sol +++ b/src/contracts/interfaces/IStrategyManager.sol @@ -5,6 +5,7 @@ import "./IStrategy.sol"; import "./IShareManager.sol"; import "./IDelegationManager.sol"; import "./IEigenPodManager.sol"; +import "./ISemVerMixin.sol"; interface IStrategyManagerErrors { /// @dev Thrown when total strategies deployed exceeds max. @@ -56,7 +57,7 @@ interface IStrategyManagerEvents { * @notice Terms of Service: https://docs.eigenlayer.xyz/overview/terms-of-service * @notice See the `StrategyManager` contract itself for implementation details. */ -interface IStrategyManager is IStrategyManagerErrors, IStrategyManagerEvents, IShareManager { +interface IStrategyManager is IStrategyManagerErrors, IStrategyManagerEvents, IShareManager, ISemVerMixin { /** * @notice Initializes the strategy manager contract. Sets the `pauserRegistry` (currently **not** modifiable after being set), * and transfers contract ownership to the specified `initialOwner`. diff --git a/src/contracts/mixins/SemVerMixin.sol b/src/contracts/mixins/SemVerMixin.sol new file mode 100644 index 0000000000..c955de4f8b --- /dev/null +++ b/src/contracts/mixins/SemVerMixin.sol @@ -0,0 +1,38 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.0; + +import "../interfaces/ISemVerMixin.sol"; +import "@openzeppelin-upgrades/contracts/utils/ShortStringsUpgradeable.sol"; + +/// @title SemVerMixin +/// @notice A mixin contract that provides semantic versioning functionality. +/// @dev Follows SemVer 2.0.0 specification (https://semver.org/). +abstract contract SemVerMixin is ISemVerMixin { + using ShortStringsUpgradeable for *; + + /// @notice The semantic version string for this contract, stored as a ShortString for gas efficiency. + /// @dev Follows SemVer 2.0.0 specification (https://semver.org/). Prefixed with 'v' (e.g., "v1.2.3"). + ShortString internal immutable _VERSION; + + /// @notice Initializes the contract with a semantic version string. + /// @param _version The SemVer-formatted version string (e.g., "v1.2.3") + /// @dev Version should follow SemVer 2.0.0 format with 'v' prefix: vMAJOR.MINOR.PATCH + constructor( + string memory _version + ) { + _VERSION = _version.toShortString(); + } + + /// @inheritdoc ISemVerMixin + function version() public view virtual returns (string memory) { + return _VERSION.toString(); + } + + /// @notice Returns the major version of the contract. + /// @dev Supports single digit major versions (e.g., "v1" for version "v1.2.3") + /// @return The major version string (e.g., "v1" for version "v1.2.3") + function _majorVersion() internal view returns (string memory) { + bytes memory v = bytes(_VERSION.toString()); + return string(bytes.concat(v[0], v[1])); + } +} diff --git a/src/contracts/mixins/SignatureUtils.sol b/src/contracts/mixins/SignatureUtils.sol deleted file mode 100644 index 18f9c89844..0000000000 --- a/src/contracts/mixins/SignatureUtils.sol +++ /dev/null @@ -1,85 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.0; - -import "@openzeppelin-upgrades/contracts/utils/cryptography/SignatureCheckerUpgradeable.sol"; - -import "../interfaces/ISignatureUtils.sol"; - -/// @title SignatureUtils -/// @notice A mixin to provide EIP-712 signature validation utilities. -/// @dev Domain name is hardcoded to "EigenLayer". -abstract contract SignatureUtils is ISignatureUtils { - using SignatureCheckerUpgradeable for address; - - /// CONSTANTS - - /// @notice The EIP-712 typehash for the contract's domain. - bytes32 internal constant EIP712_DOMAIN_TYPEHASH = - keccak256("EIP712Domain(string name,uint256 chainId,address verifyingContract)"); - - /// @dev Returns the original chain ID from the time the contract was deployed. - uint256 internal immutable _INITIAL_CHAIN_ID; - - /// @dev Returns the original domain separator from the time the contract was deployed. - bytes32 internal immutable _INITIAL_DOMAIN_SEPARATOR; - - /// CONSTRUCTION - - constructor() { - _INITIAL_CHAIN_ID = block.chainid; - _INITIAL_DOMAIN_SEPARATOR = _calculateDomainSeparator(); - } - - /// EXTERNAL FUNCTIONS - - /** - * @notice Returns the current EIP-712 domain separator for this contract. - * - * @dev The domain separator will change in the event of a fork that changes the ChainID. - * @dev By introducing a domain separator the DApp developers are guaranteed that there can be no signature collision. - * for more detailed information please read EIP-712. - * @dev Use `_calculateDomainSeparator` rather than using this function. - */ - function domainSeparator() public view virtual returns (bytes32) { - /// forgefmt: disable-next-item - return block.chainid == _INITIAL_CHAIN_ID - // If the chain ID is the same, return the original domain separator. - ? _INITIAL_DOMAIN_SEPARATOR - // If the chain ID is different, return the new domain separator. - : _calculateDomainSeparator(); - } - - /// INTERNAL HELPERS - - /// @dev Helper for calculating the contract's domain separator. - function _calculateDomainSeparator() internal view returns (bytes32) { - /// forgefmt: disable-next-item - return - keccak256( - abi.encode( - EIP712_DOMAIN_TYPEHASH, - keccak256(bytes("EigenLayer")), - block.chainid, - address(this) - ) - ); - } - - /// @dev Helper for creating valid EIP-712 signable digests. - function _calculateSignableDigest( - bytes32 hash - ) internal view returns (bytes32) { - return keccak256(abi.encodePacked("\x19\x01", domainSeparator(), hash)); - } - - /// @dev Helper for checking if a signature is valid, reverts if not valid. - function _checkIsValidSignatureNow( - address signer, - bytes32 signableDigest, - bytes memory signature, - uint256 expiry - ) internal view { - require(expiry >= block.timestamp, SignatureExpired()); - require(signer.isValidSignatureNow(signableDigest, signature), InvalidSignature()); - } -} diff --git a/src/contracts/mixins/SignatureUtilsMixin.sol b/src/contracts/mixins/SignatureUtilsMixin.sol new file mode 100644 index 0000000000..10b33ad61c --- /dev/null +++ b/src/contracts/mixins/SignatureUtilsMixin.sol @@ -0,0 +1,87 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.0; + +import "@openzeppelin-upgrades/contracts/utils/ShortStringsUpgradeable.sol"; +import "@openzeppelin-upgrades/contracts/utils/cryptography/SignatureCheckerUpgradeable.sol"; + +import "../interfaces/ISignatureUtilsMixin.sol"; +import "./SemVerMixin.sol"; + +/// @dev The EIP-712 domain type hash used for computing the domain separator +/// See https://eips.ethereum.org/EIPS/eip-712#definition-of-domainseparator +bytes32 constant EIP712_DOMAIN_TYPEHASH = + keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"); + +/// @title SignatureUtilsMixin +/// @notice A mixin contract that provides utilities for validating signatures according to EIP-712 and EIP-1271 standards. +/// @dev The domain name is hardcoded to "EigenLayer". This contract implements signature validation functionality that can be +/// inherited by other contracts. The domain separator uses the major version (e.g., "v1") to maintain EIP-712 +/// signature compatibility across minor and patch version updates. +abstract contract SignatureUtilsMixin is ISignatureUtilsMixin, SemVerMixin { + using SignatureCheckerUpgradeable for address; + + /// @notice Initializes the contract with a semantic version string. + /// @param _version The SemVer-formatted version string (e.g., "v1.1.1") to use for this contract's domain separator. + /// @dev Version should follow SemVer 2.0.0 format with 'v' prefix: vMAJOR.MINOR.PATCH. + /// Only the major version component is used in the domain separator to maintain signature compatibility + /// across minor and patch version updates. + constructor( + string memory _version + ) SemVerMixin(_version) {} + + /// EXTERNAL FUNCTIONS /// + + /// @inheritdoc ISignatureUtilsMixin + function domainSeparator() public view virtual returns (bytes32) { + // forgefmt: disable-next-item + return + keccak256( + abi.encode( + EIP712_DOMAIN_TYPEHASH, + keccak256(bytes("EigenLayer")), + keccak256(bytes(_majorVersion())), + block.chainid, + address(this) + ) + ); + } + + /// INTERNAL HELPERS /// + + /// @notice Creates a digest that can be signed using EIP-712. + /// @dev Prepends the EIP-712 prefix ("\x19\x01") and domain separator to the input hash. + /// This follows the EIP-712 specification for creating structured data hashes. + /// See https://eips.ethereum.org/EIPS/eip-712#specification. + /// @param hash The hash of the typed data to be signed. + /// @return The complete digest that should be signed according to EIP-712. + function _calculateSignableDigest( + bytes32 hash + ) internal view returns (bytes32) { + return keccak256(abi.encodePacked("\x19\x01", domainSeparator(), hash)); + } + + /// @notice Validates a signature against a signer and digest, with an expiry timestamp. + /// @dev Reverts if the signature is invalid or expired. Uses EIP-1271 for smart contract signers. + /// For EOA signers, validates ECDSA signatures directly. + /// For contract signers, calls isValidSignature according to EIP-1271. + /// See https://eips.ethereum.org/EIPS/eip-1271#specification. + /// @param signer The address that should have signed the digest. + /// @param signableDigest The digest that was signed, created via _calculateSignableDigest. + /// @param signature The signature bytes to validate. + /// @param expiry The timestamp after which the signature is no longer valid. + function _checkIsValidSignatureNow( + address signer, + bytes32 signableDigest, + bytes memory signature, + uint256 expiry + ) internal view { + // First, check if the signature has expired by comparing the expiry timestamp + // against the current block timestamp. + require(expiry >= block.timestamp, SignatureExpired()); + + // Next, verify that the signature is valid for the given signer and digest. + // For EOA signers, this performs standard ECDSA signature verification. + // For contract signers, this calls the EIP-1271 isValidSignature method. + require(signer.isValidSignatureNow(signableDigest, signature), InvalidSignature()); + } +} diff --git a/src/contracts/permissions/PermissionController.sol b/src/contracts/permissions/PermissionController.sol index 46bdea5bde..ee367d79d8 100644 --- a/src/contracts/permissions/PermissionController.sol +++ b/src/contracts/permissions/PermissionController.sol @@ -2,9 +2,10 @@ pragma solidity ^0.8.27; import "@openzeppelin-upgrades/contracts/proxy/utils/Initializable.sol"; +import "../mixins/SemVerMixin.sol"; import "./PermissionControllerStorage.sol"; -contract PermissionController is Initializable, PermissionControllerStorage { +contract PermissionController is Initializable, SemVerMixin, PermissionControllerStorage { using EnumerableSet for *; modifier onlyAdmin( @@ -19,7 +20,9 @@ contract PermissionController is Initializable, PermissionControllerStorage { * INITIALIZING FUNCTIONS * */ - constructor() { + constructor( + string memory _version + ) SemVerMixin(_version) { _disableInitializers(); } diff --git a/src/contracts/pods/EigenPod.sol b/src/contracts/pods/EigenPod.sol index 1066b2fbfb..c92bf9191e 100644 --- a/src/contracts/pods/EigenPod.sol +++ b/src/contracts/pods/EigenPod.sol @@ -8,6 +8,8 @@ import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; import "../libraries/BeaconChainProofs.sol"; import "../libraries/BytesLib.sol"; +import "../mixins/SemVerMixin.sol"; + import "../interfaces/IETHPOSDeposit.sol"; import "../interfaces/IEigenPodManager.sol"; import "../interfaces/IPausable.sol"; @@ -23,7 +25,13 @@ import "./EigenPodStorage.sol"; * @dev Note that all beacon chain balances are stored as gwei within the beacon chain datastructures. We choose * to account balances in terms of gwei in the EigenPod contract and convert to wei when making calls to other contracts */ -contract EigenPod is Initializable, ReentrancyGuardUpgradeable, EigenPodPausingConstants, EigenPodStorage { +contract EigenPod is + Initializable, + ReentrancyGuardUpgradeable, + EigenPodPausingConstants, + EigenPodStorage, + SemVerMixin +{ using BytesLib for bytes; using SafeERC20 for IERC20; using BeaconChainProofs for *; @@ -94,7 +102,12 @@ contract EigenPod is Initializable, ReentrancyGuardUpgradeable, EigenPodPausingC * CONSTRUCTOR / INIT * */ - constructor(IETHPOSDeposit _ethPOS, IEigenPodManager _eigenPodManager, uint64 _GENESIS_TIME) { + constructor( + IETHPOSDeposit _ethPOS, + IEigenPodManager _eigenPodManager, + uint64 _GENESIS_TIME, + string memory _version + ) SemVerMixin(_version) { ethPOS = _ethPOS; eigenPodManager = _eigenPodManager; GENESIS_TIME = _GENESIS_TIME; diff --git a/src/contracts/pods/EigenPodManager.sol b/src/contracts/pods/EigenPodManager.sol index 35be0ac084..e6ec820e17 100644 --- a/src/contracts/pods/EigenPodManager.sol +++ b/src/contracts/pods/EigenPodManager.sol @@ -7,6 +7,7 @@ import "@openzeppelin-upgrades/contracts/access/OwnableUpgradeable.sol"; import "@openzeppelin-upgrades/contracts/security/ReentrancyGuardUpgradeable.sol"; import "../libraries/SlashingLib.sol"; +import "../mixins/SemVerMixin.sol"; import "../permissions/Pausable.sol"; import "./EigenPodPausingConstants.sol"; import "./EigenPodManagerStorage.sol"; @@ -27,7 +28,8 @@ contract EigenPodManager is Pausable, EigenPodPausingConstants, EigenPodManagerStorage, - ReentrancyGuardUpgradeable + ReentrancyGuardUpgradeable, + SemVerMixin { using SlashingLib for *; using Math for *; @@ -48,8 +50,13 @@ contract EigenPodManager is IETHPOSDeposit _ethPOS, IBeacon _eigenPodBeacon, IDelegationManager _delegationManager, - IPauserRegistry _pauserRegistry - ) EigenPodManagerStorage(_ethPOS, _eigenPodBeacon, _delegationManager) Pausable(_pauserRegistry) { + IPauserRegistry _pauserRegistry, + string memory _version + ) + EigenPodManagerStorage(_ethPOS, _eigenPodBeacon, _delegationManager) + Pausable(_pauserRegistry) + SemVerMixin(_version) + { _disableInitializers(); } diff --git a/src/contracts/strategies/EigenStrategy.sol b/src/contracts/strategies/EigenStrategy.sol index 8a74ef1a15..1bde13901d 100644 --- a/src/contracts/strategies/EigenStrategy.sol +++ b/src/contracts/strategies/EigenStrategy.sol @@ -2,6 +2,7 @@ pragma solidity ^0.8.27; // NOTE: Mainnet uses the OpenZeppelin v4.9.0 contracts, but this imports the 4.7.1 version. This will be changed after an upgrade. + import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; import "../interfaces/IStrategyManager.sol"; import "../strategies/StrategyBase.sol"; @@ -37,8 +38,9 @@ contract EigenStrategy is StrategyBase { /// @notice Since this contract is designed to be initializable, the constructor simply sets `strategyManager`, the only immutable variable. constructor( IStrategyManager _strategyManager, - IPauserRegistry _pauserRegistry - ) StrategyBase(_strategyManager, _pauserRegistry) {} + IPauserRegistry _pauserRegistry, + string memory _version + ) StrategyBase(_strategyManager, _pauserRegistry, _version) {} function initialize(IEigen _EIGEN, IERC20 _bEIGEN) public virtual initializer { EIGEN = _EIGEN; diff --git a/src/contracts/strategies/StrategyBase.sol b/src/contracts/strategies/StrategyBase.sol index 3621242c46..5dc1c158cb 100644 --- a/src/contracts/strategies/StrategyBase.sol +++ b/src/contracts/strategies/StrategyBase.sol @@ -3,6 +3,7 @@ pragma solidity ^0.8.27; import "../interfaces/IStrategyManager.sol"; import "../permissions/Pausable.sol"; +import "../mixins/SemVerMixin.sol"; import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; import "@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol"; import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; @@ -28,7 +29,7 @@ import "@openzeppelin-upgrades/contracts/proxy/utils/Initializable.sol"; * [this thread](https://github.com/OpenZeppelin/openzeppelin-contracts/issues/3706) on the OpenZeppelin repo. * We specifically use a share offset of `SHARES_OFFSET` and a balance offset of `BALANCE_OFFSET`. */ -contract StrategyBase is Initializable, Pausable, IStrategy { +contract StrategyBase is Initializable, Pausable, IStrategy, SemVerMixin { using SafeERC20 for IERC20; uint8 internal constant PAUSED_DEPOSITS = 0; @@ -69,7 +70,11 @@ contract StrategyBase is Initializable, Pausable, IStrategy { } /// @notice Since this contract is designed to be initializable, the constructor simply sets `strategyManager`, the only immutable variable. - constructor(IStrategyManager _strategyManager, IPauserRegistry _pauserRegistry) Pausable(_pauserRegistry) { + constructor( + IStrategyManager _strategyManager, + IPauserRegistry _pauserRegistry, + string memory _version + ) Pausable(_pauserRegistry) SemVerMixin(_version) { strategyManager = _strategyManager; _disableInitializers(); } diff --git a/src/contracts/strategies/StrategyBaseTVLLimits.sol b/src/contracts/strategies/StrategyBaseTVLLimits.sol index ac972822e8..65eca55877 100644 --- a/src/contracts/strategies/StrategyBaseTVLLimits.sol +++ b/src/contracts/strategies/StrategyBaseTVLLimits.sol @@ -26,8 +26,9 @@ contract StrategyBaseTVLLimits is StrategyBase { // solhint-disable-next-line no-empty-blocks constructor( IStrategyManager _strategyManager, - IPauserRegistry _pauserRegistry - ) StrategyBase(_strategyManager, _pauserRegistry) {} + IPauserRegistry _pauserRegistry, + string memory _version + ) StrategyBase(_strategyManager, _pauserRegistry, _version) {} function initialize( uint256 _maxPerDeposit, diff --git a/src/contracts/strategies/StrategyFactory.sol b/src/contracts/strategies/StrategyFactory.sol index 20ded2db2e..385bdcd839 100644 --- a/src/contracts/strategies/StrategyFactory.sol +++ b/src/contracts/strategies/StrategyFactory.sol @@ -3,6 +3,7 @@ pragma solidity ^0.8.27; import "@openzeppelin/contracts/proxy/beacon/BeaconProxy.sol"; import "@openzeppelin-upgrades/contracts/access/OwnableUpgradeable.sol"; +import "../mixins/SemVerMixin.sol"; import "./StrategyFactoryStorage.sol"; import "./StrategyBase.sol"; import "../permissions/Pausable.sol"; @@ -14,14 +15,18 @@ import "../permissions/Pausable.sol"; * @notice Terms of Service: https://docs.eigenlayer.xyz/overview/terms-of-service * @dev This may not be compatible with non-standard ERC20 tokens. Caution is warranted. */ -contract StrategyFactory is StrategyFactoryStorage, OwnableUpgradeable, Pausable { +contract StrategyFactory is StrategyFactoryStorage, OwnableUpgradeable, Pausable, SemVerMixin { uint8 internal constant PAUSED_NEW_STRATEGIES = 0; /// @notice EigenLayer's StrategyManager contract IStrategyManager public immutable strategyManager; /// @notice Since this contract is designed to be initializable, the constructor simply sets the immutable variables. - constructor(IStrategyManager _strategyManager, IPauserRegistry _pauserRegistry) Pausable(_pauserRegistry) { + constructor( + IStrategyManager _strategyManager, + IPauserRegistry _pauserRegistry, + string memory _version + ) Pausable(_pauserRegistry) SemVerMixin(_version) { strategyManager = _strategyManager; _disableInitializers(); } diff --git a/src/test/DevnetLifecycle.t.sol b/src/test/DevnetLifecycle.t.sol index 79beb56f99..aeb3cd6752 100644 --- a/src/test/DevnetLifecycle.t.sol +++ b/src/test/DevnetLifecycle.t.sol @@ -119,7 +119,7 @@ contract Devnet_Lifecycle_Test is Test, IAllocationManagerTypes { function _delegateToOperator() internal { // Delegate to operator - ISignatureUtils.SignatureWithExpiry memory signatureWithExpiry; + ISignatureUtilsMixinTypes.SignatureWithExpiry memory signatureWithExpiry; cheats.prank(staker); delegationManager.delegateTo(operator, signatureWithExpiry, bytes32(0)); diff --git a/src/test/harnesses/AllocationManagerHarness.sol b/src/test/harnesses/AllocationManagerHarness.sol index abe08266c2..98205c0d22 100644 --- a/src/test/harnesses/AllocationManagerHarness.sol +++ b/src/test/harnesses/AllocationManagerHarness.sol @@ -18,7 +18,8 @@ contract AllocationManagerHarness is AllocationManager { _pauserRegistry, _permissionController, _DEALLOCATION_DELAY, - _ALLOCATION_CONFIGURATION_DELAY + _ALLOCATION_CONFIGURATION_DELAY, + "v9.9.9" ) {} diff --git a/src/test/harnesses/DelegationManagerHarness.sol b/src/test/harnesses/DelegationManagerHarness.sol index a88d0fe67b..dcf1bc0229 100644 --- a/src/test/harnesses/DelegationManagerHarness.sol +++ b/src/test/harnesses/DelegationManagerHarness.sol @@ -20,7 +20,8 @@ contract DelegationManagerHarness is DelegationManager { _allocationManager, _pauserRegistry, _permissionController, - _MIN_WITHDRAWAL_DELAY + _MIN_WITHDRAWAL_DELAY, + "v9.9.9" ) {} diff --git a/src/test/harnesses/EigenPodHarness.sol b/src/test/harnesses/EigenPodHarness.sol index 0be5e4a541..29217270bc 100644 --- a/src/test/harnesses/EigenPodHarness.sol +++ b/src/test/harnesses/EigenPodHarness.sol @@ -9,11 +9,13 @@ contract EigenPodHarness is EigenPod { constructor( IETHPOSDeposit _ethPOS, IEigenPodManager _eigenPodManager, - uint64 _GENESIS_TIME + uint64 _GENESIS_TIME, + string memory _version ) EigenPod( _ethPOS, _eigenPodManager, - _GENESIS_TIME + _GENESIS_TIME, + _version ) {} function getActiveValidatorCount() public view returns (uint256) { diff --git a/src/test/harnesses/EigenPodManagerWrapper.sol b/src/test/harnesses/EigenPodManagerWrapper.sol index ffb190a551..5491984548 100644 --- a/src/test/harnesses/EigenPodManagerWrapper.sol +++ b/src/test/harnesses/EigenPodManagerWrapper.sol @@ -9,8 +9,9 @@ contract EigenPodManagerWrapper is EigenPodManager { IETHPOSDeposit _ethPOS, IBeacon _eigenPodBeacon, IDelegationManager _delegationManager, - IPauserRegistry _pauserRegistry - ) EigenPodManager(_ethPOS, _eigenPodBeacon, _delegationManager, _pauserRegistry) {} + IPauserRegistry _pauserRegistry, + string memory _version + ) EigenPodManager(_ethPOS, _eigenPodBeacon, _delegationManager, _pauserRegistry, _version) {} function setPodOwnerShares(address owner, IEigenPod pod) external { ownerToPod[owner] = pod; diff --git a/src/test/integration/IntegrationDeployer.t.sol b/src/test/integration/IntegrationDeployer.t.sol index 88d03c9a09..90811262cd 100644 --- a/src/test/integration/IntegrationDeployer.t.sol +++ b/src/test/integration/IntegrationDeployer.t.sol @@ -40,6 +40,8 @@ abstract contract IntegrationDeployer is ExistingDeploymentParser { bool isUpgraded; uint mainnetForkBlock = 21_616_692; // Post Protocol Council upgrade + string version = "v9.9.9"; + // Beacon chain genesis time when running locally // Multiple of 12 for sanity's sake uint64 constant GENESIS_TIME_LOCAL = 1 hours * 12; @@ -316,35 +318,54 @@ abstract contract IntegrationDeployer is ExistingDeploymentParser { } /// Deploy an implementation contract for each contract in the system - function _deployImplementations() public noTracing { - allocationManagerImplementation = new AllocationManager(delegationManager, eigenLayerPauserReg, permissionController, DEALLOCATION_DELAY, ALLOCATION_CONFIGURATION_DELAY); - permissionControllerImplementation = new PermissionController(); - delegationManagerImplementation = new DelegationManager(strategyManager, eigenPodManager, allocationManager, eigenLayerPauserReg, permissionController, DELEGATION_MANAGER_MIN_WITHDRAWAL_DELAY_BLOCKS); - strategyManagerImplementation = new StrategyManager(delegationManager, eigenLayerPauserReg); + function _deployImplementations() public { + allocationManagerImplementation = new AllocationManager( + delegationManager, + eigenLayerPauserReg, + permissionController, + DEALLOCATION_DELAY, + ALLOCATION_CONFIGURATION_DELAY, + version + ); + permissionControllerImplementation = new PermissionController(version); + delegationManagerImplementation = new DelegationManager( + strategyManager, + eigenPodManager, + allocationManager, + eigenLayerPauserReg, + permissionController, + DELEGATION_MANAGER_MIN_WITHDRAWAL_DELAY_BLOCKS, + version + ); + strategyManagerImplementation = new StrategyManager(delegationManager, eigenLayerPauserReg, version); rewardsCoordinatorImplementation = new RewardsCoordinator( - delegationManager, - strategyManager, - allocationManager, - eigenLayerPauserReg, - permissionController, - REWARDS_COORDINATOR_CALCULATION_INTERVAL_SECONDS, - REWARDS_COORDINATOR_MAX_REWARDS_DURATION, - REWARDS_COORDINATOR_MAX_RETROACTIVE_LENGTH, - REWARDS_COORDINATOR_MAX_FUTURE_LENGTH, - REWARDS_COORDINATOR_GENESIS_REWARDS_TIMESTAMP + IRewardsCoordinatorTypes.RewardsCoordinatorConstructorParams({ + delegationManager: delegationManager, + strategyManager: strategyManager, + allocationManager: allocationManager, + pauserRegistry: eigenLayerPauserReg, + permissionController: permissionController, + CALCULATION_INTERVAL_SECONDS: REWARDS_COORDINATOR_CALCULATION_INTERVAL_SECONDS, + MAX_REWARDS_DURATION: REWARDS_COORDINATOR_MAX_REWARDS_DURATION, + MAX_RETROACTIVE_LENGTH: REWARDS_COORDINATOR_MAX_RETROACTIVE_LENGTH, + MAX_FUTURE_LENGTH: REWARDS_COORDINATOR_MAX_FUTURE_LENGTH, + GENESIS_REWARDS_TIMESTAMP: REWARDS_COORDINATOR_GENESIS_REWARDS_TIMESTAMP, + version: version + }) ); - avsDirectoryImplementation = new AVSDirectory(delegationManager, eigenLayerPauserReg); + avsDirectoryImplementation = new AVSDirectory(delegationManager, eigenLayerPauserReg, version); eigenPodManagerImplementation = new EigenPodManager( DEPOSIT_CONTRACT, eigenPodBeacon, delegationManager, - eigenLayerPauserReg + eigenLayerPauserReg, + "v9.9.9" ); - strategyFactoryImplementation = new StrategyFactory(strategyManager, eigenLayerPauserReg); + strategyFactoryImplementation = new StrategyFactory(strategyManager, eigenLayerPauserReg, "v9.9.9"); // Beacon implementations - eigenPodImplementation = new EigenPod(DEPOSIT_CONTRACT, eigenPodManager, BEACON_GENESIS_TIME); - baseStrategyImplementation = new StrategyBase(strategyManager, eigenLayerPauserReg); + eigenPodImplementation = new EigenPod(DEPOSIT_CONTRACT, eigenPodManager, BEACON_GENESIS_TIME, "v9.9.9"); + baseStrategyImplementation = new StrategyBase(strategyManager, eigenLayerPauserReg, "v9.9.9"); // Pre-longtail StrategyBaseTVLLimits implementation // TODO - need to update ExistingDeploymentParser diff --git a/src/test/integration/deprecatedInterfaces/mainnet/IDelegationManager.sol b/src/test/integration/deprecatedInterfaces/mainnet/IDelegationManager.sol index 5f041668c5..3fafbeaf4e 100644 --- a/src/test/integration/deprecatedInterfaces/mainnet/IDelegationManager.sol +++ b/src/test/integration/deprecatedInterfaces/mainnet/IDelegationManager.sol @@ -3,7 +3,7 @@ pragma solidity ^0.8.27; import "src/contracts/interfaces/IStrategy.sol"; import "src/contracts/interfaces/IPausable.sol"; -import "src/contracts/interfaces/ISignatureUtils.sol"; +import "src/contracts/interfaces/ISignatureUtilsMixin.sol"; /** * @notice M2 DEPRECATED INTERFACE at commit hash https://github.com/Layr-Labs/eigenlayer-contracts/tree/426f461c59b4f0e16f8becdffd747075edcaded8 @@ -11,7 +11,7 @@ import "src/contracts/interfaces/ISignatureUtils.sol"; * @author Layr Labs, Inc. * @notice Terms of Service: https://docs.eigenlayer.xyz/overview/terms-of-service */ -interface IDelegationManager_DeprecatedM2 is IPausable, ISignatureUtils { +interface IDelegationManager_DeprecatedM2 is IPausable, ISignatureUtilsMixin { // @notice Struct used for storing information about a single operator who has registered with EigenLayer struct OperatorDetails { /// @notice DEPRECATED -- this field is no longer used, payments are handled in PaymentCoordinator.sol diff --git a/src/test/integration/users/User.t.sol b/src/test/integration/users/User.t.sol index 0d1e96589e..3cafc26648 100644 --- a/src/test/integration/users/User.t.sol +++ b/src/test/integration/users/User.t.sol @@ -205,7 +205,7 @@ contract User is Logger, IDelegationManagerTypes, IAllocationManagerTypes { ) public virtual createSnapshot { print.method("delegateTo", operator.NAME_COLORED()); - ISignatureUtils.SignatureWithExpiry memory emptySig; + ISignatureUtilsMixinTypes.SignatureWithExpiry memory emptySig; delegationManager.delegateTo(address(operator), emptySig, bytes32(0)); print.gasUsed(); } @@ -243,7 +243,7 @@ contract User is Logger, IDelegationManagerTypes, IAllocationManagerTypes { ) public virtual createSnapshot returns (Withdrawal[] memory) { print.method("redelegate", newOperator.NAME_COLORED()); Withdrawal[] memory expectedWithdrawals = _getExpectedWithdrawalStructsForStaker(address(this)); - ISignatureUtils.SignatureWithExpiry memory emptySig; + ISignatureUtilsMixinTypes.SignatureWithExpiry memory emptySig; _tryPrankAppointee_DelegationManager(IDelegationManager.redelegate.selector); delegationManager.redelegate(address(newOperator), emptySig, bytes32(0)); print.gasUsed(); diff --git a/src/test/integration/users/User_M1.t.sol b/src/test/integration/users/User_M1.t.sol index e0ebb17a91..86b6f34904 100644 --- a/src/test/integration/users/User_M1.t.sol +++ b/src/test/integration/users/User_M1.t.sol @@ -5,7 +5,7 @@ import "src/test/integration/deprecatedInterfaces/mainnet/IEigenPod.sol"; import "src/test/integration/deprecatedInterfaces/mainnet/IEigenPodManager.sol"; import "src/test/integration/deprecatedInterfaces/mainnet/IStrategyManager.sol"; import "src/test/integration/users/User.t.sol"; -import "src/contracts/mixins/SignatureUtils.sol"; +import "src/contracts/mixins/SignatureUtilsMixin.sol"; interface IUserM1MainnetForkDeployer { function delegationManager() external view returns (DelegationManager); @@ -70,11 +70,6 @@ contract User_M1 is User { } contract User_M1_AltMethods is User_M1 { - /// @notice The EIP-712 typehash for the contract's domain. - bytes32 internal constant EIP712_DOMAIN_TYPEHASH = - keccak256("EIP712Domain(string name,uint256 chainId,address verifyingContract)"); - - mapping(bytes32 => bool) public signedHashes; constructor(string memory name) User_M1(name) {} diff --git a/src/test/mocks/DelegationManagerMock.sol b/src/test/mocks/DelegationManagerMock.sol index 74660ae04f..9fc9cd28ce 100644 --- a/src/test/mocks/DelegationManagerMock.sol +++ b/src/test/mocks/DelegationManagerMock.sol @@ -52,7 +52,7 @@ contract DelegationManagerMock is Test { } } - function delegateTo(address operator, ISignatureUtils.SignatureWithExpiry memory /*approverSignatureAndExpiry*/, bytes32 /*approverSalt*/) external { + function delegateTo(address operator, ISignatureUtilsMixinTypes.SignatureWithExpiry memory /*approverSignatureAndExpiry*/, bytes32 /*approverSalt*/) external { delegatedTo[msg.sender] = operator; } diff --git a/src/test/mocks/EigenPodMock.sol b/src/test/mocks/EigenPodMock.sol index d1e12199f9..f74b966c4a 100644 --- a/src/test/mocks/EigenPodMock.sol +++ b/src/test/mocks/EigenPodMock.sol @@ -3,8 +3,10 @@ pragma solidity ^0.8.9; import "forge-std/Test.sol"; import "../../contracts/interfaces/IEigenPod.sol"; +import "../../contracts/mixins/SemVerMixin.sol"; -contract EigenPodMock is IEigenPod, Test { +contract EigenPodMock is IEigenPod, SemVerMixin, Test { + constructor() SemVerMixin("v9.9.9") {} function nonBeaconChainETHBalanceWei() external view returns(uint256) {} diff --git a/src/test/unit/AVSDirectoryUnit.t.sol b/src/test/unit/AVSDirectoryUnit.t.sol index bd9e2b8b05..7a8694d4db 100644 --- a/src/test/unit/AVSDirectoryUnit.t.sol +++ b/src/test/unit/AVSDirectoryUnit.t.sol @@ -4,7 +4,7 @@ pragma solidity ^0.8.27; import "src/contracts/core/AVSDirectory.sol"; import "src/test/utils/EigenLayerUnitTestSetup.sol"; -contract AVSDirectoryUnitTests is EigenLayerUnitTestSetup, IAVSDirectoryEvents, IAVSDirectoryErrors, ISignatureUtils { +contract AVSDirectoryUnitTests is EigenLayerUnitTestSetup, IAVSDirectoryEvents, IAVSDirectoryErrors, ISignatureUtilsMixinTypes { uint8 constant PAUSED_OPERATOR_REGISTER_DEREGISTER_TO_AVS = 0; AVSDirectory avsDirectory; @@ -39,7 +39,7 @@ contract AVSDirectoryUnitTests is EigenLayerUnitTestSetup, IAVSDirectoryEvents, avsd = AVSDirectory( address( new TransparentUpgradeableProxy( - address(new AVSDirectory(IDelegationManager(delegationManager), pauserRegistry)), + address(new AVSDirectory(IDelegationManager(delegationManager), pauserRegistry, "v9.9.9")), address(eigenLayerProxyAdmin), abi.encodeWithSelector( AVSDirectory.initialize.selector, @@ -51,7 +51,18 @@ contract AVSDirectoryUnitTests is EigenLayerUnitTestSetup, IAVSDirectoryEvents, ); isExcludedFuzzAddress[address(avsd)] = true; - assertTrue(avsd.domainSeparator() != bytes32(0), "sanity check"); + bytes memory v = bytes(avsd.version()); + bytes32 expectedDomainSeparator = keccak256( + abi.encode( + EIP712_DOMAIN_TYPEHASH, + keccak256(bytes("EigenLayer")), + keccak256(bytes.concat(v[0], v[1])), + block.chainid, + address(avsd) + ) + ); + + assertEq(avsd.domainSeparator(), expectedDomainSeparator, "sanity check"); } function _newOperatorRegistrationSignature( @@ -110,7 +121,7 @@ contract AVSDirectoryUnitTests is EigenLayerUnitTestSetup, IAVSDirectoryEvents, function test_registerOperatorToAVS_SignatureExpired() public { defaultOperatorSignature.expiry = block.timestamp - 1; - cheats.expectRevert(SignatureExpired.selector); + cheats.expectRevert(ISignatureUtilsMixinErrors.SignatureExpired.selector); avsDirectory.registerOperatorToAVS(defaultOperator, defaultOperatorSignature); } diff --git a/src/test/unit/AllocationManagerUnit.t.sol b/src/test/unit/AllocationManagerUnit.t.sol index f9fa209149..bf3cb7939c 100644 --- a/src/test/unit/AllocationManagerUnit.t.sol +++ b/src/test/unit/AllocationManagerUnit.t.sol @@ -62,7 +62,7 @@ contract AllocationManagerUnitTests is EigenLayerUnitTestSetup, IAllocationManag strategyMock = StrategyBase( address( new TransparentUpgradeableProxy( - address(new StrategyBase(IStrategyManager(address(strategyManagerMock)), pauserRegistry)), + address(new StrategyBase(IStrategyManager(address(strategyManagerMock)), pauserRegistry, "v9.9.9")), address(eigenLayerProxyAdmin), abi.encodeWithSelector(StrategyBase.initialize.selector, tokenMock) ) diff --git a/src/test/unit/DelegationUnit.t.sol b/src/test/unit/DelegationUnit.t.sol index 9a0458281e..6137a45f47 100644 --- a/src/test/unit/DelegationUnit.t.sol +++ b/src/test/unit/DelegationUnit.t.sol @@ -65,7 +65,7 @@ contract DelegationManagerUnitTests is EigenLayerUnitTestSetup, IDelegationManag address defaultOperator2 = address(0x123); address defaultAVS = address(this); string emptyStringForMetadataURI; - ISignatureUtils.SignatureWithExpiry emptyApproverSignatureAndExpiry; + ISignatureUtilsMixinTypes.SignatureWithExpiry emptyApproverSignatureAndExpiry; bytes32 emptySalt; // Helper to use in storage DepositScalingFactor dsf; @@ -112,7 +112,7 @@ contract DelegationManagerUnitTests is EigenLayerUnitTestSetup, IDelegationManag // Deploy mock token and strategy tokenMock = new ERC20PresetFixedSupply("Mock Token", "MOCK", tokenMockInitialSupply, address(this)); - strategyImplementation = new StrategyBase(IStrategyManager(address(strategyManagerMock)), pauserRegistry); + strategyImplementation = new StrategyBase(IStrategyManager(address(strategyManagerMock)), pauserRegistry, "v9.9.9"); strategyMock = StrategyBase( address( new TransparentUpgradeableProxy( @@ -208,7 +208,7 @@ contract DelegationManagerUnitTests is EigenLayerUnitTestSetup, IDelegationManag address operator, bytes32 salt, uint256 expiry - ) internal view returns (ISignatureUtils.SignatureWithExpiry memory approverSignatureAndExpiry) { + ) internal view returns (ISignatureUtilsMixinTypes.SignatureWithExpiry memory approverSignatureAndExpiry) { approverSignatureAndExpiry.expiry = expiry; { bytes32 digestHash = delegationManager.calculateDelegationApprovalDigestHash( @@ -222,15 +222,20 @@ contract DelegationManagerUnitTests is EigenLayerUnitTestSetup, IDelegationManag // @notice Assumes operator does not have a delegation approver & staker != approver function _delegateToOperatorWhoAcceptsAllStakers(address staker, address operator) internal { - ISignatureUtils.SignatureWithExpiry memory approverSignatureAndExpiry; + ISignatureUtilsMixinTypes.SignatureWithExpiry memory approverSignatureAndExpiry; cheats.prank(staker); delegationManager.delegateTo(operator, approverSignatureAndExpiry, emptySalt); } function _delegateToOperatorWhoRequiresSig(address staker, address operator, bytes32 salt) internal { uint256 expiry = type(uint256).max; - ISignatureUtils.SignatureWithExpiry memory approverSignatureAndExpiry = - _getApproverSignature(delegationSignerPrivateKey, staker, operator, salt, expiry); + ISignatureUtilsMixinTypes.SignatureWithExpiry memory approverSignatureAndExpiry = _getApproverSignature( + delegationSignerPrivateKey, + staker, + operator, + salt, + expiry + ); cheats.prank(staker); delegationManager.delegateTo(operator, approverSignatureAndExpiry, salt); } @@ -1310,6 +1315,19 @@ contract DelegationManagerUnitTests_Initialization_Setters is DelegationManagerU ); assertEq(delegationManager.owner(), address(this), "constructor / initializer incorrect, owner set wrong"); assertEq(delegationManager.paused(), 0, "constructor / initializer incorrect, paused status set wrong"); + + bytes memory v = bytes(delegationManager.version()); + bytes32 expectedDomainSeparator = keccak256( + abi.encode( + EIP712_DOMAIN_TYPEHASH, + keccak256(bytes("EigenLayer")), + keccak256(bytes.concat(v[0], v[1])), + block.chainid, + address(delegationManager) + ) + ); + + assertEq(delegationManager.domainSeparator(), expectedDomainSeparator, "sanity check"); } /// @notice Verifies that the DelegationManager cannot be initialized multiple times @@ -1418,7 +1436,7 @@ contract DelegationManagerUnitTests_RegisterModifyOperator is DelegationManagerU // delegate from the `staker` to the operator cheats.startPrank(staker); - ISignatureUtils.SignatureWithExpiry memory approverSignatureAndExpiry; + ISignatureUtilsMixinTypes.SignatureWithExpiry memory approverSignatureAndExpiry; delegationManager.delegateTo(defaultOperator, approverSignatureAndExpiry, emptySalt); // expect revert if attempt to register as operator @@ -1592,7 +1610,7 @@ contract DelegationManagerUnitTests_delegateTo is DelegationManagerUnitTests { cheats.prank(pauser); delegationManager.pause(2 ** PAUSED_NEW_DELEGATION); - ISignatureUtils.SignatureWithExpiry memory approverSignatureAndExpiry; + ISignatureUtilsMixinTypes.SignatureWithExpiry memory approverSignatureAndExpiry; cheats.prank(defaultStaker); cheats.expectRevert(IPausable.CurrentlyPaused.selector); delegationManager.delegateTo(defaultOperator, approverSignatureAndExpiry, emptySalt); @@ -1603,7 +1621,7 @@ contract DelegationManagerUnitTests_delegateTo is DelegationManagerUnitTests { */ function testFuzz_Revert_WhenDelegateWhileDelegated( Randomness r, - ISignatureUtils.SignatureWithExpiry memory approverSignatureAndExpiry + ISignatureUtilsMixinTypes.SignatureWithExpiry memory approverSignatureAndExpiry ) public rand(r) { address staker = r.Address(); address operator = r.Address(); @@ -1630,7 +1648,7 @@ contract DelegationManagerUnitTests_delegateTo is DelegationManagerUnitTests { // try to delegate and check that the call reverts cheats.prank(staker); cheats.expectRevert(OperatorNotRegistered.selector); - ISignatureUtils.SignatureWithExpiry memory approverSignatureAndExpiry; + ISignatureUtilsMixinTypes.SignatureWithExpiry memory approverSignatureAndExpiry; delegationManager.delegateTo(operator, approverSignatureAndExpiry, emptySalt); } @@ -1648,7 +1666,7 @@ contract DelegationManagerUnitTests_delegateTo is DelegationManagerUnitTests { */ function testFuzz_OperatorWhoAcceptsAllStakers_StrategyManagerShares( Randomness r, - ISignatureUtils.SignatureWithExpiry memory approverSignatureAndExpiry + ISignatureUtilsMixinTypes.SignatureWithExpiry memory approverSignatureAndExpiry ) public rand(r) { address staker = r.Address(); bytes32 salt = r.Bytes32(); @@ -1711,7 +1729,7 @@ contract DelegationManagerUnitTests_delegateTo is DelegationManagerUnitTests { */ function testFuzz_OperatorWhoAcceptsAllStakers_beaconChainStrategyShares( Randomness r, - ISignatureUtils.SignatureWithExpiry memory approverSignatureAndExpiry + ISignatureUtilsMixinTypes.SignatureWithExpiry memory approverSignatureAndExpiry ) public rand(r) { address staker = r.Address(); bytes32 salt = r.Bytes32(); @@ -1826,7 +1844,7 @@ contract DelegationManagerUnitTests_delegateTo is DelegationManagerUnitTests { */ function testFuzz_Revert_OperatorWhoAcceptsAllStakers_AlreadySlashed100Percent_BeaconChainStrategyShares( Randomness r, - ISignatureUtils.SignatureWithExpiry memory approverSignatureAndExpiry + ISignatureUtilsMixinTypes.SignatureWithExpiry memory approverSignatureAndExpiry ) public rand(r) { address staker = r.Address(); bytes32 salt = r.Bytes32(); @@ -2092,7 +2110,7 @@ contract DelegationManagerUnitTests_delegateTo is DelegationManagerUnitTests { */ function testFuzz_OperatorWhoAcceptsAllStakers_BeaconChainAndStrategyManagerShares( Randomness r, - ISignatureUtils.SignatureWithExpiry memory approverSignatureAndExpiry + ISignatureUtilsMixinTypes.SignatureWithExpiry memory approverSignatureAndExpiry ) public rand(r) { address staker = r.Address(); bytes32 salt = r.Bytes32(); @@ -2275,7 +2293,7 @@ contract DelegationManagerUnitTests_delegateTo is DelegationManagerUnitTests { */ function testFuzz_OperatorWhoAcceptsAllStakers_ZeroDelegatableShares( Randomness r, - ISignatureUtils.SignatureWithExpiry memory approverSignatureAndExpiry + ISignatureUtilsMixinTypes.SignatureWithExpiry memory approverSignatureAndExpiry ) public rand(r) { address staker = r.Address(); bytes32 salt = r.Bytes32(); @@ -2319,12 +2337,17 @@ contract DelegationManagerUnitTests_delegateTo is DelegationManagerUnitTests { _registerOperatorWithDelegationApprover(defaultOperator); // calculate the delegationSigner's signature - ISignatureUtils.SignatureWithExpiry memory approverSignatureAndExpiry = - _getApproverSignature(delegationSignerPrivateKey, staker, defaultOperator, salt, expiry); + ISignatureUtilsMixinTypes.SignatureWithExpiry memory approverSignatureAndExpiry = _getApproverSignature( + delegationSignerPrivateKey, + staker, + defaultOperator, + salt, + expiry + ); // delegate from the `staker` to the operator cheats.startPrank(staker); - cheats.expectRevert(ISignatureUtils.SignatureExpired.selector); + cheats.expectRevert(ISignatureUtilsMixinErrors.SignatureExpired.selector); delegationManager.delegateTo(defaultOperator, approverSignatureAndExpiry, salt); cheats.stopPrank(); } @@ -2348,8 +2371,13 @@ contract DelegationManagerUnitTests_delegateTo is DelegationManagerUnitTests { "salt somehow spent too early?" ); // calculate the delegationSigner's signature - ISignatureUtils.SignatureWithExpiry memory approverSignatureAndExpiry = - _getApproverSignature(delegationSignerPrivateKey, staker, defaultOperator, salt, expiry); + ISignatureUtilsMixinTypes.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 @@ -2377,7 +2405,7 @@ contract DelegationManagerUnitTests_delegateTo is DelegationManagerUnitTests { _registerOperatorWithDelegationApprover(defaultOperator); // calculate the signature - ISignatureUtils.SignatureWithExpiry memory approverSignatureAndExpiry; + ISignatureUtilsMixinTypes.SignatureWithExpiry memory approverSignatureAndExpiry; approverSignatureAndExpiry.expiry = expiry; { bytes32 digestHash = delegationManager.calculateDelegationApprovalDigestHash( @@ -2391,7 +2419,7 @@ contract DelegationManagerUnitTests_delegateTo is DelegationManagerUnitTests { // try to delegate from the `staker` to the operator, and check reversion cheats.startPrank(staker); - cheats.expectRevert(ISignatureUtils.InvalidSignature.selector); + cheats.expectRevert(ISignatureUtilsMixinErrors.InvalidSignature.selector); delegationManager.delegateTo(defaultOperator, approverSignatureAndExpiry, emptySalt); cheats.stopPrank(); } @@ -2420,8 +2448,13 @@ contract DelegationManagerUnitTests_delegateTo is DelegationManagerUnitTests { "salt somehow spent too early?" ); // calculate the delegationSigner's signature - ISignatureUtils.SignatureWithExpiry memory approverSignatureAndExpiry = - _getApproverSignature(delegationSignerPrivateKey, staker, defaultOperator, salt, expiry); + ISignatureUtilsMixinTypes.SignatureWithExpiry memory approverSignatureAndExpiry = _getApproverSignature( + delegationSignerPrivateKey, + staker, + defaultOperator, + salt, + expiry + ); // delegate from the `staker` to the operator cheats.startPrank(staker); @@ -2479,8 +2512,13 @@ contract DelegationManagerUnitTests_delegateTo is DelegationManagerUnitTests { "salt somehow spent too early?" ); // calculate the delegationSigner's signature - ISignatureUtils.SignatureWithExpiry memory approverSignatureAndExpiry = - _getApproverSignature(delegationSignerPrivateKey, staker, defaultOperator, salt, expiry); + ISignatureUtilsMixinTypes.SignatureWithExpiry memory approverSignatureAndExpiry = _getApproverSignature( + delegationSignerPrivateKey, + staker, + defaultOperator, + salt, + expiry + ); // Set staker shares in StrategyManager strategyManagerMock.addDeposit(staker, strategyMock, shares); @@ -2562,8 +2600,13 @@ contract DelegationManagerUnitTests_delegateTo is DelegationManagerUnitTests { "salt somehow spent too early?" ); // calculate the delegationSigner's signature - ISignatureUtils.SignatureWithExpiry memory approverSignatureAndExpiry = - _getApproverSignature(delegationSignerPrivateKey, staker, defaultOperator, salt, expiry); + ISignatureUtilsMixinTypes.SignatureWithExpiry memory approverSignatureAndExpiry = _getApproverSignature( + delegationSignerPrivateKey, + staker, + defaultOperator, + salt, + expiry + ); // Set staker shares in BeaconChainStrategy eigenPodManagerMock.setPodOwnerShares(staker, beaconShares); @@ -2649,8 +2692,13 @@ contract DelegationManagerUnitTests_delegateTo is DelegationManagerUnitTests { "salt somehow spent too early?" ); // calculate the delegationSigner's signature - ISignatureUtils.SignatureWithExpiry memory approverSignatureAndExpiry = - _getApproverSignature(delegationSignerPrivateKey, staker, defaultOperator, salt, expiry); + ISignatureUtilsMixinTypes.SignatureWithExpiry memory approverSignatureAndExpiry = _getApproverSignature( + delegationSignerPrivateKey, + staker, + defaultOperator, + salt, + expiry + ); // Set staker shares in BeaconChainStrategy and StrategyManager uint256[] memory depositScalingFactors = new uint256[](2); @@ -2744,12 +2792,12 @@ contract DelegationManagerUnitTests_delegateTo is DelegationManagerUnitTests { _registerOperatorWithDelegationApprover(defaultOperator); // create the signature struct - ISignatureUtils.SignatureWithExpiry memory approverSignatureAndExpiry; + ISignatureUtilsMixinTypes.SignatureWithExpiry memory approverSignatureAndExpiry; approverSignatureAndExpiry.expiry = expiry; // try to delegate from the `staker` to the operator, and check reversion cheats.startPrank(staker); - cheats.expectRevert(ISignatureUtils.SignatureExpired.selector); + cheats.expectRevert(ISignatureUtilsMixinErrors.SignatureExpired.selector); delegationManager.delegateTo(defaultOperator, approverSignatureAndExpiry, emptySalt); cheats.stopPrank(); } @@ -2771,8 +2819,13 @@ contract DelegationManagerUnitTests_delegateTo is DelegationManagerUnitTests { _registerOperatorWith1271DelegationApprover(defaultOperator); // calculate the delegationSigner's signature - ISignatureUtils.SignatureWithExpiry memory approverSignatureAndExpiry = - _getApproverSignature(delegationSignerPrivateKey, staker, defaultOperator, salt, expiry); + ISignatureUtilsMixinTypes.SignatureWithExpiry memory approverSignatureAndExpiry = _getApproverSignature( + delegationSignerPrivateKey, + staker, + defaultOperator, + salt, + expiry + ); // delegate from the `staker` to the operator cheats.startPrank(staker); @@ -2801,7 +2854,7 @@ contract DelegationManagerUnitTests_delegateTo is DelegationManagerUnitTests { _registerOperator(defaultOperator, address(wallet), emptyStringForMetadataURI); // create the signature struct - ISignatureUtils.SignatureWithExpiry memory approverSignatureAndExpiry; + ISignatureUtilsMixinTypes.SignatureWithExpiry memory approverSignatureAndExpiry; approverSignatureAndExpiry.expiry = expiry; // try to delegate from the `staker` to the operator, and check reversion @@ -2830,13 +2883,18 @@ contract DelegationManagerUnitTests_delegateTo is DelegationManagerUnitTests { // calculate the delegationSigner's but this is not the correct signature from the wallet contract // since the wallet owner is address(1) - ISignatureUtils.SignatureWithExpiry memory approverSignatureAndExpiry = - _getApproverSignature(delegationSignerPrivateKey, staker, defaultOperator, salt, expiry); + ISignatureUtilsMixinTypes.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(ISignatureUtils.InvalidSignature.selector); + cheats.expectRevert(ISignatureUtilsMixinErrors.InvalidSignature.selector); delegationManager.delegateTo(defaultOperator, approverSignatureAndExpiry, emptySalt); cheats.stopPrank(); } @@ -2866,8 +2924,13 @@ contract DelegationManagerUnitTests_delegateTo is DelegationManagerUnitTests { "salt somehow spent too early?" ); // calculate the delegationSigner's signature - ISignatureUtils.SignatureWithExpiry memory approverSignatureAndExpiry = - _getApproverSignature(delegationSignerPrivateKey, staker, defaultOperator, salt, expiry); + ISignatureUtilsMixinTypes.SignatureWithExpiry memory approverSignatureAndExpiry = _getApproverSignature( + delegationSignerPrivateKey, + staker, + defaultOperator, + salt, + expiry + ); // delegate from the `staker` to the operator cheats.startPrank(staker); @@ -4505,12 +4568,17 @@ contract DelegationManagerUnitTests_redelegate is DelegationManagerUnitTests { _registerOperatorWithDelegationApprover(newOperator); // calculate the delegationSigner's signature - ISignatureUtils.SignatureWithExpiry memory approverSignatureAndExpiry = - _getApproverSignature(delegationSignerPrivateKey, staker, newOperator, salt, expiry); + ISignatureUtilsMixinTypes.SignatureWithExpiry memory approverSignatureAndExpiry = _getApproverSignature( + delegationSignerPrivateKey, + staker, + newOperator, + salt, + expiry + ); // delegate from the `staker` to the operator cheats.startPrank(staker); - cheats.expectRevert(ISignatureUtils.SignatureExpired.selector); + cheats.expectRevert(ISignatureUtilsMixinErrors.SignatureExpired.selector); delegationManager.redelegate(newOperator, approverSignatureAndExpiry, salt); cheats.stopPrank(); } @@ -4532,8 +4600,13 @@ contract DelegationManagerUnitTests_redelegate is DelegationManagerUnitTests { "salt somehow spent too early?" ); // calculate the delegationSigner's signature - ISignatureUtils.SignatureWithExpiry memory approverSignatureAndExpiry = - _getApproverSignature(delegationSignerPrivateKey, staker, newOperator, salt, expiry); + ISignatureUtilsMixinTypes.SignatureWithExpiry memory approverSignatureAndExpiry = _getApproverSignature( + delegationSignerPrivateKey, + staker, + newOperator, + salt, + expiry + ); // Spend salt by delegating normally first cheats.startPrank(staker); diff --git a/src/test/unit/EigenPodManagerUnit.t.sol b/src/test/unit/EigenPodManagerUnit.t.sol index 6aa8282ce5..f10dc60955 100644 --- a/src/test/unit/EigenPodManagerUnit.t.sol +++ b/src/test/unit/EigenPodManagerUnit.t.sol @@ -44,7 +44,8 @@ contract EigenPodManagerUnitTests is EigenLayerUnitTestSetup, IEigenPodManagerEv ethPOSMock, eigenPodBeacon, IDelegationManager(address(delegationManagerMock)), - pauserRegistry + pauserRegistry, + "v9.9.9" ); eigenPodManager = EigenPodManager( address( @@ -196,7 +197,8 @@ contract EigenPodManagerUnitTests_ShareUpdateTests is EigenPodManagerUnitTests { ethPOSMock, eigenPodBeacon, IDelegationManager(address(delegationManagerMock)), - pauserRegistry + pauserRegistry, + "v9.9.9" ); eigenLayerProxyAdmin.upgrade(ITransparentUpgradeableProxy(payable(address(eigenPodManager))), address(eigenPodManagerWrapper)); } @@ -368,7 +370,8 @@ contract EigenPodManagerUnitTests_WithdrawSharesAsTokensTests is EigenPodManager ethPOSMock, eigenPodBeacon, IDelegationManager(address(delegationManagerMock)), - pauserRegistry + pauserRegistry, + "v9.9.9" ); eigenLayerProxyAdmin.upgrade(ITransparentUpgradeableProxy(payable(address(eigenPodManager))), address(eigenPodManagerWrapper)); } @@ -490,7 +493,8 @@ contract EigenPodManagerUnitTests_BeaconChainETHBalanceUpdateTests is EigenPodMa ethPOSMock, eigenPodBeacon, IDelegationManager(address(delegationManagerMock)), - pauserRegistry + pauserRegistry, + "v9.9.9" ); eigenLayerProxyAdmin.upgrade(ITransparentUpgradeableProxy(payable(address(eigenPodManager))), address(eigenPodManagerWrapper)); } diff --git a/src/test/unit/EigenPodUnit.t.sol b/src/test/unit/EigenPodUnit.t.sol index 002ff9419f..eb098cfa94 100644 --- a/src/test/unit/EigenPodUnit.t.sol +++ b/src/test/unit/EigenPodUnit.t.sol @@ -59,7 +59,8 @@ contract EigenPodUnitTests is EigenLayerUnitTestSetup, EigenPodPausingConstants, podImplementation = new EigenPod( ethPOSDepositMock, IEigenPodManager(address(eigenPodManagerMock)), - GENESIS_TIME_LOCAL + GENESIS_TIME_LOCAL, + "v9.9.9" ); // Deploy Beacon @@ -324,7 +325,7 @@ contract EigenPodUnitTests is EigenLayerUnitTestSetup, EigenPodPausingConstants, contract EigenPodUnitTests_Initialization is EigenPodUnitTests { function test_constructor() public { - EigenPod pod = new EigenPod(ethPOSDepositMock, IEigenPodManager(address(eigenPodManagerMock)), GENESIS_TIME_LOCAL); + EigenPod pod = new EigenPod(ethPOSDepositMock, IEigenPodManager(address(eigenPodManagerMock)), GENESIS_TIME_LOCAL, "v9.9.9"); assertTrue(pod.ethPOS() == ethPOSDepositMock, "should have set ethPOS correctly"); assertTrue(address(pod.eigenPodManager()) == address(eigenPodManagerMock), "should have set eigenpodmanager correctly"); @@ -352,7 +353,7 @@ contract EigenPodUnitTests_Initialization is EigenPodUnitTests { } function test_initialize_revert_emptyPodOwner() public { - EigenPod pod = new EigenPod(ethPOSDepositMock, IEigenPodManager(address(eigenPodManagerMock)), GENESIS_TIME_LOCAL); + EigenPod pod = new EigenPod(ethPOSDepositMock, IEigenPodManager(address(eigenPodManagerMock)), GENESIS_TIME_LOCAL, "v9.9.9"); // un-initialize pod cheats.store(address(pod), 0, 0); @@ -1726,7 +1727,8 @@ contract EigenPodHarnessSetup is EigenPodUnitTests { eigenPodHarnessImplementation = new EigenPodHarness( ethPOSDepositMock, IEigenPodManager(address(eigenPodManagerMock)), - GENESIS_TIME_LOCAL + GENESIS_TIME_LOCAL, + "v9.9.9" ); // Upgrade eigenPod to harness diff --git a/src/test/unit/RewardsCoordinatorUnit.t.sol b/src/test/unit/RewardsCoordinatorUnit.t.sol index 4358e094bc..6f6a153510 100644 --- a/src/test/unit/RewardsCoordinatorUnit.t.sol +++ b/src/test/unit/RewardsCoordinatorUnit.t.sol @@ -108,17 +108,21 @@ contract RewardsCoordinatorUnitTests is EigenLayerUnitTestSetup, IRewardsCoordin // Deploy RewardsCoordinator proxy and implementation rewardsCoordinatorImplementation = new RewardsCoordinator( - IDelegationManager(address(delegationManagerMock)), - IStrategyManager(address(strategyManagerMock)), - IAllocationManager(address(allocationManagerMock)), - pauserRegistry, - IPermissionController(address(permissionController)), - CALCULATION_INTERVAL_SECONDS, - MAX_REWARDS_DURATION, - MAX_RETROACTIVE_LENGTH, - MAX_FUTURE_LENGTH, - GENESIS_REWARDS_TIMESTAMP + IRewardsCoordinatorTypes.RewardsCoordinatorConstructorParams({ + delegationManager: IDelegationManager(address(delegationManagerMock)), + strategyManager: IStrategyManager(address(strategyManagerMock)), + allocationManager: IAllocationManager(address(allocationManagerMock)), + pauserRegistry: pauserRegistry, + permissionController: IPermissionController(address(permissionController)), + CALCULATION_INTERVAL_SECONDS: CALCULATION_INTERVAL_SECONDS, + MAX_REWARDS_DURATION: MAX_REWARDS_DURATION, + MAX_RETROACTIVE_LENGTH: MAX_RETROACTIVE_LENGTH, + MAX_FUTURE_LENGTH: MAX_FUTURE_LENGTH, + GENESIS_REWARDS_TIMESTAMP: GENESIS_REWARDS_TIMESTAMP, + version: "v9.9.9" + }) ); + rewardsCoordinator = RewardsCoordinator( address( new TransparentUpgradeableProxy( @@ -141,7 +145,7 @@ contract RewardsCoordinatorUnitTests is EigenLayerUnitTestSetup, IRewardsCoordin token2 = new ERC20PresetFixedSupply("jeo boden", "MOCK2", mockTokenInitialSupply, address(this)); token3 = new ERC20PresetFixedSupply("pepe wif avs", "MOCK3", mockTokenInitialSupply, address(this)); - strategyImplementation = new StrategyBase(IStrategyManager(address(strategyManagerMock)), pauserRegistry); + strategyImplementation = new StrategyBase(IStrategyManager(address(strategyManagerMock)), pauserRegistry, "v9.9.9"); strategyMock1 = StrategyBase( address( new TransparentUpgradeableProxy( diff --git a/src/test/unit/StrategyBaseTVLLimitsUnit.sol b/src/test/unit/StrategyBaseTVLLimitsUnit.sol index 797621b681..531be01dae 100644 --- a/src/test/unit/StrategyBaseTVLLimitsUnit.sol +++ b/src/test/unit/StrategyBaseTVLLimitsUnit.sol @@ -24,7 +24,7 @@ contract StrategyBaseTVLLimitsUnitTests is StrategyBaseUnitTests { StrategyBaseUnitTests.setUp(); // depoloy the TVL-limited strategy - strategyBaseTVLLimitsImplementation = new StrategyBaseTVLLimits(strategyManager, pauserRegistry); + strategyBaseTVLLimitsImplementation = new StrategyBaseTVLLimits(strategyManager, pauserRegistry, "v9.9.9"); strategyWithTVLLimits = StrategyBaseTVLLimits( address( new TransparentUpgradeableProxy( diff --git a/src/test/unit/StrategyBaseUnit.t.sol b/src/test/unit/StrategyBaseUnit.t.sol index 13a80673b3..60caa46201 100644 --- a/src/test/unit/StrategyBaseUnit.t.sol +++ b/src/test/unit/StrategyBaseUnit.t.sol @@ -55,7 +55,7 @@ contract StrategyBaseUnitTests is Test { underlyingToken = new ERC20PresetFixedSupply("Test Token", "TEST", initialSupply, initialOwner); - strategyImplementation = new StrategyBase(strategyManager, pauserRegistry); + strategyImplementation = new StrategyBase(strategyManager, pauserRegistry, "v9.9.9"); strategy = StrategyBase( address( @@ -161,7 +161,7 @@ contract StrategyBaseUnitTests is Test { // Deploy token with 1e39 total supply underlyingToken = new ERC20PresetFixedSupply("Test Token", "TEST", 1e39, initialOwner); - strategyImplementation = new StrategyBase(strategyManager, pauserRegistry); + strategyImplementation = new StrategyBase(strategyManager, pauserRegistry, "v9.9.9"); strategy = StrategyBase( address( diff --git a/src/test/unit/StrategyFactoryUnit.t.sol b/src/test/unit/StrategyFactoryUnit.t.sol index 5775851163..6843c39d20 100644 --- a/src/test/unit/StrategyFactoryUnit.t.sol +++ b/src/test/unit/StrategyFactoryUnit.t.sol @@ -46,12 +46,12 @@ contract StrategyFactoryUnitTests is EigenLayerUnitTestSetup { underlyingToken = new ERC20PresetFixedSupply("Test Token", "TEST", initialSupply, initialOwner); - strategyImplementation = new StrategyBase(IStrategyManager(address(strategyManagerMock)), pauserRegistry); + strategyImplementation = new StrategyBase(IStrategyManager(address(strategyManagerMock)), pauserRegistry, "v9.9.9"); strategyBeacon = new UpgradeableBeacon(address(strategyImplementation)); strategyBeacon.transferOwnership(beaconProxyOwner); - strategyFactoryImplementation = new StrategyFactory(IStrategyManager(address(strategyManagerMock)), pauserRegistry); + strategyFactoryImplementation = new StrategyFactory(IStrategyManager(address(strategyManagerMock)), pauserRegistry, "v9.9.9"); strategyFactory = StrategyFactory( address( diff --git a/src/test/unit/StrategyManagerUnit.t.sol b/src/test/unit/StrategyManagerUnit.t.sol index 99e591dc5b..9e58282aaa 100644 --- a/src/test/unit/StrategyManagerUnit.t.sol +++ b/src/test/unit/StrategyManagerUnit.t.sol @@ -38,7 +38,7 @@ contract StrategyManagerUnitTests is EigenLayerUnitTestSetup, IStrategyManagerEv function setUp() public override { EigenLayerUnitTestSetup.setUp(); strategyManagerImplementation = new StrategyManager( - IDelegationManager(address(delegationManagerMock)), pauserRegistry + IDelegationManager(address(delegationManagerMock)), pauserRegistry, "v9.9.9" ); strategyManager = StrategyManager( address( @@ -88,7 +88,7 @@ contract StrategyManagerUnitTests is EigenLayerUnitTestSetup, IStrategyManagerEv IPauserRegistry _pauserRegistry, address admin ) public returns (StrategyBase) { - StrategyBase newStrategyImplementation = new StrategyBase(_strategyManager, _pauserRegistry); + StrategyBase newStrategyImplementation = new StrategyBase(_strategyManager, _pauserRegistry, "v9.9.9"); StrategyBase newStrategy = StrategyBase(address(new TransparentUpgradeableProxy(address(newStrategyImplementation), address(admin), ""))); newStrategy.initialize(_token); return newStrategy; @@ -177,7 +177,7 @@ contract StrategyManagerUnitTests is EigenLayerUnitTestSetup, IStrategyManagerEv if (!expectedRevertMessageIsempty) { cheats.expectRevert(expectedRevertMessage); } else if (expiry < block.timestamp) { - cheats.expectRevert(ISignatureUtils.SignatureExpired.selector); + cheats.expectRevert(ISignatureUtilsMixinErrors.SignatureExpired.selector); } else { // needed for expecting an event with the right parameters uint256 expectedDepositShares = amount; @@ -263,6 +263,20 @@ contract StrategyManagerUnitTests_initialize is StrategyManagerUnitTests { address(pauserRegistry), "strategyManager.pauserRegistry() != pauserRegistry" ); + + bytes memory v = bytes(strategyManager.version()); + + bytes32 expectedDomainSeparator = keccak256( + abi.encode( + EIP712_DOMAIN_TYPEHASH, + keccak256(bytes("EigenLayer")), + keccak256(bytes(bytes.concat(v[0], v[1]))), + block.chainid, + address(strategyManager) + ) + ); + + assertEq(strategyManager.domainSeparator(), expectedDomainSeparator, "sanity check"); } } @@ -836,7 +850,7 @@ contract StrategyManagerUnitTests_depositIntoStrategyWithSignature is StrategyMa uint256 depositSharesBefore = strategyManager.stakerDepositShares(staker, strategy); - cheats.expectRevert(ISignatureUtils.InvalidSignature.selector); + cheats.expectRevert(ISignatureUtilsMixinErrors.InvalidSignature.selector); // call with `notStaker` as input instead of `staker` address address notStaker = address(3333); strategyManager.depositIntoStrategyWithSignature(strategy, token, amount, notStaker, expiry, signature); @@ -866,7 +880,7 @@ contract StrategyManagerUnitTests_depositIntoStrategyWithSignature is StrategyMa // not expecting a revert, so input an empty string bytes memory signature = _depositIntoStrategyWithSignature(staker, amount, expiry, ""); - cheats.expectRevert(ISignatureUtils.InvalidSignature.selector); + cheats.expectRevert(ISignatureUtilsMixinErrors.InvalidSignature.selector); strategyManager.depositIntoStrategyWithSignature(dummyStrat, dummyToken, amount, staker, expiry, signature); } @@ -906,7 +920,7 @@ contract StrategyManagerUnitTests_depositIntoStrategyWithSignature is StrategyMa signature = abi.encodePacked(r, s, v); } - cheats.expectRevert(ISignatureUtils.InvalidSignature.selector); + cheats.expectRevert(ISignatureUtilsMixinErrors.InvalidSignature.selector); strategyManager.depositIntoStrategyWithSignature(strategy, token, amount, staker, expiry, signature); } @@ -1074,7 +1088,7 @@ contract StrategyManagerUnitTests_depositIntoStrategyWithSignature is StrategyMa uint256 depositSharesBefore = strategyManager.stakerDepositShares(staker, strategy); - cheats.expectRevert(ISignatureUtils.SignatureExpired.selector); + cheats.expectRevert(ISignatureUtilsMixinErrors.SignatureExpired.selector); strategyManager.depositIntoStrategyWithSignature(strategy, token, amount, staker, expiry, signature); uint256 depositSharesAfter = strategyManager.stakerDepositShares(staker, strategy); diff --git a/src/test/unit/mixins/SemVerMixin.t.sol b/src/test/unit/mixins/SemVerMixin.t.sol new file mode 100644 index 0000000000..bd217fd1d3 --- /dev/null +++ b/src/test/unit/mixins/SemVerMixin.t.sol @@ -0,0 +1,29 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.0; + +import {Test} from "forge-std/Test.sol"; +import {SemVerMixin} from "src/contracts/mixins/SemVerMixin.sol"; + +// Helper contract to test the abstract SemVerMixin +contract SemVerMixinMock is SemVerMixin { + constructor(string memory version) SemVerMixin(version) {} + + // Expose internal function for testing + function majorVersion() public view returns (string memory) { + return _majorVersion(); + } +} + +contract SemVerMixinTest is Test { + SemVerMixinMock public semVer; + + function test_version_returnsCorrectVersion() public { + semVer = new SemVerMixinMock("v1.2.3"); + assertEq(semVer.version(), "v1.2.3"); + } + + function test_majorVersion_returnsCorrectMajorVersion() public { + semVer = new SemVerMixinMock("v1.2.3"); + assertEq(semVer.majorVersion(), "v1"); + } +} \ No newline at end of file diff --git a/src/test/unit/mixins/SignatureUtilsUnit.t.sol b/src/test/unit/mixins/SignatureUtilsUnit.t.sol index f5f3183c4c..c2b959b39a 100644 --- a/src/test/unit/mixins/SignatureUtilsUnit.t.sol +++ b/src/test/unit/mixins/SignatureUtilsUnit.t.sol @@ -2,7 +2,7 @@ pragma solidity ^0.8.27; import "forge-std/Test.sol"; -import "src/contracts/mixins/SignatureUtils.sol"; +import "src/contracts/mixins/SignatureUtilsMixin.sol"; contract MockSigner { mapping(bytes32 => mapping(bytes => bool)) public validSignatures; @@ -16,24 +16,7 @@ contract MockSigner { } } -contract SignatureUtilsHarness is SignatureUtils { - function calculateSignableDigest(bytes32 hash) public view returns (bytes32) { - return _calculateSignableDigest(hash); - } - - function checkIsValidSignatureNow( - address signer, - bytes32 digest, - bytes memory signature, - uint256 expiry - ) public view { - _checkIsValidSignatureNow(signer, digest, signature, expiry); - } -} - -contract SignatureUtilsUnit is Test { - SignatureUtilsHarness harness; - MockSigner mockSigner; +contract SignatureUtilsMixinUnit is Test, SignatureUtilsMixin("v0.0.0") { uint256 signerPk; address signer; bytes32 hash; @@ -43,36 +26,35 @@ contract SignatureUtilsUnit is Test { function setUp() public { vm.chainId(1); - harness = new SignatureUtilsHarness(); - mockSigner = new MockSigner(); signerPk = 1; signer = vm.addr(signerPk); hash = keccak256(""); - digest = harness.calculateSignableDigest(hash); + digest = _calculateSignableDigest(hash); expectedDomainSeparator = keccak256( abi.encode( - keccak256("EIP712Domain(string name,uint256 chainId,address verifyingContract)"), + keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"), keccak256(bytes("EigenLayer")), + keccak256(bytes(_majorVersion())), block.chainid, - address(harness) + address(this) ) ); } - function test_domainSeparator_NonZero() public view { - assertTrue(harness.domainSeparator() != 0, "The domain separator should be non-zero"); - assertTrue(harness.domainSeparator() == expectedDomainSeparator, "The domain separator should be as expected"); + function test_domainSeparator_NonZero() public { + assertTrue(domainSeparator() != 0, "The domain separator should be non-zero"); + assertTrue(domainSeparator() == expectedDomainSeparator, "The domain separator should be as expected"); } function test_domainSeparator_NewChainId() public { - bytes32 initialDomainSeparator = harness.domainSeparator(); + bytes32 initialDomainSeparator = domainSeparator(); // Change the chain ID vm.chainId(9999); - bytes32 newDomainSeparator = harness.domainSeparator(); + bytes32 newDomainSeparator = domainSeparator(); assertTrue(newDomainSeparator != 0, "The new domain separator should be non-zero"); assertTrue( @@ -85,8 +67,8 @@ contract SignatureUtilsUnit is Test { function test_checkIsValidSignatureNow_Expired() public { (uint8 v, bytes32 r, bytes32 s) = vm.sign(signerPk, digest); - vm.expectRevert(ISignatureUtils.SignatureExpired.selector); - harness.checkIsValidSignatureNow(signer, digest, abi.encode(r, s, v), block.timestamp - 1); + vm.expectRevert(ISignatureUtilsMixinErrors.SignatureExpired.selector); + _checkIsValidSignatureNow(signer, digest, abi.encode(r, s, v), block.timestamp - 1); } // function testFail_checkIsValidSignatureNow_InvalidSignature() public { diff --git a/src/test/utils/EigenLayerUnitTestSetup.sol b/src/test/utils/EigenLayerUnitTestSetup.sol index a8ac0e187f..80d48dc3d4 100644 --- a/src/test/utils/EigenLayerUnitTestSetup.sol +++ b/src/test/utils/EigenLayerUnitTestSetup.sol @@ -71,7 +71,7 @@ abstract contract EigenLayerUnitTestSetup is Test { eigenLayerProxyAdmin = new ProxyAdmin(); // Deploy permission controller - permissionControllerImplementation = new PermissionController(); + permissionControllerImplementation = new PermissionController("v9.9.9"); permissionController = PermissionController(address(new TransparentUpgradeableProxy( address(permissionControllerImplementation), address(eigenLayerProxyAdmin), From c748e03e671b3d45ac173e751989fb61f7412b75 Mon Sep 17 00:00:00 2001 From: Michael Sun <35479365+8sunyuan@users.noreply.github.com> Date: Fri, 14 Feb 2025 15:13:10 -0500 Subject: [PATCH 27/35] fix: reentrant guards (#1107) **Motivation:** Concerns about reentrancy in the DelegationManager and interactions of completed withdrawals which can call untrusted ERC20 transfers **Modifications:** Added reentrant guards across external functions **Result:** Preventing cross-function reentrancy in the DelegationManager --------- Co-authored-by: wadealexc --- src/contracts/core/DelegationManager.sol | 19 +++++++++++-------- src/contracts/core/StrategyManager.sol | 17 ++++++++++------- src/contracts/pods/EigenPodManager.sol | 12 ++++++------ 3 files changed, 27 insertions(+), 21 deletions(-) diff --git a/src/contracts/core/DelegationManager.sol b/src/contracts/core/DelegationManager.sol index 1038e9c601..48cfe3f39d 100644 --- a/src/contracts/core/DelegationManager.sol +++ b/src/contracts/core/DelegationManager.sol @@ -96,7 +96,7 @@ contract DelegationManager is address initDelegationApprover, uint32 allocationDelay, string calldata metadataURI - ) external { + ) external nonReentrant { require(!isDelegated(msg.sender), ActivelyDelegated()); allocationManager.setAllocationDelay(msg.sender, allocationDelay); @@ -110,7 +110,10 @@ contract DelegationManager is } /// @inheritdoc IDelegationManager - function modifyOperatorDetails(address operator, address newDelegationApprover) external checkCanCall(operator) { + function modifyOperatorDetails( + address operator, + address newDelegationApprover + ) external checkCanCall(operator) nonReentrant { require(isOperator(operator), OperatorNotRegistered()); _setDelegationApprover(operator, newDelegationApprover); } @@ -126,7 +129,7 @@ contract DelegationManager is address operator, SignatureWithExpiry memory approverSignatureAndExpiry, bytes32 approverSalt - ) public { + ) public nonReentrant { require(!isDelegated(msg.sender), ActivelyDelegated()); require(isOperator(operator), OperatorNotRegistered()); @@ -145,7 +148,7 @@ contract DelegationManager is /// @inheritdoc IDelegationManager function undelegate( address staker - ) public returns (bytes32[] memory withdrawalRoots) { + ) public nonReentrant returns (bytes32[] memory withdrawalRoots) { // Check that the `staker` can undelegate require(isDelegated(staker), NotActivelyDelegated()); require(!isOperator(staker), OperatorsCannotUndelegate()); @@ -176,7 +179,7 @@ contract DelegationManager is /// @inheritdoc IDelegationManager function queueWithdrawals( QueuedWithdrawalParams[] calldata params - ) external onlyWhenNotPaused(PAUSED_ENTER_WITHDRAWAL_QUEUE) returns (bytes32[] memory) { + ) external onlyWhenNotPaused(PAUSED_ENTER_WITHDRAWAL_QUEUE) nonReentrant returns (bytes32[] memory) { bytes32[] memory withdrawalRoots = new bytes32[](params.length); address operator = delegatedTo[msg.sender]; @@ -228,7 +231,7 @@ contract DelegationManager is IStrategy strategy, uint256 prevDepositShares, uint256 addedShares - ) external onlyStrategyManagerOrEigenPodManager { + ) external onlyStrategyManagerOrEigenPodManager nonReentrant { /// Note: Unlike `decreaseDelegatedShares`, we don't return early if the staker has no operator. /// This is because `_increaseDelegation` updates the staker's deposit scaling factor, which we /// need to do even if not delegated. @@ -252,7 +255,7 @@ contract DelegationManager is address staker, uint256 curDepositShares, uint64 beaconChainSlashingFactorDecrease - ) external onlyEigenPodManager { + ) external onlyEigenPodManager nonReentrant { if (!isDelegated(staker)) { return; } @@ -282,7 +285,7 @@ contract DelegationManager is IStrategy strategy, uint64 prevMaxMagnitude, uint64 newMaxMagnitude - ) external onlyAllocationManager { + ) external onlyAllocationManager nonReentrant { /// forgefmt: disable-next-item uint256 operatorSharesSlashed = SlashingLib.calcSlashedAmount({ operatorShares: operatorShares[operator][strategy], diff --git a/src/contracts/core/StrategyManager.sol b/src/contracts/core/StrategyManager.sol index c1b5bbada0..8d320a12b0 100644 --- a/src/contracts/core/StrategyManager.sol +++ b/src/contracts/core/StrategyManager.sol @@ -117,7 +117,7 @@ contract StrategyManager is address staker, IStrategy strategy, uint256 depositSharesToRemove - ) external onlyDelegationManager returns (uint256) { + ) external onlyDelegationManager nonReentrant returns (uint256) { (, uint256 sharesAfter) = _removeDepositShares(staker, strategy, depositSharesToRemove); return sharesAfter; } @@ -127,7 +127,7 @@ contract StrategyManager is address staker, IStrategy strategy, uint256 shares - ) external onlyDelegationManager returns (uint256, uint256) { + ) external onlyDelegationManager nonReentrant returns (uint256, uint256) { return _addShares(staker, strategy, shares); } @@ -137,12 +137,15 @@ contract StrategyManager is IStrategy strategy, IERC20 token, uint256 shares - ) external onlyDelegationManager { + ) external onlyDelegationManager nonReentrant { strategy.withdraw(staker, token, shares); } /// @inheritdoc IShareManager - function increaseBurnableShares(IStrategy strategy, uint256 addedSharesToBurn) external onlyDelegationManager { + function increaseBurnableShares( + IStrategy strategy, + uint256 addedSharesToBurn + ) external onlyDelegationManager nonReentrant { (, uint256 currentShares) = EnumerableMap.tryGet(burnableShares, address(strategy)); EnumerableMap.set(burnableShares, address(strategy), currentShares + addedSharesToBurn); emit BurnableSharesIncreased(strategy, addedSharesToBurn); @@ -162,14 +165,14 @@ contract StrategyManager is /// @inheritdoc IStrategyManager function setStrategyWhitelister( address newStrategyWhitelister - ) external onlyOwner { + ) external onlyOwner nonReentrant { _setStrategyWhitelister(newStrategyWhitelister); } /// @inheritdoc IStrategyManager function addStrategiesToDepositWhitelist( IStrategy[] calldata strategiesToWhitelist - ) external onlyStrategyWhitelister { + ) external onlyStrategyWhitelister nonReentrant { uint256 strategiesToWhitelistLength = strategiesToWhitelist.length; for (uint256 i = 0; i < strategiesToWhitelistLength; ++i) { // change storage and emit event only if strategy is not already in whitelist @@ -183,7 +186,7 @@ contract StrategyManager is /// @inheritdoc IStrategyManager function removeStrategiesFromDepositWhitelist( IStrategy[] calldata strategiesToRemoveFromWhitelist - ) external onlyStrategyWhitelister { + ) external onlyStrategyWhitelister nonReentrant { uint256 strategiesToRemoveFromWhitelistLength = strategiesToRemoveFromWhitelist.length; for (uint256 i = 0; i < strategiesToRemoveFromWhitelistLength; ++i) { // change storage and emit event only if strategy is already in whitelist diff --git a/src/contracts/pods/EigenPodManager.sol b/src/contracts/pods/EigenPodManager.sol index e6ec820e17..921fefba91 100644 --- a/src/contracts/pods/EigenPodManager.sol +++ b/src/contracts/pods/EigenPodManager.sol @@ -66,7 +66,7 @@ contract EigenPodManager is } /// @inheritdoc IEigenPodManager - function createPod() external onlyWhenNotPaused(PAUSED_NEW_EIGENPODS) returns (address) { + function createPod() external onlyWhenNotPaused(PAUSED_NEW_EIGENPODS) nonReentrant returns (address) { require(!hasPod(msg.sender), EigenPodAlreadyExists()); // deploy a pod if the sender doesn't have one already IEigenPod pod = _deployPod(); @@ -79,7 +79,7 @@ contract EigenPodManager is bytes calldata pubkey, bytes calldata signature, bytes32 depositDataRoot - ) external payable onlyWhenNotPaused(PAUSED_NEW_EIGENPODS) { + ) external payable onlyWhenNotPaused(PAUSED_NEW_EIGENPODS) nonReentrant { IEigenPod pod = ownerToPod[msg.sender]; if (address(pod) == address(0)) { //deploy a pod if the sender doesn't have one already @@ -148,7 +148,7 @@ contract EigenPodManager is address staker, IStrategy strategy, uint256 depositSharesToRemove - ) external onlyDelegationManager returns (uint256) { + ) external onlyDelegationManager nonReentrant returns (uint256) { require(strategy == beaconChainETHStrategy, InvalidStrategy()); int256 updatedShares = podOwnerDepositShares[staker] - int256(depositSharesToRemove); require(updatedShares >= 0, SharesNegative()); @@ -169,7 +169,7 @@ contract EigenPodManager is address staker, IStrategy strategy, uint256 shares - ) external onlyDelegationManager returns (uint256, uint256) { + ) external onlyDelegationManager nonReentrant returns (uint256, uint256) { require(strategy == beaconChainETHStrategy, InvalidStrategy()); return _addShares(staker, shares); } @@ -185,7 +185,7 @@ contract EigenPodManager is IStrategy strategy, IERC20, uint256 shares - ) external onlyDelegationManager { + ) external onlyDelegationManager nonReentrant { require(strategy == beaconChainETHStrategy, InvalidStrategy()); require(staker != address(0), InputAddressZero()); require(int256(shares) > 0, SharesNegative()); @@ -226,7 +226,7 @@ contract EigenPodManager is } /// @inheritdoc IShareManager - function increaseBurnableShares(IStrategy, uint256 addedSharesToBurn) external onlyDelegationManager { + function increaseBurnableShares(IStrategy, uint256 addedSharesToBurn) external onlyDelegationManager nonReentrant { burnableETHShares += addedSharesToBurn; emit BurnableETHSharesIncreased(addedSharesToBurn); } From aac6227f064a04a42d5dada23b2406d477871ee0 Mon Sep 17 00:00:00 2001 From: Alex <18387287+wadealexc@users.noreply.github.com> Date: Fri, 14 Feb 2025 15:43:03 -0500 Subject: [PATCH 28/35] fix: dont call strategy if we have no burnable shares (#1106) **Motivation:** Fixes an issue arbitrary external contracts could be called via `StrategyManager.burnShares`. (Certora L-04) **Modifications:** `StrategyManager.burnShares` does not do an external call if the burnable share amount is zero **Result:** Should no longer be possible to call untrusted code directly through `burnShares` --- docs/core/StrategyManager.md | 2 ++ src/contracts/core/StrategyManager.sol | 8 ++++++-- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/docs/core/StrategyManager.md b/docs/core/StrategyManager.md index ddb817dbd5..34e4d8797d 100644 --- a/docs/core/StrategyManager.md +++ b/docs/core/StrategyManager.md @@ -298,6 +298,8 @@ function burnShares( Anyone can call this method to burn slashed shares previously added by the `DelegationManager` via `increaseBurnableShares`. This method resets the strategy's burnable shares to 0, and directs the corresponding `strategy` to convert the shares to tokens and transfer them to `DEFAULT_BURN_ADDRESS`, rendering them unrecoverable. +The `strategy` is not called if the strategy had no burnable shares. + *Effects*: * Resets the strategy's burnable shares to 0 * Calls `withdraw` on the `strategy`, withdrawing shares and sending a corresponding amount of tokens to the `DEFAULT_BURN_ADDRESS` diff --git a/src/contracts/core/StrategyManager.sol b/src/contracts/core/StrategyManager.sol index 8d320a12b0..fddf81a06c 100644 --- a/src/contracts/core/StrategyManager.sol +++ b/src/contracts/core/StrategyManager.sol @@ -158,8 +158,12 @@ contract StrategyManager is (, uint256 sharesToBurn) = EnumerableMap.tryGet(burnableShares, address(strategy)); EnumerableMap.remove(burnableShares, address(strategy)); emit BurnableSharesDecreased(strategy, sharesToBurn); - // burning shares is functionally the same as withdrawing but with different destination address - strategy.withdraw(DEFAULT_BURN_ADDRESS, strategy.underlyingToken(), sharesToBurn); + + // Burning acts like withdrawing, except that the destination is to the burn address. + // If we have no shares to burn, we don't need to call the strategy. + if (sharesToBurn != 0) { + strategy.withdraw(DEFAULT_BURN_ADDRESS, strategy.underlyingToken(), sharesToBurn); + } } /// @inheritdoc IStrategyManager From 452d5306bb8ed9f09fd7c49fd9b7d62a8e72a965 Mon Sep 17 00:00:00 2001 From: Yash Patil <40046473+ypatil12@users.noreply.github.com> Date: Wed, 19 Feb 2025 10:22:19 -0500 Subject: [PATCH 29/35] docs: bc/avs slashing edge case (#1127) **Motivation:** Document edge cases around BC/AVS Slashing. **Modifications:** Update docs with justification. **Result:** Clear edge case callouts. --- docs/core/accounting/SlashingEdgeCase.md | 117 +++++++++++++++++++++++ docs/images/avs-bc-slash.png | Bin 0 -> 35858 bytes 2 files changed, 117 insertions(+) create mode 100644 docs/core/accounting/SlashingEdgeCase.md create mode 100644 docs/images/avs-bc-slash.png diff --git a/docs/core/accounting/SlashingEdgeCase.md b/docs/core/accounting/SlashingEdgeCase.md new file mode 100644 index 0000000000..4bfd54adc5 --- /dev/null +++ b/docs/core/accounting/SlashingEdgeCase.md @@ -0,0 +1,117 @@ +# Dual Slashing Edge Case + +This document describes edge cases surrounding the slashing of a staker for native ETH by the beacon chain (BC) and an AVS. + +## Prior Reading + +* [ELIP-002: Slashing via Unique Stake and Operator Sets](https://github.com/eigenfoundation/ELIPs/blob/main/ELIPs/ELIP-002.md) +* [ELIP-004: Slashing-Aware EigenPods](https://github.com/eigenfoundation/ELIPs/blob/main/ELIPs/ELIP-004.md) +* [Shares Accounting](./SharesAccounting.md) + +## Scenario + +Consider a staker, Alice who is in the following state: + +1. Alice has verified a validator. `withdrawble: 32 ETH` +2. Alice's operator is slashed for 75%. `withdrawable: 8 ETH` +
+ Calculation + + * `depositShares: 32` + * `maxMagnitude: 0.25` + * `BCSF: 1` + * `DSF: 1` + * `withdrawable = 32 * 0.25 * 1 * 1 = 8 ETH` +
+3. Alice is slashed by 16 ETH on the beacon chain + +## Restaking + +We define restaking as **reusing staked ETH as security for AVSs. Thus, the same Native ETH that is securing the BC (beacon chain) can also be slashed by an AVS, with priority burning rights going to the BC.** + +In the above scenario, let's say the Alice now proves a checkpoint. + +4. A checkpoint of BC state is proven. `withdrawable: 4 ETH` +
+ Calculation + + * `depositShares: 16` + * `maxMagnitude: 0.25` + * `BCSF: 1` + * `DSF: 1` + * `withdrawable = 16 * 0.25 * 1 * 1 = 4 ETH` +
+ +The checkpoint slash has devalued Alice's currently withdrawable assets by 50%. The AVS slashes from what's left due to the BC getting priority burning rights. Thus, AVSs must factor Native ETH (or an LST) being slashed by the beacon chain when designing their slashing conditions. The below diagram illustrates this behavior: + +
+AVS and Beacon Chain Slashing Behavior +
Diagram showing how AVS slashing is applied after Beacon Chain slashing, with BC having priority burning rights
+
+ +Note that the portion that is marked as BC Slash and BC + AVS Slash has priority burning rights by the beacon chain. 12 ETH has been slashed "twice", but this is by design given our definition of restaking. + +The behavior of BC and AVS slashings for Native ETH mimics the behavior of slashings for an LST in isolation (see below for an additional edge case). This ensures that Native ETH security is not disadvantaged compared to LST security. ELIP-004 explains this in [more detail](https://github.com/eigenfoundation/ELIPs/blob/main/ELIPs/ELIP-004.md#why-do-eigenpods-need-to-upgrade). + +## Ordering of EigenPod Actions + +**When an AVS slashes, its attributable slashed amount is between 0 and the originally slashed amount. The attributable slashed amount decreases in the event of BC slashes.** We see this behavior in the above example, where the 12 ETH that was attributed to the AVS is less than the original 24 ETH that was slashed. + +However, given the asynchronous nature of the EigenPod proof system, Alice may have a different number of withdrawable shares depending on the ordering of her actions. Note that even in this case, **assets are not overslashed**. + +Let's start with our above scenario. + +Scenario A: + +4. Alice verifies another validator. `withdrawable: 40 ETH` +
+ Calculation + + * `depositShares: 64` + * `maxMagnitude: 0.25` + * `BCSF: 1` + * `DSF = 40 / (32 + 32) / 0.25 = 2.5` + * `withdrawable = 64 * 0.25 * 1 * 2.5 = 40 ETH` +
+ +5. Alice checkpoints all her pods. `withdrawable: 30 ETH` +
+ Calculation + + * `depositShares: 64` + * `maxMagnitude: 0.25` + * `BCSF = 48 / 64 = 0.75` + * `DSF: 2.5` + * `withdrawable = 64 * 0.25 * 0.75 * 2.5 = 30 ETH` +
+ +In this scenario, 25% of Alice’s currently proven assets are slashed. Similarly, the AVSs attributable slashed amount has been decreased by 25% (24 → 18 ETH). + + +Scenario B: + +4. Alice checkpoints her pod. `withdrawable: 4 ETH` +
+ Calculation + + * `depositShares: 32` + * `maxMagnitude: 0.25` + * `BCSF = 16 / 32 = 0.5` + * `DSF: 1` + * `withdrawable = 32 * 0.25 * 0.5 * 1 = 4 ETH` +
+ +5. Alice verifies another validator. `withdrawable: 40 ETH` +
+ Calculation + + * `depositShares: 64` + * `maxMagnitude: 0.25` + * `BCSF: 0.5` + * `DSF = 36 / (32 + 32) / 0.125 = 4.5` + * `withdrawable = 64 * 0.25 * 0.5 * 4.5 = 36 ETH` +
+ +In scenario B, 50% of Alice’s currently proven assets are slashed, along with a commensurate decrease in the AVSs attributable slashed amount. In both cases Alice’s withdrawable shares and the AVSs attributable slashed amount decrease by the same percentage. + +We acknowledge this edge case. A benefit of this system is that stakers are incentivized to immediatley prove BC slashed. Eigen Labs runs an off-chain process (EigenPod Health Checker) that monitors BC slashings and starts checkpoints as needed. Conversely, when Native-ETH burning is implemented, AVSs are incentivized to immediately exit stakers from the BC to recoup the maximum possible attributable slashed amount. \ No newline at end of file diff --git a/docs/images/avs-bc-slash.png b/docs/images/avs-bc-slash.png new file mode 100644 index 0000000000000000000000000000000000000000..e53cedaae1704a72d9ef1a42ba5392ea1bc47ef0 GIT binary patch literal 35858 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 literal 0 HcmV?d00001 From 6cebc82ba12113bc426694c5e2a7c942d2def23b Mon Sep 17 00:00:00 2001 From: Bowen Li Date: Wed, 19 Feb 2025 07:55:09 -0800 Subject: [PATCH 30/35] feat: require avs register metadata in allocation manager (#1025) require avs register metadata in allocation manager before they can create operatorset --------- Co-authored-by: clandestine.eth <96172957+0xClandestine@users.noreply.github.com> --- docs/core/AllocationManager.md | 180 ++++++++++-------- src/contracts/core/AllocationManager.sol | 7 + .../core/AllocationManagerStorage.sol | 6 +- .../interfaces/IAllocationManager.sol | 2 + src/test/integration/IntegrationBase.t.sol | 1 + src/test/integration/users/AVS.t.sol | 12 ++ src/test/unit/AllocationManagerUnit.t.sol | 14 ++ 7 files changed, 143 insertions(+), 79 deletions(-) diff --git a/docs/core/AllocationManager.md b/docs/core/AllocationManager.md index 194d8b9dab..3957fed5da 100644 --- a/docs/core/AllocationManager.md +++ b/docs/core/AllocationManager.md @@ -22,7 +22,9 @@ Libraries and Mixins: ## Overview -The `AllocationManager` manages registration and deregistration of operators to operator sets, handles allocation and slashing of operators' slashable stake, and is the entry point an AVS uses to slash an operator. The `AllocationManager's` responsibilities are broken down into the following concepts: +The `AllocationManager` manages AVS metadata registration, registration and deregistration of operators to operator sets, handles allocation and slashing of operators' slashable stake, and is the entry point an AVS uses to slash an operator. The `AllocationManager's` responsibilities are broken down into the following concepts: + +* [AVS Metadata](#avs-metadata) * [Operator Sets](#operator-sets) * [Allocations and Slashing](#allocations-and-slashing) * [Config](#config) @@ -38,6 +40,104 @@ The `AllocationManager` manages registration and deregistration of operators to --- +## AVS Metadata + +AVSs must register their metadata to declare themselves who they are as the first step, before they can create operator sets or register operators into operator sets. `AllocationManager` keeps track of AVSs that have registered metadata. + +**Methods:** +* [`updateAVSMetadataURI`](#updateavsmetadatauri) + + +#### `updateAVSMetadataURI` + +```solidity +/** + * @notice Called by an AVS to emit an `AVSMetadataURIUpdated` event indicating the information has updated. + * + * @param metadataURI The URI for metadata associated with an AVS. + * + * @dev Note that the `metadataURI` is *never stored* and is only emitted in the `AVSMetadataURIUpdated` event. + */ +function updateAVSMetadataURI( + address avs, + string calldata metadataURI +) + external + checkCanCall(avs) +``` + +_Note: this method can be called directly by an AVS, or by a caller authorized by the AVS. See [`PermissionController.md`](../permissions/PermissionController.md) for details._ + +Below is the format AVSs should use when updating their metadata URI initially. This is not validated onchain. + +```json +{ + "name": "AVS", + "website": "https.avs.xyz/", + "description": "Some description about", + "logo": "http://github.com/logo.png", + "twitter": "https://twitter.com/avs", +} +``` + + +Later on, once AVSs have created operator sets, content in their metadata URI can be updated subsequently. + +```json +{ + "name": "AVS", + "website": "https.avs.xyz/", + "description": "Some description about", + "logo": "http://github.com/logo.png", + "twitter": "https://twitter.com/avs", + "operatorSets": [ + { + "name": "ETH Set", + "id": "1", // Note: we use this param to match the opSet id in the Allocation Manager + "description": "The ETH operatorSet for AVS", + "software": [ + { + "name": "NetworkMonitor", + "description": "", + "url": "https://link-to-binary-or-github.com" + }, + { + "name": "ValidatorClient", + "description": "", + "url": "https://link-to-binary-or-github.com" + } + ], + "slashingConditions": ["Condition A", "Condition B"] + }, + { + "name": "EIGEN Set", + "id": "2", // Note: we use this param to match the opSet id in the Allocation Manager + "description": "The EIGEN operatorSet for AVS", + "software": [ + { + "name": "NetworkMonitor", + "description": "", + "url": "https://link-to-binary-or-github.com" + }, + { + "name": "ValidatorClient", + "description": "", + "url": "https://link-to-binary-or-github.com" + } + ], + "slashingConditions": ["Condition A", "Condition B"] + } + ] +} +``` + +*Effects*: +* Emits an `AVSMetadataURIUpdated` event for use in offchain services + +*Requirements*: +* Caller MUST be authorized, either as the AVS itself or an admin/appointee (see [`PermissionController.md`](../permissions/PermissionController.md)) + + ## Operator Sets Operator sets, as described in [ELIP-002](https://github.com/eigenfoundation/ELIPs/blob/main/ELIPs/ELIP-002.md#operator-sets), are useful for AVSs to configure operator groupings which can be assigned different tasks, rewarded based on their strategy allocations, and slashed according to different rules. Operator sets are defined in [`libraries/OperatorSetLib.sol`](../../src/contracts/libraries/OperatorSetLib.sol): @@ -145,6 +245,7 @@ Optionally, the `avs` can provide a list of `strategies`, specifying which strat *Requirements*: * Caller MUST be authorized, either as the AVS itself or an admin/appointee (see [`PermissionController.md`](../permissions/PermissionController.md)) +* AVS MUST have registered metadata * For each `CreateSetParams` element: * Each `params.operatorSetId` MUST NOT already exist in `_operatorSets[avs]` @@ -665,7 +766,6 @@ Once slashing is processed for a strategy, [slashed stake is burned via the `Del **Methods:** * [`setAllocationDelay`](#setallocationdelay) * [`setAVSRegistrar`](#setavsregistrar) -* [`updateAVSMetadataURI`](#updateavsmetadatauri) #### `setAllocationDelay` @@ -756,79 +856,3 @@ Note that when an operator registers, registration will FAIL if the call to `IAV *Requirements*: * Caller MUST be authorized, either as the AVS itself or an admin/appointee (see [`PermissionController.md`](../permissions/PermissionController.md)) - -#### `updateAVSMetadataURI` - -```solidity -/** - * @notice Called by an AVS to emit an `AVSMetadataURIUpdated` event indicating the information has updated. - * - * @param metadataURI The URI for metadata associated with an AVS. - * - * @dev Note that the `metadataURI` is *never stored* and is only emitted in the `AVSMetadataURIUpdated` event. - */ -function updateAVSMetadataURI( - address avs, - string calldata metadataURI -) - external - checkCanCall(avs) -``` - -_Note: this method can be called directly by an AVS, or by a caller authorized by the AVS. See [`PermissionController.md`](../permissions/PermissionController.md) for details._ - -Below is the format AVSs should use when updating their metadata URI. This is not validated onchain. - -```json -{ - "name": "AVS", - "website": "https.avs.xyz/", - "description": "Some description about", - "logo": "http://github.com/logo.png", - "twitter": "https://twitter.com/avs", - "operatorSets": [ - { - "name": "ETH Set", - "id": "1", // Note: we use this param to match the opSet id in the Allocation Manager - "description": "The ETH operatorSet for AVS", - "software": [ - { - "name": "NetworkMonitor", - "description": "", - "url": "https://link-to-binary-or-github.com" - }, - { - "name": "ValidatorClient", - "description": "", - "url": "https://link-to-binary-or-github.com" - } - ], - "slashingConditions": ["Condition A", "Condition B"] - }, - { - "name": "EIGEN Set", - "id": "2", // Note: we use this param to match the opSet id in the Allocation Manager - "description": "The EIGEN operatorSet for AVS", - "software": [ - { - "name": "NetworkMonitor", - "description": "", - "url": "https://link-to-binary-or-github.com" - }, - { - "name": "ValidatorClient", - "description": "", - "url": "https://link-to-binary-or-github.com" - } - ], - "slashingConditions": ["Condition A", "Condition B"] - } - ] -} -``` - -*Effects*: -* Emits an `AVSMetadataURIUpdated` event for use in offchain services - -*Requirements*: -* Caller MUST be authorized, either as the AVS itself or an admin/appointee (see [`PermissionController.md`](../permissions/PermissionController.md)) \ No newline at end of file diff --git a/src/contracts/core/AllocationManager.sol b/src/contracts/core/AllocationManager.sol index fd88e07aa0..4e24f49d38 100644 --- a/src/contracts/core/AllocationManager.sol +++ b/src/contracts/core/AllocationManager.sol @@ -330,11 +330,18 @@ contract AllocationManager is /// @inheritdoc IAllocationManager function updateAVSMetadataURI(address avs, string calldata metadataURI) external checkCanCall(avs) { + if (!_avsRegisteredMetadata[avs]) { + _avsRegisteredMetadata[avs] = true; + } + emit AVSMetadataURIUpdated(avs, metadataURI); } /// @inheritdoc IAllocationManager function createOperatorSets(address avs, CreateSetParams[] calldata params) external checkCanCall(avs) { + // Check that the AVS exists and has registered metadata + require(_avsRegisteredMetadata[avs], NonexistentAVSMetadata()); + for (uint256 i = 0; i < params.length; i++) { OperatorSet memory operatorSet = OperatorSet(avs, params[i].operatorSetId); diff --git a/src/contracts/core/AllocationManagerStorage.sol b/src/contracts/core/AllocationManagerStorage.sol index 5d973e6aa7..24bbb8f3e7 100644 --- a/src/contracts/core/AllocationManagerStorage.sol +++ b/src/contracts/core/AllocationManagerStorage.sol @@ -89,6 +89,10 @@ abstract contract AllocationManagerStorage is IAllocationManager { /// These must be completed in order to free up magnitude for future allocation mapping(address operator => mapping(IStrategy strategy => DoubleEndedQueue.Bytes32Deque)) internal deallocationQueue; + /// @dev Lists the AVSs who has registered metadata and claimed itself as an AVS + /// @notice bool is not used and is always true if the avs has registered metadata + mapping(address avs => bool) internal _avsRegisteredMetadata; + // Construction constructor(IDelegationManager _delegation, uint32 _DEALLOCATION_DELAY, uint32 _ALLOCATION_CONFIGURATION_DELAY) { @@ -102,5 +106,5 @@ abstract contract AllocationManagerStorage is IAllocationManager { * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ - uint256[37] private __gap; + uint256[36] private __gap; } diff --git a/src/contracts/interfaces/IAllocationManager.sol b/src/contracts/interfaces/IAllocationManager.sol index bce2134972..f61fd72649 100644 --- a/src/contracts/interfaces/IAllocationManager.sol +++ b/src/contracts/interfaces/IAllocationManager.sol @@ -27,6 +27,8 @@ interface IAllocationManagerErrors { /// @dev Thrown when an invalid operator is provided. error InvalidOperator(); + /// @dev Thrown when an invalid avs whose metadata is not registered is provided. + error NonexistentAVSMetadata(); /// @dev Thrown when an operator's allocation delay has yet to be set. error UninitializedAllocationDelay(); /// @dev Thrown when attempting to slash an operator when they are not slashable. diff --git a/src/test/integration/IntegrationBase.t.sol b/src/test/integration/IntegrationBase.t.sol index 6f825a647d..dc7e4a7faa 100644 --- a/src/test/integration/IntegrationBase.t.sol +++ b/src/test/integration/IntegrationBase.t.sol @@ -147,6 +147,7 @@ abstract contract IntegrationBase is IntegrationDeployer, TypeImporter { function _newRandomAVS() internal returns (AVS avs, OperatorSet[] memory operatorSets) { string memory avsName = string.concat("avs", numAVSs.toString()); avs = _genRandAVS(avsName); + avs.updateAVSMetadataURI("https://example.com"); operatorSets = avs.createOperatorSets(_randomStrategies()); ++numAVSs; } diff --git a/src/test/integration/users/AVS.t.sol b/src/test/integration/users/AVS.t.sol index 2ef36433b5..91abb0801c 100644 --- a/src/test/integration/users/AVS.t.sol +++ b/src/test/integration/users/AVS.t.sol @@ -71,6 +71,18 @@ contract AVS is Logger, IAllocationManagerTypes, IAVSRegistrar { /// AllocationManager /// ----------------------------------------------------------------------- + function updateAVSMetadataURI( + string memory uri + ) public createSnapshot { + print.method("updateAVSMetadataURI"); + + console.log("Setting AVS metadata URI to: %s", uri); + _tryPrankAppointee_AllocationManager(IAllocationManager.updateAVSMetadataURI.selector); + allocationManager.updateAVSMetadataURI(address(this), uri); + + print.gasUsed(); + } + function createOperatorSets( IStrategy[][] memory strategies ) public createSnapshot returns (OperatorSet[] memory operatorSets) { diff --git a/src/test/unit/AllocationManagerUnit.t.sol b/src/test/unit/AllocationManagerUnit.t.sol index bf3cb7939c..7f81cdfba4 100644 --- a/src/test/unit/AllocationManagerUnit.t.sol +++ b/src/test/unit/AllocationManagerUnit.t.sol @@ -71,6 +71,10 @@ contract AllocationManagerUnitTests is EigenLayerUnitTestSetup, IAllocationManag defaultStrategies = strategyMock.toArray(); defaultOperatorSet = OperatorSet(defaultAVS, 0); + cheats.prank(defaultAVS); + allocationManager.updateAVSMetadataURI(defaultAVS, "https://example.com"); + + _createOperatorSet(defaultOperatorSet, defaultStrategies); _registerOperator(defaultOperator); _setAllocationDelay(defaultOperator, DEFAULT_OPERATOR_ALLOCATION_DELAY); @@ -3856,6 +3860,13 @@ contract AllocationManagerUnitTests_createOperatorSets is AllocationManagerUnitT ); } + function testRevert_createOperatorSets_NonexistentAVSMetadata(Randomness r) public rand(r) { + address avs = r.Address(); + cheats.expectRevert(NonexistentAVSMetadata.selector); + cheats.prank(avs); + allocationManager.createOperatorSets(avs, CreateSetParams(defaultOperatorSet.id, defaultStrategies).toArray()); + } + function testFuzz_createOperatorSets_Correctness( Randomness r ) public rand(r) { @@ -3863,6 +3874,9 @@ contract AllocationManagerUnitTests_createOperatorSets is AllocationManagerUnitT uint256 numOpSets = r.Uint256(1, FUZZ_MAX_OP_SETS); uint256 numStrategies = r.Uint256(1, FUZZ_MAX_STRATS); + cheats.prank(avs); + allocationManager.updateAVSMetadataURI(avs, "https://example.com"); + CreateSetParams[] memory createSetParams = new CreateSetParams[](numOpSets); for (uint256 i; i < numOpSets; ++i) { From a4ec016fd188d49911db688c82ea7222fb9945a7 Mon Sep 17 00:00:00 2001 From: "clandestine.eth" <96172957+0xClandestine@users.noreply.github.com> Date: Wed, 19 Feb 2025 11:25:20 -0500 Subject: [PATCH 31/35] refactor: `getSharesForQueuedWithdrawal` (#1130) **Motivation:** Current fn only returns scaled shares, which leads integrators to making two calls. This is expensive in terms of gas. **Modifications:** - `getSharesFromQueuedWithdrawal` has been renamed to `getQueuedWithdrawalFromRoot` and now also returns `Withdrawal` struct. **Result:** Integrators can fetch both in a single call. --- src/contracts/core/DelegationManager.sol | 6 ++--- .../interfaces/IDelegationManager.sol | 5 ++-- src/test/unit/DelegationUnit.t.sol | 24 +++++++++---------- 3 files changed, 18 insertions(+), 17 deletions(-) diff --git a/src/contracts/core/DelegationManager.sol b/src/contracts/core/DelegationManager.sol index 48cfe3f39d..2c33a2b85e 100644 --- a/src/contracts/core/DelegationManager.sol +++ b/src/contracts/core/DelegationManager.sol @@ -972,10 +972,10 @@ contract DelegationManager is } /// @inheritdoc IDelegationManager - function getSharesFromQueuedWithdrawal( + function getQueuedWithdrawalFromRoot( bytes32 withdrawalRoot - ) external view returns (uint256[] memory shares) { - (, shares) = _getSharesByWithdrawalRoot(withdrawalRoot); + ) external view returns (Withdrawal memory withdrawal, uint256[] memory shares) { + (withdrawal, shares) = _getSharesByWithdrawalRoot(withdrawalRoot); } /// @inheritdoc IDelegationManager diff --git a/src/contracts/interfaces/IDelegationManager.sol b/src/contracts/interfaces/IDelegationManager.sol index eed886ecd4..c16d7ebd68 100644 --- a/src/contracts/interfaces/IDelegationManager.sol +++ b/src/contracts/interfaces/IDelegationManager.sol @@ -491,12 +491,13 @@ interface IDelegationManager is ISignatureUtilsMixin, IDelegationManagerErrors, /** * @notice Returns the withdrawal details and corresponding shares for a specific queued withdrawal. * @param withdrawalRoot The hash identifying the queued withdrawal. + * @return withdrawal The withdrawal details. * @return shares Array of shares corresponding to each strategy in the withdrawal. * @dev The shares are what a user would receive from completing a queued withdrawal, assuming all slashings are applied. */ - function getSharesFromQueuedWithdrawal( + function getQueuedWithdrawalFromRoot( bytes32 withdrawalRoot - ) external view returns (uint256[] memory shares); + ) external view returns (Withdrawal memory withdrawal, uint256[] memory shares); /// @notice Returns a list of queued withdrawal roots for the `staker`. /// NOTE that this only returns withdrawals queued AFTER the slashing release. diff --git a/src/test/unit/DelegationUnit.t.sol b/src/test/unit/DelegationUnit.t.sol index 6137a45f47..cd97299c98 100644 --- a/src/test/unit/DelegationUnit.t.sol +++ b/src/test/unit/DelegationUnit.t.sol @@ -8670,16 +8670,16 @@ contract DelegationManagerUnitTests_getQueuedWithdrawals is DelegationManagerUni // Get shares from withdrawal - should return 50 shares (100 * 0.5) using original magnitude // rather than incorrectly returning 100 shares (100 * 1.0) using new magnitude - uint256[] memory shares = delegationManager.getSharesFromQueuedWithdrawal(withdrawalRoot); + (, uint256[] memory shares) = delegationManager.getQueuedWithdrawalFromRoot(withdrawalRoot); assertEq(shares[0], 50e18, "shares should be 50e18 (100e18 * 0.5) using original magnitude"); } } -contract DelegationManagerUnitTests_getSharesFromQueuedWithdrawal is DelegationManagerUnitTests { +contract DelegationManagerUnitTests_getQueuedWithdrawalFromRoot is DelegationManagerUnitTests { using ArrayLib for *; using SlashingLib for *; - function test_getSharesFromQueuedWithdrawal_Correctness(Randomness r) public rand(r) { + function test_getQueuedWithdrawalFromRoot_Correctness(Randomness r) public rand(r) { // Set up initial deposit uint256 depositAmount = r.Uint256(1 ether, 100 ether); _depositIntoStrategies(defaultStaker, strategyMock.toArray(), depositAmount.toArrayU256()); @@ -8703,14 +8703,14 @@ contract DelegationManagerUnitTests_getSharesFromQueuedWithdrawal is DelegationM delegationManager.queueWithdrawals(queuedWithdrawalParams); // Get shares from queued withdrawal - uint256[] memory shares = delegationManager.getSharesFromQueuedWithdrawal(withdrawalRoot); + (, uint256[] memory shares) = delegationManager.getQueuedWithdrawalFromRoot(withdrawalRoot); // Verify withdrawal details match assertEq(shares.length, 1, "incorrect shares array length"); assertEq(shares[0], depositAmount, "incorrect shares amount"); } - function test_getSharesFromQueuedWithdrawal_AfterSlashing(Randomness r) public rand(r) { + function test_getQueuedWithdrawalFromRoot_AfterSlashing(Randomness r) public rand(r) { // Set up initial deposit uint256 depositAmount = r.Uint256(1 ether, 100 ether); _depositIntoStrategies(defaultStaker, strategyMock.toArray(), depositAmount.toArrayU256()); @@ -8739,20 +8739,20 @@ contract DelegationManagerUnitTests_getSharesFromQueuedWithdrawal is DelegationM delegationManager.slashOperatorShares(defaultOperator, strategyMock, WAD, 0.5 ether); // Get shares from queued withdrawal - uint256[] memory shares = delegationManager.getSharesFromQueuedWithdrawal(withdrawalRoot); + (, uint256[] memory shares) = delegationManager.getQueuedWithdrawalFromRoot(withdrawalRoot); // Verify withdrawal details match and shares are slashed assertEq(shares.length, 1, "incorrect shares array length"); assertEq(shares[0], depositAmount / 2, "shares not properly slashed"); } - function test_getSharesFromQueuedWithdrawal_NonexistentWithdrawal() public { + function test_getQueuedWithdrawalFromRoot_NonexistentWithdrawal() public { bytes32 nonexistentRoot = bytes32(uint256(1)); - uint256[] memory shares = delegationManager.getSharesFromQueuedWithdrawal(nonexistentRoot); + (, uint256[] memory shares) = delegationManager.getQueuedWithdrawalFromRoot(nonexistentRoot); assertEq(shares.length, 0, "shares array should be empty"); } - function test_getSharesFromQueuedWithdrawal_MultipleStrategies(Randomness r) public rand(r) { + function test_getQueuedWithdrawalFromRoot_MultipleStrategies(Randomness r) public rand(r) { // Set up multiple strategies with deposits uint256 numStrategies = r.Uint256(2, 5); uint256[] memory depositShares = r.Uint256Array({ @@ -8782,7 +8782,7 @@ contract DelegationManagerUnitTests_getSharesFromQueuedWithdrawal is DelegationM delegationManager.queueWithdrawals(queuedWithdrawalParams); // Get shares from queued withdrawal - uint256[] memory shares = delegationManager.getSharesFromQueuedWithdrawal(withdrawalRoot); + (, uint256[] memory shares) = delegationManager.getQueuedWithdrawalFromRoot(withdrawalRoot); // Verify withdrawal details and shares for each strategy assertEq(shares.length, numStrategies, "incorrect shares array length"); @@ -8791,8 +8791,8 @@ contract DelegationManagerUnitTests_getSharesFromQueuedWithdrawal is DelegationM } } - function testFuzz_getSharesFromQueuedWithdrawal_EmptyWithdrawal(bytes32 withdrawalRoot) public { - uint256[] memory shares = delegationManager.getSharesFromQueuedWithdrawal(withdrawalRoot); + function testFuzz_getQueuedWithdrawalFromRoot_EmptyWithdrawal(bytes32 withdrawalRoot) public { + (, uint256[] memory shares) = delegationManager.getQueuedWithdrawalFromRoot(withdrawalRoot); assertEq(shares.length, 0, "sanity check"); } } From b67df41f7006da952eeb04d44830963bf8744a99 Mon Sep 17 00:00:00 2001 From: Alex <18387287+wadealexc@users.noreply.github.com> Date: Wed, 19 Feb 2025 12:40:42 -0500 Subject: [PATCH 32/35] test: slash invariants (#1083) **Motivation:** Improve slashing invariants in integration tests **Modifications:** Adds `check_Base_Slashing_State`, and implements several checks used within **Result:** Slashing invariants check all manner of state changes in the ALM and delegation. --------- Co-authored-by: Michael --- src/test/integration/IntegrationBase.t.sol | 295 +++++++++++++++++- src/test/integration/IntegrationChecks.t.sol | 49 ++- .../tests/ALM_RegisterAndModify.t.sol | 26 +- .../tests/SlashingWithdrawals.t.sol | 81 ++++- src/test/integration/users/AVS.t.sol | 37 ++- 5 files changed, 439 insertions(+), 49 deletions(-) diff --git a/src/test/integration/IntegrationBase.t.sol b/src/test/integration/IntegrationBase.t.sol index dc7e4a7faa..c998e6de9f 100644 --- a/src/test/integration/IntegrationBase.t.sol +++ b/src/test/integration/IntegrationBase.t.sol @@ -18,6 +18,7 @@ import "src/test/integration/users/User_M1.t.sol"; abstract contract IntegrationBase is IntegrationDeployer, TypeImporter { using StdStyle for *; using SlashingLib for *; + using Math for uint256; using Strings for *; using print for *; @@ -68,6 +69,35 @@ abstract contract IntegrationBase is IntegrationDeployer, TypeImporter { return (staker, strategies, tokenBalances); } + function _newBasicStaker() internal returns (User, IStrategy[] memory, uint[] memory) { + string memory stakerName; + + User staker; + IStrategy[] memory strategies; + uint[] memory tokenBalances; + + if (!isUpgraded) { + stakerName = string.concat("M2Staker", cheats.toString(numStakers)); + + (staker, strategies, tokenBalances) = _randUser(stakerName); + + stakersToMigrate.push(staker); + } else { + stakerName = string.concat("staker", cheats.toString(numStakers)); + + (staker, strategies, tokenBalances) = _randUser(stakerName); + } + + assert_HasUnderlyingTokenBalances(staker, strategies, tokenBalances, "_newRandomStaker: failed to award token balances"); + + numStakers++; + assembly { // TODO HACK + mstore(strategies, 1) + mstore(tokenBalances, 1) + } + return (staker, strategies, tokenBalances); + } + /** * @dev Create a new operator according to configured random variants. * This user will immediately deposit their randomized assets into eigenlayer. @@ -535,6 +565,17 @@ abstract contract IntegrationBase is IntegrationDeployer, TypeImporter { assertEq(slashableStake[i], 0, err); } } + + function assert_DSF_Reset( + User staker, + IStrategy[] memory strategies, + string memory err + ) internal { + uint[] memory depositScalingFactors = _getDepositScalingFactors(staker, strategies); + for (uint i = 0; i < strategies.length; i++) { + assertEq(depositScalingFactors[i], WAD, err); + } + } /******************************************************************************* SNAPSHOT ASSERTIONS @@ -836,6 +877,29 @@ abstract contract IntegrationBase is IntegrationDeployer, TypeImporter { } } + function assert_Snap_Slashed_SlashableStake( + User operator, + OperatorSet memory operatorSet, + SlashingParams memory params, + string memory err + ) internal { + uint[] memory curSlashableStake = _getMinSlashableStake(operator, operatorSet, params.strategies); + uint[] memory prevSlashableStake = _getPrevMinSlashableStake(operator, operatorSet, params.strategies); + + Magnitudes[] memory curMagnitudes = _getMagnitudes(operator, params.strategies); + Magnitudes[] memory prevMagnitudes = _getPrevMagnitudes(operator, params.strategies); + + for (uint i = 0; i < params.strategies.length; i++) { + uint expectedSlashed = SlashingLib.calcSlashedAmount({ + operatorShares: prevSlashableStake[i], + prevMaxMagnitude: prevMagnitudes[i].max, + newMaxMagnitude: curMagnitudes[i].max + }); + + assertEq(curSlashableStake[i], prevSlashableStake[i] - expectedSlashed, err); + } + } + function assert_Snap_StakeBecameAllocated( User operator, OperatorSet memory operatorSet, @@ -878,6 +942,29 @@ abstract contract IntegrationBase is IntegrationDeployer, TypeImporter { } } + function assert_Snap_Slashed_AllocatedStake( + User operator, + OperatorSet memory operatorSet, + SlashingParams memory params, + string memory err + ) internal { + uint[] memory curAllocatedStake = _getAllocatedStake(operator, operatorSet, params.strategies); + uint[] memory prevAllocatedStake = _getPrevAllocatedStake(operator, operatorSet, params.strategies); + + Magnitudes[] memory curMagnitudes = _getMagnitudes(operator, params.strategies); + Magnitudes[] memory prevMagnitudes = _getPrevMagnitudes(operator, params.strategies); + + for (uint i = 0; i < curAllocatedStake.length; i++) { + uint expectedSlashed = SlashingLib.calcSlashedAmount({ + operatorShares: prevAllocatedStake[i], + prevMaxMagnitude: prevMagnitudes[i].max, + newMaxMagnitude: curMagnitudes[i].max + }); + + assertEq(curAllocatedStake[i], prevAllocatedStake[i] - expectedSlashed, err); + } + } + function assert_Snap_Added_EncumberedMagnitude( User operator, IStrategy[] memory strategies, @@ -919,6 +1006,20 @@ abstract contract IntegrationBase is IntegrationDeployer, TypeImporter { } } + function assert_Snap_Slashed_EncumberedMagnitude( + User operator, + SlashingParams memory params, + string memory err + ) internal { + Magnitudes[] memory curMagnitudes = _getMagnitudes(operator, params.strategies); + Magnitudes[] memory prevMagnitudes = _getPrevMagnitudes(operator, params.strategies); + + for (uint i = 0; i < params.strategies.length; i++) { + uint expectedSlashed = prevMagnitudes[i].encumbered.mulWadRoundUp(params.wadsToSlash[i]); + assertEq(curMagnitudes[i].encumbered, prevMagnitudes[i].encumbered - expectedSlashed, err); + } + } + function assert_Snap_Added_AllocatableMagnitude( User operator, IStrategy[] memory strategies, @@ -949,14 +1050,14 @@ abstract contract IntegrationBase is IntegrationDeployer, TypeImporter { function assert_Snap_Removed_AllocatableMagnitude( User operator, IStrategy[] memory strategies, - uint64[] memory magnitudeAllocated, + uint64[] memory magnitudeRemoved, string memory err ) internal { Magnitudes[] memory curMagnitudes = _getMagnitudes(operator, strategies); Magnitudes[] memory prevMagnitudes = _getPrevMagnitudes(operator, strategies); for (uint i = 0; i < strategies.length; i++) { - assertEq(curMagnitudes[i].allocatable, prevMagnitudes[i].allocatable - magnitudeAllocated[i], err); + assertEq(curMagnitudes[i].allocatable, prevMagnitudes[i].allocatable - magnitudeRemoved[i], err); } } @@ -1010,6 +1111,21 @@ abstract contract IntegrationBase is IntegrationDeployer, TypeImporter { } } + function assert_Snap_Slashed_Allocation( + User operator, + OperatorSet memory operatorSet, + SlashingParams memory params, + string memory err + ) internal { + Allocation[] memory curAllocations = _getAllocations(operator, operatorSet, params.strategies); + Allocation[] memory prevAllocations = _getPrevAllocations(operator, operatorSet, params.strategies); + + for (uint i = 0; i < params.strategies.length; i++) { + uint expectedSlashed = prevAllocations[i].currentMagnitude.mulWadRoundUp(params.wadsToSlash[i]); + assertEq(curAllocations[i].currentMagnitude, prevAllocations[i].currentMagnitude - expectedSlashed, err); + } + } + function assert_Snap_Unchanged_MaxMagnitude( User operator, IStrategy[] memory strategies, @@ -1023,6 +1139,20 @@ abstract contract IntegrationBase is IntegrationDeployer, TypeImporter { } } + function assert_Snap_Slashed_MaxMagnitude( + User operator, + SlashingParams memory params, + string memory err + ) internal { + Magnitudes[] memory curMagnitudes = _getMagnitudes(operator, params.strategies); + Magnitudes[] memory prevMagnitudes = _getPrevMagnitudes(operator, params.strategies); + + for (uint i = 0; i < params.strategies.length; i++) { + uint expectedSlashed = prevMagnitudes[i].max.mulWadRoundUp(params.wadsToSlash[i]); + assertEq(curMagnitudes[i].max, prevMagnitudes[i].max - expectedSlashed, err); + } + } + function assert_Snap_Allocations_Slashed( SlashingParams memory slashingParams, OperatorSet memory operatorSet, @@ -1238,6 +1368,47 @@ abstract contract IntegrationBase is IntegrationDeployer, TypeImporter { } } + function assert_Snap_Slashed_OperatorShares( + User operator, + SlashingParams memory params, + string memory err + ) internal { + uint[] memory curShares = _getOperatorShares(operator, params.strategies); + uint[] memory prevShares = _getPrevOperatorShares(operator, params.strategies); + + Magnitudes[] memory curMagnitudes = _getMagnitudes(operator, params.strategies); + Magnitudes[] memory prevMagnitudes = _getPrevMagnitudes(operator, params.strategies); + + for (uint i = 0; i < params.strategies.length; i++) { + uint expectedSlashed = SlashingLib.calcSlashedAmount({ + operatorShares: prevShares[i], + prevMaxMagnitude: prevMagnitudes[i].max, + newMaxMagnitude: curMagnitudes[i].max + }); + + assertEq(curShares[i], prevShares[i] - expectedSlashed, err); + } + } + + function assert_Snap_Increased_BurnableShares( + User operator, + SlashingParams memory params, + string memory err + ) internal { + uint[] memory curBurnable = _getBurnableShares(params.strategies); + uint[] memory prevBurnable = _getPrevBurnableShares(params.strategies); + + uint[] memory curShares = _getOperatorShares(operator, params.strategies); + uint[] memory prevShares = _getPrevOperatorShares(operator, params.strategies); + + for (uint i = 0; i < params.strategies.length; i++) { + uint slashedAtLeast = prevShares[i] - curShares[i]; + + // Not factoring in slashable shares in queue here, because that gets more complex (TODO) + assertTrue(curBurnable[i] >= (prevBurnable[i] + slashedAtLeast), err); + } + } + /******************************************************************************* SNAPSHOT ASSERTIONS: STAKER SHARES *******************************************************************************/ @@ -1788,12 +1959,34 @@ abstract contract IntegrationBase is IntegrationDeployer, TypeImporter { Magnitudes[] memory magnitudes = _getMagnitudes(operator, strategies); for (uint i = 0; i < params.strategies.length; i++) { - IStrategy strategy = params.strategies[i]; uint64 halfAvailable = uint64(magnitudes[i].allocatable) / 2; params.newMagnitudes[i] = allocations[i].currentMagnitude + halfAvailable; } } + /// @dev Generate params to allocate a random portion of available magnitude to each strategy + /// in the operator set. All strategies will have a nonzero allocation, and the minimum allocation + /// will be 10% of available magnitude + function _genAllocation_Rand( + User operator, + OperatorSet memory operatorSet + ) internal returns (AllocateParams memory params) { + params.operatorSet = operatorSet; + params.strategies = allocationManager.getStrategiesInOperatorSet(operatorSet); + params.newMagnitudes = new uint64[](params.strategies.length); + + Allocation[] memory allocations = _getAllocations(operator, operatorSet, params.strategies); + Magnitudes[] memory magnitudes = _getMagnitudes(operator, params.strategies); + + for (uint i = 0; i < params.strategies.length; i++) { + // minimum of 10%, maximum of 100%. increments of 10%. + uint r = _randUint({min: 1, max: 10}); + uint64 allocation = uint64(magnitudes[i].allocatable) / uint64(r); + + params.newMagnitudes[i] = allocations[i].currentMagnitude + allocation; + } + } + /// @dev Generates params for a half deallocation from all strategies the operator is allocated to in the operator set function _genDeallocation_HalfRemaining( User operator, @@ -1839,12 +2032,46 @@ abstract contract IntegrationBase is IntegrationDeployer, TypeImporter { User operator, OperatorSet memory operatorSet, IStrategy[] memory strategies - ) internal view returns (AllocateParams memory params) { + ) internal pure returns (AllocateParams memory params) { params.operatorSet = operatorSet; params.strategies = strategies; params.newMagnitudes = new uint64[](params.strategies.length); } + /// Generate random slashing between 1 and 99% + function _genSlashing_Rand( + User operator, + OperatorSet memory operatorSet + ) internal returns (SlashingParams memory params) { + params.operator = address(operator); + params.operatorSetId = operatorSet.id; + params.description = "genSlashing_Half"; + params.strategies = allocationManager.getStrategiesInOperatorSet(operatorSet).sort(); + params.wadsToSlash = new uint[](params.strategies.length); + + /// 1% * rand(1, 99) + uint slashWad = 1e16 * _randUint({min: 1, max: 99}); + + for (uint i = 0; i < params.wadsToSlash.length; i++) { + params.wadsToSlash[i] = slashWad; + } + } + + function _genSlashing_Half( + User operator, + OperatorSet memory operatorSet + ) internal view returns (SlashingParams memory params) { + params.operator = address(operator); + params.operatorSetId = operatorSet.id; + params.description = "genSlashing_Half"; + params.strategies = allocationManager.getStrategiesInOperatorSet(operatorSet).sort(); + params.wadsToSlash = new uint[](params.strategies.length); + + for (uint i = 0; i < params.wadsToSlash.length; i++) { + params.wadsToSlash[i] = 1e17; + } + } + function _randWadToSlash() internal returns (uint) { return _randUint({ min: 0.01 ether, max: 1 ether }); } @@ -2372,6 +2599,38 @@ abstract contract IntegrationBase is IntegrationDeployer, TypeImporter { return allocationManager.isMemberOfOperatorSet(address(operator), operatorSet); } + function _getPrevBurnableShares(IStrategy[] memory strategies) internal timewarp() returns (uint[] memory) { + return _getBurnableShares(strategies); + } + + function _getBurnableShares(IStrategy[] memory strategies) internal view returns (uint[] memory) { + uint[] memory burnableShares = new uint[](strategies.length); + + for (uint i = 0; i < strategies.length; i++) { + if (strategies[i] == beaconChainETHStrategy) { + burnableShares[i] = eigenPodManager.burnableETHShares(); + } else { + burnableShares[i] = strategyManager.getBurnableShares(strategies[i]); + } + } + + return burnableShares; + } + + function _getPrevSlashableSharesInQueue(User operator, IStrategy[] memory strategies) internal timewarp() returns (uint[] memory) { + return _getSlashableSharesInQueue(operator, strategies); + } + + function _getSlashableSharesInQueue(User operator, IStrategy[] memory strategies) internal view returns (uint[] memory) { + uint[] memory slashableShares = new uint[](strategies.length); + + for (uint i = 0; i < strategies.length; i++) { + slashableShares[i] = delegationManager.getSlashableSharesInQueue(address(operator), strategies[i]); + } + + return slashableShares; + } + /// @dev Uses timewarp modifier to get operator shares at the last snapshot function _getPrevOperatorShares( User operator, @@ -2512,6 +2771,34 @@ abstract contract IntegrationBase is IntegrationDeployer, TypeImporter { return shares; } + function _getDepositScalingFactors(User staker, IStrategy[] memory strategies) internal view returns (uint[] memory) { + uint[] memory depositScalingFactors = new uint[](strategies.length); + for (uint i=0; i < strategies.length; i++) { + depositScalingFactors[i] = _getDepositScalingFactor(staker, strategies[i]); + } + return depositScalingFactors; + } + + function _getDepositScalingFactor(User staker, IStrategy strategy) internal view returns (uint) { + return delegationManager.depositScalingFactor(address(staker), strategy); + } + + function _getExpectedDSFUndelegate(User staker) internal view returns (uint expectedDepositScalingFactor) { + return WAD.divWad(_getBeaconChainSlashingFactor(staker)); + } + + function _getExpectedWithdrawableSharesUndelegate(User staker, IStrategy[] memory strategies, uint[] memory shares) internal view returns (uint[] memory){ + uint[] memory expectedWithdrawableShares = new uint[](strategies.length); + for (uint i = 0; i < strategies.length; i++) { + if (strategies[i] == BEACONCHAIN_ETH_STRAT) { + expectedWithdrawableShares[i] = shares[i].mulWad(_getExpectedDSFUndelegate(staker)).mulWad(_getBeaconChainSlashingFactor(staker)); + } else { + expectedWithdrawableShares[i] = shares[i]; + } + } + return expectedWithdrawableShares; + } + function _getPrevWithdrawableShares(User staker, IStrategy[] memory strategies) internal timewarp() returns (uint[] memory) { return _getWithdrawableShares(staker, strategies); } diff --git a/src/test/integration/IntegrationChecks.t.sol b/src/test/integration/IntegrationChecks.t.sol index 7b021dda54..f7ae129933 100644 --- a/src/test/integration/IntegrationChecks.t.sol +++ b/src/test/integration/IntegrationChecks.t.sol @@ -243,6 +243,8 @@ contract IntegrationCheckUtils is IntegrationBase { "check_Undelegate_State: calculated withdrawal should match returned root"); assert_AllWithdrawalsPending(withdrawalRoots, "check_Undelegate_State: stakers withdrawal should now be pending"); + assert_DSF_Reset(staker, strategies, + "check_Undelegate_State: staker dsfs should be reset to wad"); assert_Snap_Added_QueuedWithdrawals(staker, withdrawals, "check_Undelegate_State: staker should have increased nonce by withdrawals.length"); assert_Snap_Removed_OperatorShares(operator, strategies, stakerDelegatedShares, @@ -357,7 +359,9 @@ contract IntegrationCheckUtils is IntegrationBase { assert_WithdrawalNotPending(delegationManager.calculateWithdrawalRoot(withdrawal), "staker withdrawal should no longer be pending"); assert_Snap_Unchanged_TokenBalances(staker, "staker should not have any change in underlying token balances"); assert_Snap_Unchanged_TokenBalances(operator, "operator should not have any change in underlying token balances"); - assert_Snap_Added_Staker_DepositShares(staker, strategies, shares, "staker should have received expected shares"); + assert_Snap_Added_Staker_DepositShares(staker, strategies, shares, "staker should have received expected deposit shares"); + uint[] memory expectedWithdrawableShares = _getExpectedWithdrawableSharesUndelegate(staker, strategies, shares); + assert_Snap_Added_Staker_WithdrawableShares(staker, strategies, expectedWithdrawableShares, "staker should have received expected withdrawable shares"); assert_Snap_Unchanged_OperatorShares(operator, "operator should have shares unchanged"); assert_Snap_Unchanged_StrategyShares(strategies, "strategies should have total shares unchanged"); } @@ -487,18 +491,6 @@ contract IntegrationCheckUtils is IntegrationBase { assert_Snap_Unchanged_AllocatableMagnitude(operator, allStrats, "should not have updated allocatable magnitude"); } - // /// @dev Checks invariants for registration for a variety of allocation states - // /// - // function check_Registration_State( - // User operator, - // OperatorSet memory operatorSet, - // IStrategy[] memory unallocated, - // AllocateParams memory pending, - // AllocateParams memory active - // ) internal { - // check_Base_Registration_State(operator, operatorSet); - // } - /// @dev Check invariants for registerForOperatorSets given a set of strategies /// for which NO allocation exists (currentMag/pendingDiff are 0) /// @param unallocated For the given operatorSet, a list of strategies for which NO allocation exists @@ -875,6 +867,37 @@ contract IntegrationCheckUtils is IntegrationBase { check_ActiveModification_State(operator, deallocateParams); } + /******************************************************************************* + ALM - SLASHING + *******************************************************************************/ + + function check_Base_Slashing_State( + User operator, + AllocateParams memory allocateParams, + SlashingParams memory slashParams + ) internal { + OperatorSet memory operatorSet = allocateParams.operatorSet; + + check_MaxMag_Invariants(operator); + check_IsSlashable_State(operator, operatorSet, allocateParams.strategies); + + // Slashing SHOULD change max magnitude and current allocation + assert_Snap_Slashed_MaxMagnitude(operator, slashParams, "slash should lower max magnitude"); + assert_Snap_Slashed_EncumberedMagnitude(operator, slashParams, "slash should lower max magnitude"); + assert_Snap_Slashed_AllocatedStake(operator, operatorSet, slashParams, "slash should lower allocated stake"); + assert_Snap_Slashed_SlashableStake(operator, operatorSet, slashParams, "slash should lower slashable stake"); + assert_Snap_Slashed_OperatorShares(operator, slashParams, "slash should remove operator shares"); + assert_Snap_Slashed_Allocation(operator, operatorSet, slashParams, "slash should reduce current magnitude"); + assert_Snap_Increased_BurnableShares(operator, slashParams, "slash should increase burnable shares"); + + // Slashing SHOULD NOT change allocatable magnitude, registration, and slashability status + assert_Snap_Unchanged_AllocatableMagnitude(operator, allStrats, "slashing should not change allocatable magnitude"); + assert_Snap_Unchanged_Registration(operator, operatorSet, "slash should not change registration status"); + assert_Snap_Unchanged_Slashability(operator, operatorSet, "slash should not change slashability status"); + assert_Snap_Unchanged_AllocatedSets(operator, "should not have updated allocated sets"); + assert_Snap_Unchanged_AllocatedStrats(operator, operatorSet, "should not have updated allocated strategies"); + } + // TODO: improvement needed function check_Withdrawal_AsTokens_State_AfterSlash( diff --git a/src/test/integration/tests/ALM_RegisterAndModify.t.sol b/src/test/integration/tests/ALM_RegisterAndModify.t.sol index 20816e88ba..65a4592a2f 100644 --- a/src/test/integration/tests/ALM_RegisterAndModify.t.sol +++ b/src/test/integration/tests/ALM_RegisterAndModify.t.sol @@ -52,11 +52,9 @@ contract Integration_InitRegistered is Integration_ALMBase { check_Registration_State_NoAllocation(operator, operatorSet, allStrats); } - function testFuzz_allocate_deallocate_deregister( - uint24 _random - ) public rand(_random) { + function testFuzz_allocate_deallocate_deregister(uint24 _r) public rand(_r) { // 1. Allocate to the operator set - allocateParams = _genAllocation_AllAvailable(operator, operatorSet); + allocateParams = _genAllocation_Rand(operator, operatorSet); operator.modifyAllocations(allocateParams); check_IncrAlloc_State_Slashable(operator, allocateParams); @@ -77,11 +75,9 @@ contract Integration_InitRegistered is Integration_ALMBase { check_FullyDeallocated_State(operator, allocateParams, deallocateParams); } - function testFuzz_allocate_deallocate_waitDeallocate_deregister( - uint24 _random - ) public rand(_random) { + function testFuzz_allocate_deallocate_waitDeallocate_deregister(uint24 _r) public rand(_r) { // 1. Allocate to the operator set - allocateParams = _genAllocation_AllAvailable(operator, operatorSet); + allocateParams = _genAllocation_Rand(operator, operatorSet); operator.modifyAllocations(allocateParams); check_IncrAlloc_State_Slashable(operator, allocateParams); @@ -111,7 +107,7 @@ contract Integration_InitRegistered is Integration_ALMBase { _rollForward_DeallocationDelay(); // 3. Allocate to operator set - allocateParams = _genAllocation_AllAvailable(operator, operatorSet); + allocateParams = _genAllocation_Rand(operator, operatorSet); operator.modifyAllocations(allocateParams); check_IncrAlloc_State_NotSlashable(operator, allocateParams); @@ -132,7 +128,7 @@ contract Integration_InitRegistered is Integration_ALMBase { // 2. Before deregistration is complete, allocate to operator set // The operator should be slashable after the allocation delay - allocateParams = _genAllocation_AllAvailable(operator, operatorSet); + allocateParams = _genAllocation_Rand(operator, operatorSet); operator.modifyAllocations(allocateParams); check_IncrAlloc_State_Slashable(operator, allocateParams); @@ -156,7 +152,7 @@ contract Integration_InitRegistered is Integration_ALMBase { // 2. Before deregistration is complete, allocate to operator set // The operator should be slashable after the allocation delay - allocateParams = _genAllocation_AllAvailable(operator, operatorSet); + allocateParams = _genAllocation_Rand(operator, operatorSet); operator.modifyAllocations(allocateParams); check_IncrAlloc_State_Slashable(operator, allocateParams); @@ -184,9 +180,7 @@ contract Integration_InitAllocated is Integration_ALMBase { check_IncrAlloc_State_NotSlashable(operator, allocateParams); } - function testFuzz_register_deallocate_deregister( - uint24 _random - ) public rand(_random) { + function testFuzz_register_deallocate_deregister(uint24 _r) public rand(_r) { // 1. Register for the operator set operator.registerForOperatorSet(operatorSet); check_Registration_State_PendingAllocation(operator, allocateParams); @@ -208,9 +202,7 @@ contract Integration_InitAllocated is Integration_ALMBase { check_FullyDeallocated_State(operator, allocateParams, deallocateParams); } - function testFuzz_waitAllocation_register_deallocate( - uint24 _random - ) public rand(_random) { + function testFuzz_waitAllocation_register_deallocate(uint24 _r) public rand(_r) { _rollForward_AllocationDelay(operator); // 1. Register for the operator set. The allocation immediately becomes slashable diff --git a/src/test/integration/tests/SlashingWithdrawals.t.sol b/src/test/integration/tests/SlashingWithdrawals.t.sol index 2dcca1d732..e0349aefcb 100644 --- a/src/test/integration/tests/SlashingWithdrawals.t.sol +++ b/src/test/integration/tests/SlashingWithdrawals.t.sol @@ -3,7 +3,7 @@ pragma solidity ^0.8.27; import "src/test/integration/IntegrationChecks.t.sol"; -contract Integration_SlashingWithdrawals is IntegrationCheckUtils { +contract Integration_ALMSlashBase is IntegrationCheckUtils { AVS avs; OperatorSet operatorSet; @@ -16,15 +16,6 @@ contract Integration_SlashingWithdrawals is IntegrationCheckUtils { uint[] initTokenBalances; uint[] initDepositShares; - /** - * Current test setup uses a single operator set and multiple strategies. Slashes - * are simple, done on that single operator set. - * -- good for testing full slashes where 100% of a strategy's magnitude is impacted - * -- could have a separate setup with multiple operator sets and one strategy - * to test "full slashes" that don't hit 100% of a strategy's magnitude (but are - * 100% of allocated magnitude for that operator set) - */ - /// Shared setup: /// /// 1. Generate staker, operator, and AVS @@ -33,8 +24,13 @@ contract Integration_SlashingWithdrawals is IntegrationCheckUtils { /// 4. Operator allocates to operator set /// 5. Operator registers for operator set /// NOTE: Steps 4 and 5 are done in random order, as these should not have an outcome on the test - function _init() internal override { - (staker, strategies, initTokenBalances) = _newRandomStaker(); + function _init() internal virtual override { + _configAssetTypes(HOLDS_LST); + // (staker, strategies, initTokenBalances) = _newRandomStaker(); + // operator = _newRandomOperator_NoAssets(); + // (avs,) = _newRandomAVS(); + + (staker, strategies, initTokenBalances) = _newBasicStaker(); operator = _newRandomOperator_NoAssets(); (avs,) = _newRandomAVS(); @@ -72,6 +68,67 @@ contract Integration_SlashingWithdrawals is IntegrationCheckUtils { _rollBlocksForCompleteAllocation(operator, operatorSet, strategies); } +} + +contract Integration_InitSlash is Integration_ALMSlashBase { + + SlashingParams slashParams; + + function testFuzz_slashSingle(uint24 _r) public rand(_r) { + slashParams = _genSlashing_Rand(operator, operatorSet); + avs.slashOperator(slashParams); + check_Base_Slashing_State(operator, allocateParams, slashParams); + } + + function testFuzz_slashMulti_WithdrawTokens(uint24 _r) public rand(_r) { + for (uint i = 0; i < 25; i++) { + slashParams = _genSlashing_Rand(operator, operatorSet); + avs.slashOperator(slashParams); + check_Base_Slashing_State(operator, allocateParams, slashParams); + } + + // undelegate + uint[] memory shares = _getStakerWithdrawableShares(staker, strategies); + Withdrawal[] memory withdrawals = staker.undelegate(); + bytes32[] memory roots = _getWithdrawalHashes(withdrawals); + check_Undelegate_State(staker, operator, withdrawals, roots, strategies, initDepositShares, shares); + + _rollBlocksForCompleteWithdrawals(withdrawals); + + // try withdrawing as tokens: + IERC20[] memory tokens = _getUnderlyingTokens(strategies); + uint[] memory expectedTokens = _calculateExpectedTokens(strategies, shares); + + staker.completeWithdrawalsAsTokens(withdrawals); + for (uint i = 0; i < withdrawals.length; i++) { + check_Withdrawal_AsTokens_State(staker, operator, withdrawals[i], strategies, shares, tokens, expectedTokens); + } + } + + function testFuzz_slashMulti_WithdrawShares(uint24 _r) public rand(_r) { + for (uint i = 0; i < 25; i++) { + slashParams = _genSlashing_Rand(operator, operatorSet); + avs.slashOperator(slashParams); + check_Base_Slashing_State(operator, allocateParams, slashParams); + } + + // undelegate + uint[] memory shares = _getStakerWithdrawableShares(staker, strategies); + Withdrawal[] memory withdrawals = staker.undelegate(); + bytes32[] memory roots = _getWithdrawalHashes(withdrawals); + check_Undelegate_State(staker, operator, withdrawals, roots, strategies, initDepositShares, shares); + + _rollBlocksForCompleteWithdrawals(withdrawals); + + // try withdrawing as shares + staker.completeWithdrawalsAsShares(withdrawals); + for (uint i = 0; i < withdrawals.length; i++) { + check_Withdrawal_AsShares_Undelegated_State(staker, operator, withdrawals[i], strategies, shares); + } + } +} + +contract Integration_SlashingWithdrawals is Integration_ALMSlashBase { function testFuzz_slash_undelegate_completeAsTokens( uint24 _random diff --git a/src/test/integration/users/AVS.t.sol b/src/test/integration/users/AVS.t.sol index 91abb0801c..b4899d65e5 100644 --- a/src/test/integration/users/AVS.t.sol +++ b/src/test/integration/users/AVS.t.sol @@ -120,9 +120,40 @@ contract AVS is Logger, IAllocationManagerTypes, IAVSRegistrar { } function slashOperator( - User operator, - uint32 operatorSetId, - IStrategy[] memory strategies, + SlashingParams memory params + ) public createSnapshot { + + + for (uint256 i; i < params.strategies.length; ++i) { + string memory strategyName = params.strategies[i] == beaconChainETHStrategy ? + "Native ETH" : + IERC20Metadata(address(params.strategies[i].underlyingToken())).name(); + + print.method( + "slashOperator", + string.concat( + "{operator: ", + User(payable(params.operator)).NAME_COLORED(), + ", operatorSetId: ", + cheats.toString(params.operatorSetId), + ", strategy: ", + strategyName, + ", wadToSlash: ", + params.wadsToSlash[i].asWad(), + "}" + ) + ); + } + + _tryPrankAppointee_AllocationManager(IAllocationManager.slashOperator.selector); + allocationManager.slashOperator(address(this), params); + print.gasUsed(); + } + + function slashOperator( + User operator, + uint32 operatorSetId, + IStrategy[] memory strategies, uint256[] memory wadsToSlash ) public createSnapshot returns (SlashingParams memory p) { p = SlashingParams({ From a4741dd835fdd57eccc00b78e9c6b46a7a52ca9c Mon Sep 17 00:00:00 2001 From: "clandestine.eth" <96172957+0xClandestine@users.noreply.github.com> Date: Wed, 19 Feb 2025 15:45:51 -0500 Subject: [PATCH 33/35] refactor: rename inconsistent `getQueuedWithdrawal` alias (#1133) **Motivation:** Naming between the `getQueuedWIthdrawal` aliases was inconsistent. **Modifications:** - ~made `queuedWithdrawals[withdrawalRoot]` mapping public.~ - renamed `queuedWithdrawals` -> `_queuedWithdrawals`. - added `_queuedWithdrawals` getter - removed previous `getQueuedWithdrawal` alias. - renamed `getQueuedWithdrawalFromRoot` to `getQueuedWithdrawal`. **Result:** Consistent function naming. --------- Co-authored-by: Yash Patil <40046473+ypatil12@users.noreply.github.com> --- src/contracts/core/DelegationManager.sol | 15 +-- .../core/DelegationManagerStorage.sol | 2 +- .../interfaces/IDelegationManager.sol | 23 ++-- .../integration/tests/Slashed_Eigenpod.t.sol | 127 +++++++++--------- src/test/unit/DelegationUnit.t.sol | 26 ++-- 5 files changed, 94 insertions(+), 99 deletions(-) diff --git a/src/contracts/core/DelegationManager.sol b/src/contracts/core/DelegationManager.sol index 2c33a2b85e..d75c59e674 100644 --- a/src/contracts/core/DelegationManager.sol +++ b/src/contracts/core/DelegationManager.sol @@ -523,7 +523,7 @@ contract DelegationManager is bytes32 withdrawalRoot = calculateWithdrawalRoot(withdrawal); pendingWithdrawals[withdrawalRoot] = true; - queuedWithdrawals[withdrawalRoot] = withdrawal; + _queuedWithdrawals[withdrawalRoot] = withdrawal; _stakerQueuedWithdrawalRoots[staker].add(withdrawalRoot); emit SlashingWithdrawalQueued(withdrawalRoot, withdrawal, withdrawableShares); @@ -569,7 +569,7 @@ contract DelegationManager is // Remove the withdrawal from the queue. Note that for legacy withdrawals, the removals // from `_stakerQueuedWithdrawalRoots` and `queuedWithdrawals` will no-op. _stakerQueuedWithdrawalRoots[withdrawal.staker].remove(withdrawalRoot); - delete queuedWithdrawals[withdrawalRoot]; + delete _queuedWithdrawals[withdrawalRoot]; delete pendingWithdrawals[withdrawalRoot]; emit SlashingWithdrawalCompleted(withdrawalRoot); @@ -803,7 +803,7 @@ contract DelegationManager is function _getSharesByWithdrawalRoot( bytes32 withdrawalRoot ) internal view returns (Withdrawal memory withdrawal, uint256[] memory shares) { - withdrawal = queuedWithdrawals[withdrawalRoot]; + withdrawal = _queuedWithdrawals[withdrawalRoot]; shares = new uint256[](withdrawal.strategies.length); uint32 slashableUntil = withdrawal.startBlock + MIN_WITHDRAWAL_DELAY_BLOCKS; @@ -964,15 +964,14 @@ contract DelegationManager is return (strategies, shares); } - /// @inheritdoc IDelegationManager - function getQueuedWithdrawal( + function queuedWithdrawals( bytes32 withdrawalRoot - ) external view returns (Withdrawal memory) { - return queuedWithdrawals[withdrawalRoot]; + ) external view returns (Withdrawal memory withdrawal) { + return _queuedWithdrawals[withdrawalRoot]; } /// @inheritdoc IDelegationManager - function getQueuedWithdrawalFromRoot( + function getQueuedWithdrawal( bytes32 withdrawalRoot ) external view returns (Withdrawal memory withdrawal, uint256[] memory shares) { (withdrawal, shares) = _getSharesByWithdrawalRoot(withdrawalRoot); diff --git a/src/contracts/core/DelegationManagerStorage.sol b/src/contracts/core/DelegationManagerStorage.sol index 6da2ed4c88..8e38b4c8d1 100644 --- a/src/contracts/core/DelegationManagerStorage.sol +++ b/src/contracts/core/DelegationManagerStorage.sol @@ -111,7 +111,7 @@ abstract contract DelegationManagerStorage is IDelegationManager { /// @notice Returns the details of a queued withdrawal given by `withdrawalRoot`. /// @dev This variable only reflects withdrawals that were made after the slashing release. - mapping(bytes32 withdrawalRoot => Withdrawal withdrawal) internal queuedWithdrawals; + mapping(bytes32 withdrawalRoot => Withdrawal withdrawal) internal _queuedWithdrawals; /// @notice Contains history of the total cumulative staker withdrawals for an operator and a given strategy. /// Used to calculate burned StrategyManager shares when an operator is slashed. diff --git a/src/contracts/interfaces/IDelegationManager.sol b/src/contracts/interfaces/IDelegationManager.sol index c16d7ebd68..6a59398278 100644 --- a/src/contracts/interfaces/IDelegationManager.sol +++ b/src/contracts/interfaces/IDelegationManager.sol @@ -471,11 +471,17 @@ interface IDelegationManager is ISignatureUtilsMixin, IDelegationManagerErrors, */ function depositScalingFactor(address staker, IStrategy strategy) external view returns (uint256); - /// @notice Returns the Withdrawal associated with a `withdrawalRoot`, if it exists. NOTE that - /// withdrawals queued before the slashing release can NOT be queried with this method. + /** + * @notice Returns the Withdrawal and corresponding shares associated with a `withdrawalRoot` + * @param withdrawalRoot The hash identifying the queued withdrawal + * @return withdrawal The withdrawal details + * @return shares Array of shares corresponding to each strategy in the withdrawal + * @dev The shares are what a user would receive from completing a queued withdrawal, assuming all slashings are applied + * @dev Withdrawals queued before the slashing release cannot be queried with this method + */ function getQueuedWithdrawal( bytes32 withdrawalRoot - ) external view returns (Withdrawal memory); + ) external view returns (Withdrawal memory withdrawal, uint256[] memory shares); /** * @notice Returns all queued withdrawals and their corresponding shares for a staker. @@ -488,17 +494,6 @@ interface IDelegationManager is ISignatureUtilsMixin, IDelegationManagerErrors, address staker ) external view returns (Withdrawal[] memory withdrawals, uint256[][] memory shares); - /** - * @notice Returns the withdrawal details and corresponding shares for a specific queued withdrawal. - * @param withdrawalRoot The hash identifying the queued withdrawal. - * @return withdrawal The withdrawal details. - * @return shares Array of shares corresponding to each strategy in the withdrawal. - * @dev The shares are what a user would receive from completing a queued withdrawal, assuming all slashings are applied. - */ - function getQueuedWithdrawalFromRoot( - bytes32 withdrawalRoot - ) external view returns (Withdrawal memory withdrawal, uint256[] memory shares); - /// @notice Returns a list of queued withdrawal roots for the `staker`. /// NOTE that this only returns withdrawals queued AFTER the slashing release. function getQueuedWithdrawalRoots( diff --git a/src/test/integration/tests/Slashed_Eigenpod.t.sol b/src/test/integration/tests/Slashed_Eigenpod.t.sol index d901cad05c..c98990ab19 100644 --- a/src/test/integration/tests/Slashed_Eigenpod.t.sol +++ b/src/test/integration/tests/Slashed_Eigenpod.t.sol @@ -134,71 +134,72 @@ contract Integration_SlashedEigenpod is IntegrationCheckUtils { assertApproxEqAbs(withdrawableSharesAfter[0], depositSharesAfter[0], 100, "Withdrawable shares should equal deposit shares after withdrawal"); } - function testFuzz_delegateSlashedStaker_slashedOperator(uint24 _random) public rand(_random) { - - - (User staker2,,) = _newRandomStaker(); - (uint40[] memory validators2,) = staker2.startValidators(); - beaconChain.advanceEpoch_NoWithdrawNoRewards(); - staker2.verifyWithdrawalCredentials(validators2); - staker2.startCheckpoint(); - staker2.completeCheckpoint(); - staker2.delegateTo(operator); - - //randomize additional deposit to eigenpod - if(_randBool()){ - uint amount = 32 ether * _randUint({min: 1, max: 5}); - cheats.deal(address(staker), amount); - (uint40[] memory validators,) = staker.startValidators(); - beaconChain.advanceEpoch_NoWithdrawNoRewards(); - staker.verifyWithdrawalCredentials(validators); + // TODO: Fix this test + // function testFuzz_delegateSlashedStaker_slashedOperator(uint24 _random) public rand(_random) { + + + // (User staker2,,) = _newRandomStaker(); + // (uint40[] memory validators2,) = staker2.startValidators(); + // beaconChain.advanceEpoch_NoWithdrawNoRewards(); + // staker2.verifyWithdrawalCredentials(validators2); + // staker2.startCheckpoint(); + // staker2.completeCheckpoint(); + // staker2.delegateTo(operator); + + // //randomize additional deposit to eigenpod + // if(_randBool()){ + // uint amount = 32 ether * _randUint({min: 1, max: 5}); + // cheats.deal(address(staker), amount); + // (uint40[] memory validators,) = staker.startValidators(); + // beaconChain.advanceEpoch_NoWithdrawNoRewards(); + // staker.verifyWithdrawalCredentials(validators); - staker.startCheckpoint(); - staker.completeCheckpoint(); - } - - // Create an operator set and register an operator. - operatorSet = avs.createOperatorSet(strategies); - operator.registerForOperatorSet(operatorSet); - check_Registration_State_NoAllocation(operator, operatorSet, strategies); - - // Allocate to operator set - allocateParams = _genAllocation_AllAvailable(operator, operatorSet, strategies); - operator.modifyAllocations(allocateParams); - check_IncrAlloc_State_Slashable(operator, allocateParams); - _rollBlocksForCompleteAllocation(operator, operatorSet, strategies); - - //Slash operator before delegation - IAllocationManagerTypes.SlashingParams memory slashingParams; - uint wadToSlash = _randWadToSlash(); - slashingParams = avs.slashOperator(operator, operatorSet.id, strategies, wadToSlash.toArrayU256()); - assert_Snap_Allocations_Slashed(slashingParams, operatorSet, true, "operator allocations should be slashed"); - - uint256[] memory initDelegatableShares = _getWithdrawableShares(staker, strategies); - uint256[] memory initDepositShares = _getStakerDepositShares(staker, strategies); - - // Delegate to an operator - staker.delegateTo(operator); - (uint256[] memory delegatedShares, ) = delegationManager.getWithdrawableShares(address(staker), strategies); - check_Delegation_State(staker, operator, strategies, initDepositShares); + // staker.startCheckpoint(); + // staker.completeCheckpoint(); + // } + + // // Create an operator set and register an operator. + // operatorSet = avs.createOperatorSet(strategies); + // operator.registerForOperatorSet(operatorSet); + // check_Registration_State_NoAllocation(operator, operatorSet, strategies); + + // // Allocate to operator set + // allocateParams = _genAllocation_AllAvailable(operator, operatorSet, strategies); + // operator.modifyAllocations(allocateParams); + // check_IncrAlloc_State_Slashable(operator, allocateParams); + // _rollBlocksForCompleteAllocation(operator, operatorSet, strategies); + + // //Slash operator before delegation + // IAllocationManagerTypes.SlashingParams memory slashingParams; + // uint wadToSlash = _randWadToSlash(); + // slashingParams = avs.slashOperator(operator, operatorSet.id, strategies, wadToSlash.toArrayU256()); + // assert_Snap_Allocations_Slashed(slashingParams, operatorSet, true, "operator allocations should be slashed"); + + // uint256[] memory initDelegatableShares = _getWithdrawableShares(staker, strategies); + // uint256[] memory initDepositShares = _getStakerDepositShares(staker, strategies); + + // // Delegate to an operator + // staker.delegateTo(operator); + // (uint256[] memory delegatedShares, ) = delegationManager.getWithdrawableShares(address(staker), strategies); + // check_Delegation_State(staker, operator, strategies, initDepositShares); - // Undelegate from an operator - IDelegationManagerTypes.Withdrawal[] memory withdrawals = staker.undelegate(); - bytes32[] memory withdrawalRoots = _getWithdrawalHashes(withdrawals); - check_Undelegate_State(staker, operator, withdrawals, withdrawalRoots, strategies, initDepositShares, delegatedShares); - - // Complete withdrawal as shares - // Fast forward to when we can complete the withdrawal - _rollBlocksForCompleteWithdrawals(withdrawals); - for (uint256 i = 0; i < withdrawals.length; ++i) { - staker.completeWithdrawalAsShares(withdrawals[i]); - check_Withdrawal_AsShares_Undelegated_State(staker, operator, withdrawals[i], withdrawals[i].strategies, delegatedShares); - } - - (uint256[] memory withdrawableSharesAfter, uint256[] memory depositSharesAfter) = delegationManager.getWithdrawableShares(address(staker), strategies); - assertEq(depositSharesAfter[0], delegatedShares[0], "Deposit shares should reset to reflect slash(es)"); - assertApproxEqAbs(withdrawableSharesAfter[0], depositSharesAfter[0], 100, "Withdrawable shares should equal deposit shares after withdrawal"); - } + // // Undelegate from an operator + // IDelegationManagerTypes.Withdrawal[] memory withdrawals = staker.undelegate(); + // bytes32[] memory withdrawalRoots = _getWithdrawalHashes(withdrawals); + // check_Undelegate_State(staker, operator, withdrawals, withdrawalRoots, strategies, initDepositShares, delegatedShares); + + // // Complete withdrawal as shares + // // Fast forward to when we can complete the withdrawal + // _rollBlocksForCompleteWithdrawals(withdrawals); + // for (uint256 i = 0; i < withdrawals.length; ++i) { + // staker.completeWithdrawalAsShares(withdrawals[i]); + // check_Withdrawal_AsShares_Undelegated_State(staker, operator, withdrawals[i], withdrawals[i].strategies, delegatedShares); + // } + + // (uint256[] memory withdrawableSharesAfter, uint256[] memory depositSharesAfter) = delegationManager.getWithdrawableShares(address(staker), strategies); + // assertEq(depositSharesAfter[0], delegatedShares[0], "Deposit shares should reset to reflect slash(es)"); + // assertApproxEqAbs(withdrawableSharesAfter[0], depositSharesAfter[0], 100, "Withdrawable shares should equal deposit shares after withdrawal"); + // } function testFuzz_delegateSlashedStaker_redelegate_complete(uint24 _random) public rand(_random){ diff --git a/src/test/unit/DelegationUnit.t.sol b/src/test/unit/DelegationUnit.t.sol index cd97299c98..630be6679e 100644 --- a/src/test/unit/DelegationUnit.t.sol +++ b/src/test/unit/DelegationUnit.t.sol @@ -4846,7 +4846,7 @@ contract DelegationManagerUnitTests_queueWithdrawals is DelegationManagerUnitTes cheats.prank(defaultStaker); bytes32 withdrawalRoot = delegationManager.queueWithdrawals(queuedWithdrawalParams)[0]; - Withdrawal memory withdrawal = delegationManager.getQueuedWithdrawal(withdrawalRoot); + (Withdrawal memory withdrawal, ) = delegationManager.getQueuedWithdrawal(withdrawalRoot); assertEq(withdrawal.staker, defaultStaker, "staker should be msg.sender"); assertEq(withdrawal.withdrawer, defaultStaker, "withdrawer should be msg.sender"); } @@ -8670,16 +8670,16 @@ contract DelegationManagerUnitTests_getQueuedWithdrawals is DelegationManagerUni // Get shares from withdrawal - should return 50 shares (100 * 0.5) using original magnitude // rather than incorrectly returning 100 shares (100 * 1.0) using new magnitude - (, uint256[] memory shares) = delegationManager.getQueuedWithdrawalFromRoot(withdrawalRoot); + (, uint256[] memory shares) = delegationManager.getQueuedWithdrawal(withdrawalRoot); assertEq(shares[0], 50e18, "shares should be 50e18 (100e18 * 0.5) using original magnitude"); } } -contract DelegationManagerUnitTests_getQueuedWithdrawalFromRoot is DelegationManagerUnitTests { +contract DelegationManagerUnitTests_getQueuedWithdrawal is DelegationManagerUnitTests { using ArrayLib for *; using SlashingLib for *; - function test_getQueuedWithdrawalFromRoot_Correctness(Randomness r) public rand(r) { + function test_getQueuedWithdrawal_Correctness(Randomness r) public rand(r) { // Set up initial deposit uint256 depositAmount = r.Uint256(1 ether, 100 ether); _depositIntoStrategies(defaultStaker, strategyMock.toArray(), depositAmount.toArrayU256()); @@ -8703,14 +8703,14 @@ contract DelegationManagerUnitTests_getQueuedWithdrawalFromRoot is DelegationMan delegationManager.queueWithdrawals(queuedWithdrawalParams); // Get shares from queued withdrawal - (, uint256[] memory shares) = delegationManager.getQueuedWithdrawalFromRoot(withdrawalRoot); + (, uint256[] memory shares) = delegationManager.getQueuedWithdrawal(withdrawalRoot); // Verify withdrawal details match assertEq(shares.length, 1, "incorrect shares array length"); assertEq(shares[0], depositAmount, "incorrect shares amount"); } - function test_getQueuedWithdrawalFromRoot_AfterSlashing(Randomness r) public rand(r) { + function test_getQueuedWithdrawal_AfterSlashing(Randomness r) public rand(r) { // Set up initial deposit uint256 depositAmount = r.Uint256(1 ether, 100 ether); _depositIntoStrategies(defaultStaker, strategyMock.toArray(), depositAmount.toArrayU256()); @@ -8739,20 +8739,20 @@ contract DelegationManagerUnitTests_getQueuedWithdrawalFromRoot is DelegationMan delegationManager.slashOperatorShares(defaultOperator, strategyMock, WAD, 0.5 ether); // Get shares from queued withdrawal - (, uint256[] memory shares) = delegationManager.getQueuedWithdrawalFromRoot(withdrawalRoot); + (, uint256[] memory shares) = delegationManager.getQueuedWithdrawal(withdrawalRoot); // Verify withdrawal details match and shares are slashed assertEq(shares.length, 1, "incorrect shares array length"); assertEq(shares[0], depositAmount / 2, "shares not properly slashed"); } - function test_getQueuedWithdrawalFromRoot_NonexistentWithdrawal() public { + function test_getQueuedWithdrawal_NonexistentWithdrawal() public { bytes32 nonexistentRoot = bytes32(uint256(1)); - (, uint256[] memory shares) = delegationManager.getQueuedWithdrawalFromRoot(nonexistentRoot); + (, uint256[] memory shares) = delegationManager.getQueuedWithdrawal(nonexistentRoot); assertEq(shares.length, 0, "shares array should be empty"); } - function test_getQueuedWithdrawalFromRoot_MultipleStrategies(Randomness r) public rand(r) { + function test_getQueuedWithdrawal_MultipleStrategies(Randomness r) public rand(r) { // Set up multiple strategies with deposits uint256 numStrategies = r.Uint256(2, 5); uint256[] memory depositShares = r.Uint256Array({ @@ -8782,7 +8782,7 @@ contract DelegationManagerUnitTests_getQueuedWithdrawalFromRoot is DelegationMan delegationManager.queueWithdrawals(queuedWithdrawalParams); // Get shares from queued withdrawal - (, uint256[] memory shares) = delegationManager.getQueuedWithdrawalFromRoot(withdrawalRoot); + (, uint256[] memory shares) = delegationManager.getQueuedWithdrawal(withdrawalRoot); // Verify withdrawal details and shares for each strategy assertEq(shares.length, numStrategies, "incorrect shares array length"); @@ -8791,8 +8791,8 @@ contract DelegationManagerUnitTests_getQueuedWithdrawalFromRoot is DelegationMan } } - function testFuzz_getQueuedWithdrawalFromRoot_EmptyWithdrawal(bytes32 withdrawalRoot) public { - (, uint256[] memory shares) = delegationManager.getQueuedWithdrawalFromRoot(withdrawalRoot); + function testFuzz_getQueuedWithdrawal_EmptyWithdrawal(bytes32 withdrawalRoot) public { + (, uint256[] memory shares) = delegationManager.getQueuedWithdrawal(withdrawalRoot); assertEq(shares.length, 0, "sanity check"); } } From e278a04163cfd4efa4ff1a8e68d8c11408fad814 Mon Sep 17 00:00:00 2001 From: Alex <18387287+wadealexc@users.noreply.github.com> Date: Thu, 20 Feb 2025 17:49:43 -0500 Subject: [PATCH 34/35] docs: add final audit reports (#1129) **Modifications:** Add finalized audit reports to /audits folder --- .../V1.0.0 (Slashing) - Certora - Feb 2025.pdf | Bin 0 -> 785650 bytes ...0.0 (Slashing) - Sigma Prime - Feb 2025.pdf | Bin 0 -> 542237 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 audits/V1.0.0 (Slashing) - Certora - Feb 2025.pdf create mode 100644 audits/V1.0.0 (Slashing) - Sigma Prime - Feb 2025.pdf diff --git a/audits/V1.0.0 (Slashing) - Certora - Feb 2025.pdf b/audits/V1.0.0 (Slashing) - Certora - Feb 2025.pdf new file mode 100644 index 0000000000000000000000000000000000000000..93bb944da93c37716fd7e2931911c34bd381b8bc GIT binary patch literal 785650 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

tdYT&!Hp* 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 z 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

htV|?0-Ck19!`U@orqxpQjbue=gGINiM z(pVCOERh}O+AXy)HVpk1nUnek{FIEETn;bfLN2*!qLtt?SuihBI&x8k|AtD{zEsM< z2AcN!a8Rb&rmxN@qOB`uxfp9LB4fIz=HYfLI$GbHd2cO3Cv#aOv}JDhBqcUUHjjmcv|S6v}P+@ zc~r=9V6C->cajM}R7LMk@_pHGf|fe+=r!dq^x)0>jSHp)zO+ehAfIitOzlpGP$K8g zR0=6->#IaORg`4v{GyF-2BW=PC6wSP`uY1UwJHIYXvwOZDz{GnnH+fdva^nw@soB# zYws%=VN1MHxjGjXn%q7-ja}zh#^l>UDW4j014|%dZnljc$7Ua5c?RvT(EQ4l-_G?) zGa(?1cqLwTB%ShrucH6_@6z⁢2RNxZhTXu88;0fV=AZNM636_dQlFEa>*Asci9! zIY~MA2woRe&}zO-4Oq!oKb8^Q`>Kk3S^Fc8x_}+1d1j;C@f9&My_nUZK^pRwPUB5e zXB%PpY7yIaWRD3UHd|)LuVxdE-CmLrW>L#F>79~3Qx^#rUNV|iV9Q?}E3N~Lm)iqfHMaXf@nwgPhuF^Z=?3{)KtcJ!p8xE<0fqS12QNvTjxkxE zuuey9O_TsK#jsB9FwpjKVsSDjU)LDR>bP?BCp(BztbTgS^d9lM{0?QP;#-COux9C6 zCD}BoUJY>Z^V9nfon?V(pniG`PLAh_l=V8t#VKL4z5b)9M&I}<0B-fs5g+x8+~H+e!3`>BVnUKz?YQ z)T2)EH9`yj<~45wPOeKoYd&#MRpe;=;z1102=Rv(QhAFT9)5x*rg9`tWIk6k;E2{F zM1n9zxqR#V{lQ?>L}?!mA>ybEL}Ef?3U3aG;QbZWP$9|MFM92*i|J`9_*La}ZA>Y8 z`QjHEm-!%pZ{F*s%)0bopOa5bdb`Yir_*6K5A*%c1ws=(stkmq^{ka-Y%%wXusHjsY>E6S?_S7OtaZ<#FTtCP2aYqMI|IDC$-7SsT1JK%T8gNQh*enn`1-+xsIY6H4*`b z!t1XPxlzTvV{Dx}k003&R75#T@^weLMny#dW8KCZv=);nxBuF;<+8M-!CbY!@d(*l z%@{adh;j^DK#sN!!QcT=au7uh`Pr87Sxw@+uO<(c(fkzG%~>%4$LoU0V3{#zAqTkT zyghz7*J|g)>kk;TFz1bEgLgmi<(C*>sXEICe!4EVat(5TBiQUdx*dM~ps^BF=*z}f znB0LRrE?=#PO7!whWS)n0Wn-n#H;8xmRII;9SIvQopNcX*c=(m1l6U{Sj9w<6j-go zeBA0tZ_1OY@;F>dbBWS_)fcbZ8hrONvVZ34UO8M!MDh;IQitFob=?_zyU6Ho71=7* zo}tJFu6wXq<1Cqdxs+gFJu=#)#DD3=oyp;@Ghit!riLh=siHSiB)jB7Bcq{k@o?9f zDL9>u!TeoA&HOcqt%UZCa$EYDB(g3&yUq3V;%b|f*f)u;J;0iRkTjEy2Pz{?-4T8? z6Y#|q!EskBk`?GEOYe4DpEG_Eu-@32KZ#%wYpXJWOLE6G`5Y0ztGpX%sXbOtxgs;B zI8_{O#WNoM?Y1<=5$Sd2A>^3Id8p9uii3n@%dH}BbACs?9IVOp8$7i@$jtia6%cEX zm%Y2Ad+6I%?svqY{AU8e3KgzwN<&IUwNU|C)7IvzH+A^(?r--)R>q)&wRhVy zY3MoO7BZRAH3C=NbtF)L+QIcVAO{KbTHK?-!FW?E&IAn23JxVkVPbQSLKo0!+p3Rcn zLe1#xdYsz~vQW1clKJzw!JAj6{;?ww1un@WM;OqBb1f2=G}Fi`K`aYa779T|W>j&s zUSAhiPfFc5|1eh@;!ftV1fT*dlns#!4vYA@03tg$`f7qlGOzN>*McPAims|GrRr{> zbi9#i=ITKNy%?R!B@)uE@m{-IQ3cH}9VO8H1C^PMIE(kINN1$%C`}KkW`49V?-04t zK&3E~sGmC+r*tecua-@VGG}9G!cH{~$@;v7!oxx`DIL#+^~4C6lorg?W|$JZD8M2> zmes}e5{aO{?Kh37Has=?lCf4lk15PZZB!C$-r+NIF-18liaaR^@;eFtFj}|7MJf5} z@Rc+H2^>4ykb*;6{59%STkzkB#9E0Ye?~OuPyu2&85dl`TAiOaap_g}t$-K3i>qf_ zbBhtB^Y*2sk?XxgBE;*<@b1}e3AM@h{57_sF72TuFCf82T-z7@`yDn8xky%~Ji^!c zK@s7DjEbX4NrIr*PsYGUGp9=}K6=~d-=>oS*9%|c2ZaO^X(sY>j-@^LXCb|z6FLR_kW@>Xzd!fC|F_2QN%__%76Q!L z76Se=|60L{HAA2^{(Id}n7z zEFduvJZXfAikga)@s0MlL17Lr3ULza$ayVgoPcd?GIZYu9hzSB($a+U{%y55?b4kh z*-v0^`@5)b3*NWXI?R^ztq4_1Z8&ms#oKu5Kh^FBVxVbBYdwEww?5HgyGQ+=`|aGQ zVk-BVitE{Cuz58wu`L<^lrUZ}*@DggBbE_njMDOAef3Ot62Jnyg=?o0tUX>%7Bm;_ ziaK62n-jdj_)=i|*>Y*CDYm4Sr_ASbjhZCq^hNuw^Q+pqA;~N7{I+ic|Mcy>xCYY^-u@5Ta+|s3h9k+e>$K zeR^yQfPAsG&NteWQcUCJsO%0%4GIb(!7M6jx6Ev5c^k0O?6eQT{rMI;`_0)O>ZF0I zw*w#?U^_d=GiptsS^;Z)9-dzdiU)BPL#;1H4j)>Uui9)PZM2N#U8dz&wB3-I369{ao+u#+@RnB2hzR5PSlfyvU}XGxSc zq|q<3(z3_7*}z0V$l+^^mDj~Ho?3Rj2C4I5*g;xePrw0=;(I?!Z;dG*&mNYWjsI=1xn{O%12Hl2@e2GHK*?HI zXao4AhQ+_bL>!!v455{onVE%!J3vUF#&oo|uP-IPw6s+07cU=Q^x1TYW`RPQ%C?_E zGW%|SG{tC!(DClBuphAe={yc57dxY`mp_00oXo!nATC0t78e)UKiJt-xtHp-IO}QB zGIRONS9{)^A!Cv_dUON=zy3!DMRC(}e}*v?dk@W6qLW0>GbmeoHW7)vA7J;5dRx0Y zZqN6g1uGscxz8?~=a+13?|)BF4C5*W_vdX3tsHtyh8qC@voY1Z2B%5ZC_GlJgtxPf zYkfx}msiK`3+enn$Z9=F{gQ2Tk9PMy2uejF=69WR)}b@HlskN6k@h)qzUj9nI_=LV zjN82F_TXLw=)anZM3990ovryxQ%0#Vpsxgw)}1uHt=7NAdQtVYB z4Ia5a3Snt;s<=YOhW&#dAfsVsjC6@Pt?#Y$GEGUAc(oDRhip4$$9B~Xj5)f66219M zM~F5EnVwadBn!Gi69I`9bUgLUbU=<_+DM_`9ME^@^%MSOM<^w0_`-<8co0|S*-Hy| zXaD*(5Musq*)E}|S}4oAeszVfs`>o@j;GjM(CaoXZZohvP~=xz>(j)^77Zfh!d_QZ z@v@uaU2&Bf*C^3%#1&@R?EWK7_oAtr1j~@VQ(gJPv1G`UGXZP)mdBsPwvk$Z;KDGy zBx^clG^;=|h2wdG`;2^C1k5xNmI>&+xGz_z)Cu`~DW%Om-O(>A4?~3C{M@ANdmJCZ zG^D^%pt&XknUm~>sXw%_`W$KKn>V`pG_VL9iiBYiXW$zpu?=1}x}^WQ8WrB6_{ZQO z*dsxUQ$+sFyCrR?-MNjqVg4Zh2)#ooRlUZ?*0&D7c&aoZm_^dDv9T4nyWU-v4atGCLug|G z;El1V>GtL(Kr#FJ+4V^sAI4n-KoVCQ0SS_<*Zki1jZS$*gau~x8W9Mk6G>C+^}gvA=?6@e zusVns0RQ12U(il|pjVgIe?eThZ(Q=16Zx?M?2(sPon(8Puy!AH#SIZcR0 zGKx~{nyyoe=ui@4DB=Nw(Duyl@S2FtEivtjr!UN9XnvxceeC%I@2nWockR4b2ns?eq~Sn%x^$bdO%wE*2dFzx zZu1GsTMIyug{TSIjTGWPpPjg~V}_%u6rha}WpmHNs-QkN67mt5DODJm75+f2z z-d<238BR&({`BZ|`#pe6rpp}Qf`kpu5~_na^{%7ygQO6aBF0W~<^4sL14ZkTpNJ~@;T{JG-m{g2`3g(%UxV8UX zH$5;$o#4Te-cE&5(+f>BCJLZ=0aW9_dK%0n&BH++8&oXL1jSs>DXBZnu{H0FupHV! zJF~FZKdarFLDN+uxKB1GW8Iyp)g0ISHkNFHZx{tX41vgSBrUy;q;U3brx z>#^m7RKPRS)8mE|C@K;D?Gywbb#!D|?!PF+`!3TmF-g?lT^@=KxD}h~>ZT@BQ+7oa zi+h|%;`wEa!QX?X5jfb{N%M1Zy0^0k)WO9J&n?exX@D#mj`d`n&X@G)<+yLLG2ZsD zHm9%sZuaW2jT)3S!p)G}J21Z&m{&tPT)oJx(0zkU4ayK|Es&T{7gTBpdh}XamZ0L2 z;mqiYifIEVGgVy>fv!{ARp2xdiyuehBlom-a1ul#Le%clo*_2$H{+j0#Y_|pq)+qV z^vjo;JJ&p+avG$!l)QrB7o=_N5S9k|j%@UQqG$rp*Ly#Ifx4`BwElJ(2LR?u>!gaG zs6yg_F$JJ{Rhz$zcM%RZXe&2>r(fj!QI?UFmHt66j%)mvCpiIo^>(Ts@X$u8 zxsE+He3(TtF`qN()*s7QE_7E>fD^^Aw3{>!fCf))e$4PrPMQKnv*obX;ryf3>pc1K z!A{aA4HHLeBgYRLcJ&sSj#;}(ib^u`Pnf16iP|LlO5+zv@Wf|nsUd6z(0MjdE}B8U z7%n0`DnT+Iuba2PFr7Tf@p3S`%?Q4`Z@{i1kjSRoNgGIeJqvV@h!`wy{a9HZSiAP~ z+Y@0*%)2Snf9J|3z=P+02fHscrjx8S@xLa{8p`Ykn1NU8J?KCF(p&#JQ=x!?VQrvY zi}PU@{GH%OtNLR{-d#ek5Dl0ojC1kII;k=BE>eVEm(P0b zW(YR2eGXUy7Z|SWjK)eGQ}I}SPLuX6#c{4VC=4|TU$@!aJIB@fScmz2aGd<_tJ z1p}Z!R2E<6b@}`QO_Y3Ow=lwPS>d)6Ym}1PG}2z;ri!BItv63kwIMt-EF`O+C*_#j zWSk_HZV(`%P=YA3hYb)7GZyz!`b~R}d_b)4{wcva`+@VU$2SK1#T~(%903R9vo6c6 zZbSs{-YJge$_4z@sgjRRLqZimA!kg-Gw^=gPBIS&2+(Gkn79@2NeGbuq@MKB8$=4D z0ht*tJQzR#T?bUAN@b5um_PD_&YQ3LZ81$luoMF zUN!`fS3vFz5&PSTmk^sUf?S96+DLcm!M)QS1JrUE*#Z3@4QD4OCwye8R{?N<7-8XQ zWJD>JH^fE|pN>Qh)Bkh|D69Rs`6MfgPN(#T<3cF{NGo$kFA6a}h^xo}su;`(Q~qR` z8^9V)HhwRHaX}mZ5}iCpQh9LMd>%bRps4(~U6p{4krfKUfT-oZd)yMYLGAs)S?i-s zPPOE#2`-YQA)KEP5MA~Yj37WBDU^-k>+`ujqJtN78-0`5p&0nLwNe-VqK7mY3qn&(NKXU=jj| zjl%eIWXz3k{9vZeFyeuUMQgVEyhiL2IvMKS zw4@Dl9BG?p=X!9K;Rmj03(;FZ77A$p&dgMA?*8fM3RJ`C;o{< qv0tge8p6R!H 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 z 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 z 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

vb2hH82>Z`nifw5p^xkwZW+t%l~`dMui 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:hR_J1gUEr#uRh0%tra(C+l7VOyJv!WxJkZB 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 sKF!^TZ<7;9k^=w^?iyKzR%_ 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 z zL_qg(vW2|3`ZBVp4?CUolFx^LaIyb#Vuc_S`*#48j;#=brzxC_DI8jCGNCj7#Tz#) z6?FDc3PX1`pOtJs{nL*HwzH{XN_>Nem@S><#Acz_IT>_sY|D}KE*X%+m8Kx4f%g)m zGQnbLFICZ9`-&Y*EiTN{`;E*&tz*;LkGa(EKRfaUXw*8*ZIfrlCoEGh<$91v#lRX* zGUZ>RAY5xj@UrgqUjYJYqDZzFef98unxdx16UroIi3SHQ{JAKsy}@z_;|YC&nBmjt zpLxDZ4Pkon#N_pbkPvGS;N$g3cYO3|@KNN#sXYi7Gh!_NjSKBwMJgv*@!GkRN_NwH zTrQxtU{2nt3{q5QX|PZRLU1lH;iEX*HRT1nbc2DXsLa{p7LQ~AD2YCc&DRsmGR#yP zE^T)h5&-&9X|*MHi=l;N_m&3y(0Drp`TWi7e0hBa#4BUeoL}PY>y_1AR(Tl<%bR~1 zV-!>?jEpfmEjeJR>O=YJH(}V_Pe1rQsfKl@fuMXEuXWveNO+0JN$>}kWgMMFe>xR{ z{g^E!5C^?Gqx&K@=!d2p_mj9IT>UTNh{D>A8bvvJpVme+a;&YNxgIkpjgBZBUniL)#K#x zyU*zd=#<*E`RT$I(`(8;jHpvKuR|Y;ZyBZr{b3lH`D5#@k$L5Idr?*TP$Uh=9n)FT z2qCCrED;W(Q_mmO^5nyTyGkx9Zz8@~=p~(43>|uJP9PmlSkV*CKbbfF?xQ0CO_x@X z`JT^CK?QUIZaeDh{s|}&c9+8qng;AEd+Y>40qZ$H*5~xj26@wAs^T$<55K835?kp7 zAvfP~n1jThwBueoPB$tcBc{19171|>q3qoH zBZ?+XGh@`D42Us`em>Ihl8QV;&Q2+_?|;G>&B z+nosX;hoJmg1R98S+wTSo{;^FUbYHqJLfy|XRg}VI8Po;)Z!rfqiVanwEDgM!oVVi zw~rPQ0G^DaUU`r3H$y%j$?E)!cMe5ap1ugjp)Jrbl@r>i@VrbLdEs15pV{z;70q=q zfo?VUHlADMc=XCgXUckJ-a7+Hknt?ZnaaCdhSM$#O?>yCgDI{%?tQe7D&`Khv4_1o zQ@~J>TfQt_d(7o^>n6I}SkFX@m+V5ttjXFK!}gwx5{%P;gg?u81y6FPbb&-iBp_>A z)jmuxBxh#-TOLCGpEd=GbD)No#xmWtkNccE6R1IXKU#y-sF&)CqcJl5k-8Tgt;PUD zkMY)LRe2$Q%XQf}CA&T$W{jLV3rz5_TklESLqV4l)-e=C)0a+DI|H3Cj###&YPC{S z7(kU=o0i5|I&?h)EyJ28RLSyS5m^$q!ipKip|0JPF@)rWxi=#<;L+PVk>;E2(p*45 zK0&l`-b};*zYxZ+8_B$)Zek~A12s^-Ae7gu#xr{?@01dA0R+>m>bzWcy#TXrJ+cW$ zB8ISH4YFoJ@0j!yd6AHH5HF_zY1iwAWX}9e9PwXBAVxZSMp6v zp!YE<6*{q!8I9*g-LO1ZA`D1P-7KHYNTjKO73C!1PVrnV zS8!9Sb6925PAS;r&YSfVU(mkBXI2D>D80LWcy(y+!1A5@(}RsPA_j~bkkZVPz8Q+! z4tqA;@1J(sx#{ol8;^s60j4JFlZ|`}c?t!E6>vS+M8AHL{^wgI5A)kkvV`-KPlN96?defY7KI6E{yRbi(Cl>cev}X$6REqwg?w(5tJ|q#M z5C8W`usrRxHIJGkRp9|Rva#I^%WX?P@fPG)7TNtIp`5-wb=5l+ zsjVdrd(NGKoZyLM8YIqx%q)F1r{rliGli`n?OZVXCXb`K6v@i>wh*`ZQO|XE@V2fn z8!1uG`dA6s%URQKs&y!P!`|LWqL zx^q#OARXJbZQHhO+qP}&*tU}$W5>4n#h!5xEnEe2tx8j7z`5)$W@C9`&Hb=X$TIdAr5 zCteI33xf?SPITgN{(Nmve5#(b7b_O+XXZp9BpkoE+e&$;^*EEu-)5{u9ymvN*J`O# zePf&jCrg)#mX3fD6{rT&(3e|KpK4?SaeRT@J#|pY(9j5eS>gn3AI?V2AP|Bfwsm$F zk3#P9!e4xcARl-njo6m+z(29ji`U1%NJm=uB(*B=2HzAXWQZe_Aswz7O`C4reyHw zo#;s1hnH|p^bZNp40aERs2#o{;Au1$TbdG%XguyQAjcK|$O|5$*yoR+R;NtPAzGy; zFt@43P9rdJaABaX^w5Gij*bWEB5H-RE721c0Y-|X1v!2Oobv4Wcq%Sx*fWi1Mo{@*6(j-|Mr*b6 zz7T=GUE#aB^}OQ=JsWV38v)}0oEi`s-6>tRDU|j*TFJeQSR3cDg zc-Soc=4J4A9p~;@j@(h(kO16=f0+%MrqV@A3bl30gc35#eYLUh)++Db#5rU>3v%D^ z01w;yUdS#a$Peu}d414I!J||_t{UQWCKX| z&{uJS8CcN6X6Zc(E^fDj_G(VQL#0fbw`&EFN<^fDmbezj*#KEUroT)UzbSJ>&bI2= zso!NA|4l{Px;h-8Iv;Z2l{wsh62fxd-VUO!Q}7#{X@J=ub#w4$Jd#DbhR)r4n9vha zshq({kJLCdcieZy2bGeKGOj;;)H%Ta4KnuAL9*+69j&y%WjW%gRh=$3CsF|(ZvGA; zl8lJXia@<4`Pe7uv0*}v*}gS{OBR>Jy;BSlsoTn5+% zWpsl99Y)Geoci=-wP2VO*PRZYQQ+!Y7F(bR#p74y1U*jRaEQdqWTYVTWZgxDzmqU@ z`vVqz%}Q=-HtY{#3`q`^_SqmO}^?_5d z_O3u*vRf^x!EQ$Q&vF)Uz!h$aU#ZevvB`WoS?9FGT_;DzM`s7Y%b3$A&?)ytc@W^2 zD7KlcQWKR5?T5Znd=Qr(Z7q04_bF5B7E@WWub_&I<5o*I3~nt*#aXgC4-3zKN8F~w zd~mgI4PBMEJhzV+oneM-1hGiDfl%t;?s+&|6IXZVIjb3~)4grLCQZ}lR+kT zPKe*f`^gx5-DzNm2)+-Kl!gttp~nnJ?*m&ug*=yVtM&!5@@zwl99Mac38#?SPs!-g z`1REXl@F7}GLMv;)QGMibe<_WzWjpNXd`W$6~|u93oDHeOh#oGen+iYF>^2o{}6-v zy(JytJEeAlxsAZLjp;+Xi7*k+F3+tbrl>6ov-P02S z!G13l_4R<&TT%_cE?}9NIF@F_G}fcChR~s+ktu$|jD%bVirm<*;J!+(C=E$LEo7Px zrYz%nL|}5-k8NeVj8I!La+TUF8sJ8NLFy*z>&jmJM^QnuEuZ!8`(*H5DBG&rSdAz2 zh7b%ImuCC=Qop(N4x|8j^^FMVW74DHwgkEU2F}rG#heeCFvb4aSEgrl&x`AY#;zK; z7=9RHs)k1+U)8E;VZCf+qa%;3^8yt}`Uq_{$(n5gqXc0L!Gz$yplMVDipQ(=@USem zC`2GRGOT`AkteO|Sz_hRh;p~FA=(J?KMq8?pjHB!cYJ!M07pHcyyYDTu;%=8Y!?<} z9yg)iiKF9ScE0Z3_t2m69dKxPnuVqSz{xo8uFEf%zKVbj6d%`B#?0;VrZZ+c>em`B zEySAqYTD_98R}{MW3+MhmCY!ENyMLVF0m5M28yirp}$SsE|QgdMZu=&)4K4q1$TV% zS7@Few)HX_q42HS3MNOgM>Sfvc6PPCTy~1AzRW^Qfs8Z--$?>kAKP348Ol9(aXyqs znrUSjSxIpT%&`u=9(nA3-X+_Ao+_=$>?y}4d+>zNQyh_O^NzxHvY5+p7n@p~RR zI!ZwxQGnmoL@<_8O2JXFs084eH>?~;^1nvsg{x&~V6U50WP2lW2;3TpHUzrkJln;4 z5M>OB3#5VFu&l^_y{@8%h6ZM>$>jlfz9Ls>X-t6fUWGLMK`V3Rci+;|lrzAf86{zu zqnnYOsgsFdFQmnFRo}aeocQ8uRlNL!vm&u(GLe25=I2&LB2A-I8xJ6J zg5m&sP;?#{(H?R6Z+kKWSaaQeD-<= z7R%5{OpNW1vI2i;QVHI@<;Rn{dZF&9Pa-kjBlt^F28PIB-@X%{nA#@ZMS?nV3t`_R z)l{HN58PzdQSc$|p3;X?n{>3W5s7{FZ-o)xt0|bqnFq}H5|7a3yy6TlN^>x~f>vr5 z$rbvLAnBgy!6Vtu7v1fnUbsQ+Vp75$S@nP|i!w^DJyD{1SjKY^bXLzF5G;%%T4RD} z4rn-({QI~8O+|OZJW{rJE|5+_SQ%}dSPK9i>12(n(=%ObKBo6r>aupjPGs-{{W0i| z#sEr9KX@+k!NQ6*e!0qSj<=)6DiaW9m7}yRo8zKDE7CuF(+v-0m#ta!{pT3UR8ngE zM3F{K9+@-G6GH&+xQgeC1MHJC3oE{#^0P6UKcj{mmPb#}C-hAG1@|^bFGMWeA1IJ| zY6Yk-F$!`A^_~7*C-|ATj+NT12C3jVaZP4}O6-M*yqG+6b%Lw5#oCFsIeqm0&qi(aRVn=Ng*L&A|uaE06J=G=vyW zBKX37(^NdftIMzKF^NuZY!<^853a7n+24Pq9D>E*Vr#muNmlIpy%&Z#UwEKOBLKJS z!OpJO3*WXElF#WzN;c1Ma9LucQqqqZF4jWDA z_*1^7{Z5y<9==Tvm2svtPv|xJreV?aJ8Ugb0o|d`yv8idk?xX z)aszQP{1acJoRa)TQvK8vNWTocM`ksE-|{fHSp~mlZ%NwDjoU6J_%n?wh1k(789h> zV966;1+Ja3Bjr1|b z#1XsoqMvu}>@I|dzrc+QB$_}qDhk<{d-Sxil1!%3>I4?IQlFS$b8FapZ_zSoKH%^& z`XqULxbK_WRt@?8i0;yHbs``-TC@ORYgy2Zv>Xu|cGvFv5La>V;JD?m1=*jC5NuM( zv)JWf?etn|E)rVz+Rn;AQaD#)ZF~#dwF^wuaR=r9N`%*K%N6uwyd1+S^;E1%QV92hfpAe_uc|zTr7{6+i z)@SnyC(rL^QTWHJZdktNZ(kP3Y7MXp#f-Au%T=LQS_k=cVc-tYmF1e|95AvEJU_?$ zZ)Ur%GcZCqof2F}tgD4@`Hok2TMU~AJ9Lez69v5;l1Tz*uw#jxGQ9Lrz$YS!g>*`& z*fn-_`c6(NUs|LTyzyBJ9@w6-`cZ1DbCOW(v{ot$aQt?3p}o>81%YBwRK>iA-kan` z6?caH$JgqpS41xlZkTy}PT_(_Xb9{B1y8RCAA_ljwk?62N@HX#UGXPHdv7(V4fw)` zR=;SQ%Zgom2Pxy>v=xkKhwa-u)V(gHcj;#t*IcvvKp#KhBF5KGtHpcd{^mesFJ`Gd z15hBbs_GgA+|Z$ zR|@S^P%%won=hg$Vz646c1w4GTGP@GG}SWxCiWobOu4kG4G=Gw{1UFK!n~>F5WGE6 zmOnC-KV|%q*-*7buFspTi>!eexkH?-RgA(G!lvc|PX3UqiOO!=&9W0#S8J3v_z;Ur z7xpNmK-ekTnRF?ea-iIQX0kJ#rS88NvPr{6!JkWm5aMi) zK$7my6MDWhpEMH8YlOIJg|y^ss)KCAp~Y{ulS%>ap*6tkd$BI!nlpM6CtrT-@{_%- zRAO}?i;$pFMzk@5qdyWz;gZ*o)kJ$B)3ai5h0BzOI7Ubw)E%-y?QEEyr`oY+IAIQ| zY5}m*Zfs?fScGV#i5=-H=*)mq&DiEJ`niaYm$T)INMEoKod7G~PG1_Qf*QT0LA6hG zGJmiW>KzM%JWXym5uzgcQ7bAt-C5-ALiX&N_RNE`?*4gPt$*Z5FuEeeM?hu3T5u&+ zGh2LGxaL=YG-5hyWzhtV+ioDJia+O5$I)sq3$qLC4E@<1Lxju-`k(nSCL?RY&aQ2q zEj1o{XwITRG_|oZ-HnnjkfKd$TWBP3%!U{D?VU)w8gkr;-~F%1QRWh?F(lj%?p6Ms zTWv&LgNuxxSVh)^HYsFJ>Cxxt39LPt@A&U5JJ(LEYQEgU$VO3nyN4JxjhzVT7X?{H z{Fg2!Fh_=XU=F@)MEfHNsgw~6xfVEogX^oaE#Vw8%ktepslsW^%^>)B#P=1^kV-jgk>mA$AeCiwZ=FuHVs1qso3!YTe%IPhI6 zjeyhOxQ}tF_cz@T!vK$h^G_vy=p>&P8^)Eiio-Kt{W5pX()d?bNw^c=afWk#J-0La zplJA)=%hn{06plHzwpoypd9kEw%N91*wAU1QKCQrpg>?rhctDoNZN{XfslZnq68uzUfS&LGS-vICe`wMb#2iCmGEHD?vIM>LLWXQ zmT86?rhjX#ia>H!$Fvg1oRSw6f}(qiJt#>k)aL=WlFe?ma-HC0&(P3 zb9+Ub47g03?`3uZx9?@4j0LO7XE2cxvClcf*Z2vW3s0cKt`Wu5HP@YeG$OQbg)K75 zTnHs{4#JkQ-`a@BW!P8I`(bZx>#_`m=3{H-}<}>?wOj&$NVk zf=|Bd6S9ezpkG-VO{pK&vdDLS*1Ifwst;W(^1~{}Uy8+ucm0eJ3@UU8`;O}U|Cid^ zGlWqL11+NXd-LRE-%60;c6*2V7*t7b5C7M7tx>^--Lw9n_9&O2t55EJApqrM)W-Ue zEH{Hn?O8@?PRL$oz4|+=u;(|CD*`*ZVQ1;%gEdMoCj)buP*z+!>=Ohd1(jGK8bHP1 zLZMeV>kCx1?V_`3;$$z;^?ZvqI8b{7>YFfAYqIT{_T@)bAz@D0mh|k|h5@zoGs7|3 z2x>ua|KO6Qan1!o?e{~yU4@a%09N#^UVxXOIMn85QNVbp$xntMBu3S#`?u&F<9*Lx zld#P<2N2~FtOO_?BvhTJ)I2xz_1Mz8KYwHIb z0t`+Fr8$_K65)eI%QzY3u{DiJQZa%OxU}p))ZBrKPz1BC)TQhspRTi3TEwY`Beo2V z#mPB??bi^F9fc%s2_0kY*3WaPTzMK|ypzX50h-B6BWZ0erpx-zHYGk?fru1RA5iH1 zHiO`_8vk5e4O(B>u?)9G{9rGDS%LT-9 z-NDAADJeUmk`cR-U^Sn~Py<`8r|rMAW~MIy15kprwVq>?QWFBQgxe7V~kRnp>SWOUSI?`e-{r zkBcA-Fz*&&3<7tl!hmlNSH2<<*Q&7E*j@v8Fp5cJ5QtD~TaWj-DiF>CeS#f0a7hy_ zxOWvXUgB<&lV(Z`)IINzbC<}>UycT(>`6S)N6Q~e%4|vBx!7Q($p_qrKBJ?=4)eTT zXB1F*S*;-Hu82j~*-H(U2Hr1J;K+R1b2%IGn{1;Nr@c;g;u!?dmPi^GV8k1iJG}hL z@Tkd|^u#FFRbAbq66(~vHkNeN9#?D7m0L*mhl8XiZZsKaImVL+0lFS?reJ%ZC@+M_ z&uPN@r)lW6;6+n_xSVR=8`Xz-c)#mg8mx@yqk6facr`u2}O#m)zvkL}B zG}!YBoAqwvlLK?*C!g{KxkRyQQju|UkT#-cU-Fx^2f9(Zx4;W@Ndn)Svc7XNV9RMV zUx&Qh@^@g?1~_8sSp|F+Ud(`<**U}L(Nu7hSShCf=PJ==kba$Hzl^bChpN$hkO2ds zU6gw)>mqbvPxst_6qK(jymE_+A6>TXh~-mwhHgF*$c+$(fjz4(_W4w-{Z7>U6D{6k zZ>ZX8Gv&5L+R-e9>=>};^^&B3{KvC`pPB-MS%X6U3z!MlxrvS3&8JXoVmR;p` zrk3HG+L$!{7}Gs#a5(f`u1r~r6DGk;dYp--_lfnPmR(g;^f1KNaN>O>JXcp5j{x6p zQgBXYbPp-e&#{184$V; zCRb_RYl9(i@tP9T-Hj?2i2R*(!_a=0R`4N(_*CNK)^;503t;@z*PQ^wEI| zj!~0MJGoAA#(1m$0VnqD{uPJyyP0W zfYJPTq3eD!7hs;{%Wam({-(bIjJO7EFfmU^(#d;TrW~n)y2$A^-4=9C5#Z9yKW_fb za3O&WsrlQR)T5WDT#n|}%xs=P#42lce2~Gg)-*ayss3MOld6jkh~2d zjG8<+w|!t$74Md4cF9Di6j0Yg7c^>MXc#0b6X!-uiDx|7)cYOsfID~3W84WC2R1<{ zLSmIMtiWEMB!*J)e#GGYaE3%>QgQ?=lNE`~#CNdz`K%XR{p`(Fa3eZt&`+j#(YF+UT1_Sl zNc=rr0yfH^7PZ=~bfcGn^FUeNj+cy_Njtami|93U4W(b6! zGgD1>e(@(Z@!zXO&LB=m~u8YfaM z2}EX`jz=6xk60vCgh4R`c4sJ~+r$6o1!ulg59Hg{rgRE% z@iH2WpVNHs)VSj>Ln#JQ(ncbn?N@@mkF(7>Dc8T5IXlqHO4~Y8(CvnmWH5oG5IS?f zD>ra_d6;wdKr^Hc2;Y9F#_e|y7c75PYGC+9@mbQE^M+=`3 z>%o?$nvUL@B5LL z$q{Nb4a2yd)YTbWk@fru`T2@#RfZU#eondx_tL72iFMf^FDE|aQ3rWJ*#&Dsqa6N8 zsGl*4R{j#HSUkpfZ|h_n-b(+ci>2_-i_HQ#%H~Q>%Mr~zQ?Q|*mR#tT#u-cC(;l4E zBfz3-0#RaPYbTbhl|HGJgRUGLmPi7#5=Db zVw1otQ77B|ZZ7i&@Vdu0`M+hGwKW>rsC$iRem)Q(_Upeu`OlAJe;v`C*dJ@6ysx6L z`&p>sy(vNQ;?Fx15g}Tf$0BSFdd^+lg#hbQ7dsRW`g8U$<)w{@_e`UY5!Cye+C5C_|0|_6I;i0sLEE zKeUo4x@neWfdt3Gt|I+-9O!V^* z19`gZ<=~rS%h{zaQq^}y-+{~QhkGtGNoQ2Isd2w`tXPx4uL5>o}jn${DFp?$uvn%OG5;*O@?NAQn zbSA0RvtM&8MVZ)kTX1^huRosJtTGI}efu2Qav+$eotvb!XB74eO)+BP_bC=Jh%z06 z0r#t#8pumTWXD#i#-`tb4a;)NcPrd_BT6~!ISpM}8cyuBSG|(#6Z&cd_(cQiIfOL@ zq9Xn1?64n2nOxGMLFx|EclSMS)kyJKRU;7~aC11xgHE_ROor+{z00_(p0GGA3#UG{ zVsm^h|LDmeI5ncW1ctZ^i7#BBn52^y zYwuM)Pl?1i!E{H&8W62Wh1BB~)bkIs{`fmh9yif*C}-AU>Rp$_8}P@}$k4`}1lW6g z)4p*odWURtp>N1#!;4#%5B6{lkd!Unma{@YgM0Uss%JvU z1GH&Bg?JT4ko)a;CQ>N zp144vSZiIOh(4BHfbk$>5M5aEWz3bj?XUDsUNyaVD2ox&sc_%83V5n~5jy-g%FRed zj$Br<5+{Rhdjbit`*lY0Tw+L{`Gj&!?5(a?IzN#hk3kxdm2waguq5N`56X4Ap9Cz= zcrBvW^+sdTr*`+Njcn>W178pV0>hgHnt_C0JBrFwLd|d)v-m`(>{J~5sk)62+*t2& zdtsAc9C_GMQJdO#o*Pkw`SSNwSv5sg@DLtE5C{<)OWM|6qwE5y0o=aB))=FLA)MC) zZr}uey^=`W8T34htv`r0-R?zpxDba>OFy1+$|y}Sw(ns~B+N9ghNW2UKROw=lePp z0s(I!?bW)up(pSY6TJugq~VOyw11z`!*$8-l%Gn*kq}XKE4i}^vYuo!W(wKMLkS=V zi;AS_F%7>IzgPdurwd*Vk#2JvRO78{>xodNP1 zbu6tcnGK37}tN3oAjb7%$qI?>pB9&ycP~yuO#vLzYG3|ACTnJ;Wy61 zn4-Kbbo-XxQpguAn_zk+5otc;MKIGp&%$L?^RqRpLSXim^f;&N*83eNFT%y)60IX~ zn%wUOwNdz3FpknXN;J1jS%}tB*K(&6!rR|L90s_^V^4UZMEtSezNWg6{7jyYhy1pi zC*UI$OJEE9a&g&aZGvCjnO}<1g+Tk}==~qzW)f?`OOv5YY!tVn`1o z394gQo9VzOMoVpBG(|1T`ziI;cmurQpB&uVb?m4G8yzR!Th{vIUGf`?6dYAdMILUZ z@E1gaZCD^JB?-vjBHP{0(E-#_!+ep9powcht87bD8}1gMte|1XK`AT!{ir4Ki3RR~ zX+?a)Lp!aS-!zpT^&<5vabC2kaY%Cspw%-V_bLLk{m0pLfWg3LTsHI2Bi?1rRi3ae zR!mm}OTloVoKUVrDa^=;yM_QECBGJo&ZM(2f<7R<5b*t2Zaoon$^ZuctrWZQ4V%nx zmudlJ3hoMiHw>q^NURx`pU@gr<&^;=Zl1#)D?iZKdoXH2>h9OeTmqt{^9)~|Laqw6( z#1NjmlEXb2bWO=;;-+b~z!GukuCU*{$}tq>LzNZ(oWC21z<}L{^$ygv@SnGSh)R-Z z?DvN<6AAGLmwwcJc~tair=<(c-~@9+Z<=tVCb_L3YjLH$cVnn@r4BPgBd`Htw65}w zu)tiG929LWecTYcR*bNOdjr`v z$-!!+jEI#9vb$VC-k~aNY*OyBO-F-Ot*7SZ4nw}zJrsFOs%*nxH~i7Am_cL1Ghgn6 zj1|GfsoJ5WM%0Zz#jD|*FA4x0X>~kTDkSF!`$jL_rDW*epUHSzqFkFzN6-w~JY+dik}Ky$k|8TcNbmmzVamkp4@2NO!qdzbT^m5oP_yqaxT+%sZZuf3U5yXWZ zaTg2cC|9xcR7`v`W1>%2AiX==q4Y+_B_Hr+DtUb0#$o0CJ0oSJLp0aW!Ag{^I|-*( z0c0gaS1(+6!69WkdvYsz0@gF#iG*crGba?;qit8y!eUg$;SP_Eu+GCo(@v%;zqaMwbclf1*Z4Pum9%vCFLaYQN6%g2WmDA29>tEL?HNKHjG zbO2|H6VOG;zs63)mSh-uxN*pm(;-fOo7%S05%tE6AuEUjbco=YXg%6r61T9mS4np@)dHUbWlI!jsOT^q3 zHImTel8x-r+N;SXw6BzqD~Zf7To{nu$mW212ibba<$)u&mv1zVmu|%5PN_W5R*j!I zSePq}M?QS1%Z1jvU|R&>x3nY+oj*KCDZwZEo0& zd&?!DFewoMI)Wwg_Rd;$B>I?Gatxy1H?j(FN`@sp#~Gsp0DWQme?+wz zfzBjzR6CaF=Mu1Sk$z}aijOY%x}%G#wn;?q)eiLvxOenBj#181mj^Sd^JQ_l>;dr-O6#+~CsCBN<`hS^Ds7?xPMaQe_rg9&>#J z7^(ZTpI57LZb&z)^ptZw|FE@8lk(519zTCTboPG9qXudj`$z)LD>l3?gYqs$<|7Yt zRFo!s8GbnUn3H)fqKD&G3gVeXv0qXuJ#>x$(A#Zr8q#wHCiM)#NH2Q}o4dUUzkgt> z?tC#Xb{aD_q<1C|qg6=!8FYMj2r_M?L>t+!;CnDq$(QO5Ln`Jxr2n}<^ z@;F3kI=_YIXv-l?P{Bst|gIGB%mUWrz zxw2?|5}u+CA+~KA4j6zHmzK(z`WDmYM$&#U-U5WyBx?oW=)=p^ z#@*K4%xQuRplQ}4vC2fcnxKG2R27P+Z<2rgCybnAk}X>v9T<0WkLXdSG-<+Eb$v*> zu%KXiK7Q;$kHHXx;q9b%%4r^dK=t?nw!W^CT4@~e$ns@-IZsw3n?Y-PmiR2tL1vEQ z1l!Iczat|yJ&X%zG}7RH91|ay@i`kNu2}6zpqZ6l++`_GM~ZE}j*^e`|+}xIp zi);(!d_PZ!68znbOzAi)G>JM0ya@LUHy{2KP*kqs7H}JZIsluH%8r#N+fwqXw(_)o zxWF*0K|8oG3>)3jOCJ#|_1XC9-rgq+y5~W^C=G|r7MN9t0%ywTZFtAfkV0W)Jkz>T z#+B8W)+>WPyDI&dZ4POb5A~1d_k@NP%hy@)n3@iRwg@dRU4lWPssm^som4A0rwRG4 zzofoBD4if|Pm&K~1(^ploMm@DLPp6E*v$92F>@xf5@Iod7#-OMqU6R6QG`w#;a{&b z(dtWJEaa7u%m!`@1xj>`>DNvt887_m@C$E#m(6&|AA&>SIl$!zG_TEUerpF1H@LcQ zbH~<{E>#T;5NQzp%#cZ}=_;!D%bVlB9tPZh{(SJ;D`}$S9%_qp@5BmBCleTI<3-GJ zYJi_sPXGpM!Gtn>G|Gcrj*Pny8DqvY!wmFdY3dH6&JkUqt%#{)m)R%qwf<;gf~v+3aL}dzzFt}d7lE(5eE8Xm|Uc)e`;P%cKErj$qGKf^2(IwAPVi<7?LwoC&gQe z5jcFZhXV=l!@6>hlL<`uyBHmSuz}g$>xamVN@KHACTZ45*Dw5Dx^f$!OCYid9;KSd zkX4b5MyXYg1{UsS;6EAjUW66!lVv;BqL2}yQ7xx5jLM1meMZ~@o*Pq>=#akm6s4qi<>Q~e1LCg?X8yROyyQb z>&QBd1JolShnH)H?r}B(3Gw6?>?E!C#ox}^_+SIWNjdHcCo=f(! zkP0vKW{`-^2*_sylL?53qIp#h+sr<0D>{i=|KX#bMTFpRD3+a28an#cMfS;@de@}| zNoqlssCAKN2qVC4wdO7RlsU&9Hq}{-w&Cd?Fy7Cf3@ZxuMvDyD&u%hzGKHb)#%yn9 zI~W$*Je;sH>~sG$kXzrP))Qk8d^U1gR4=-W>uvOixtG9m<$mkuBc0o_YZs#-x zK`iFASbP$;UnwEx^!262X;4jtPHb+Afvq!y**&A#iBZ!6$&U?uk=x=6Ovsm%7kjig zGiKbT!aiP&N-O>f#s7BVRpvQ8o*z6#-9ch-rno%*?sp>?WQP_kc{Wt^jIqR=ot9WoA-U$PPZ$$h3M!IhbkR(LLYPXS zza>b~?z3@2^F1FzH~i`HutM>b5@naWvVr7}JJHP1*6dI!+~f4iKPTsC4v@fd$Jh`k z4Hd&o=6H<+{$G|uV;2K$hl&D|kPyJwvspH#9raDAaq8e_sPMk36lkX*KguZd4H8|^ zsT2Vlox5{Ncein9!7-98;ey~A=M9$Pm5a29B7Tm?r^O5|y`!uSNVy2>p0iI=4{sTO z{>P8Pk;FCk3%DwnA+<-GK*gXhqzoi8ip_PV zmFf=aUy~PXi>kkq4^(4g**45%<4m$KUO24l8f6 zF^X&2nKfbdDFa>e{#&X+EZMbK0V3?44@`JI`SN->X>ou6O^vz&AFKq$vjte42=U52 zCR8Hu!B_SV%72CkWz-y9n$rW(BC^DHxVskLX~+9;N2+Ocn5an8i>zjvQtl9b)d~s0 z%!;{94>%6#D=j_lzW2Bc&b8k?z^o()f;sEYX)C5K^rx#{p_{Va5j+TU-DFC%@NuuP zw}==pXuX4~xDITPD&7j}a9(-S=s{d7jh$?{ zEx-5pbF-J%E`Y9M2s<~RY}gWRV=Ptoet#(4LWDJ|g9;>o18Qb8TXrcs_^`^~#E!2% zFO2&~knge;oX<-&p8)FR^p80>h+y-cJ&tbdhRK^t`#x`aRf0RYd69T|BI$qME2Yi} zhv)7S^+8o!dzONXk=0anTvygF9xmyYU%>X9RweRVp&fK2h1i8;9@ZWyh*kO`O4x4~8q$PkrE4v;U`jn&XZ^n-lnW z@H(CgGou{dwFLH@Qy$y`EU85=Z_<-H(0`>RGtg>I$EA`8Bw9wCy$@aHSBzg?sai-Y z0>XE)hNERH3Bq4P(hxpY0b_jYE8eQx2mW$}*L_}%#E+f9X#n={WZ z0IpBp7+9GuDacx2T$REP`?s8N?npG2V~D7Uxr>BJ^aXeT6FR6R`5EbylTi>-*wu`g zzQGCVB|kTafB0jVEI}|1i>!M}i@7!FEG$CNj-@=2?2|xcEP;7tY=2^MZPWDEN;|Xf zVl88uW~T&=d-L`v;?vysLDsG&yWc4=k0}6Y-cndAkJ3GR(V9&T7l`N1;8T;Z^2xD} z(@|V5j+ZoIr*mC`W$Ma7)@%nWvxXXBIaO803(06%PW3>;5e@&N;JPQXf(y4f-r9|fTn_<7rr;c z2=b;)ReC{GzMVb!6CJf|B7IhvsKld(`ix{N{pTHg=)${Bx-cC#*~?nB-Y1WqT3io( zJ!FrWwZ@UXLDGj~PWds85#TI?Y{EAU|E{}0pOb!2dK&}3npe7a9L zk25h_b~7q=tFJf%{$6Xx-^IPNmKo=7VPs{?G72>U0=}_}`eWNgwL1BmRTcEsvOlaZ zhUU-XgI0ks}K27yCyqJoyu*Rqaz zRJ#$Bbvd9@dw|1w#-1lGky}W!7kZn47b!U34dPpX{kl`xy&{4e0_9N(QB7BQbFnpW z$s#4z9~ZrwowP|Z@*lR=Z9;uMlTMO>6vYD2*v8G7;U$-IZF+nuY18MY6~~PTb8&6h zJuft}5j$f08FjdTg!T2Am53QMEu2&omTNxAVx}7CJaX~P8a9$r=Vsqneb4L{;KJho zj%}Vhc`wDCP1`UBQjKNkjH*c?8wi=hX}Y`|P?$Kj-5>#vfKTrY{wG}Zp1+`=T=%<( zsY+Q@3WDCbhZVxvN!QcCKsHmL?zb7A&4;Lsr`N{K8%S752SB))k*;WG2zia^aKHY{ z(|AO6hAjsF7(!RmldoR4IGM-&?syirCKgQQi*m!L_9yresV(o50}DtA_`@0WOH4?5av(28Y+-a|L}g=dWMv9IJ_>Vma%Ev{3V7ON zxC4+d&9*E$^NnrW_RKf7ZQHhO+qP}nwr$&C>e9kg{}0c|*yO)q;x;C>`2WK;a<=>58C;AV9L;TQ@X7y2 zfCAsaSl`Ij#>)M_sWP@s=7z@jw>GzO{}1qgf>e$F^@ijM#-`3z`VRk@Hg^;;cQZDU zGj}pH!*_D{-(rb7>06l_^4pkN{ZsY-9#Xb3GIp>sw=tHpbu|B%8yW`s|I8_wnHyT# z7&|)Rv;23;_#emrt|)9{XlrC{V~Vfn^iMhT9gP0(z`xRR`sOxHO73?5SNFfZ+rMIl z|1Xx-cXBXy!`GyzrKe~32l&tRzfao#A*bl%U~6ftYHs9Y_Wz$zK)}`w-;;)g^)EgR z%Re?47+F~G8R%K)z5ktW=u}eYMVS4$Ii*^lfzApUp#81(*uG9!*2^p9X4_ zSNSf~Ssc+mE;Bt5$lm+=(ED9KmQsAaxKznRwPNr;UDrc9+*iHyYB{6DK1EjkK!D7H zqWG0PY>MSz@MnLr20d+QV3GF0>_E;AlP*)Sd+(#}t3j1p#wMxX6!n*`XOoFHAa}sZ zs)gexWhcCRKf%30Awd%T_0vxVz6Dq7$#PNlApUGy{>~NS3Yb(gjDXq;KUp^l=6<9GZhjzsjgYjV2)!vhAdTqfZ5olU>e5E+L58b$m6T`@CF$aOOC?^E? zRI*?KTvx|Z^`J+B?#1JqR(Pr%kUZ3?-YYk%=E-G8HuiHM`o^4VRn<`NP7+V4dRanh zv_c}5QmcO~OF}*E@bYPds!Hil*h{qWrw?D1p8KK3jzRIXy2<#o*J<%Jt z9flq5Iz1cpB2wBAigl(u1RGvQv2Jp%-cZH`Tq7&V3*#I$C+iV$tFiO4spTw(-CcbF zS;*g_bI;;LlSoK7?w6{vBqc#pP_V!!K(HI7NMmdOT0o`0m)4{i{G!o}I_rMHNM-hw zb`!5^Y%p8!eH|?Ke*t+LM94C1L-q8OV)bBgCM!BEFb}E8f)@+1Y^OyXV^2g|Kg?1V zV4U!ckU}YMan0VwtzD=4VaHk+bUOynW-y{>WY-Ch1X#x7>7&*A#s@+-0qax6XQ+mg zv2w>#KQ(CFpO&!ZnI`nt2J^RQeP($~kF`_us|Z*g!NumGa1N_`UtnL%mL;CspZ{T4 zAM%a3>tfi6O})AglT)EsZ-{xkxLuV|eYfh}#N}jI3g|?K+&}#CoDxV3CI1y=azW^Y zTpnze{npQXp{|7Ujfg4L2LF{Z=>REDVD+aTHR3~-Mu3`$`4iCgXAe>%k4rx=c3 zLMfT)W{xSBz0i!Y#`y;%`JIV2__zORkbe{ZyF8rXNU*<7Y*`00Ca~r`>N| zrI<6i)WRYo>C9$G(}(+XnWo70(+QC8ooGV{1garpcxze{c!7#9!^(1bJ_lX*Z%ZbGG1a_%o21(5}pEXzB8l!QD8Mi z=SoU8&}(6J(jjzadd~%@*|u5FprHHu;xC3JUECPD%k&lK`EH`*SNBDsU?4lM@Q3oV zbcUSo)tY4iBwZ11_hUZcf!He@6z%oLIjie{B3Vw3KXf@Uz|#w}U7*Tb@(CD068}jz zpW&P|^KTaEu!0?KZ+90b<_!Xu0rXTv73iRh(>WKg<*e(QAL4?iQn1(rV-8~x*y9;; zk^J^SBIA4CS_mLcP(kNNx=}~-{AY;>DkQFk)5{FZg`sXPqAbu!iB%UGL27!qU}WKb z@2G;7=}=-Uo0vl+@Ak%iA?{k>M~uQpO7_Alt14uPy{8=>RFFkjT^P(apFAqpqU-q4 zE`WPSA=;r>yM|nobwNrapg{LS4D})b6b4C6apkB1N&TLXfiJ!efua6-uaL8`LAuJl z3zfQlKES|hp5R`^569w4{&Za+mot89HZcJmbq#cC!XtMAcD1h?hb*((+L>Jn&`<-x zn-(C@Xea)+LgE(mW^HN^WNLEBA#vSV|KMd1ANv6uUq(K$38UMXrn;& zKp!_tnH)L#hr1Rj0%Fesh8;cuJ>6C0pY%;sNp+8db2`Pd| z(MoxciA^A?ZV|Q0s!2i$b9nv=B}ll* zexgI1K*!AO7k_IUX@w)Q*68X0g5gdOI~9d6wJ=bmA5DBC`|qjTc|)9O*gIn_BVU(o zM4I2kq;QF$Z6pZZ-B7;(h#)0-W`@s)OsozFIol3O*;dz$mu^-PY@dlfBN^v>2{h{SXMP;m(`UWT6P_))@M7KtxU!T=WP2%dK~C(rn=*?UlMqQpJ<}|hd!Y?o z=qCAiw|-7Gy^a>bUR#fEmG`{h33Uc&T^o-B-0Fe*)Zr`EwX3Ews%R3S*g9BqZLE@e zw2+*Jo*YOY&dUSf;#QK8xl!;~HcVSy&MaC%pd2OQF-2dS!;oM{R*Nl)dz2v*fluKk zQ#Nk$p2iHLH=V@`-E{FEgW$uHvz1VfU}kb?6^SzLi-aHi|3F+`ecS3H31|7H&C@Ka zMuN*LEV8YqCX0!2^=rEwc{` zp6N4UWbXuiwNC;SdMUURel!;e=5)8uxVfaXmU-S*PSigq3)Cfu`p3SD;!kqY3O-Pu zjai45=la2+g>Jhg18jDqxHbUYrL%j}2Hy`Jt02tY0QpO1p2eKI>1m~(foB>j@esgD z>zC5#^vFdK+W~o@w0z&T2tzh-AsGe8F7)hO*okTUJHsljEw zax_k!?(r;&5y33GNWvQ(H}%rE|&+bvB-RUM(^+(XZTDhUPbf{w@w>> zRs!w7;rwh!!;(NgBT4nFNUHeLt0Xyr^_ZTkDjL&xRv#1Smi+M6;}r;eZUB0LyP;>1?QVT^hSYhV%=*lYCd{h z5oq<#a_JKCq~@yZx}tjF~Ohpv{&w+_|0`UB~R$WIOy_5#6=q7Tj=2^p6-$5l}2K56Z|4&+|2>*ww2z){VHd%QA|3}xx$F+Y?P_}bO2A^Ra95h`CgEIU>l#{sMY zmT%8XCVk1FCMg2y^$(3?c7fk!6pR~u1HljLEyO|B-&L-__O6RM#JgAs437x9o(Qc= zQa0+p{&hq4&N#Fp?Wg$_kDKdr`(yn95s&eW*rkzB&pQ0jQF!-V%fM76!3JS9wOwV7 zi`nP&bfgb3a`TTyN{_9Y*4$cJQ@ z43Z|Q8B~j0=yY-k?dyu{xwV#8kIq94lVc;;obfjaIe87cvJsEQf`ZP3FirBzXo3IN ztD})^wNMo0n$JO!LNe54pd9%*aOFtGG~tG|#8pK{5d^Tn@B}GDk_Fb9vMZscxReXL(I2C+G1!v zD(Gd%^t!nxhcpQ<7yUDLbcRbOr0sNRzw5Czq{=A@Fq}&3qBl5SiP&EEC|zWNLS+f+ z20+_}E;}VQ>|MPqP1VWY{v)=YFYq zC(6?U=k()T@knst!%3?P!?%d5G9bPJ3Ha9Y982PE*@}TZ&YeEN+qgjy@r-A)?}8M3 zTA5o&li@`)?&e8?9n#5g{l$~^$drxp)Au_c-l>1j{OT-JbgF5F$<9%k4=i8rqD-pt zAS!D^DeQ|6l3UHszd8p808nNgAb-rm*zl+?3Kev^q(rsmJARV`xPkDnzK@0k#H}O+ zA9LRqMvaA!)c02Rzb-=7-z+%zHZS1{rDvGojV}~!Q_?P52U1gHTvR?f3ht=uRQ`Mv zGSmz-8stHV==-_B%cd4CP(oZVwd*@P*wWnFobXTelYSg2S-Z-gqe7b^{>3Q%8E>v2 zGI!#px^L4b7~?K^szi^AJ=BEe(inFaVf1$Upv+yy;94KkH&~uex|ky@J>Z zCCezTFxJhYka%%XV2EQ1@@E7oo%iskkAbYGS5EO|ET&94@ibYg(=(rOz&RNS{r&Ub zp+f#)P{?ugrNvi;PxuLT&f1kVjZX9Eh}it#*|UbFX{RZCQsb`}NH*uzZ5k&HmaZ#$tP)E(DWXJ2NdMx7{mAaM@ayfDqOuM?XGGw812(KjGJdb2p> z#4>^YEEAROaShWYmkoq#rGrqYx)$!&RTM_^gRb~(vNfU=gN<)U2`1ckf-z95RaM!d zb+&_(#-lnf3=o0qfwfJV`{$q=c<=4@aFW8m4qFAHQ;CNwDEsI~Ea;l_u$7p%ru9A7 zB^Xh+HwXhsr_t;;&+gTN3%U~*v5C9wJNS6iZy;8#cukf@ji#Dg{%qt{0x?6I1o z(|o+Y1ZKx$=CloWMF0y`UsG(eIbT_kGU@+8!cCW`2hiZWMz)m`DFw9r4lcQFq6hj15PIz^WP{#OR|J}S}TxV+NWErE0!(qr1gJkqT7;2Oj$ z)5~$cEmXtFHY~M$;-LwJ&>OAcV%PVE%2G6HXKO0Xh@clD`n23n5Z|*Ih3{cP!tTe+ zrGX{BCcHcWu>|Q5X&K`U z&}%Gt?@YE17tc>NrRQmviy7+>ec9!`yhoJ#V6>e}#+U=C-}et8O8aNJCWnU>#fP)! zq*cy)q~>fzt2V%N6Aaimg;F$1oP_{C!Hm-2hYl8w3nYsS@VwMcG?o|p3N{E}EY~pK z{=^r!oCNi5-)mEs45nSo_|Cas*T(UFcM&llg+SF)ZuIwMN2O&sl@~hXj|z0Gj$O5V zUF?OK;Q80t#Vm74p!HS}GY6Vf^wEYK!*eDR*ntK0iKpV7%}xLye}Acfmn|q+0iVnh z_a4vXuG}%2`e}3V+%!mCxNXIpZdK5^1jxH7)i*D6!-}CzweAE0}toLsi z>7SEuH2=Xu*-J;mZI`6?bL)rs8XzgKC>Le(DEP51zCv{WS-ZYCn=$bs zLpWKCNW~7vSD?PJ4ws|zg!t73HhyAbVNSw=Gmt323fFgk@6?!5(=(D4TJnK2qn%(B zV{KKWRe_%c?Y9$7!pQ=pvTrSv(hH>W!o?^g>9c{)LFdlf!>C^FJ7qdwLm{Z#St2E{ z-ppZA`VMR~bu0uv>#=rlB}iyx-mlb`dnWX#k@iW2x`MOY4)!$TOm>@qr)YECPBj_? ztYbh)OrxIC!|s9}KH?dz@)>fpGy?OH4#t294)h(U;LQPGk9Cjxm< zP~ss`0A~u8hwm7g7#) zp~2rOek&IQZs>1hyP77aZPK(=j7JW=Il>p7mie9aZb{RjHjKeIqt@HxoT%yVG$ijI^2KvXtTvV zzuBO8xBK#@sZZ%hTDb^fDcy;ay{3vi>~WE@81!A4Y6re3RUuQ zO)+guLRXwkVUlZ#&R)ZT?6DrXU6$J(6Ty|MC7Weq%Os;ma3Yi>;?s+Xsb%+H<2E0Jz_^jH{E5FsgrbHXR#}R zQdpCtdu@ev1}&?MHGGhWQ0EP}&K@uVX8Za}sgtvR>kFSY)cR@&-bZ}rI9q=*=x ze*y4h@p=d(IO{AZ7etR!h@^B0d6r*K!7a;87+bInkWLyp8dROBMElY-RSp%UEl6!) zLuRtx^eLG~hNz7*w~4mB-pb36)zV|!-S6=@(kX0KTlD}B8739fU!q8y;D~62B!9ri z7qKB8;*y6T+Wi*QHj5F-F2F$6PD1mg-o^NY{;>LdB|uFrQ}<-&O~^;K1vV)|YZ_MB zQ_4WtGkyG>5Uit++$Sl=+ej#C;n-G^eyU0Ys=0CTV9-?q4OQ=D1H z>G9_FX}T17=S^36Oy@;Q2#y`n%Yq{Cx0HT?P^$F~AL@ie6%2lE3bIBF^DkSlDm@1D z^xs0%(DDs}0P5QjUil`JEVw08U&-nG8aVk_xaOFeXC@q9AH{pLcf|JdIBADO$uIS^ z-~a}0aj6Xrmxg1Lv#0p#6#jY#wYeX1`r>&A=wu&M|cvBjU(rU?G3?vt2Nv7@~$FO7Ly`u7~}~A4v3y zE%VnxW!X9i#99qwPILCzhsX7O#xw!N8D+ItO4FNTfql?JxAh>#;Wjs?q=k#Ox{n#h zgWX8_16MQdd0(Yk4>toY_P4I*vuM#{%Cha8V7N`8ZKptg!^;S7F^(BTt+!PS{?w}u z^+aDxAAO^{Y@tQ0V321L`V+KM-y?dzp%Vuu92s^X|Ng}RCEgVJv~2CE7e9%R===sL ztJx6iwdPw{6nkq!ZJT#`v4jM;>X)2Q+%9;Y$+2lAu)~a%-vOeKkY*v0_s4tb>r1+B z;UYilTlc^Oc!#5)bom_Phk<}qOEX?7zye8x(b(TVz2LVv^D%gRth{P!Ub9CN9M~^$ zQ(epy%Tba&4-TDZ=BbUG{`hf)TR4`4oh_xYrbHEa4&sMY`l6iHiG{$Sh5}19wIaR7 z0S(OU!ANY?Vo=zk)=Rt`Zqw-pFhbx3`R*|5TI3~hgfLy)&Y_xB~Gw;P7 zW|_d+icS>euJ*$P-ez{m%tzKzNMJemz4JcSwx2Uh2{6nWn{#GFZfwi)-bji zL~V;~w*2a*8)&c@WI&#(Zs@x1Xjx>wTFnsMbg4#k;+}r4Zxs@m-v9N;&s&V{=r#{% z8K-u(Qh1xwtITqan4sFk9n@m&s2sF)Yafm4kN9d%34b%rQ(aQ%-c&xY_eSA{(6iXh z;~XoK=z5hL>EDc8Vyw;2lm)j5bf<%94| zO>R_y5Y&`D+JX`z*Q;_-NyiZi-?J;}>&51mTOcIEirRJsK$Otww;V;z9;RVXRSs0i zNUMGufDjATIyA$<`7rOQLG!DSUv}^1OzdVc9GAkvZY8tEI#vp`otyp|z#cthSOi0v z2aBDn5LUQulD+bsZUoZ6I^O)hZ4_-kQ_^>-e6$*rFg9G`@>AopDj z)z7w2OFWia8xtDo1wr&mS7)j{+0_l&$^ z?rBlP>ev=9T^E30WWHeXt`MvqE;3a*W{Q1bshFu6t-?LhrO;i+RW`TE7kK*Sa!0Ps zd_r-Bb4D%5Li)vd!jDF!JWr_g`e*O!5btSgAb?2kT8m`TQUGSD&M-F}mh#p$yi_gW$bZuJe zQ$K7#W2)z)4WR~O?TF{f1Ska$bBsup=W3scshvLCu~ox5cT0u#8D`~RHRG<2_ab}k zXZNqhf(jWd&yb|(YeoX?=#w@Z4bZzW_=QUN%vf!cs1Ay!Oaz>})to{YB5~OUNjukR ze#EU_#K{bp>JDcx2bZcHkg7mHPHXY7aDpQh@G;9tSjlCe>;q4c3}O=f=9mV!1TlzP zUA81KLwQSVv#9;kIH?6J^6q<)r0D}*$fs0wSVY9`Rv29OSqiS*Q-t#{sQc=PeC{e5 zTpm0*$4r}xRqTj)tL!E$twlu|U^2uL$UV@rAnbcY?X8+0N7P5UT9%~4Y@Eq?7s$cdcz=i+k(lV=Nuw+ zybw>#9mfkWvVo)0D6cT0Q&YG)es`-` zQuiV7kgevRbVhBZHo=57fmQ0wW^R4Y{=i8abc0h&mV9Z&aa{hP6zoCFF^muYt0UC| zsQHL^an)N6nO||RUo876(5ZMkR?C^&pEo#;tXVC7@grmKT&6v<=%#Djg=}@tliLT& zV6h5u1ic6T#=RB&Y2Q~P*M3go2v(8R2VEYW3%MW4)h@TQc6QfxK9V;jv<8k8Gq=l3 zdm+T@+DfO1xO9J#=3mz7`=Fy%)2OQrfPDS8P%2nq*uHvn03q7QqX;;r6SmS*d(0HJ zMa9jw@xI1tN3^;w)nvk^nmlg&&-{;VW@60Pf%y&X2+@&cRl51%s&BG6) z+H<9d>#C41KXFjM)h8oe<>kjf`_qp-%*{4rniT5#P~jGPD@`t>lrop6 zw`6@orM1*PK@|@t)8GRx*p4c$j9-clL3r|g-YJLmxdj}LP>=Wab*#V6+)Nga zOoSJ}-lfKwPoX!5<~qfd!%n6X(J7;vOsw3u{_UC!dD@_TNAu9Yqz5#Kb{4p%I;Vah zvFhapzKZ_9v_SYlE-`#V43y%&se1;C+MzT*%>zeExlp41Y@LTqbZLIMsACsq-pok+ zpxIoZ6EEAtwN`FZHrYYkIMV2)7a{|S{NWH~=bRI|2WER zi=eZFk)|LxDy(Qf0ft(Xh)qaFckf4ibY@M;J#JaL=yg{1CLaZ~5fAh!bU%BBzj3_0 zSbVyq@KxCx$v$<3z=H~J7PnrxM~A9|K+9rS>yOz)@ynSg>xVJf)Bx@5^#ybU0B#Xg z!gmM4vQ~c%Y18#MWuPc{3ECLQzFZs+2*wztF;TVaJUCzCM}9Xg zbH>qRy^wfFvK5Cg6DUm%*a`;>qgXc89U}9G*3W*@uNNBLTVpPmpM`>Pw5AvVzla2B z8fr3cCnUOk7uJl5ZT3~kjCyL0Rht#1c;%@bMU#>ukZT&|hLeN}zt@~Ww1xW=lW!B6 z8qK+gF2rPkugSvb0LN-BF@yBU$#)iIV~Ix9&fLgd&(*RsY6FH$*r6Muss|*IZxqAS zsg~Rtribx`l6zS<+-c0o+2`1=L8orL`-bn^u(Xny4AfT6;Nn+QI;d!u#c8-E_#O@y5Nht?se_ z=}3B$cL6&)nGgK}Cg#I(#U0i_gjqH{LP`53JvD7(R$38$We&K)#fJ^E+EJ&CqyfCU zdx){1|Hld<&c7uwxZa!(>@7S)pfVkvU(|J(*Hrs554~S;>;Z)F68}8j%QaONjpwVzX^mwY z^=1w`!?lzTFK62^OIf9YUdeY2xf&K&Yd+kb1lJSppt}K>gSO0)KHAO1Fdo27<>3ul zY4(DB`vd(?OO8a=n(fz9Y@i1jVmW8K&}PGcrB!~ZpW(a%W?s7z8N+x2?UeSX*Hnh* z2szUi_k=elI=kFc8R5If;_I4bR~jzI%&@PAO_?yQ@q-Adc$yujSqntKg0 zFmjmIF*~p4J^%{rVJ^gTk8#JOmjlbM7wZVn86_l2s6qvQekH8cXSCeo6Jq#N4C90Q zfPF!~r*Uf=hh2puEDcpYQ31qJDBePTNNbt%dtzo~zcSpO3W~l165eQcaUQ3p=X9-5 zni`*Hx07)=m7Q9&)0Fk=kE!ZlnJ5?KFb==s*kb;t4Nh_j$Zc^xqf&`O747RcaQ56K z3=Bh*g@g6++CzP#7|Flyx6tH>9Q@+=q~|cgT*S4=7ig+3sqcR*u{^YeFxv^CFKU!1 zBxftbh7&&e&$RX@f=T9}(wX37Lm?D>)3*a5oEB~Fz#zL`{Lsof?iX6mOJDcKh^L7u z>G0~R&uX(|*qs7(t>;TSLC`rAMJgnZ5+#->_TK>!GfJdNG145bm~tb3BxnU%!Azgf zD*Upd*NG8N<{#(X0Nuz`%Wyzr$F|Wahi?lOqejGmNRb0D zyVs&|5mk#|MY$r77&(;qrxYICe=folGh_r>IWqlJjp~e)vq6BC3fibU0_q}R7W*sW zZ`^BMlD0^3Memi7CUE17L|)4Sh};QS6>J=s&e>egb4U4=*IqLFNOH0Q3*8-*fAonW5SS=SBUm{sKfy_Q3G=W>G^ETAIiR( zXvhkZ%SpPwIgF#nkRnRg*Y1lM>EvoF z0o)_xlclHCXq9Vkf${PgObs`KP8^>AHVU@t07`xdW9-8fgs`7s6#G<#9YI~V(0=+Y z#_&E;3vu|4#h>rbe)#Q@@BHRQ*B=3n;R|}Rf4pCZ=&_%n4hPhE7Q(GR7fA}qS6L~% zIp2~s7x=UR=cA(rd5L&`AFHcVh6%X6#@+0G&3Q{;t-iYV^G3r|Ox{q~oQT}~(zsxR zx+t0X&2U%gTP{Y*ZuwGfrOOT{;X*~s5Mc5i$$@sCMQwC0s`vfTz!ob3I}M04dA zN)(ig#}BNpKhFiUA^a53l6J0njt3mYjAONgk%o8d|RizXuuygZqhK{JXfZl{+ zMu(&^-j=HZ2qkOdY)#)n>XTN!8Nn$1SCO~o(H_1ygAO?|t&zc_lGjs1X6O-3RDfOr4?V|(e- zpmjsXl)I8$eqhtfXs<7;FE`BTK3*LS$T8h6FAOl```jxnSIV76yNgp{C%^Q>SbeYD zkU_m>5vvB+k5j|hMq$0=gJUroij0vUh~}ojDkVSBrHY2xunS)d>?w(m2qfE~2Ck9N zbBeWdyB%u);}xa!OsC$=K&#tT$Hd;Mb?HFI=YFb?HO8f;%urFCd23N9yD!~q#K)Z0 z7Av55t!*_SnO4k+m%Rk$ZN3tMG{-c&$EYL@oR}GecO74Z>oc0NYJ^s%d-tPIwX=gN z9vl+ai=<69WwWk0u8mW^X%-bFd334io_)9Qr(CSj$Btqh3y%sxnRYHFCPz5J+ybLQ zgfwyhygT?yJ^lJ(_;fo}-Mv9UYE2Xc>*WU>6Mdg8ZVmR$CFYF}^#}~K4<%^mMM!A0 z<9mSqpo-p#676FpLw{f{M2NefPM9eqj*pGcr??;LY} z9aoWgEt_;I&v`~;@$<^3={Iwta#0o%T{rbyaulLVYl*_Ct{Lj>F}3g;j>k2)zD=mJvAyuB%5n`5n11hqiuLA)$Ms0t~^hpEC)2Wxx zk9?Nn+B9^MeFAma*6r{(CD-1|M%|tlY|}#xj?wT21DEX;XE&U4!pUnKNOcR3mFgH_ zHXP!vZrZ4a2bZ9Bk7LCdhTIANF>40$G~sLx5N-Jy{jz~1el=7RRNuRvOH;jE9T2#c zH9v+GzY1xl92fKV@-l3SNcnPjr& z(!Hc>jU9sKpa;s6qmjvzNWCugB){K>^}X2+Qbw``9LZ>*Svqxqm?OiDm+nUiI5Q$A zJq+iaSi{j8h6UHk*5#{DSOoELW_*QLrG!0lk9!+yV-gb@m)bq59%<(F_Tc!U*f`dX z3QKwW&XA2z*jcvyU^Qc?ZGGNm%F^o+Oh|CUd|FbimZ@f)Cn&>S4ei`%f0LPO<@CoJ z501*k4w*w_Sq6wvElQ)Lj~IC*1z-OShB4!O?-Td2jtJou%?U=}x+0@fis!=yoF0d$ zxq}#=Syb=k+Q+urIn~RDZ`D03n-tUhedFX0LcLP)SxGB3rQBZup6OQMbA9Gm{?6ft zBJbJgF^U8S<*JK7$R@tINFMw)<^igISvjid+ts-jV12oi4;+-k=^ms*4QkSEnuZ{osSFM7dz|IxFBHsX*c?J z(|rI6rz z?*@B2#Y6nY2BTfpD>3G2A>5PTa2vrRLkr=0E%G~5`vz|H@-8-5Xkx_AxtE!#{2#tE zYmUdKdZdA8ce_UX8Tu`Vxg5VC*YOvJG)ty50bLdQT;(W!6+yy5(E~zT3;k+d2h`Kb zp9~5MNe2FS?Ujfj2NIbYuyf8!a+XJj3zzbn>mHBNR4>LUIzFksvRlt6&tv4yU1?3mQCa^T3^J@a1GTDG(PIuqm8@4ems|Ze|yDP`>SD1mo7iA zvz(n-oDIe|(V?9@-A~vA;L<#_YKj8mu7bPfFv?U_YwZ6HT5pe^jvzEUyifQq6iJi} z=-qBGBB_5J*-K+j0!i8pqaz!^Z6l|KjDBbYva1qJuZQhZ7NIfW%C6%u0FLGFa|-xk z;ge!lvh1boe=0z}mqXA};OYC~Mocw;8c!AgV6CxF_S>QVKDdHCXMoN+o8;Y_bel6K zlUqV-wtO|dRJm~{w|WZj&QMVL^oWfZFyrW_+-|6x!6=Nvm-w7mnNTzWzr-k;jfW|%Byv)jD zY!3Y3`%5^1@C5@O*c$LDOKzHe2f;l=f$erIY6VCYB!#>egeX?Oj^=<{8)3o_h7;jI z-AVXG!whXdyZcwKwZ;D7zzNT&;#}#*ckP_GZxEy#0|M8S7C2TC1bvFB8}QP^FE8pB zQwDm9pB}G|oMa@9cgSSM*S|04vtjvg`KsTNSwFLG5a*NdBT%+bPjJZyT<$jreZB_q zc-}6H%NJrLF1V&x8Y+lLkRa;N<=>8KgTiM#w84clFxgWjID&93vlaht^v{hcfOm}S zgqC9GN%MAPNH;Rfsx&`7izxw^^tLCg&E3!rU;AzxZigDNkw#v2Ai?rc6fnZzB zv=IJF8_qzlf_*l0Kk3M{D}*W~Z$aF#oC;q{mqQYyU46fPx`P4d>~kV}u(7nw1uI4I z1LsYrT`_Tp#ucJfdv$s+rwJK8%<|Fi9v*!xsScvzOu~jMkLG^(ZP(90j!=i6@}=Y5 z-|XJ=0tWUVLAo9I#uRe=JygU$a*8ET7e?$+nk$yD5Y%zT5t;i!3FCo1l{`?PP z+cJDkX24Pcf43BbmKmr>W#O11o|joUte_qEs@Gf!$oZ9uyPS_)mjD$o2>|eXDsj^l`=~@G>%<$NSyWJuyo?=LQjmkU z_JQd4^zl`Cvj_;-2a<<*_ZXVlnPm$5B9$^Sq8WzCxj&VhKfpI0A#iu1RLK)~Snfy$ z$#5+RNNm>+3a)12F>TR=sye|xp+3p{gU~^O(D}Vi<;cSRkyx|TqpCMUX`e8A^M%Q$ z9aJL>@l_0=KucM2$#hF&Be}z7$qfcLsXyZ`8dpd{NuS7z_3mj;%@KD)>QZgP*>zf5 zFujrjhuCL!RJm~^#6w*v`Jwb!gqBIUXy~v0YjLqxX(2yBHOtv|Sb2(Ah0!3qDc$~S zF@s^&s-5HN$?lm7F?D&_qTU~pxbg*X{0ON6Plx1~zeb!jRG}28xO`f7mhq?l?D5ge zEAy=NM)_2+rDq0frD7)p0$n>UP+nJ=pw=li9MeiN#n z$Hz?*p{tTzqBt!zyq#(dNy;y=E+*F5BBB6PHQ+8iQXl_*Y^$sGhgB+-5)s1pRkgh> zkV#f$o_VY84^LWGezJgwI3(b+k!=m?Gj4QCL`F|l!wcjd7Y&0-+i6-y{6oK!(qFmf z3?TQsR2j8y|ISaO76qRo1=}tG#Q|1-#r|5rqSHm!m)1_v=O4rE(5OIC%TnK`$R<#k zntKV#T&^shc4fU7h?Q*t7QW7r#pA2W^g8t)v#nKy)8F^|d}Gg?MR`|?c$`kv^+f>* zVEN1Ko13c$*mV|T?73YBB4vWi&eck(7?rx1&ocZu-p@`-Y2;3ZM!0NcvJ9`}YJ7As zp4}U23?%+km3I=EQBcimp|}szZ~Ca@B6RmD#Vm*|g%cw}&6Zia%PnmE5RH|2-mlzW zuve-=@mOUy^UI2?Rm#*t;#SZFvr>Igz)`yi4&>1b$^Bf05Hv7%&WVK`i) z50xK(pz2O_(o?8nB20RaS1@qoF#?L$F0WllYu<#B<^@~|6Ka|is+(7TKC|Gg1tGC- zN~mx7jKM;!X>K9q$pJI8~Ing8agI z9YM|KQz4=|pf=WkRr8;S=sD!m@nL3XO5odfG0VPgiemhAn>;`#b-7mp8Tyat3EPfV)-*ySX46Pl>ve9I)BQ7-QGkwwq9W>YtTc z+taHPct;jQ&WHP)7>UT^zsFl7U1td_diT?c7KF^A8Wsap$EXATG*Uxdt6aV z)(^bLIHBn}!1{SxT4fW%)AG1~&n=HV$RczYGz3umz2{rAf$tozPunwMba1hl>qWKH z38S)P{+cHWA;0DzIUT;oQK*R|wZ>F^GjotIUW8Ai-5ChCl#HM+JDnSDXh;bpp{5aq zx=A|9>Asmys=>l878k6b<~aR(hWe+660`k$FsM3UXTJ?b2@SdmtDcsRaPqY(eG93> z%w&6|)1{-8oi@fEIgmM`q7u<~wn|s2^NLQ`RZ_dbdbvrR-yiev*7pw~Jo+qA)Z4fg zI|B^83m4*x^K{ja4w54g84vSu(Sj30{U-WUxsxdux$&w@DJnix;AUwXgGfWXRH<(M zz(KJxeIP#aZ6Y>{FzC>BX@>i5tE~;8xJfc*^vAKyH-AeV$@8On|AgQ7RB+^I)6#A* zehT@ybRr$y+W(>AoOXm^lx97)ZQHhO+qP}nwr$(?JGO1xv)7;OlkXa;JE=amf^ppv1>2?8X!nDfKf(!}F&Z>m)F>Lz-QL9Je1uM)!{Ln1@8t zY`jPt^7|xAoKyuab`gaW`g-VqmX$y`lQ>V^G>ArB0*I#jXpY8!-8KMB9?ahl?1hB;T3ZG7KOW?gG~yhQxF@osX2wQqhF zDG<3`m(e3o^=-4Gjz9knUEUFh(0*X+$dOxL{9jF~x?wsB< z;-}X`$(k$Jy_TM#e374u1G5^ zWL)^Trh`uU5*tQb!*!6jum5#A6vn(1*RZDPffYN=cnVid=1b;Iy&xLfE6mU;vnIP{ zGF;N2=VZmtS!{@vY|oZdu%|Ck9Jv2tACVGPOz`u@hPLKZV{cSTCq+-N}&mVh&S;r6XsI z1fRB}8ry(uE-fqggTfr54WJ{$|6A+Z2~4vw+rJPZ|C1dUlIw@)C*L+VGp$$GbVEcz`uFREYp$K%Ku7FreD6@}k)Xh)uBXcOjhdbtCZD z;Zwk2lQtp2!687I3rR{cMg_^!=e^Y&DDK$$cJBizQM6q#w%QVd{mozDI9hlMv|>Xn z1+lKg8#7<{W|-@~t{JGHDDiHTR7fkgpSF(*umeK@9;s>HrM-Jvw{huh+f|^-_gY6} z78P7Z_n7FLYV(m>teP`jpJ0lT3d^JBp#q@=o937wRliP7oHE>{&42;hNIkrHTmKtq z+RPFgii_#i?We{P)~ZF9h{Yt(cRCD`G0+kyQqap|tbw>=>1Jc|fdwj}ja_v7fc zrt5s!XPX}8Fa!)XXAyqiT6yG(->0O12Hnx3`x(A9nfC@RtwxsN2mFN8u0^wHk$6My ztm_p{T|&rO3jad4KO6-uux}^mh<=gaa~X!Q4j+it274X%Z`GKudW)* zAG=8+h_8Ndlo?oIBeMemGFdfrgLw@RVAtV}bVF8;)7LX3u4C&k*#Z+d*BW7{`tSP- z_G%koa`A!4OQchkxlJ7{MyH3t3d}$<2~d>|a2`-ryYyafrBA*G&yBa*X0$jY!)%8>g=*%p5fS zF)sX=1~8%}a+l;~aTEpzlqioS?1>Xi`r+NfRN9NAG+8Om@-=}3bhI}f=R&2;WGg|y zt{&vxrIH#_Q8jNCdk}FL+E1D^WdUr~3--Ok0gaF=U79T00m3*N4W;q{rzL&0nlyX} zX>D8h2Oqvqcp@ft8m(dD4@#m3 zGz1oya63S&fztU_-xAH<4Na&v_0X}ybQl^LTFj+u`CncT>%S=`5;BCym%C;>wTLh0 zXvl~1y?t7uf7`K9?j8Yt*Xof;LyqLb2;Ii74Z)gsntRPJc1e;InD_)Tns9dNi{q|( zu!ZQEW;BNV=;OM}9{tG2WKIiS!|SIvJdMJ>5_7ZSHPfL|F1xK`VvJ$#uI_o3OyROI z!y)O-^Y`U`NS_-2_3Lapw+IfZ5wwd}w3GE%!d?Vg@ba0?gdNR7!BYNKrs}O7|IBK6 zNZysj1wM#Z%o72{k#@){O~EJQT%o+V)9)rFs*}YdUN2{KC2oF9bFSkfgh){kSI2zP zx8*hy8R?^~#`R9y!i9Xcw`CUFZk85@NkxBaD0Pu!X2tiB z@g)4~!C6q4sg39wf9nZ$XZc;%+Dv&%WF%bQVhx)zn&tu=h|!51{#8fS2t?{ODl)At z)qMH9M{D{UNb4}c?Y|(rlyrm3OPv_@i^Y@HjoJPPnv)~u|5K(tA2etXwioOvK)&$U z30|i!J;(jxzR&^l3|h1#N8d_Rh22K#A`A~GEi3qa{2&&rl&E;$VZ{jACHIipBpRq- z)7otjAhY6|x;JO2^5%2|AF6Hufz$PSaodxiC@aT>nA|QMYQoM+|9v_=+UF)?d_TcZ zFvM8rl;x32nELg`^1{6kWh;^@!xC>Sjp45}fB5O8INdD_7om& zYD<6!Ye;I5Q8aeuN0x^ zAz*alR%ni5Mdm~BC2g#8HxE(w0?I$>2NyikRDtMlL3)=?>2FW1i=c13Q}RwVm#G+4 zFVM7+j%Xf=uD7Zb@bUfZNm5$R8Lle*1PKAeXnPu2uvO3xV^?q|neegCPHPy{is*f7 zCm*~vA6vrLyd#HThhq)ffBcUKk_0h?hZd^GNC>zmlVJeG-})olG}Hn?&n;oFRs>rd zx-WWd(lq@$*$i}ZZYG0g}tdRdwVOm?V_$6Xw<^nAVCSwt3--#43BEXWGrC z5cgz-N6YMPK$UY6uz}~(Bg!&c|XTy2Rofc-OVf0;?@yaF%@;IUs0J&gX+KLXTJJ1vg!muJlptNxqBNpSD?6aM#9UxH^bsgXSCI1WN%-DreEp)v{) zA}Ib;r^8C<2N6cj#UO&vs|)ioIRCG|lA|IcQLtq}$COIoJMf9@hMv$e(5`FrTCTzc z90=ys+n(tn(_va_EUU#v5p|Z29cR3nB@!O6bc=;Ypm6_N)`FJgDN^zkULQ*=!-&zmAk^cv{Fq0z-?_?793RZAeSu&)(RFB_>;1q)R^}qcg`H*HYN^I zYHlw}32s8~Yt_sC1nLNu&H8DG;GZ*)tP5ax?`74#)cd#Drv3=$(ft?tBQ>aRclz`C zZc2@;cielm?*E>^bD&i);7L%Iw(e9P*rCt(IKX%uhm1&_m(>sQgvun!E>t4Z-xs5> zJ?Vw4x4xS1*(F2eblB2ReNz2sQDE*W?NoD}b+t3-_w(NBSrGX1ct?Q4ek_R>%(NF* zDB3;8tUpq@?M6>oCd69@*Odvl+v&Q=Y2Ow$XdjbRulaQFS-6H?!I9Bt`01w)uw$(; zr(Y=)nxQU#_J);J>``(UPjf53X1JS~>@cob&!qTt;soT>4e<$HQanhIP@7Z*R^>ry zlZaE;!$+kI85_jfA0v!9k=$BZZ!bp}l4M*qI`W5$;WjWSMC6&45JgosfHTn>iJO#? zL#p^XEFl<<7ofPbd|>0KARIt)y*5rB<+=Kz+9Mmg}7esZ*dYOIHZ=@j~-cwdwVBTda<0>$FDyB7QZ&cXC@c==< z8c)B%2_XOi5;Uur`&Q7vC?0!^+#_%5Xv1zj{>5iHtf%3Z3=?J3^h`dsz=G^X6A|m& zvdJwed%>0P`QBee{e;@^Di$EQ=M@+3IFsF{0&=?37UebZU4fMAv5xZq$mp+_ZQyu0 z4j4+zWzJdQWd{UWE7=>4LhW6`5G>fGt+x^bZL}ZzZ!pz?bOki;Q&|hr=XcRMVUSU? z7p9yMOJcbEHRJchJMR(uyAnM^LWv=Km(?J-2=@A$&Rbv9M6dYL*z-_5gZpVe7%&clrn>W=i2vLW}`%p3jd;5M0D zJrtTGpcT7a*%xJ?cD(EweYSofS8!$hS;YG4+InvXN6Lw##PzF^Qzg^}Z;-6rCTTr6 zh}b+0gX?{zKYsglsVNp$W&TIew%>V`6a32p*B1|59Q@}HocPv`XmC0^-q40y+o_UK zgn(9+LxU_JI{28Nf3WXCA^+g`*z|F5eBAo?!?PZa%4l~lI4NT}N`){rNe!M3&QyTz zUGHqfh@_RKEdLLolbS#V$PFQmhR+|`dRKMK1gfV@!ju?usM!L;4gg4VY^*@2Ku*1SRRl}ae*h}5=WjHHaMyKd-DQ6f(1@h`njayzq#LiNs17ejA} zo$B`afnHDvbgeZH;sNG%tqb$26GNofa}0;eJck4m6h4|=SvVInmkk#LD|4Y%?)hOlO&24HTq zT6HyCvtH8ppfjqwANPKzA|Ir%O7?H*K)VQ_W`=Yve3W5B z#RxE!>ug1igwHQ#VNo9~K~nElB)Wf;U{)-#jmMMd5o?C$JEoNDn@4{Yx2t}?nb_sz z)K_FZ1uMV6#K1oYKADpCh%yHZ7)KH=}e|LVYZQoZiPSu z%nL9o+MLrEBa@{T;D8&%6cvdMYih6>Oy(a~YxWsmb?$gard^izsb zS`=_u)_<7*g*m$j84L^H=Sb%`WHLHgsrDF87Vr<>6qkJVyx?n)TrO)K*jd~rXt@P2 z%a$&NP+41GRDdd;Eom4(x$uczxOqnm632DKAjuO#5)9}BHWba-^Jr8>3uiGXSDh`w zekG*|xp33+)7~p&&>{j4^;Lj=X6;g_94H49eD?8->83?J+bqZ{?v(yz5UII3Pswat zbj$->{DF^ieej5bBkJ1N)>H3~JDVvgsvB}`Y!l%X1%EXzr8qqENW&)*#Znck=wkTZ zReG-TyIQT z*7FRR)sRu3Uf3T4eOo~>_FlwvIV^WZl2rPBYeqbT_iG<;@<>SqM`m^~jY-c#O-wt?J zk}5kp{qYvH7)m1^$Hv*;Qz+&@`! z4Az|oi)9v*>bemdiumV!n;4;*p!sy#CzqOz$jjb`6oZdNk^H;d(*K>R6CI z`c(*Gn~=t5Ad#O3cMwfKvdzrzx!|)>G@)Dy#n*hQKe9x_oAs=HhRaWiY~86$XHcP%YBH=@Q3=20t7aOPrP3~WT3$Rr5T zFaJcra4 zgx(r=JvGDf7AvG6l%8q@BG`3q8w>?@SG?;*HmF!vyetiYXU}{@j0eD4?E7$&+5y7$ zDovc>`)$V1QkGg`Dxxqcg%GzANHxLyM51A?NRT-+dR`agM0mo6{IiXpGb$pf>Xjpx z+(zdu>N-t+!Y@hm_%_Mg-?hlDkoEzIs)_=KjZMh@(e|KZ88|-_#&H#@;8VU!S`^2?PEGc<_1u20A_X*C z{KLsX;{nR?vUerI)0^FOgFXYxDZgkU&nEvY1C<^*#P2T1O1#uhxLi+kDmC(JBNp%h zZR5P?kWz7jxWTK}vc+vu<3+4&kC>684-mr_T%A$e(+J>4*k}f2%|P+^R@nleby@a6 z*!frSa|92J${Ott4ovVL;inSt zGAtvh{rDw=Q5F*!qm2^IF7)2#r;KA=f1b=CoI`bhMJ17J<5Bp|e!ZaX?6~K+M_mR} zf|N(EIPa}RsVdIn>dOYAfuZ2+QgBLO_s+#$BNuVAO>~%9kl=k0N;_OlBGjPPFjSxK zNH`(S>ZsZNoQim5YgBrlhpXilksuN`^a!bM4w|2gMyc=^9z1E%EP))@v?{yt75HEH zJ`##!h9_!RW|sA{#C3t;kD#)1BmU}n;QGZ~cqc;*i0L5Ey)<@w{0{!_5@w;|Hs`gG z3SqG{%RZBb?DA^?8Z6-^xq&#>855buh+j&Z{(a9PP4F_RzFfUp1#P-ka%f%;iuKFG z9G#KbG}ds&s*#y~&i>6=Kswkamp=vL^>tYa+}pTpuhx@04)_tWPYNu0++`A%1Yp2N z@R^lLJ~A1$>d#2PZ~=nWXxFDBYAh~OjCjgbVDTmlGgYc;_G#cKS1|;5?0cVvXhRX+ z`;>BA_kKq3Q99B*RaodDrYn)WMsKw(kZ#Nid}C*`;wcL^m6^47Aoz_U#lM()SuDR|oZs#~>~aGhJ#M%Sac!ab3Ir^1gepxD zQY56Nd>6Xn0<6#>OX-7$DXiy)+0Oj`iDP*Ca|sGzS~*I(tJr#JG!;UoK~EHI2q1D& zmTj|@s%cNursI#rWbo1yE1st!TQI4s$hKvP_&xaCzWIHVoiQKb8wyWV$8=UH*O=4; z``tmt{E3lm(zj#%%x1=)|3k-U0sQphkR`Fmo{vxN->P?M3t|Mlhs1bNz9#k06XkG%2moWa=iCxPJTDgvHSuP zJbj}`g^-R!p*oJtddFbjw_mTD2fhefYqrGV&h*Dr1g%_hqKchq0u{wbnX9ZmqcquU zcnED)>&ZROY{0VQu=RgP?XUe!h=cp*D=4WzPw*{_>~4i^Hho(A4GV4u?>S9i3@1vY zypK_4FNKLQJJA0xLb%l%Ftz3nFPOy@4Na_wrdP~tthMMI4L13H$OTIyK1#tV+7i|X zcK7pn(?E4*FkbDl2F=9Ft8f18z=AY^#jwJ^gl;%D4~`HT-#|26vJLN6KljTDd>Kcs zB)%`Eq)Z=tUq0kra;;yHue3&u->!fFaqhRA3RnsEsa?VO#;R@y7`K9l<47VpK@lk~ zmLsnXm1}ROfwUPUI>NG8ma7vlb~#+ei$llJEq(%G9NSyJI3{Y0No;17dwqq68e7lV zupd7$ofiR*UP9Y%LHmRHu3GP_sZ7B-!-qXi$n-84l#aoY?hm%>^$W`)Q5@be8C!Pp zQKk!sH0Gr|qRtnRROOLL)8JG|3Gwwl@9OU<-wBK>m7~4{zQIhlFaD*^CTj!!&2`F6 z{+a)0&Sarek-+YGXxzNCKDtm(T?H`{&hUkb-hZO{rtxRzLnMR@;Vo&QfyH$&+c>U@ zock&on8){rZX!ys7_!cfxq+MT>98s1Qaes3Zw^a*7`PQ0bddz@jG)P2-xCpD5() z%ViSHYKgS{jtUpA=zc)|fckqncKb9KWlVTXcVN2NK(>Cg z{zHDS%8rJ-(0#}R+ydi~xEUt>EZlUnmbSbQGz27%T4mL(U%q3T6wKpbZ)hWC67qf^|eV1SW}m z4?FhD>@!9wRn6g?EK~S$HlzD)Do;Iq-?CnM^vm7anz(2(@b1&|Qv0Vb9?3yaQB~#< z-$I09_ZjZa`poKU`W*i9Jn(&bg3D{v^BEq%xGw_JetqRmp6)yliW{pD(om8pRW?Tz zBWk&X@lu+wkM!EV{kYf-607g=c}mr<_we;ohoCMhJT!Qz&=0ZxK!T-UQm2#gl*Msb zAv@89|=ibitSM>7fMuXk+BjFo(jDnUK)0x%n+^)06!y zViqcBtng1`1xDmixfr+^Ov2}o%}1Q5RQ*c#a?E63Fq9`^8Tv(W&L|23kh_&5UL?d% z1-jM=adZ};KNTVpz0xHvj7%s=_D$A^2?OQe$FVd-noTnoBrvl3TAQ(5JC5Gea^=g_ z!6V)oeo_Z6NDaUp)~J)12eK@~`C?<5Mq8uqh>4`Z#AxyqP9&#cSnLU@3<6;O-@F*@ zHRdN9DqcN*Oe0AuPG`FCk_%l{Hs6P#K`{IH;R~G3xYNm?TNFdoG$8fv=ea{wU^NSZ zXnHJ5WvME8E=KtlB3mqSVpzlg7k@O|t6Hsb<0c_`C4n|4T^mol8=pbti>G`wR*ZDK z%kf)Ow9&Qv3}*w#Y9_+4NzQOg)fb(umlOf#2~^008)`2Lw!*61a&?iwZSj=yW`;eb zOR8`iAwhGKPTr`Req z%j|>)1#2SgxCvG!X`l;m;J0!zZ)_RL`G(K9)Rq|B{c&x!i@k3Afp< zR$C+fid(zSrpp?M_&@)dHl%-_Q?VgqPZ)UzVjrZ2Q;}XW`PZ*-La#|QivVLt>d8bm zrW#Hm4mw54Iu=1KNAnQlFVEG!2Qn}9RAX&gq0pSFZ`dc^pDn@XWtgI=C*nqHx-*$5ObO0mUMP}31d?ch=R2Lmr6GM(za~@DsNm=Qu@_RumFS}OW z+I;lR=4csZMCo2oQdKGLtNpN$3iTAHiu6Wp+F8UMzJ#h}&m~q`F?C~{_bC8KR+|ST zpMt544&^DP4BSGotPGDMb9RNbAzgzZupbMk&}>JCvXvdnYIcY=DR)A4W$}l`USo0U zG9e|xC!x@SnK{ZM6ODyD7H!BOv@*Nao;J`R_J~RQM?R+I{tTPLP=Fq6(p(oH0M#Vb zS@^2MfnMD3aP@1qN^2uv?NX^POf2R%9{h;lCjJv0h{Wi@9-|gTH;V+oD5cySW+u%jjA*<7r^rA&h8DhNMJ;B-h(Mh|!i=qI zS`OHYv*hdD#J{$xR;Rb@`M-NV1lbJ&rHSlt?x`$eJp?_p)SD`@hL zf{y-5W7{>v-{M&Mita0GQ4@?l~)j{Z|eyx{CL6OE;VN4of07Gn-pSupLIo z9@f;F(NSb-ZfSt|AR4)b2|Jpi)E%uJ--MTz7&INHIEykT_bCfhTZ`+0S z09v>?QMLA$t=$&V21gX~$nX1?)u=9hky0L77W0v2m@a2g9{fd;1S_15PO| z+t7N{LdtpVDuh1a3OAj_Hf7I`{0>})b^(8o5NA^Cf^@Af!_=!m&hpc2&I1eDxqzik zAZ=6N4M-WGUWXJsSoqPTJY=XnHaaJLLOL=Z?ib2u-9?mNHt2vCaXkusvLWWSuPCzp z6u&OHi1NEp$&fP=A*`<3rqMtAw4|a>O@RP~or>tlD;AFcOn=;JdXm24yQrm*5Sz^B zSFc{J=En1X$z%L0bo-F147_sgnJOC6id*(KRn8jj)%vvfsj+aVrReYxQuxb*)I^b^ zM3=7)i^OGF;Pksnx?u=P3hzMq=mbsBiUnZtI}&%LP~G$p^uHc4p&_MRb@|3zMblG$ z-roG?{i#f;T1JO9NER_u^U_H`3glCq-3oLg>Y0{y(~ ze3AB7hffgGPEl&5oQf1p&sT^nn(zlOef*|?5#a@?YXDhjCyRFyw;xOyrQYIRC257n zZG6$IJ=%*}Ny(RL2X-OdjOqvP?Xbsk8qk_Cw-KZ#wL-l@&4pukGdZuzz`0;`8R{{@ z&$~Y!;HH@U8Qzx9^22zqNWi`=7*(nXtFQ37=jP#~@I~NbdLKJ(CVpy82*-gpjel;H zuE;gw?f}g8M;9Jz+$us|*;+*~H|^V?iXpgNYTG^(%i**>EZ2!cG)b|#Sv6K3)mtmL zDLp7_s^`5gt}r{Z6Rx`;&`oJaF;MWVUwyjun#zmej15xok<(xj-X!Z3ta+f`GAozX zrSE#NbhxGX9W-|1&vFNTVoHS!3m%L41yodP9()6NY!zG9dwfXI_D+m=bn@vk@#KBOdphiF!7V(!57fn}&^&jVSVaZ$caqX0Y~M9- zWF~CuJX0s}{sgnQLFgd$0X<*TSWTji}t65$?&X??cuHDbte2j1xdJWQ;9E6iPpJqR1vGL)kd|YbKbxasJ zMz=`*rYjskf?La9wdc5^OBtnD%Sr(hRqFQz=|t`cLK`e%H_J*~nVdPa)Mn85ZN|5N@Y?Q!9P%5k$36yJ+3PR@G)R7hvS8?Lh zF!`i#Rmd_H7w&aC+F}N5kTR*e`@2$zSSOt2~06 zFs|p(39pGTWabEtBGq;0P-pd`70iDIL11`2-W=X$E{@|NE19wNfb5Q&wYY* zlPq0B*ND8%lE^PAXWWcUa$ZWznG=Lsnvc=#KzZce)%vw&!p zt}VGq^RiaR;@PT46vwa#@>OJvs%_zzv~&L*C!W!XIy3E-t@rlwmCuwoqDhV1d`-LdtaA_H;N` zGgM`XlqFQ?ho$Ax`^t}11M($6b-bH`O|6ThyZ&AJ#70c(GEGpLSGPp`8)syZm6k97 zMV>G#Yc9DAwVNTh_C3ZlAbF}xemWlpy+LL(_K@)01g+}No*P-Kn=reJ0VTa0>=FT86{#%sjw`!b9aP}q4jF)`o77eXTotebonv?tHwNsZaFv=rXxwGg8e>3s%f{>yJ zjrh9~h~;pHaVCeoO|$1;bUSiV7p|o2i*U=i6Em+vyO|=xU>d~?HGv@6G+JBH=c@-olnkpUFWJZB^f5ZxZI#=FfW<6=zDYX_9f-+)7j1WCd zM=tvPX+09Tl3WInyErkVdp`ZxFc9?<5q!CsgQo5TVa%H>3eQfgNM`GJ$T%Iic^i)4 zv2v)P8KWUfcA)=-7#Q)8P;mh5yhkY6H3lLRqr=Kb5s(!gBwAz}ZhMW&XzC@d0vfoV zS~L|Xth{Ftk_i|qcDKu!AISjtmyGOpJgN2Zh;4WOg1-srs)To!r8uj5%RGU3e_n<^ zIXZ^^3E?#Lk}|nt6dE^hr<4)E*N(p!&lSRQ|{K zuZ(^m%3usj#FbV`l0;u6MX8h^UMKLWM~`_s6H0oQP~qQ?yB$EA?Dt@0FPd4=dLIdx<+KeUleVo{k7=-2}_) z>@;(30`THii-YeV;Uc@N$p>h04Vt(Rx1%lL=c$v6nye2C>&cRmiWUTe9WPURLFv)} zH)>0T{ff2I4i(kw6vF*$*T`={JApz7e!W+TxtakGDVp>A<0?kI-|Eh?FR1iTR z+9E(J_*(@r5UaBvK%5-?)~0;arlN7Q9m^=3KWUhmpqpUZD@!A#QFPLX(qi+WJ*nBU zl%Mj<=9l!B>A?kxbx$b*z983qt-LU1ZVa(Fr7A8Ud4(N-R(OPh?5O)Q^H(iK4XI@q zU$hyxLBtLR_?(VnFPR+-o3&IuJ=5@4j0ZH^$(wejy8ZjayFa24W&NoZ_6c6+_>P(t zJ?HgWZ{@(gS6b~{kvE)qtIrWe71+^FXssKvk9_l{<51k4AkaBgQP|Pk9+gP6G7P$K zAI;p>p6{+6x+MS;Zq{_!1CK9l_9%M7o$DX9SPB;3JgOT3IF{DEI4nH8*Ad!#j_dZr zdCX&b+nGwblMQMg*Ac}#%4iq#P$+wJ6n@6)gQgrlcXc(3Iq;Un`{(Ed5+>HO(P*a^5f?MG>YklJO^{}>uHpYeyncO{bjxW>tM&A?jajn~ zcaA)GQobM|!%^%uX=>V9>rh_)5r^PoGZGjGSd6qHZWmv{+9M54zUdwUXhbdko(;lR zdAEjDp2NeVgA~z&{2ze8U=NhUY#~A6ViSM}MR+{|vk-}Ys%KG>ZNP!KfdR-W%YxfF zoT40v&eI+GX;`D1DMmdCI$N5lA(zzt5=5lTh`ZWRs^s?qD8P`)TseiA3H%SV3Yz^xudM{{z(2$C${I^e3tB3&8JA#&j3 zx0ttYk&V=}B@^bZNW|t=kgaweJF&E~#7`8nEp==kpu58?v=ghVKod49SfL*V2cD0GtPnIUu*u4o$*1EqqZM=RasNUj;o?s=jBSqn)ON_AKId@UBw$Wc zsEfnU9K=&I6)xKm*X)kf9s9bL1`C0!4CJz5Nj$~jbtq^0$ABgUemlzna64x4Qm%=! z{%La8?fSZgA6?(^3Yrm2w4xUwyDs?9-_&PpSxVCWQ*{Jt~=S@K+&x z4RQ$vf>noRIUFSnsnlxS20I(6TY!nx3cY}GE?w_YHUDA*mkt=kpHU9)I^KsePCe4? zfaa3LTj0gX-8qNdsduzaXs@L^l4J1T_Tjo%cE2q}Lh)BRvCj&DI+tV!4;x!JF)(&r z?k!0(Do~&6XW+FH0yWxy@;y74{5p;#xMRPh_-O zAQiEzpz1@w7RjY;rR2qr?0*8)Mzp~Zbf6O1S%}Qp)sY(Sn*QAJQjaHj6QPu2*jbae z#OyDV^e*t`9*A3_YYat$Qau}TZ_veENY#d7u{he8Rqff#ELZPS4g{n}N-2WdFO!gwfU`EsZG z8v)!jF`^Bo23tHyLpziiO&3@xZf-F}RN-@~l*aY;>moOPf~^xN%4gyr{)fl%*v~og zv3V5e7tCq)KfFlrFvJl%Pr(?6^{BJ&YjQ{~3=!#LRUtFXGBmj!^{$=^lgI!wOOZw; zs<7sJfVbX8Gh%w^T^5%2OPIfbofya=N;fZBhFoZauPzjoXFcKt5bEuS>hB)G;;6u{ zjdr+4>RA3gNHL5BG@G&gnwo)>3H@OK2MI7zRcS@bx!?-$ks*ll&!!jT+vc%S7*Vfa zE!yDcQrou-*#m#17DU?IFPD2lY#w&Q;S2mo$Vke0od60af#4Ze+BtRNuzDaNefn5%?0$$5TZqmDIgm`W{G8<^Y9OI>-?f_n4sY7T*|M z;{<@>^ttjH38Y*NyYBhfgVq8nF^gE&&Ip$~HpTajkiWbtu1$||@+jG(wN_W4@n7qx z5H8ql_$Ba|UzKi6O#7p72w0s&g~oJ)bI|#OFvW5YGGtNJjm2};Dduq~rKFQc_)L?u z1Wpj|>Li|>Gp$Xn2&?8gLbx(4oUlw~dFTby;5ZBp{1jixwn#EQ=^CHwkN(Qul9L*ABoMR9b3b8^cwd%bb<$!)_dhB;=2Iz2@)afGI6u{h>4Z=r%SzRXx5B>!|w z&9NgyT#)mG5~_8w9=uZ)%LXy^4w9Ek)09p zpHE@{4Q1Tt@ep>A2QN2`6jPdwWgn(;jF9B+`Lk?^Z(89U=j^`#?IQ%pSpz2A+PRb4 zse8}57&G=y?wtf3n$|<+s7lS1?U#S<#Mm1WQms^qJ7&}hyTqx;_OW#BO>cu)mcD+Z zI1vP=8*naKb^N1bV$uu<$H+qWW<{Y=JaAE}Ys6*1 z5ID#**4cGAdrq!mh~L4A{)F*#W-`W_^%Dpllb1i}_D}HxLVOGP3ZdoVOY(I@Qhe~GU!#(j8y1JDfY1?O z9=-CnkX&P<0UDg9OVpg`Yw9CT+_D(3ki$Zrt7Y2$n1!JqF=Q0rRJKH%c&_ltkwUb= z7TzL=Oawz{CbmsD{_rTFX+J?6RHIt3AXGWcE0_IFO$kVNc=e6?{{3&-i+L{f1wjM| zG@Q;>#M{jq%IDTbStB6nasEO!+gT!Z9Akw3eD2@B&OFKxa$>?MlVfN{ zRH$>|Gc`R;mL4k1+Hs9Lv|om5q#-x}fQ58vEFgd|Yo?eG$aT0^-lg|K11gfgThidx zSk6on1XatDahDOHhLpZM_f{n&lpz8-HjD-W@Y}oxac%t+A&e4wo}5b(lS)#4E6d9A z&O&4dFh$Ldon2QC*15+xlqx*jIy{(EZ@RF_1jC>B?LV_?Ex%RiPKbwN4oltc+COWaNAMJ?PUIJ@^Q5E z_8K2#0dIk^vz(P6XUpn_zXW_BA&`*uQ(CdDJe)8nv;)97ar81*w z==o|&Myz5ss3vnoYI)sSh1Blvha`>ESqMZPzMn@XnYO9a2;qdQD7rBhkI$x|5!!X^ zm)#R>!UBX};pgGov$q(jVq!8D4d$~YTOPa~o{}OeMmCkKy$O7i)BJvFCGZAMiR1~l zfhJ7*;NCx8gz)=T(0GiF_>vR3Fm3mLZA&Kj%v)v{!pl2DMJHuD#KBC`O5Zc5Ov8Y4s>$Ndx?wD(mIj|wv?8p|c_8$; zs26D8b+3gG53b9=hZA+c_VkRfaWTmLxRZUr#nzgcsO>Fub;<4$HeUNW(`#m5XA(|L zS%2)yyxvcW{>x+h&lR3D2_=q1)wOj9z`zqf90)lGM~AV_!*BWGy>hC>-3#lRPpWvr zW(s`(JWCu8sbip0ICOugjHBDhEAn2YN1s$(F2zGxbqtjb9+LH%t&&e)A@uETIq(eW zOj9eg*5zISe&Kyp-TcnMpkTP4Y&#*@>w7wZ-fr^@!!T610oH}b6`vE6k^T^S-m0kh zp;5-Onqz>~S@4{o;k1ZnmITBI8)s?JjMnt6rNQ3d&s*AA8)WL>WgKMRlzhL&T(;vz zgPn}_YI4+YRiGwwgx?LnrGR%Q@bKAopa zXFG$&iY*T#Qy^@diU|WDPd1zP-c76HvtB!R8lS)6P0CV7aAxJ(G0L%u$#*fSVZ;TA zut@0;pHdHs>@7}~+5=XuqIC%Fe9o5QQMQN0d{i`cb!=ct)lI?eC+H4{+B2xH48KQF zVqu&km;j=UMu405R>fb-!i#Lo;a{mPuYqvXb7uwYCG-gq^2yx;Fdx4yNsdpJ3%0^=lY~3w;6>U^wROJW_z&Ho!Ar94bylJ!cJZ=WgrT^_tevve4C6kVq zfMsBKD_c|228rxD+JW#klB6N4J&qLGF6mf)!8UwvU>an~>{+dLLHk7!lv>>u1RM;D{j7SJv(0~RFhtqu)JEIDNhXhsZk zd^2$GgzE%U8+e4BfHt7fBo0O|ky?@*cd3CZ?RpA8`tNbkGl}(Eo7-O>%4?#I?I(e-gduRrdr($FYg(ts@cQ(=Hfd3|$73mb^ z82-%dBhzHnGP0~fV!!*BdQo;7Mw|V@=n7?SWOH4?5av(28Y+-a|L}g=dWMv9IJ_>Vma%Ev{3V7Odx^r+Z?Y1=< z+jf4jZD+;Kif!A@if!ArZQEI~ZQJ+V`<(OLd-hkix~i+^e8!lg$J71C>{(4l^jnGU zm$99piI|BR4?I!qGt1&eo1j(ZtNf+Q1RO$jCy^%*X`81u(WSat0Whm|57u zF#L-kXJBIjU{DtqmQoR>`M-F^CZ_)dle9Ip1N=AJ*v0;TD!7_BI$7A+0x17mfC}Jf zVqk1%Ywhu0R5?3m3nLQ%rHF-@g|mgHi7~*~z}Wy`WM}W;XkljV4A7=D(xw9Z!(^uW z=fp+}P&PLK$l7^YSX&za#Oz#b|H1!Dz`)iRplo7oVrpk=VPpVMqW?wzpITxr*4F=a zL-{WofPeV_{I`$)3u<6vVeRoB;Qs`vnf&_>DF8n}z`y^0YFIdlS-6`R|F&>8G6y(2 zx|sY|TGH9T+QR6Ut(mn6fbqXlDz?TZj@A~oCco{REdK3=j*0O<*ObjIjI3-;oSXn` z|FvZDkK_NXC~9kDXKZ0>22gVTXFCiWjsH*L-^;%ZENq>XJ?#IF?!TVfzhkEVHH@Xfe_=GBW)G{O9BVPuS{a{w;V5IsAMMsmiEN*ANZTK#TsO(1kIJ zFW$#%t}h1Ddv_Olx8uiF3J{D-l}=PIh63rj8rtT&>}6EX87=lHvi1iBW*rm+H`U3$2p6G9oemw9cyi!k*i@pmDvSsx%S4<#eTFsPu(RvhyOuIE>_&LN;MDEWB z1$f2Y9Pbia*jZULH>5q>Srw+tnsM>X2x7>(F{-rccemTa+A62G)r=l{u&4jLi6bYp zAK#J!M`=}c3O*^q9I&99faMBoctK@_J(nx!I+>PZ`?5b_CN&?T#F-HXp1EgYZ9E@= za1ed8X%x+}qJ49&dbLg`1}oDv&ZM^0M`Jqh5X-KH&46*DX+2KrF8WC32& zz*X~PM1|`m6r5IktR0X((5~JsH?HQ-4X9I{d79j92b%Oug6l=rWLc)2$9-DzNqo{p&hFEm&U_ zPy2ftHP$(Uj=RR}rWnSNOD+c|Y7IFae}vNEq>g`t9;f;;qkbWpWBrpk((3{z3j5F_-WJJYOgdkxVxTBPGd^ zH@}?K(U09tXnaL~3(b+ZZY@)Lc+FEq!QmRVuE{Zk+;!UhjGfBrE9)*<)!1OZ;QKOI z?*9z_I*6QQ)P~{ZCBxy#=0Z_)QeY8MlZ7M^V%1KMF~*gMxpt7HBE&r58zF;U-r|p=Qjwmz{vq{rGT`BelgjS%4RQ@MoIy)AGpX3LY#?ahBPtqu7`+;%Z-$EIH1 zh5c5gT5E`TIKNquQ+u=S-5}s$`Ww)R1+#bX=`|&k7)tpg&f<#P3$rxXEdOPY`Al1h z=o=AJssr^SW7+{;p1|SHIBMF{i#2OFH(-M(9Mb`(@m0kVzQO&M|Ftc?OVJSV(B%Bu z61tp}(LGrzZwj8sH_zXHtV{(j>YN?hiXmiFVE3 zO*RE7jle?P_c64KM6lRoHN};qhGg}-B8I*IT_PicwO$by6T@`XJ69SFgM6TYmptL! zif``4<^1WoKwcL>YBnhm18oglYQh6w0$#PRJGVTm`|7EE3g}P+(W^Ev=x8V4OEGjx zz5Lt^YC^s3X3AYs9x*asU}E%f$9wmRTT);j2qGJz^bF@*YdZ3Swt?V}?*1Lx` zRi0te>be?_(7dk&OMc5spX&CT^(&h@N$He)NNh5ff{{OJ@i95FSkZEMkg07ThF%e^ z>WXPX3Tt@&G7S0OXnDaWHU(%l%OpmhOIR}$*7+8FDMRHI7y8?nnL6_Bb|hc~Hd%wM z_2!Yp<2D*;w*CT9o&INRN6V*NDsD~eD-dkc!k8o?4;&u>qOl{>$y>G2>gQX3vCysi zeR3BwvL8dz`6myTzCbXva_uwuU-1D$x#B5M#(p;w7!hq;`Td{Wwl#SK(Y?rn7A^N6 zr_T>XpWwA3?Mgu?h;ScMBH$UUrruvyi#4$Yql@Vn5EJ%yfNo`ysL9XY_eqeYb8xM5P7&-JuENF)#e{9okvZS~WkZWgJbS^oo%h188ZpUyDtQNPg^2 zgxaa4C|8`C9d7={ZMTxLoM!eOHlq#wiWiMx6_4TBv+HNHIO9qyPw*2T;sHHkZ9iwP zaiSNE$XaEn0}4hwM(I=%!O_M>mwhnxjqJap@el}cq2ua|wTgUMvK4E7m5?DIg|n3+ zdUMD41R{Zv=ARip8#1-tC+2C}FXdcWGx>YHoM87v@)5~A=d0jQHA5>pSxTf?pFi{M z$dx|peU|WK*+m%hCd8YiTq55~oeO?!&)1Y$)R=@qHtLmT$=VBNPO`E4%Qj3IAP+a6(OHGy# zb9dw~nb1pb9Z{V8fQM%ruVC#Gex6TQr=_2$2wt$5`PA#4v|r*H7Ctp##?Iaj{A`~D zE%a7&Eqre-63*#vpK*6hX)W`*shp^PN*1b15ciLL69-K4&8`eAivPFdufY3q4aKCe%_DWE8MJ{=3dyK)Ez{byi%8IV4R%{=F6Q0 zEfB3eci;cVisTP%C9~i0lsIB2*QR1nhG+2~k7q){ z_SI#UMu04Em!9pW7h*uc0JFIMF1N_FUgGh3hRMS$QlIMmi(FPk>TC!gQB?MeV z9DI6QK^Y93xA?hAQ=af5IHn!q&6<^G85nB#e5yoy%C>jL@I!Tm(gJhSTvItc+>9w; z*2_VqgX$;O!;CVa3wyuo4+;V5kl;cOcky(OJdZ+G$XEVI59D0@Q3)%n<<@a)=T#uz zf_=Y0R|mdYHsZsjv2-X~C%?skw9w~{UJb=J5t&H&--EIvrEz@VDlmoiykzp{99ps> z&|d%0NLE**EoR}k!B=oVSZ^Udmcfon1>T>!r~|_Dg~0HLpsR_{x+E3j{;MB%v_BaK z*5v(kKaz2CeeNJO@6hqsUnpIg3H2Pq_Z@||U$smuRZ^VL)>B(m76dqb&Yx$jv}9?r zvkJf%TjOUM7?_PbQ{ef}-q-z8$>(>|y`nhi8sQTaP6Bvh`fq8-{nme|t-;k{l3YYE z8d3L;4-28wmE8%xX0rqQm}tf}SV>mXwVF_%T4yWD&Bs0!Vh#jRjgrCB#I=HI(F&c9 zFW`LL(7ZNR^XjqqY2kBhg_|?jlhBe^@hTe$=`5)jOo`K^PmLFT{djjYa;_ALqhAR+ zN>fRPx(<}1Jq0cw%9$lxbJY0uXW4?8EpImVxLRGeyEIziPWkHKe?GZD+`vXLQ$q0D zf*h?hkyA--8h*`rf!C1UO6 z1}~Xey26U^!q={C^W(|#ZSf#I)=&Czr)2G@e2j{0i1`=WnvKKJP(z{B z=7&>oe_&ivI~;>0MIo@6=HAMA+)9|TQ8%M_%*Mdx*}#rNd{?r3YuKb|aCY~VXygTO zPd7AkkOr;G^vy%lAh$H2xWfbC;G=!}QwyZCM0~GF#J%Vd{_PdUQ!H6RcZ0WS7Kb5> zi-JTMQ&c!5O6j~qI(Z1>IJtC=FJm)f(T%6eQk$Onhy%;XNa*jM{|XiH4}(REV=OJc zEPMnc*t_Ud)-*cLW1-;vg36vXDor~{5tJE!!A7+`vuW$7fE?~H_6!3YaXp_s$_^u0ZiQoDSE{PA#p~<_Crw6mpP8To z*8*#swD!&*)(PL*9T25Oe;hXp#HSJumeKdH4%x7@7!fLQZp`X?u1c_@Zmy9Bl1`$z zuAe-rg%|WD&SMjI+P49Ow6EaSZiG!%#*Jofu)V6~c!Ig%(sn~b-xo7vCoG21mEe$@ zj&)i>7)@T_f{%K&UesB27!K1bhxXyy99@RJ110$HAQN_Rb;?WI7Yk7tNs&lEO->;N zWDG!g-a!PC3A=-md9I;~#&T-y5SGcDRF8^i4bBb>!&=6u_i;85tC~vrVgbgY6K*$d zwqe6Ye|ixz_n5*0MbYdtjN90MxoWwNGb^UuSiZkEgp#l;Srp}wV=xd_4^~Jt*$xb|!{axxlV68BioF=##9U4U^Bvhvu4 zyCFk{YOE@?*`6&g%b50mqY|V`)dOkrT%pz+Wq1>-sGX%T7Ox_<@ko$2kg*A}YjY!{Z= zK5^fKPW%V6;e5yUn#M{zYI}1k&X}kdI{KvCPZ;3Uj4pUTA!Ywx4f+yG**lZ1%gg_r zP3?8kU4s2d#I~v!UYZ(t5IF@%bDf_PTxyY zmmH3L%=q@1U)TE4UUv~GFqKf%V{Y`G>>c zNubSU5i2*QO!VRUZ>FbA7RY@|+G8)JTifjb;9vcvLf&=|6a|8Ek9@oQ7dyWv5**MD z4X6`6qYmobZlzS!XCoy(qe3wA5m@LjOz6@U!Le}!_WLW)Uys`YDe zqZh*}^A;qsH|O3T1Hil=kutRFSn2ibakB?$SFQt5COycuZQ^*+!4qak^G9N79M(d} z;hdX|&k}42TE?yTIe+j1hX4a*0WH@$@OF}awT=RW1MfLBx8_nYjIh14vO(D z5LU$N^~3Zy-4KeNc~sXi_>dKx6Zad!XRjOxkq|>!hR1)TwG}-JTd)c>TE0QQrWlM~FvKCwc{ij^+ zj#mWm_{Os_3zF$m%U|sA!v~kbqB~BK+6Boy7A*B5H~~sL>nuYWDoIaFi0u_(llVQ^ zxRBDv0INaFb5hPD!ecpP%lsN7KM`u`hB5W_pCN~{Aue=CYPjZmq%(&UH06G4np%QE z_7;C=FfK@lS)8@M(<4v|B4OjB783~$-8tw`= zLl%x9aEMHZAc2y#BBe5!ND+^U1v@4@IiHVEttJmaA&6>*0-uwJLV4c@3wy2LFM+@# z2aH=68=sp0loK0|;JXy!_5*EdutFWNeZNm34BXr)XjOsG=XFt)2z3qZmoi*ymWf@2 z=-2nf4>}O`KwuMb`1mJJONCMJQk{V?Jmes!h&8rF2*y^xwLmw3dI#1eOq`5}vqvi8>Z2Ma~BVgEZXS_IxK^6t=*^-V>_ud=n;$oPlgA<)AWfvB3P>gjOrLm zeT!{i#~%v`4a|tjCn!6fnAajcE6AO{(F=LZ>=i||Sqql0f~H#r%ZFGt zEVMkCMZhBWdi_3St+4c6HzB3>dLLz@P8NIaRobf`1r ztRGSj))P>uX#Qa4-bQp9;n zr+D^@k!0Jh;u1$<(Kdw5BvV~;TfQd`^GpEMchgG>1+5-=IXAW>K*h88Hd~3|X;2!) z@W;Ip5Rvw5Y;~S>yV~lkCP_X}4n>1gFN>|d#oj?&-lm#UVt6Xv#Fz77RKXQ8cimE^ zPJe`If`0`KrrzrJe12bPWy8N=(xJUK>T?G@OUO<1FkHC%6R5qH?leDOoSEqN_vTAw z2pMve{y0O(s-{!eavc%_p|j`;5gonjh)E*Q+7_8$GoHco&?JmEc@ylai`H+>cRs%gB#Z> z8`ln(zH77&n7Aa?)aDq@?X6snit7jvj@~iK4n$(LUGDHac6d|9N0gMT0mVVLlTF>O zbIdcz%ki}L74OO)`KH|uQuP3OZ~O@80z2GAos{dz;_pUR$+99;NInf;gPiJQMrX%t#!BjD$O z{_3tBKux16`@m3=tOUPCL*{?@wpO({!$$hJr}JGG`2!vOc;XddbkOUI-QGNR1eXV) zx4FykA>mwz%_Ku9V`?!U<@q%{I_c=-h)4Z(<1yZXKH`2wz*6&p02WkvI+&UGi3`v}BmS<4 z)v1-zt3{OLb8B~n=px7WdqIo}ubyv9dR!a!K-d`F2y=^4! z0bEb-sK6A5%*65ctp}L#!38rkn+uxJE+rwXexh~xtdjlH`x^xPO^SB3<|hDeBP1lewh>02& zfe2Qh9O`6I7RUl>Lx|0hXK6kj#|X5^usml`m^Uo6xJ?UA>`)XQTZ%##RpP#cry(bScFPEcT35dYKbxw8MtB3ha)^p!$|vEI94dI>A%W7^Gk2gLe9 zt>?r7d}vp{4Hy*M5M=twC&auRNCcxC!WC}l8!pM&x4AL(1@CraldEyKHLnGx=83g> zR$0Si?8^Rkzbv*tbnQ6MZ3yIZmM^atqxwk&Om#>x!yBIV5uKAz^^^c+C<`_^ob@}L z+zD@uO2jCa7k*ai@r28Wgk&J~r3aZa!`^rUp!vA%dk0P`+2++xRU~o4Yv>&n6?$~Y zRADVE)854iQ@bO6h{lqX)yPRA6#LZU(!5V`pi&&-@Qd8&cpEU;QEph!l9O)US(AQ2 z&XeLMBu-bM*(;ZLvUek=94~U9M+He+~rc$ka0O zI&J2iRWj%A*dhX`kkLfbxJCK&hOI=HZBoRs0d61Rny9&|sk%o!;M!)}>-tfTfXcRO z1HpQckwa>iIl+OeG$tqzj*6zza&>D^=!gM5GeGJRWp$GOrAq06HYf&m?(dj-VvhYdulW=BtxrWu5KjiUOk4!GD(S47!M>`z6dVn`cPpl@ z>s;kzDW4q8PGn`E95}3!=^e7l!wCz1R%T_(Ft;?l&y=xX8tA^v&F}D|O7xU4Hmz*% zb55ymtzFk8TM1(i@J;arNX#Z9i*a&@L>14pZY(-BwmwyDbJ4q=x$AQDu|wB&X>Wd- zC^_^ckf~)z&E{nsKTP00ZpmKw9;uco-UFK^gAZ$NWyoW7(~7Z}qz-$)g-*3j zy{1#ks4MXX?ubp7#NlI6g+|3y!-1BJ^S7*<4@9Kh9pZ3XbBp<7hP7$B$zYb-sfGh1 zV<8P^Zoio^a(#0q9%^|>hK#${r-6V#K{{n75w7E4EU!xO4m7wV8pG*4BLX$I8@>>E z%ns0)ge>#i8an$xNFM0qEv(Xe{c6be&*USMGQO7=1@3OywR#qvF<+$f&8?-XRFGPF zg-#OrZA)IdUfydsdC6c|X}`l)9RLj2Wk~yIkFSQKK9wfZ@Q$MVCVh{dES%bCLZ$gz zC~)ZoDSYrv@`a)^Fn_ZxxY^q_$2Hspy0nWyh``CyOkPB&}N9ew(@dRKSSZWW6Zh3z7DN)IYuB$p~f0<}BB zgVF_`p7NshCKlicQ~`H_4f-yw#<_j(p82VDsK?_Gm_kE7{T{*tU$r374AH3J#{zgy z>|FsfzauW7Z*^ru_;HZ3d=J@&$q*T}6DyvQhYXM==!ZI7JL`TK?!7|U56jA*-j;W9 z*QCE;EY**tg;Rzn&pfNM^&xY0T}nTBNjfwna<#P z&PZ(Yd>mS@_CDRH+|3kZbjdT+bGmeCHLbP#IekS#4E%=J6?bGDV^WOOX2wAdi5rUbC+~&G zUAu`kzMPc}F|Dq&t&?>UsZWHff9xTE@IY}pwM%-_IGx6pZ4E1Q8t9=7BM%AE_~f^{ z3+VeHCo*q0LL$)tsDWauSiAO|SyTCb(nF|5aXMlSoYf4FH*ND=Z&0}4b>aB)RkDf( z2kE3a=KRmcs$t%yT62cUa(@9Sgd!`Ul<|@?rs|;X zJ{&a0{F(#T*h%{8xIE>Rt}i;5C+Hc^@|G|IgUmml`yw&p@F`f-VNs20gN=i+<7Q1n zt#93WszVVvyN7WuKq+6vXKE_{v$)(GpABnlF1|5fPI12joi*)|MS+@$bp4&pI?t(7 zJQ+WbHMc%MKkKGyo4z0!aEHJm{cVTSk-sPtt{B5oi}|OgrhTm3F;zF5wefc8w1Wo~ zNAfFyFFXEJ68*^GE0;vcMWi>VlrP2}* z5(KqF1_^j(lDf_Hufd8i4Zfv!0Pakyo-quW;dr9jNiy;FaA?`OW?rssQFi4IQ=91A zoFn6GU?xH}r1aa7GIkZ%=@n(!&~%qj#!?eXKOOhK&{V|%Cw_+aSmna^91Ax?n6(fe#g*-;{|hO zFuLg!P(B9dCT(4#!T6;f=x}L^(96KLy-Hl7+-H8+g67!|ZR^~nDGT3np;u#9OlV2^ zWkUD5%ZX)|^@vkuB17M$IRcSvx}G0r+KflfnlWa%uck7YE7?jnd1#|pV;MU` zyExP1jMJeiH1iAjsqzX=n;!jCPA#b+Dr`%vI-P}tKa#rF8GQV>bej#!t;jnO z*JD?4(^j+3V%$vFO4#buRH~0;VO1u$a(qs4*mje{w$v387fzX?m! zu?ajeKkwoZZXx>OGLHZP#LhlVULo^xea-p1*)zP3Ux-oT^{`8@!~34#bPa@%0>6fU zlbj(|9$Aj7{WmPdGg6)43&^o`-_U#B?G`>iH_IzqgX^PC9pho_33w-hiyP{ zp;`r+pJGF;ZLhG4(|n7i1?Q$&rD2}^-(=WgA*9~6HGhjLvS*I;YtzK-$49|Ug4kL} zNFS?J9P>++edUQxWGpr#V6 z^5&^^1P>Uel6AAHogwXtu3p2V+WfY{;~l3k<^NSd%d|IlzcR<34%AY7i7ex0X6Z3wtayVG#S6JakL*h2nfZ~2%C9Iad!Gs8$ zMDso098Dk_b;2^?6>7Bs-XQy6UKh>Gai$6h#f~t{W#sz$;KvuYRBsVq+Kc~!s}-D+ zJuXl%f@TM8N{Y_43Sy>PCLb(Oc-rU^#^9=yzo}iU4hzy$+dyWm&WN6T$8@wmt7qTVv(R2 zS7MQdQ=)eKl&t_}4q=uwP{u3*Ca zIWAX5Su8HW4J|H?2PhsSyFt8-%+k6#YH;ag;QLnm87^;zCm!?nLoQzK0r-k}0;U;V zQBzs&)-0fAF*m_<9)hR8Me$S+PQ3n{dcVLO%VhJF(Tz~xpn*hL+VUw0D4?w|5hV_f z7k8$b={|CkME{r<9H7$8@DeVZ~BeKJurRoD~H< z<5_(9<(;$G+nD`=bIhB4t(05x=~-L-3mXuXU?EmD z>t6QN(uo^zp6pgQ;p=mxDaZZnwxP!Nt5v+wcXN5nJ)4B3=k!4oD$J1m*qeoCQS}S_ zpWCpwsTO_Y5q~}zZI|X#UP(Eq@HY4?)tMh8qdrT)>2F7KQNCiU2P}+3wueaSJktaT zNNki7R+Q+IYkn5$MhW3<2DIV^X!oeh$AjpZu(f3XXU2n3*|M8K-+lg;z15PJk5Md; zH8`!S5v*WI7Eszb2(-E2MBK%kz4an-7S@lxZuG<7Z%3#|Ubn)*Y$G{dL&9gfq;@~n z#n#h7&G;FgdiK|DMO0Z$icoht+0iOfR4Ip|CZG#*>nqhnXMC~X{FaHnIj3LQy+%hO zXtT0}z2K=(g5QVHax#iy%k4)9a0fnos&uOqI9cg`#&rtFe4o^Z}r6m#`L_#Er{Vb0K+UBL(>}xzQP3dl{;=0|)*wxLTh&nrcC3cR@tb zlB-ox8)IiyMg`2uNLa$BPIyqm<-??0IK}p}VuN@QGZ8}0n6%VdeG{=f!NZ0W9|^FI z+$v@54BMthylKL~AM$ZSghVHpGe1-|>XbXUucA!L#!n@os9IB+8!nD|Vwi;fo}$jC zunT;DC9}iMYE9MuAhHnPyL(8>dOtk;wKzVkBg~dIv(ryY8}(?jjF< z%I18OOid)e3vX|A?*X=s=WkugvRU*^UyqR%$gV**C?9nU-N*GSm|$OAZ|yZuD8_ReiT%y(Q$4F&%2mjJh^>sBE;sGVzkz3?FH4z^!On*F zp1y%i?tLsF^?W_)Mu>|7pQ@GMHY5Hwi$XVb*cpJ*)N`P6bLAVf!81wSC+tI?^dM6!)kE`|uZ`}T{`CY3{3V1Ak6_tFu2wg?cWHFKL- z?d>FuFK`Ev2uxoz#78Ec>xSV5A83^5rD6TLmQRd&YVF@D84GQ2)Ctp4`qzI$BKEJK zrMz4UsNMLV>e>F0(3)*?ID|!>Ux^gJB=A*J-PL} z|BjpC4Mm36k4^ZcFogazu!*iv#k;3VN0*ksiCD*mPzpl*&9ZK-+}Y27-S@`@P@EP{ zm%Au=0%WPoeU$yYjlKM4fhb49k?etmNs6zK*LY(!(^A>V;to)Nh+kzS>O7QfB7*v9 zJRI&OdpKR~z!h@;=s?bOMxoFMrBV{H$^ESj7OZq^epVR(3fv+4`a=)}_DpxSou;2E zPvA-z%-hzM=^Bk)_z8%;%T6w(+ zBhC4{KS5jtI+QC`<>TkzOCrKp=0*(qFk=rZi+Xpj;^6bO>v6UGP+MxR(eU9Jbf$M2if1&69=X-)`LNyaZF-jtzN z>fP3)B!bOPY}7^`K% zuDD(=i{0n5+RPI;?I!Kl=wJ&EG7t|1bNn$@;8Brw|0af5Y{Vw@aGo*O7 zE*7Z-`G6%=B9H=aqH^OWWq~@bg_@XAbuwWdDxAf+e7L3)o8+}jC#eZPS!B4BIZ@d_ z+8@LcFVb}jnm8$8=J!KzOg+VGiik7d8YCH=Rawqy!|PwCFeI3(e8Vi!qRoQO6{D(8 zsvxOpZIZ;%d$R|HF&=BplObzs$TS+sf-&aNiN|l5^^)kGcnAzGw~3KIOGQ4UK*LRV z79_PL2=VI|U=k+a)5a;Ar^{urS$QsIH9*Kd1=>uh(E9=C=2bVLRR_H!CLqz>1jJL< zT4;P(O_c?X)JVq~G+Zo!A}|L!&3xf$7lg1w@Q+1Em%ix-5Fa4}^i|2f^Lj;QgN@&n zGB2e43s(O~p?Sx8t7_mDE8pli|BBUBB%>BFWj#GFHX4w8;EH$56=oeeG6udE-)gqE z*T)^tB4v$Pj$eS-=#g4nWyT&R*VZ>sQb;dDb47XmMp>e52AW%w(!|7r&c_k;@)>GD z=M0CXhlJ6M;MB)A{7Y(`hpwlh-n&E+ypLCfU+SbyC^Ed25^9m@JDvEu095=qCNO)h zDrGCDAh%d(GV#WAaKZ5AF0qjwlT%Y?M4gL1+hdsXT6LZ?W7UKeFDQqUjlVkrR{R@f zMQxtIw05NEoc3_#Qh1p6dn09J*E3}p^3vZ2VV$eg59~4%Hq9T+A*e-9#~Yjh!YsO* z7+Qba{>0=HGdQ5MG}@;JFAJyJ~YLaBHwTXx98MSLOz7vdo!loj;Mrv4@U0h1uLl%|yz4wc# z6Q-Y-lf+0Ll6*zG77XYk_RTuENP7c4teTycdyWtcX3Vd*96oJP?6M0?A)-}aaIf*h zUA+Uu_lZa2eNK?nXzUHzjbl*s9H+DqwMW`Hn570jJWusFBny$*DAFW9LCyB$9KYX`;jBX5sn?qpHbSa;Fz;XvN!UiJisKWc$TG3-TwTlGbP)MN_023s9vt;-P3~ zPM6Ogh0)gv=l4M?lI@u@W^msm^V^gdJ4mK{?+jllCp`d_eOaB0ARqA;WNHnH9U8v%rztBYbEUp;(jS+V?*jE&om7wI* zz+raXM!cctP)sbPJVcClw6F2DP_?=RVihfPm0>y3KUA@qMlY z!%)wGf5|+3%Z@l5t6J|!V{zSyfb~7&iP{Tf=rvy5lR~NXLPq`?XCG9eooe2eRK0~N z$X}+GQ9RelwIo}Be#W&#L5R1K@OL8?R9 zC^qosdTJ%n{tGz^T*=bP3l}Y&ouS(|GC2 zLbzL@iD0{uid5I3ZP)TsA3m-^Q^Rg$S+S9^-yfUf7nx*6r!+Llq7{=mH`#R*86MAb zdrIN%S{)%8p%^4}^jzy?te~9#QG1E86)O9k2VW%xW6EZzF#;>n&#%%}cnvwEy|5L8 zldn1vB+^2Hqaelf)}sQADM2wzC|Q>olY7{#SH_z3Z7;0>UtTc@jG8q2&l#bq=y7jM z922h}CLqM1OSdh4X(pJKU+u_TyAO z7=!6Yh+yS0XV98*QRK#K(<5+$fp@ZB8A!z5&%z=OvvIB*Sy8>G&W%StL!NhOS)AKa zd>z&HNGm7~9!@1twGF3H3HozHd}FXQD&a$1;DriOHl`r)wc@>hM{NCMrGcDIG8iyL zd}X;;QS(|Q4wGJhFd=r3LB)8NFiP-#o>}X6RdAYE?)OAq(Aeq&-*T+vI$zY|Efg_* zGlAB^mvOrO@1}PmpP;)x%{!1G#kX#Gv{|WIv z4#Ajh@^m&uc!6Q)hfY-9I!&@C!=An2H}P7;m48_FRFM42!QVMtw0iK29@LA_2TVF7PhTA)B(*?f`>8 ze7{e@r;whIonl^#)sq0kPV=50)5if`HE~bu#B9dO;e@q+`D?wux|mb7&G%hwq!C&L z7S}W*2&Hq-R=3Y>YS~J#ea`CSC+@F3JWC>S^}6I^7(i!54%_C~31oc<6jgy;k9mXx z$!NxsAu(I+y7Mhu(N)S)5$X+*iZVC|gN%yYFZPFZe{>Diwni6pA3ZBV$v_Z<-iN+H zAPgTE-vm~N#TK)g8HsX^i^Bg^_r_)%dH{wqsmR*1AzHY!P{(Zps$5Nz=|z@vTv{B+ z972!;MQxKTIo9ggrY$!~Oy`9qCZEv;N;6p(9On4@BYbbf&w$YH>TFxQ`9~U8J9cqo zD9{e&dgnq@7?Qg>sK#?qs!fb1D)=mtylE{7$djJr)6sf65N>mSzNZghbIx5a|=`G`tI3yu166&Q+&_`5D^S4hCqN-Gt^J53ES^L>5s?Okwg>*{^3DzB_h z)&9AhI1CZ6)7ZdEiFSCu02@byzNr!H(MrQ5GlPYGi2lShAMR9a3a`NOD_g|3z#40n z<4v>JH=^wFreAoXV>3oNH4GTUz`U7plfJ}`Jyab#@pf_jL&5NtZAyPstyeMKW!7OS zL8P+gc$vSZwgUTc7*>_QcDzvIlW6cgfSrx?u;T7Jl(k1$W>^9uvU4?&VbYFGKF6vfyb_=tRCckoOePa9!FSfwW$~1{9ha<=6NX60T3ye(~xG= zWhCzvRuQQa6jTJih_@xg1vs5X$93u!z+v3=SBZ-o)X`HTUQ~AQv#HkdIjUXuzTT9E zK+x$ldlg{@Tpw$h=qrq+%iRdgj@HfOsDupvzh#3&Y&cB`&5z2sxw!0CmcsaZ@3+GqxQr;rR33E~hkJQqPx2#1S$<0(`#DME zO^{Ghpk5c?+>@zXO-8g3UN9!kt$tWysj=~)1 z`rRJUG9wLaQ=OSsL{0+0>V%w;|3A?(I#9Mo)&Bj|)lKTCQ^q#0Mt1k?5t? zAM;1+rovvs206;KZ-AJ`AH>&#qan0?z3qzV)%E73zE$599Y1*>9*Ew7+`rW5z%C+U*#`AavQ~mOui7SH*b>k7;fBULSIgc zUitavt~L!s%G$$0$(4b>XueG4pwq;Gl%F{$Xco~HS7A0mNa0^Ke?e(p6@ z;I@2GUcp1Nm$~Y-?K*|id6A#<-CsM55+aYsl@1r!2 zo+)rjaO3-xVGu4{DZpS5zxxUR=y_V}oiZ#T>6GXdvzfv}nR`)*bcww=E{<=TrqXBo zWxF<8O>@dIhRPX?y2>EmN7CP!JV6gf5oCY1LxW?PPOngDR!Oeq^n1k2)z+wg(L-iM zW6Alf^&+L!V;4}v(HP3FW{oe`k8TLEfTi9ww$h~+;5HIaKb8@IXDmaOqX}_y?F}&Q zk3$XMR@fc;^3i`jSrCj>3=thpagqy48C}f~;XJ6B4a>4@E#p`QL&EP(YE`wbp~G}e zs}eX}Jt)l$r+5bqbeD-Kgq>WnpjZKqSp5`D0p)GT1($R}@Inz_de10WBalf4ecu~q z|CgpPC63!3-`kAM-bJ+Z5om1kh`+@JJ$N*)k>DE%8RFZSypPY@8y9pDIw8VF%}F4x?!{b9D%d&+9|MKk{y1+%qJ$U}YQeV9_X0_aUW zSL3;P@5j$2RIf5^-6-ebCp{!C4lX9Y0=@goq{pvw=pTL)tcnJSyfee9{u!T_lN}s@|4>Nu7c|x5*Q= zASD--d4pJck8)sJfOPfN3S#s*6Neg-9yf;AWij=%4DI0wZPp{hM7jFlrSGku2Egxi z4ghEGR)l8B0}N_nlc;o&GZzd$@pDE_;ubCzuT}@zgA7)CvE8w_EZvZiKv zw;ak|q+0S!C{nD5)W9U`IdsBhh+>YH)EAlVnM#~(R{d$~((V`Nf~NBFMWF4jCmJFW z%$%nYoJ0(raM|6$xqM6t(4P66CAuyB-hDZCl{;#G3}}8J1J_H?)5t^(o!_XYm4t)c_(IPfcYf8~Q7{2$?^5_{EBx#Cv?m01~jD~Qx8&_Y?r zN$+NV)b`sWdg~zS7C_{JW*A{!RR(ji@T>I3(kw{u2%$R>5Ky(C6X|%}gV-;n=pFkz z>0AdR!bDN*ZN&`V5MqJyw82(Bz@=T_qHoFC^{blaO>QS3zpkr=>R6eF<}b1eCcw=Q2+`^A{-rzfmC%Z%x!V= zLf>S(j;Bg*x4YjgK^Pf3UxL)_d9DLkhKb=%Vd#2o`QVaQ|S>H&z|&%pKMaqYT}ZMxz!LyQS5$AH3=PuV7~t?lS+{E*cs*3s(A9 z<5XVkDt`ZR?~<=bOXz~59| ze(Jm2F0uMDSZvazkWh5=12u!gqI=hziYqttCTZT1Q-V)F+~txdFRhiQ1wA7!3yvo; zJ~2gCh7RB4?UvY!Qt!R*V&X*$+cDkM}vcgJxd{uS$a3H zSB_05lz8LnwlAI8a1kTRA#Hx8emD;7gKTTLs;8QH;JH1?t})JCliaB0g=5k*W0*7I zmoAPQlO6qXWf(aBoO1;txr6Q-Qtb3D#EVK8&jg%!?e7|ye> zl?o09oKv=m##FX-L;A1JJS1FWM`dwsz-k2J+_MO5w}MY6r?a)J!E5xZIvpUFqGb@`ha904?8IbZFNv6IwI@P2wFqh7WGW{x{{n(cC^Rx zxEHEfOY~Y4)7TJG+0>tGDgc-!$}eEB7GekY@ics_=Dq6#AT<(S)V3&lI0+nSv36g9 zWC@tpU7@LNIO`U#d!MsF%@6eD$!sXk@5I^w>u#gCUSmZ)H9_?PH`qg;V_;u8pC#QqMWp~VGmy$X|%e%6ZBD9K}!Stu8IxE z?2@-$kau%b(M#4cSO13YwlNS+M-Tk}$#9M%;&svz38X%)CX_HTkD6^vN3y0^hKZjD zZsjAgak`Otl`Mwc84{yLzseOC8m3E|^L)_el^_XA2&fmwb97#N!jU&nhvCY^Eb;2k09NV`RLc!WcTYUM$Kix- zy+_xFdLQs293LK%GO*w8AzoFVgqNi-zPJ};Kwx((qM{u`>))RcSl&7*@lpqaMxfgM zo4vfHU9E~cbInnFn-GU{gpauyZDf=(LUw;7V8oP<%j*dvwImbW$L)frV+XPUz9Db* z-*v>sb0RZ`Ot6HMVA*sBTo!+j%fhxT$lhVXf*Nz$53SSW9JdDvN$6wk2{oN%)ioVj zsB(cG$ERSc`Nf_@CW)vQIKc&aDz;J$fQ-^_if#mvvZ?#KLnup677Wr$*d z5i$P(_c7hYbFV(=E!+#nClz$40yi;oCt}5Tbuo?_P~4z9b&}&2g&B}SQ;Tc5LhV$G zu$F%p=JObYA1aP_i8DUFl#FDtP!>-`7X|tXy_JFVHobjFH6uSA!CO(_OmDv)JAc~J z!>c~l#k1Z~!_i6~_iWM&FVLL=TLJVBVS3PUE(a^od3;iX; zM;1Pe2s_&j&Bm0#ps`6>S@}f}Ky|k=7sPB*~7GMSJ9s|N0H0>UsTJiH?5Mies&AKFL3bk*8Q=_Fz<5r zSdYq2jns#?1@`|k6-I3C#3j3L>?N1hf$K`g_r}J;?`a^1iil7@lmCAO^>|187GG52sSeM7XjkDUx+ufwX5l!TnAmLQS2gbsd`CmQ$e8~iK;VC%hy9@tsWdRh@KLt>f?~K(YxTxqn5BBa&Z+;NMxV8VC!^omq~rUn458uhx<~rx2Y_YRKX`$R zjeJO6vISi0#3VCCn4_Mq_}%-*=>TBD`J~-kA)LVJk?6L$uxW3$3JP9SV#->wj`TpW zzukneQ%GE2n>1r(5L}Ov(sPf5X*cvWN$Y+0=AX2#nhVgu|5emVOys|uCTT1x0qSiB zyqmJX?7wd9QXt)Z;f8&DT>bKoj505D>5;ZW9yApwnWjqBziK;c#f=)1byg);1T$6b z^{(ib5Za=L8cR95`_1K1V3y+@&`Wyc&8=^^i(%@zL7JYtWJ?DTe-Y_GfUrG z)#Mvdhd#=8D~3^G{4+9+8FZ5RdrG>!OoDG8sy4~xRTf8?>FfJfM~zbRd4fiuZ=8s* ztCH1k&GeTTYXBg$oUIyOo!w9L1`I)(&?j8J#GY*P(|EOx=_64exq>j{-*NR?0T7i2 zK>)grwhVr+r`Hael-8O4&X+sr@W4-s=xrlIbdo}GOkuc{o=tH5L^XwgM*2616GNgN zDtKU%si7m6oc2szoik<%7`4LKqA@3f0=vvm7r+T|DcDo`hjv>=NgxjSo28G*?lu~m z;a5Ot>Z^imID)w5=_kicEOpMOfIvC`9HRwfN>%DsyjgbHlH0l~G_=BVh<*#>x{;DC!sPd(J0hvd_Q z*@FNnSV~lm%Ba{61rk0}jNd}@v;Ydd_}g+OeugP)SuedU}K46q5JG*^1awC_Lr z=S~U2&l{aIJ~Aj}k)m&{`cY}2fjK$G+o=bHXG9LuBOoZ^g(&R5tc6wi@0{zu;fEAX z<%op*m~Xi~au9+g=M=X|4vo@KOtF3S3D}>}tI@ef>v;wFWr;d(74JcE>g0?%aSHus zvZOC=C9`=;?${p|T}VE3!whSO&-otxn{9gB9OC>cV9+=o$6aOplvxiJVO}sB&-|Ni z0YC09m(&qZ3{Rhs!xCt2qq<|r)&OQ5VUUN_fgT(H?9!0*vkkmY)G;daFi-*YIqVfz zdc2Uk01@aG)G^J!Jv>4w^=n!MDpz3*n=>CpHZbKu_@;kRlboQqZUgP!cVe`~d7gee zGR?{NVAs@&u5SUApGlM%l`Zjw>5Krl+|GGs=rthaHEEDdEi#c z{Cu{HE0y%zzZ3XS5@s`+CwIn16=i)#FF#vHKX@KtpiLK<2S2BvhFl$=5u|6Z!=szA zX2i`OH&`J#-!U<{>p2!`zad>J37HJ%%VQ4nkFdmrCdMPYh*BR}S)D>mbLzz2mTcgYga zutZ%=>S6L%^h<<~n=*#WJKW(D0uBNbiS`gfy`}N()#%TFlkDSH^?J1b@C3t|nvd+8 zea(17gexm`WoLVyiYK3#4RTtpc5j162wpum=6HXpHD;F3fQ12*pdPOq+uTj*Qor}hDBD?D58JE^LoI)h| zgNhy)KO{JR@8l-8Qyb`2s0DTKc>6nv`^`_E_o00_=?C7*0gf{z$~&+VGPi&sbZy>P z|HP(-oIykj^l>x9he`C$*bMjN0Rate=`cCs=`;3RCAFt{*R-gzV>^?zfiHLe3ecX` z6zUARCi9r%)B*ZK%Pac{vt^rcB+uR3jB~Odhx#*2HY5hPLlVj&TH?+!w$*Rdx&(H^ z?f;Vv!1wFGe4$+XR?*DEmj4F|%|Yksi0Scg}M zBpsZ+8{V+9N|67Rt#JOS(XOO@9h#`5wLod%8F~KHlrut9B9%S>nsJBOLoDg@koC=; z&`M+K6u5iRHcU;`LemZAE|t&YT7NXx5Hq}o*?=$!uO6f1l@fQ9CZHJu@1;QkwTfBS zrX?F^E$6K<*Yj#+b`k+E7Zw=NzQTmqA-?#VXDT#rz`HEh9(ke=>LFaw%oVr=p6@y; z@4)a}xIEi6an9>flXxnp`BluqFox+In^90K)P5;jv2%>k`)yaGHE)~QVVOrtbnPE$Iomqt zNw}|_{I3tUtN0C%hLcaO8Hwn6i|)I``jjP?k6FN@OO?aX;Tl~7^D9G8H5;f}I6yvo zutrzCnwS(y3qd26|CHEz4C?X8Jtf@dJ zm(MCC#ivqcYllgKZb3#Q9JayJfR~llfn@B62q5JH!C#|r0A<2grTttn0wCzeTsruh z1u?>|1w+Rk_3-kvs6J2PJan3_uPs#F{*w!37hQn1TW8xV(Y{ZmalILAk|T-TQ5vfz=|z;5QJ&QhE_Vp9>?X%xl*;|K;jOk+s^v2E4Ndc{LRV|4Xn^&q zuFkF$h8O0&KUZNZ7%+CND^3BJkgMS#MGL4uXU$k-67D4dhnfF%Fp zV57muIPrs|Hf_nv`V2x>PClek%k!0CLSX?w@(n`e+)A>$NrJ*$Uw(M6(W%<5(}?*0 zw&f?v*fExqTro+8BeJLk4Nj_!c6b@XAQ!4GvLnhj*f)c3dv+)$e9Dj|UopWnBmAQ4oEN}2dotA0k>ei5?>wb5a}Z>EJIRHiA$Ib%#uMjNsb zE)}i_1{Mnd%wj!PTnp!V*LuTjk3Jd3peS}bRa?eo7-$sF8p4%Z1QAWBKBDu!mh4&J z`JhIVgQSQjPl<4?id-8|vn;m^I+Gzp&rjr=KAJfp6gSy71iF$KFOlFzp>T zWHo4EAS7%||4k+7S%BezF5FttP-x4aO~1S3Y|LtSY~oXHL=a3{G_}xTi*itTAE=Ll zvw$@8vMH?q!4g#^GS;lDAn$fxOls)YvSa%&SUUR4RzIBEWkb70vq_$h)%4`N9udTT zQQ_ppJJGfl7{Fx10D^@mfe(M^*r#M3+xQ6Wqw5%+0hybuQ^ zc_LbHIw=QGn<^s=n^9{25Lp<<<1)+OzL_r0jTD48c_w486HNj)*m*1D8D``n!k$P$ zWARab|4pQ~Dq2eQk%44YeYZ93Kjhg7Wm2@5`~nF-hUj!giNtJhqw^G&{t5a6aI9HX z-B21HYil^UEb$S&_6ZplyuE3e|B?8Tz?*5F5 zrvr>Q;PT;L6g7S3zRYYIeeJ4n=ZowWMeIK`vuYcBB8gb!cNJ4BL!Dt|_Cd?;30X@F zlXuH7Be7Q%w&Rh?O{6b@u_cc*_=Bo|OvK+T3SGQ&Xhb3G84FLHR1xCszHVT4trxm< zuP2x@3sfV~iH?O8Hz>TUm`HqIs+>0IOkx)fTbAdQC-BD(j%mhPFC?g=`}QvWqGslM zz#<*27i;<+0Tme8D$S^9<^s|9mQ=-q_D65BplsZ2chJ4C zY>?d=34ifn<3NA z%3XP)Nvb^`EI$-DFN(Kt*Ja4w2)<Q<>g2wlIkhB`P|2Z#_iR19ov+dvQE}2WM+MTtr-c^ zj6oZ;^G1&DCcH#(Z7p=&OfmK}`U{w|S0T&-NcKMd4|;CwUFfrXp*A&QaN%^Fyek&f zMiIEjB>dZKMvk#tYzl5Nd4gtXc)SpC$7O?4K)4i_?8#!4mrZ^g80LJvFP~_9f&WrE zP76b>LLAd?QRD7I^%+`D-rBa?C=Oi1hm{HG76S{D&zA;V&!qiIYk%mgcQj_IoWu+S zXZy#>yiCr|f-K7H2{glHMY%S2;BCdDmEz!-uT#jqI`o0UOzYdgHReyob5SC}HtVbx z;cU#-Tl}v&AU$mWdYjv?J8PMB-@=Of!e1azzLzau;}2GiI>{%f6UePRI;M~=ljG7C(` ze%p60n8SX-_DqwSm;gMZwp)(17?(K*Iie<{^34O1Gi%M(L=<`_Eu}3hVUv&@j1CrS z0~B)H^!q8}-VKow5U-S8b8)P0I2v>vKvK+SE4?mit_Wx)ko9ZK!hX}f zU|PI^Wt4U3vDR4)834?X^0&A&o#p6F+9>aKah4VgnLPywYl`6{)2+p*5$uOW^`-uy zA)|Q$*al=JO@eS~w$1e4QXvfh{*5k8%daRK4xek?Gv25T*X5ymJim5R98`CT5aWd- z9?6zols}8=xIjGE2vuvb2|+%gL<&VSs))>_5V{opxKem4-VrsMU`0nMO}Y)G!s&eb zP$47|i3xvzH#PRuOJ%|cm4;~(pe2qe*7X)l;XjPNe20u#>W9i%&P6T|cLz#ztW}s& z{I4%>f?%L~0V?kuc78sRW^X(W;%svQxYB@jA0XQ3RjpGDXG0h;tXsl)6y~=#;r(R3 ze{Um+2!5_UV3ir+8RQg{t26&cRNvHcIw7I3$Y`t}-L)by%1RAYMnLf$R)SEKRh9heZQ%&f_%Euy zDI5KyeHtdYBO{p_RB2-yo-K!Om+=l!h zoB>OIFB@nHwO*rOYycn&;ZhA*MGw-f34<6v%f~T=?#fxIabNxYV@-5hG+t^1g8v>E zxl@2jyYeMz-nNgt}~zm9tzd?_s#6)gq)xn1#)hM<&|@Sfy)yRq#EC7u03dXa!S< zT5&rXECwf2N9X&lix8hkwve%qXvh9p7FQMN9)#IfJb5KM*8{J#_gLv15y9YRS&kcz zqCp^#ywF&OTQsU8Lnatghh{T4Wu|E+TJ|piqU_)Zg@s?n?vw=|K4&BAo`#&wVTYaz2_puDAh=(z+G*bO7?-n3DgnH z|GJPE!3{agF22tJ4M|U;1S^x4fRQWZ&L@)7;F!0{v6R3|Gg)B)CQi{9=y;-lIe*EB z3Yo|vl>#&W33WidIqi|O|84yQ5psED$5{9eX&3ld<}`}29_0hNOM%(yQ_Y*i$mxmX zpChkLuRe_vL)Lmf^m|A}SPOM)z6zHCA+Ygmmg+6s?dx5#wD1C-3D)=^0R3;8Sp}L3 z!;Su?eqx!5zr}8_*_HYG zHbYvbgv;D124@lQq@T@mm+OCXw5Isgw{Vl)%W>A$JSeObgI(Z6bqo4pRS+>uIX1Ij zL|*_FcW4ESzWjiQqu^LV28(UltsMz|%`gz+?J|QC)SF%ULc~Oge zS_%0Q*HVvJx-b!5Npr<){Vg9~Z-FSSmv6<_CP%Vw-#UQiwkW}n$BBMpa>QKxKDL}0 zdj~-l18Ysp+ywFuB+*>f>MlPZzT4+{s$>0ocvSV(Xf)rZzF0PPHUlbK+NUJU1wW~5T@qBuXX@a|A?q42)#RY-CzN{(Q zF%J@d<~Pf$FuiLJ2yvf^9g6oIn%y4zFt4L~BHYj57W^tJfr40@!ej9KjiEauF!8L9 zU~=bv{LdBuQ1tVk8cJBSNbEnvVfnU$^i8qLAxno-*Cm|s-Y8*R!kn`KQ1N|FdpH-X zjd!>xD*RGrziypce+sXG`xWv%onrVxH-nc&mPkPk=EU1(heY=o9lwK0JOkc>aF(Tr zyBb(2)+2Fh>1p4_xiYbuepMk??cA(gS@>VxU>2a#p-)6_%N3HLfcj}#o}SUy7Fq9i zKV@`%BdR6M48lZYM=mV;fSChsr}3SNvLP)_k@+^9Y?QhAO(z`5`N{u{i6JfwW%Ad% zfnk^tYj&}nTW&Lgd>KH@qD~7733wQ=37fj#4FFs_aNhRTwzi5vpc7VMS^9Jr4IOs} zA0(^EpMb5g1@o{BsCx}rFb_(O4%2u+8;`rLcMmynEdHzVRXjyb=UJmTn4~*Px66n z`vR1g0|l~qEM7_h$E>bj7l@4S%Ls8Y$wVAY8{lBb4$Lqv~;3L~` zeZ?z5N~4!i(D8I6&Wf(Co>S_#-{;!KpNeq98bQ6UJHjmZxmUShL8;xVX#V@$#Rujs zG01fN;lvHoizYSeZ{3BCg)h$u*NW1lah@ygfVkEo zx#8sU5jNH2yR&!ej=$+v!b!Y}A(HSKzUuPn1A^95EbP$--OiN zd_+aGwJ|8O$-_>1)8&B8@i2u3)d0!cAsT3044+OB$sHzV^QEb5{e!Yt%J#Yp3xw?J zRty_Pd@x~`iim>}(RH>jnisl*XV!DhF+u&>!3&ad%%D-nRpbStYcb-Tb|B0GHIcCs z;aE(UCXJp);;6OAGBqI%daQe?6k345h#qYyA|v4c_tr8?)NccA+CEOjamq>R_nueF z|MOhw({P*=l9%WXl4Gwj8038Pj@d)5^JJlth;}|g{SZu6-6S+LRs7{!Ki>r+$qZh* zJ*j8xVbgbOu*S{*ByhJT$B=WJA1BOa4`ip`*=lBE58ZGpVF9P&RjtJil}W^{QCc~EHL#kIU)$Iyvh zsiX^-NS7(JNYUzL*4g_IPsCl`O-n~AwrR~H-(#cq;IHH$B|u;J4!0(O2>w!Xd)eqh zGx(9}Q?nsOV%mX_xW5zXpu!P?a*6^pHfVfeOuLfVH0|s~1GJWPV=r>9gAk{Dxbft$W*l$#fJXwf)F1y&E5lIFY5WOSd*1X<|PSN%HRRS2M* z@Hs3G4A|+0o|*jrI3S#d_BwaZgFSC>^SqaQzx`x zsu(XH2oG_P4>mOccz$36u;Z-u zE`PB;hBDCcwFMmU3EgkC9z-I~#*uC5;A&}!qbtPKZHBXhL*(cMmY}99Y?CyMjAu~f zd^-!}j5Gad#1|w-zY$BpYY2lYv+{vZ@?~pSZ6I?7ocnuhnotqsQ@QSn^PV$~do=CC zar<$k&1O@-g+bS~rj={6aSS%?&rMcf24-+4_Pz;7`&wE<5{E7i$8iS&l_+^h75LJcFhG#u_aSK$;qgUjh9foOpZq zf`Jq7yK}mysz)yJ*GyF>CE!=7_VE-=kcF|`044ZwzVPljt+3=xc$jTrATj5u0ol@l zOP;W(?!Hv==F&#fL>B$5{EEutopU`HZkaO_tJ#JU2Y_i@(sjfL(1V10MV5c=p30sa z#$X28>8P`5Lp zaJ`ZRl>e^Z?L~SX&qoQdO|ak@I=wB+)R2{~ggT6|aVn6Q=@-xLG*u}zi!rQGe>%D4 zX^FQlwg2GWtZM~S2UyV8yp)RcFy!2)U)}VRXlGOymekmCxfwZ+70Hw{$6}0;lkZhn z_jp^|6?W-6bZ)HkY9iiulq2fp#Zt%h#&^=QoOjXF6jTFt`9hIhAa}NzqX3kf(HPu* z5+9tmfDHrt{dtNj6><#w6OLWwO2pG0+08ZR>o5@2_e9j8Mx50D`-8byzY9>*xik9y zfln4{)(WS=1WQ>dEd@FxHOfn&oV)_XzndBO@^p1K+aax1iv`M7a{7@U?{hiO2#N(K z+*4`q-9M}Kwax~Bm?!m;t3tuIW}2e8FnH735K&By!=|q!ZpH-*R;p6t)UsnaZaDY; zmWhh=hs%$`Os02&9iQVEf8`8;Yn@Qb&p~0IMq|q}MF=3@Ez~y2lfe9p8maSxHs-+1 zWcbN$0ps3Na1)%alLpa=24M3RbjMl%_mtlgjxRw%l=?8H!DG@9H+5enzw$>U6VqX3 z;SmG1zY%V{196T5VZ#)rjDKi?$K$JLbOvpI++nD#_#o551-@@H+lVCH(!n`&PT^lQ zdpWh_B!vH$Y>64m9A73Bnk+)V1t)2O))koe_d^7mU2eU*Ql~Ee`^YW&SXZoZvk4R^ z(WZS|)Km^yjIj{JUSW@JJO;&*BDIvHa$}r-lsNJ_q4KiwJF7F_A4j!gW?+bT-y9CN zjRdNq6BfHOqf5D*j9K~I)wMT9($xiDR&Tu^R7ciCQHLaQhswi`5t#yB*jA<_Lc?%? z_L{$Vd|7Gbqqq>A&X6HlwB~(lVuVj?VoV-~V0XLKKYR^y_i@$}D@a}52|lH)cBp$= zHx`L)M`%ks9l!BljUoop;<|n6&ksE+=kX zE)iGxkW$4^SlAI5N)0@Jb7g9X>)-1ag^G~ zOmfu0FC>2)*c=&E==yR$5vZ%r1V>7SnLrsBuxYo-q+>A{8-E+>&O3!&8CVAU)LtdgwwUa-?GeNn4%D|0WIhb z=*K0y1>x1scUD4+qYC>J5%wIb4xoDfZ<`D7PiN;njf<-hgvz#E^K5_`O?4R#&Mj<} zDm~g|&7<|gBz*=V0@=j2O72VszVnGhHMg<4@WHvg+|iuTMOjQwK2DzN=7%+npH=uO zlsl89OArg!Hd90z?25OnV4ykY{jdoeHUZMc%Lu6T;qEUywy3E5*Mh890IPtX$5caT zHNA@GumE?WYXRC@#y;ClB}Z30#9t1e__=JgR;D8zX4S|iFiabBXeYj2e*`;c2#qn2 z)1Bn753OdH;=Zb^o<#1gyN}f2@{uG6@%<>FqU-n7d0g+xO#lbfltC`bTe(xJH2($p zTIa=nOw6et3^t@7m=|6tq!#te-<${~NUOHI@zqCz1pGHwNw6$c61XJ&7f8;+Xv_JK z4^&Q6W(m<5N1F=pP<35GZvt4YI^N#rwD?1EMTcEaT|e@1u%;hr3v{Cpjh9;d!cHUR zsTYL;hDa?(F(}=ct6gLVd}rrQAG96Jg^IyCM`(8T@M@mH7cOhN^{= zy$!N>CC;XhHdZ2b<`!W@Ibx`?M**Os8VIPBJmC)r9}m(P164I=n)eGZIWjY3v4aQu zjNIzulV-s(|4<_|H>_<+3ItvGy}p6R+2geTgBAis_Y`E+fjVHb@#~13#rH}2wq-q| z4Y$lTn9E2+^TPhkHf>c-Qx_)}EGkIeg>W$mf9p?v!J}Ap-C-0$mx6Vm1-fY1Tyf3o z`)gwseooWf;>@i@l#8~Lrm)^*g<6D{YJa1VL=}t|d4}`7edJMssT%-&LFVJeg+hSA z>PM4fc5xe%$T{JLvkUJ~dVTE(OLj>}WcjcDPd0eTV9EL15tvl<*v%+lD(I#eoo%bB}*1LF{tTxF>Qy}+_yqpo~jnM&dpjcLm0 zhyoHeC^Ey0sXAsVQJu^>T)GH2sIKP-{uKcP_6`bDPEDzEu5hH=MR#CpBYaeMdTH>h z2YOi6*i+odN@{OmCurBBtO)@AY5AG<`Wl8ylL6Zlss%yL!w-oeTXsySVj_p&5c4Li0}s({zN{bSd>h=@B&%#|3uuV5L+3h0 zzO6cxkGjxX{JK-J&ID6FU!=k@aC~#7~`0v@8}9vw@yO^8OZA2d9<-9EpCfGH$(kb zjAwXgOe>fPFi(MHbveBBwqk+Q+?gBO&DP1UX@nm8!G73ERvtIPKRZYSp=0#D!O@c_3*yRZ^KCLV`evyxIdaAi{YE*blf_HYG6KwcH zWW*O`0dT2IPs{d;=%RF?{>vUb)=xnZdX zbCOHG&Bk?Ol59obZ9dmFbXeBWo~D5XdpE)H#s*TARr(h3NJ=!Y;N*im~I1&M+(y^x8Wk*TYHOaY8azcdx))qecXAQMxw z|8RcUn%Mz3{}XEBV*g*^uBMJoKs#Fi_5aOI18_7oG_kX__V`bzoSie!*c3o53N!~g z13gXu$!O?o2r#y@_izN7TQ~z)n3!4U|G9C}0aPqZ0kU?UKx=D5fViED?LW+ar8cxR z0jQW-o0{3#0*ws;$_zpbbO0k^J9mJJhrKC4!p2DQ-y9J`M@KuL6F|hy(caF{(D@(8 zNQn;M26VOnD49B$I=cQd`oE+A{;ikvUqVU$cfH~+*4F=qss9B7{?!P;zZ&tsdFrPB zuAch;4+A=h1Kmwc6oAgg763CtYbVqH_3{F%=7-v6Zc8i2q#w^#DOYzQ3gVzlKwGcC@oHRR@~< z)7t+hqwv2b#fzSUlNCVE%FYI0X8p+oU}omz^7)_f#x9PIrnb)iewY5y@?W+Y@Snz* zn!1}B!>ujb8S?~Nre|e1*JJ1XnH1G%CxH}WbsO#)wG4MS1JY^)8R;!kkxIcmSkTAA z3+F!KmQcESzDav;c4mkk7)i&6kigN@?Hj{!RCurhs!33D1r)mAUM(Ds$`gp&+$_EX zZ=r{u&!N?r4CotUz#8c=UlhBrW(Xzvcr6UX;d<}x!tQqb*~2U1PTj!Hxo;t+nh~?jOAiLikkJ;? zE(H=!Q!nFKz4E1Iw+7*?`!nT@F5Ev9wF4+>QH11U)ga+2L)fOE+@90fN-LP_J~S<5 zQ+YMCTchZ$a;1yTguT+5P^tE3_l9S>99&cisqgb)I|&5NeX<@ zCm7^&ikV5~aaEtPp0lJo;LzqCtQrw_*R?Dy_A$!(l)Ugn!74NLRU1JDLd+QP>Sk~fbuyp>5B#Hk@Fw{hH#ynfOKb|$+Sq+m zgo@aC0~cxHX>aB|F_jo~3$?ouGVRTF_ITU2nMk3hlHV zSvS5l{q>vpu7BX3i#gosykw%m;K?VAZ`B%u=HOZW5=Kq5wTmMxie9G3h~EhRV0jaH z1Z+O@YKBqn7lU-mT#d9UwY!`3uJL%PUwOI5oJpjRnQMxD} z{x-N2xnVh+_-mrlcVQ*V;grtW}@5mAgQYjM4(-h0?9MY zq0DIM43W_t_~K!Af0J?FzB4W0J-8Rfc<=(0hr9`R|7=yajAP#cJz(2KvszitM(g8q$w!xvsg&5};W@7;;7Hig8rmm4VQuXp(IcSltppSWygQqFR9EA!!@h*!a?h>|Zhseda!S zZ3th@mErwfGMi1(;;G=_7r9yWh*f9pg0~cwGm9U1cz>Pv{df0$5H`xD?tl%&P+x3k zEY~DDhD{;pgP%WMa8KoK6lXK*BT640DX}=S+r|r^B;8WQlyA3oDXv|bOb9u*Dq{b7 zT(~2StVS+@^9kAqK-pN5c&#bBcwAU?M-k4rE(l0oN}!hP2;1n15F+FUE>WH6b$+ zJL^Ra{(gsC7gM{ngYe8&7RS=a0#;MM;PAk(*^HV}eak&JM>`hMVE+A>YUESWES~g# zM***HM@vbG0?!GB-l4abYNq#G;&?6UJEi$Rpf;x-R?jxkorf}4`SE6dE-&r{OeH|W zE&j4LB}?K{8@a~GBE@ijKXI(im{@|uvg>Y*|A5&{Kq69=q5YGwK zw8|#nTvU=P(5)ecafcEnnMI6kobh^~j8LZk8@dZq#ejRTdbe6VP2$aSQix>+b6jZo z!2Jc7z~C>Y&`%J$?v!W0o%I;dnhZe9WaR!!K*P8w!50h^HCzk}&TI8p{*Gguf2C%R zNK|c#%h}Ur{({VM>Q?SdOSpd3qd~x^Ps6^{DC-th$`<`L~%_94JC_!1D-l25G~MS+nI*=b z#N9aA735&Bz4f=2lTH_!y~Z2u;`@T+Y2|tinhU*d9=%SX9M&s(_Hd+fz%aw!k_p~& zn$z4s>ET4{jGiY4Nyi<3(~fO`d@x*EdY5rZRgUNm6~7N~ENB_O0b5Gl5k3haSSwTx zrewOVwr29dEg@c8XIhG65R&CWUQVN$`V;w>WEsuo@@6Gd_bm}dZ)A%$9lVXL7wrrQ z8zOQDd`;c`=A7yyf=nE!8WE}}ib>#E_Ovt?ur;6kD|W$|6QC4FyBN1;2`q|6KxaZO^+wR)2B(bq2dK6&~4OZ7@bjUOg>0lSe1&BB!5+=L=rop z)Zb@te^L7m!a&$Oq)Au_)zJ}Hi<>(+%)4g}UL%wvR?|}H$QM~XN2dLXJIIe z6jDkk^WA)&$T}TjJ&hVkI6jl~T(9#h9dKkd#A2#o%PGOAeHJ5d4pMzJGja})Dy5E^ z(at>G4RrV_o?l@!Y=XBfD1wDW=I- z3535ig14^m*WS)<#zu}{k5G%F^lhzk5F0~>YFRQB)LeaqbaFXmSPDNpSF+Y%Lmpj# zIhlPf#wHv6BUm3fz0X;G1nXkz&c54$13FhZ+td`L2q&23EC%_^UZANJ?lc=ZbMgTf3xP zg*S9K3#68Yi%!jHq2mEFu)Kk*GsQgZCKr`;ufHGd5NTLHK3~V9;iF?ie~U|4XbEwV znrZ{~;l5)Dt$T)6 zq-?kI3tyleq3SRjJwQH?Mi0?b?-%7ydkfh6OV)4oP}A!kruWn9T*?tMh-1f{0Qe!v zBb!{aUx}C+-P6pP%kQ+(tkA2wL&54JVJ?E`EYF*b=hrPbSnLYzsVAPP3;K|oO-EOPBUQs(YL^&r4A&vk zIV)e4?3*KIP6_Z=21~S-G2kWw&urS%Lm#1uHg=TRm~z}-eM7#w3HQ7F&#;f+(Rt;m z9Rs6WcU2<}-|N7&3Td7+fyW|$q8k<#l4z6t&gaU%Mwy4sa5fQoDV@Lr?mINGrXRqc zi2H&L*l42@zIF=JbKcy2-$vxv?iqgG;4=(DD>M$I*_@SiYYVNf7a<%8{Uqci*guYNZHD}gv1#pIqd>+W2@d7T6=f7I!gByvgc%ky7OE2N~gx~ z#tx_RNKBo2t;%pV?@vt)cpNvL89#kN0y611HG23pAxyq0^j9u%o3l>>-qbjFo9J6Z z_?`vhog=3$YCgKwG$}MFCc?8?SoIH~twoXn#Bja8)vi-|S?WPwOrM?zQUMlQ?!klV zV$0v$M{gN|Udv-XLuQL0St7#_;8}KnS=Dkqq zTCI4PwHvnD8Ee+V8RD=?#Sn&M2SE`1Ifa&>q!h3m&h&|YH+QlMLr}~cfy-f`hLXB1YFVB&m700GD!^DYX5k_zgcA(Zb6r z)c_@J?z^023H6lwEXglk>=r>ThhiPCuyz{*DJ&C6( z-lfd3o+QzJIgaXw=$p>k9-+IF#b9+mpxHl z^hM`QzO_KVhrZ%P9Y>JI8{f{^>9w)SL1SCy5O`(}Hd@{2HmGAaPcE*f&kn_<3U7Sd zFCj{sMm6O$SsIw!bRV>1Aqw;7t-MF0_0&hru8aiuvX^SegSmjc>o9ou@AJFK9+$kQ z=;h4)qYkam2u3iTK8RvE78En&NVZgL=BZ=kivAW7T~9Tm;=(x=radW_6Tu&h?c#4F z{$o3a^d-mmmBwql3T;^3lwV@Jpe)A+$lOJUb;oSgJicny^W=Lnb~Vu7tu9Om_hvFC zIyElDPjTff@g!l!REv`=044gymWHhCpZy*Z6hNX@3azX#biHSgT952QcuD>nFqI*% za+Bu54wctVoS%ra=%vu@N-|Y7^^iq&c zkHST=8ijgJu}yiiVRVFbJ6-?TJK##^Z-K7H);=2jL{zyB`sG}E31%lv%(RbB>9Pie zHE8k8S-b4!tjRMvZ&XZu{#V)TC7M4|s>-8bX+P@Hvmp39VGR3HmO($3To-{LRsuO(z+AJlhq@0Tb%qp}#zH29 zrjLk9mm-jKSgyOt!Y6=#-byMaZ`{i65G6l~ydx#bIvHK+%>Ot?Hsc1$PdO~TM_h={ z7}_!!Y8+uHDQrP%h%u@ynf{c&YZ=t9#*H0;rkpTy|75u6`bhY&uCp2B>;l}A>o3uh zm@q?U)Jledk82?j_4hU>`WJv?@K}ei{*5dstvu?1wS8-W--DxAyXI9YmOI=d(d_<5 zQ8IG4zSo>IyKF>V0mG2t-Kjyv)I&Vkr5otA`syx3_SJhaRiI9B6XNegZ%#CCLVW;r zYD>ME>eVOfE)uzJihle_vi#sirpFleQ=DQiXR8X~B_p|(+1@Riuod={pkh^lg=WH; z9xdX%8z)nnEyW-~yDP|^`in!`3@cJdLRv%g{RVvvM#X7kXU+i8OZAH(O5}k4E#We{ z)EoNKp-Fw6@PQUs8V$DwS(ZtP&^7c3*}@Fe#uJg+Cun?;;Hnr4+4&{UxHA8K{8nl0U!P9;Yl5>=Byd3Of6kBv5EG^p1uAW zA#W?%%0o{L(Tm^}QgzpFw_qhD$$qCL`nq$nzV1y9Jw*&+ao3;QqX;Uxlc^7KGS

0Cs+b9J_|_W>HYxtV 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